Pa_GetStreamTime返回0次

时间:2016-10-03 22:57:57

标签: c++ qt portaudio

我正在使用PortAudio阅读音频wav文件。回调函数工作正常,文件正在Ubunto正常播放。问题是,当我尝试使用Pa_GetStreamTime获取时间,因为它返回0,我一直在阅读portaudio文档和示例,但我找不到解决问题的方法或至少使用该函数的示例。我浏览了API文档here,但还没有响铃。如果有人能提供提示,我将不胜感激。下面是回调函数发生的实现部分,我使用Qt作为我的最终目标是显示任何wav文件的FTT。提前谢谢。

int playAudio::patestCallback(const void *inputBuffer, void *outputBuffer,
                       unsigned long framesPerBuffer,
                       const PaStreamCallbackTimeInfo* timeInfo,
                       PaStreamCallbackFlags statusFlags,
                       void *userData)
{

    /* Cast data passed through stream to our structure. */
    //  data = (WAV*)userData;
    float *out = (float*)outputBuffer;
    (void) inputBuffer; /* Prevent unused variable warning. */

    /*terminates the stream flows and reset cursor.*/
    if (cursor == playAudio::SubChunk2Size / 4)
    {
        cursor = 0;
        return paComplete;
    }

    for (int i = 0; i < framesPerBuffer; i++)
    {
        if (cursor == playAudio::SubChunk2Size / 4) break; // breaks if samples reached last.
        *(out++) = pLeftChannel[cursor];
        *(out++) = pRightChannel[cursor];
        cursor++;

    }
    //  qDebug()<<cursor;
    playAudio::audioTime = Pa_GetStreamTime(stream);
    qDebug() << playAudio::audioTime;
    return paContinue;
}

1 个答案:

答案 0 :(得分:0)

引用the documentation以获取PortAudio音频回调:

  

在开始之前,了解回调是一个非常重要   精致的地方。这是因为某些系统在a中执行回调   特殊线程,或中断处理程序,它很少被处理   与其余代码相同。对于大多数现代系统,你不会成为现实   能够通过在回调中进行不允许的调用来导致崩溃,但是   如果您希望您的代码产生无故障音频,您将不得不这样做   确保你避免可能需要无限量的函数调用   时间执行。究竟是什么取决于您的平台,但   几乎肯定包括以下内容:记忆   分配/解除分配,I / O (包括文件I / O以及控制台   I / O,例如printf()),上下文切换(例如exec()或yield()),   互斥操作,或任何可能依赖于操作系统的操作。如果你   认为简短的关键部分是安全的请阅读优先权   反转。 Windows和Mac OS调度程序没有实时安全性   优先反转预防。其他平台需要特殊的互斥锁   标志。 此外,调用任何PortAudio API函数是不安全的   在回调中,除非在文档中明确允许。

强调我的。

换句话说,在回调中调用Pa_GetStreamTime()是未定义的行为。但是你不需要首先调用该函数。为什么?因为回调的第四个参数是PaStreamCallbackTimeInfo结构,其中包含您尝试访问的相同时序信息。

此外,qDebug电话可能会搞砸您的音频播放。写入stdout只需要很长时间才能在实时音频回调中完成。