我正在尝试使用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);
我错过了一步吗?
谢谢, 泰勒
答案 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
变量生效。