我正在使用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;
}
答案 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只需要很长时间才能在实时音频回调中完成。