我有一個程序可以通過Portaudio輸出音頻。它大部分都能正常工作,但有些USB設備使用內置的Windows USBAudio驅動程序無法工作。Portaudio不能使用一些USB音頻設備
我沒有收到任何錯誤,程序顯示正在我的程序中處理的數據,但是當音頻流發送到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;
}