在Win7上使用WASAPI和PortAudio时出错

时间:2013-03-20 20:39:01

标签: portaudio libsndfile wasapi

我正在尝试使用PortAudio和libsndfile在我的Windows 7机器上以独占模式播放.wav文件,但我正在

  

错误号-9984“不兼容的主机API特定流信息”。

我已经填写了PaWasapiStreamInfo结构,如下所示:

struct PaWasapiStreamInfo wasapiInfo ;
wasapiInfo.size = sizeof(PaWasapiStreamInfo);
wasapiInfo.hostApiType = paWASAPI;
wasapiInfo.version = 1;
wasapiInfo.flags = paWinWasapiExclusive;   
wasapiInfo.channelMask = NULL;
wasapiInfo.hostProcessorOutput = NULL;
wasapiInfo.hostProcessorInput = NULL;
wasapiInfo.threadPriority = eThreadPriorityProAudio;

然后分配hostApiSpecificStreamInfo参数并通过Pa_OpenStream打开流,如下所示:

/* stereo or mono */
    out_param.channelCount = sfinfo.channels;
    out_param.sampleFormat = paInt16;
    out_param.suggestedLatency = _GetDeviceInfo(out_param.device)->defaultLowOutputLatency;
    out_param.hostApiSpecificStreamInfo = (&wasapiInfo);

    err = Pa_OpenStream(&stream, NULL, &out_param, sfinfo.samplerate,
            paFramesPerBufferUnspecified, paClipOff,
            output_cb, file);

我错过了一步吗?

谢谢, 泰勒

1 个答案:

答案 0 :(得分:1)

您用于以独占模式运行流的技术对我有用。可能是您没有在WASAPI设备上打开流。根据您的系统配置,您也可以使用DirectSound和WMME设备。以下代码将验证索引deviceIndex引用的设备是否为WASAPI设备:

bool isWasapi = Pa_GetHostApiInfo(Pa_GetDeviceInfo(deviceIndex)->hostApi)->type == paWASAPI;

您还需要在out_param结构中指定相同的索引:

out_param.device = deviceIndex;

你做了几件我没做过的事情。在您的示例中,您尝试设置线程优先级,但PortAudio文档声明了以下行:

wasapiInfo.threadPriority = eThreadPriorityProAudio;

将无效,因为您未在paWinWasapiThreadPriority中设置wasapiInfo.flags位。根据相同的规则,不必将其他变量显式设置为null。要修复此集wasapiInfo.flags,请执行以下操作:

wasapiInfo.flags = (paWinWasapiExclusive|paWinWasapiThreadPriority)

这应启用独占模式并使threadPriority变量生效。