У меня есть программа, которая выводит аудио через Portaudio. Он работает по большей части, но есть некоторые USB-устройства, которые используют встроенные драйверы USB-USB Windows, которые не работают.Portaudio не работает с некоторыми аудиоустройствами USB
У меня нет ошибок, и программа показывает данные, обрабатываемые в моей программе, но когда аудиопоток отправляется на portaudio, звук с USB-устройства не выводится. Кажется, что portaudio не инициализирует устройство и поэтому не может отправить ему поток данных.
Некоторые USB-устройства будут работать на одном USB-порту, но когда я переведу его на другой порт USB на том же компьютере, это не сработает.
Другие устройства USB не будут работать на любом USB-порту.
Однако все устройства USB прекрасно работают при выводе звука из других программ или при использовании тестового аудиовыхода Windows.
Я не могу понять, почему некоторые 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;
}