使用 AAudio 可以处理多个流。 您可将其中一个流用作主流,并在用户数据中传递指向其他流的指针。 针对主流******回调。 然后,对其他流使用非阻塞 I/O。 以下是将输入流传递到输出流的往返回调示例。 主调用流是输出流。 输入流包括在用户数据中。
请注意,在此示例中,假定输入流和输出流的通道数量、格式和采样率均相同。 流的格式可以不匹配,只要代码正确处理转换即可。
每个 AAudioStream 都具有性能模式,而这对应用行为的影响很大。 共有三种模式:
如果在您的应用中较短延迟时间比节能更重要,请使用AAUDIO_PERFORMANCE_MODE_LOW_LATENCY。 这对交互性非常强的应用(例如游戏或键盘合成器)非常有用。
如果在您的应用中节能比较短延迟时间更重要,请使用AAUDIO_PERFORMANCE_MODE_POWER_SAVING。 对于回放先前生成的音乐的应用(例如流式音频或 MIDI 文件播放器),情况通常如此。
在当前版本的 AAudio 中,为了尽量减少延迟时间,您必须将AAUDIO_PERFORMANCE_MODE_LOW_LATENCY性能模式与高优先级回调配合使用。 请参阅以下示例:
就线程安全而言,AAudio API 并非完全如此。 部分 AAudio 函数不能同时从多个线程中并行调用。 这是因为 AAudio 避免使用互斥体,而互斥体可能会导致线程抢占和干扰。
为确保安全,请勿从两个不同线程中调用AAudioStream_waitForStateChange()或者读写同一个流。 同样地,请勿在一个线程中关闭流,同时在另一个线程中读写流。
注:当流使用回调函数时,从回调线程中执行读/写,同时从运行流的线程中关闭流并无安全问题。
如需了解使用 OpenSL ES 来尽量减少输出延迟时间并避免音频干扰的详细信息,请参阅简单合成。