2016-10-03 78 views
0

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

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; 
} 

回答

0

引述the documentation为PortAudio音频回调:

在我们开始之前,我们需要认识到的回调是一个 微妙的地方是很重要的。这是因为有些系统在 特殊线程或中断处理程序中执行回调,并且很少将其作为其余代码处理 。对于大多数现代的系统,你不会 能够通过回调使得不允许调用导致崩溃,但 如果你希望你的代码产生无干扰的音频,你将不得不 确保你避免函数调用可能采取无限的时间来执行。究竟这些取决于你的平台,但 几乎肯定包括以下内容:内存 分配/取消分配,I/O (包括文件I/O以及控制台 I/O,如printf()),上下文切换(例如exec()或yield()),互斥操作或任何其他可能依赖于操作系统的操作。如果你认为短临界区域是安全的,请阅读 优先反演。 Windows和Mac OS调度程序没有实时安全 优先反转预防功能。其他平台需要特殊的互斥体 标志。 此外,在回调中调用任何PortAudio API函数 并不安全,除非文档中明确允许。

强调我的。

换句话说,从回调中调用Pa_GetStreamTime()是不确定的行为。但是你并不需要首先调用这个函数。为什么?因为回调的第四个参数是一个PaStreamCallbackTimeInfo结构,它包含您尝试访问的非常相同的时间信息。

此外,该qDebug通话可能会搞砸了你的音频播放。写入stdout只需要很长时间就可以完成实时音频回调。

+0

谢谢,的确,我试过了结构PaStreamCall ......以前,因为我不想惹的回调函数,但在currentTime的成员,我得到0;使用outputBufferDACtime我可以看到数据时间,但不知道如何处理,我把它们加起来,但结果没有意义,所以尝试Pa_getStreamTime给我使用currentTime时相同的结果。关于qDebug你是对的,在我的情况下是不给的问题,最终会被删除。如果您可以使用portaudio共享信息并获取时间或知道如何处理来自timeInfo.OutputBufferDACTime的数据。 – luffyKun