3

我正在尝试使用双簧管为音频系统编写缓冲区,注意事项是

回调注意事项和注意事项您永远不应该执行可能在内部阻塞的操作onAudioReady。阻塞操作的例子包括:

例如,使用malloc()或 new 分配内存;

文件操作,例如打开、关闭、读取或写入;

流媒体等网络操作;

使用互斥锁或其他同步原语 sleep

停止或关闭流

调用read()write()在调用它的流上

音频线程从我的缓冲区读取,解码器线程写入它,你可以想象它在线程问题出现之前一切都很好。我的主要问题是我可以使用互斥锁来解决这个问题,但如果我这样做,我会阻止一个线程,如果音频线程被阻塞,那么声音基本上不会播放,导致“爆米花”声音。(一种听着很烦人的声音)

我通过一个回调来播放声音,我将数据提供给它。

DataCallbackResult
OboeStreamCallback::onAudioReady(AudioStream *audioStream, void *audioData, int32_t numFrames) {
    // fill data here
    return DataCallbackResult::Continue;
}

所以我的主要问题是如何解决从音频线程读取数据也不阻塞音频线程以便它仍然可以播放音频的问题?

这对我来说听起来是不可能的。如果没有互斥锁,如何确保线程安全?双簧管如何期望您不使用互斥锁进行动态音频解码?

4

1 回答 1

2

您可以使用线程安全的无锁队列来读取/写入数据。这将避免对互斥体的需求,速度更快,并且应该解决您的“爆米花”问题。

可以在此处找到示例实现:https ://github.com/google/oboe/blob/master/samples/RhythmGame/src/main/cpp/utils/LockFreeQueue.h

于 2020-11-23T13:43:09.433 回答