【问题标题】:Portaudio not working with some USB Audio devicesPortaudio 不适用于某些 USB 音频设备
【发布时间】: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;
}

【问题讨论】:

    标签: windows usb portaudio


    【解决方案1】:

    您似乎正在以共享模式打开 Steam。您必须通过 API 特定参数显式设置 Steam 以使用独占模式。

    This post should demonstrate the correct syntax.

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

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

    MSDN article on exclusive streams

    【讨论】:

      猜你喜欢
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 2012-10-26
      • 1970-01-01
      • 2019-11-10
      相关资源
      最近更新 更多