错误代码错误

时间:2014-01-31 11:50:12

标签: c++ c portaudio

我正在使用portaudio播放声音。我希望能够通过UI选择输出。我这样做了:

PaError err = Pa_Initialize();
if( err != paNoError )
    return false;

qDebug() <<"Port audio succeed initialization !";

int numDevices;

numDevices = Pa_GetDeviceCount();
if( numDevices <= 0 )
{
    qDebug() << "ERROR: Pa_CountDevices returned " << numDevices;
    return false;
}

const PaDeviceInfo *deviceInfo;
bool isThereOutput = false;
int i = 0;
while(i < numDevices and !isThereOutput)
{
    deviceInfo = Pa_GetDeviceInfo( i );
    isThereOutput = (deviceInfo->maxOutputChannels > 0);
    i++;
}
if(!isThereOutput)
{
    qDebug() << "No output device";
    return false;
}

PaError errorOpening;

if(outputDevice != "")
{
    PaStreamParameters outputDeviceInfo;
    int numDevices = Pa_GetDeviceCount();

    const   PaDeviceInfo *deviceInfo;
    for(int i = 0; i<numDevices; i++ )
    {
        deviceInfo = Pa_GetDeviceInfo( i );
        if(deviceInfo->maxOutputChannels > 0 && deviceInfo->name == outputDevice)
        {
            outputDeviceInfo.device = i;
            outputDeviceInfo.channelCount = 1;
            outputDeviceInfo.sampleFormat = paInt8;
            outputDeviceInfo.suggestedLatency = deviceInfo->defaultLowOutputLatency;
        }
    }

    if(outputDeviceInfo.channelCount > 1)
    {
        errorOpening = Pa_OpenStream(&stream, NULL, &outputDeviceInfo, SAMPLE_RATE, FRAME_PER_BUFFER, paNoFlag, audioCallback, this);
    }

}

if(outputDevice == "" or errorOpening != paNoError)
{
    if(errorOpening != paNoError)
        qDebug() << "Can't open selected device ("<< outputDevice <<"), switching to the default one. Error : " << Pa_GetErrorText(errorOpening);
    errorOpening = Pa_OpenDefaultStream( &stream,
                      0,            /* no input channels */
                      1,            /* mono output */
                      paInt8,       /* 8 bits output */
                      SAMPLE_RATE,
                      FRAME_PER_BUFFER, /* frames per buffer, i.e. the number
                                              of sample frames that PortAudio will
                                              request from the callback. Many apps
                                              may want to use
                                              paFramesPerBufferUnspecified, which
                                              tells PortAudio to pick the best,
                                              possibly changing, buffer size.*/
                      audioCallback, /* this is your callback function */
                      this ); /*This is a pointer that will be passed to
                                                       your callback*/
}

if(errorOpening != paNoError)
    return false;

if(Pa_StartStream( stream ) != paNoError)
    return false;

它失败了:

  
    

无法打开所选设备(“Sortieintégr”),切换到默认设备。错误:错误代码无效(值大于零)

  

但我无法理解为什么OpenStream会因为奇怪的错误代码而失败,而Pa_OpenDefaultStream就像魅力一样。

所以:

  • 为什么会失败?
  • 为什么会抛出错误的错误代码?

1 个答案:

答案 0 :(得分:1)

我假设您使用C ++(尽管您的代码中有几个好奇的andor。)

如果您的for循环找不到满足PaDeviceInfo的任何eviceInfo->maxOutputChannels > 0 && deviceInfo->name == outputDevice,那么您的outputDeviceInfo un - 初始化。这意味着它的channelConnect可以包含任何值,包括大的负值。然后,系统不会调用Pa_OpenStream,您的errorOpening也会被取消 - 初始化。我敢打赌,当您将其Invalid error code (value greater than zero)提供给Pa_GetErrorText()时,这就是{{1}}的原因。