【发布时间】:2013-12-08 07:32:46
【问题描述】:
我有一个通过 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;
}
【问题讨论】: