返回首页

AAudio(3)

时间:2019-09-30 来源:原创/投稿/转载作者:管理员点击: 162

  优化缓冲区大小的一种方法是从较大的缓冲区开始,逐渐将其减小直至开始出现缓冲区不足现象,再稍稍将其调大。 此外,您也可以从较小的缓冲区大小开始,如果出现缓冲区不足现象,则增大缓冲区大小,直至输出再次流畅为止。

  这个过程推进速度很快,很可能在用户开始播放第一个音频前就已完成。 您可以先以静音执行初始缓冲区大小调整,确保用户不会听到任何音频干扰声。 随着时间推移,系统性能可能会有所变化(例如,用户可能会关闭飞行模式)。 因为缓冲区调整所产生的开销非常小,应用可以在对流读写数据的同时,连续不断地调整缓冲区。

  对于输入流来说,使用这种方法优化缓冲区大小并无益处。 输入流以尽可能快的速度运行,以尝试将缓存数据量保持在最低限度,然后在应用被抢占时填补缓冲区。

  如果您的应用从原始线程中读写音频数据,则可能会被抢占或遇到定时抖动, 进而可能引起音频干扰。 使用较大的缓冲区有助于避免此类干扰,但是如果缓冲区较大,音频延迟时间也会更长。 对于要求短延迟时间的应用,音频流可以使用一个异步回调函数,将数据传输到您的应用并从中传输数据。 AAudio 会在优先级较高的线程中执行该回调,这有助于改善性能。

  在最简单的情况下,流会定期执行该回调函数,以获取用于下一个脉冲串的数据。

  该回调函数不应对调用它的流执行读写操作。 如果该回调属于某个输入流,那么您的代码应处理在 audioData 缓冲区(指定为第三个参数)中提供的数据。 如果该回调属于某个输出流,那么您的代码应将数据放入该缓冲区。

  使用 AAudio 可以处理多个流。 您可将其中一个流用作主流,并在用户数据中传递指向其他流的指针。 针对主流******回调。 然后,对其他流使用非阻塞 I/O。 以下是将输入流传递到输出流的往返回调示例。 主调用流是输出流。 输入流包括在用户数据中。

  请注意,在此示例中,假定输入流和输出流的通道数量、格式和采样率均相同。 流的格式可以不匹配,只要代码正确处理转换即可。

  每个 AAudioStream 都具有性能模式,而这对应用行为的影响很大。 共有三种模式:

  如果在您的应用中较短延迟时间比节能更重要,请使用AAUDIO_PERFORMANCE_MODE_LOW_LATENCY。 这对交互性非常强的应用(例如游戏或键盘合成器)非常有用。

  如果在您的应用中节能比较短延迟时间更重要,请使用AAUDIO_PERFORMANCE_MODE_POWER_SAVING。 对于回放先前生成的音乐的应用(例如流式音频或 MIDI 文件播放器),情况通常如此。

【责任编辑:管理员】
随机推荐 更多>>