1

我正在尝试使用 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);

我错过了一步吗?

谢谢,泰勒

4

1 回答 1

1

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

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

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

out_param.device = deviceIndex;

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

wasapiInfo.threadPriority = eThreadPriorityProAudio;

将无效,因为您没有paWinWasapiThreadPrioritywasapiInfo.flags. 根据相同的规则,没有必要将其他变量显式设置为 null。要修复此集wasapiInfo.flags,如下所示:

wasapiInfo.flags = (paWinWasapiExclusive|paWinWasapiThreadPriority)

这应该启用独占模式并导致threadPriority变量生效。

于 2013-05-25T19:17:06.913 回答