我有一个通过Portaudio输出音频的程序。它在大多数情况下都有效,但有些USB设备使用内置的Windows USBAudio驱动程序无法正常工作。
我没有收到任何错误,程序显示我的程序中正在处理的数据,但是当音频流发送到portaudio时,USB设备没有声音输出。好像portaudio没有初始化设备,因此无法将数据流发送给它。
有些USB设备可以在一个USB端口上运行,但是当我将它移动到同一台计算机上的另一个USB端口时,它将无法工作。
其他USB设备无法在任何USB端口上运行。
但是,从其他程序输出声音或使用Windows测试音频输出时,所有USB设备都能正常工作。
我无法弄清楚为什么有些USB设备可以正常工作而其他设备无法使用;即使它们都使用相同的USB驱动程序也是如此。
以下是启动portaudio流的代码部分:
static int paPlayCallback( const void *inputBuffer, void *output,
unsigned long framesPerBuffer,
const PaStreamCallbackTimeInfo* timeInfo,
PaStreamCallbackFlags statusFlags,
void *userData ){
if(Out2){
int sz= Out2->Size();
if(sz>QUEUE_SIZE)start=1;
if(sz==0){
for(int i=0;i<10;i++)
averagePower[i]= 0.0;
start=0;
}
if(start){
printf("Output queue size %d\n",sz);
while(sampleCount<OUT_BUF_SIZE)
sampleCount+= AddBuffer();
Resample((float*)output, l,r,framesPerBuffer,dev.parameters.channelCount);
DelBuffer();
return paContinue;
}
}
memset(output,0, framesPerBuffer*dev.parameters.channelCount*4);
return paContinue;
}
static void StreamFinished( void* userData )
{
// exit(-1);
}
BOOL Play(int device){
dev.info = Pa_GetDeviceInfo( device );
dev.parameters.device = device;
dev.parameters.channelCount = dev.info->maxOutputChannels;
dev.parameters.sampleFormat = paFloat32;
if((dev.sampleRate = GetSampleRate(&dev.parameters))<=0){
fprintf(stderr,"Error: Bad output device sample rate.\n");
goto error;
}
int frameSize= (int)floor(dev.sampleRate/FPS);
PaError err;
do{
err= Pa_OpenStream(
&dev.stream,
NULL,
&dev.parameters,
dev.sampleRate,
frameSize,
paClipOff,
paPlayCallback,
0);
if(err ){
fprintf(stderr,"Error: Can't open %s in WASAPI exclusive mode.\n",dev.info->name);
}
}while(err != paNoError );
error_check(Pa_SetStreamFinishedCallback( dev.stream, &StreamFinished ));
error_check(Pa_StartStream( dev.stream ));
return TRUE;
error:
return FALSE;
}
答案 0 :(得分:0)
看起来你正在以共享模式打开蒸汽。您必须使用API特定参数显式设置steam以使用独占模式。
This post should demonstrate the correct syntax.
您可以通过修改Windows设备设置以匹配您的流设置来验证这一点。如果设置匹配,您应该能够打开设备并成功传输到设备。
如果您查询设备以获取默认采样率和类型,则可以将设备保留为共享模式。在共享模式下,您只能使用默认设置打开设备。