如何用C++加载ASIO驱动?

问题描述 投票:0回答:1

我想使用Steinberg的C++ ASIO SDK访问驱动程序名称列表以选择驱动程序然后加载它。所以我尝试使用 hostsample.cpp 示例来编写我的代码,它编译但不想执行:

#include <iostream>
#include <thread>

#include "asio.h"
#include "asiodrivers.h"

//----DBG MACROS----//
#define DBG(x) std::cout << #x << ": " << x << std::endl;
#define NL std::cout << std::endl; //new line
//------------------//

extern AsioDrivers *asioDrivers;
bool loadAsioDriver(char *name);

void audioTask(void)
{
    auto maxDrivers {asioDrivers->asioGetNumDev()}; //The problem is here

    ASIODriverInfo drvInfo{};
    ASIOInit(&drvInfo);

    //print info
    NL;
    DBG(drvInfo.asioVersion);
    DBG(drvInfo.driverVersion);
    DBG(drvInfo.errorMessage);
    DBG(drvInfo.name);
    DBG(drvInfo.sysRef);
}

int main(void)
{
    std::thread audioThread(audioTask);
    audioThread.join();

    return 0;
}

make 命令返回:

make: *** [makefile:31: run] Error -1073741819

你能告诉我哪里出了问题以及我应该做什么吗? ASIO 文档不太用户友好...

我的配置如下:
操作系统:Windows 11
编译器:g++ (MinGW64)
编译:手工制作文件
C++版本:23
编译器标志:-Wall -Wextra -Wpedantic

我正在尝试包含其他标题,但我找不到关于此的其他主题。我也问过chatGPT,但获得正确的代码很复杂。

c++ windows audio asio steinberg-asio
1个回答
0
投票

我找到了解决方案,要加载 ASIO 驱动程序,您必须:

  • 包括asio.hasiodrivers.h
  • asioDrivers指针中动态分配AsioDrivers的新实例
  • 然后获取设备数量
  • 获取设备名称,其功能如下:
    asioDrivers->getDriverNames(char **names, long maxDrivers)

    或 for 循环,如下面我的代码所示
  • 然后使用之前设备列表中的名称拨打
    asioDrivers->loadDriver(char *name)
  • 最后,不要忘记删除指针
#include <iostream>
#include <thread>
#include <string>
#include <vector>

#include "asio.h"
#include "asiodrivers.h"

//----DBG MACROS----//
#define DBG_STRUCT(x) std::cout << #x << ": " << x << std::endl;
#define NL std::cout << std::endl;
//------------------//

extern AsioDrivers *asioDrivers;

void audioTask(void)
{
    asioDrivers = new AsioDrivers();

    //get number of devices
    long deviceCount { asioDrivers->asioGetNumDev() };

    //create a array of 32-char strings 
    std::vector<std::string> devicesNames(deviceCount, std::string(32, '\0'));

    //print the index and name of each device
    for(std::size_t i {0}; i < devicesNames.size(); ++i)
    {
        asioDrivers->asioGetDriverName(i, devicesNames[i].data(), 32);

        std::cout << '[' << i << "]: " << devicesNames[i] << std::endl;
    }
    
    //select a device and load it
    int index;
    std::cin >> index;
    asioDrivers->loadDriver(devicesNames[index].data());

    delete asioDrivers;
}

int main(void)
{
    std::thread audioThread(audioTask);
    audioThread.join();

    return 0;
}

© www.soinside.com 2019 - 2024. All rights reserved.