Portaudio无法使用某些USB音频设备

时间:2013-11-23 11:01:15

标签: windows usb portaudio

我有一个通过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;
}

1 个答案:

答案 0 :(得分:0)

看起来你正在以共享模式打开蒸汽。您必须使用API​​特定参数显式设置steam以使用独占模式。

This post should demonstrate the correct syntax.

您可以通过修改Windows设备设置以匹配您的流设置来验证这一点。如果设置匹配,您应该能够打开设备并成功传输到设备。

如果您查询设备以获取默认采样率和类型,则可以将设备保留为共享模式。在共享模式下,您只能使用默认设置打开设备。

MSDN article on exclusive streams