音频预热

音频预热是指设备中的音频放大器电路完全通电并达到正常工作状态所需的时间。音频预热时间的主要影响因素是电源管理和用于稳定电路的任何“消噗”逻辑。

本文档介绍了如何测量音频预热时间以及减少预热时间的可能方法。

测量输出预热

AudioFlinger 的 FastMixer 线程会自动测量输出预热时间,并将其作为 dumpsys media.audio_flinger 命令输出的一部分进行报告。在预热期间,FastMixer 会重复调用 write(),直到两次 write() 之间的时间达到预期值。FastMixer 通过查看硬件抽象层 (HAL) write() 需要多长时间才能稳定来确定音频预热时间。

要测量音频预热时间,请在启动后不同的时间,对内置扬声器和有线耳机执行以下步骤。对于每个输出设备以及设备启动后,预热时间通常是不同的

  1. 确保已启用 FastMixer。
  2. 通过在设备上选择设置 > 声音 > 触摸提示音来启用触摸提示音。
  3. 确保音频已关闭至少三秒钟。五秒或更长时间更好,因为硬件本身可能具有超出 AudioFlinger 三秒钟的电源逻辑。
  4. 按主屏幕按钮,您应该听到咔哒声。
  5. 运行以下命令以接收测量的预热时间
    adb shell dumpsys media.audio_flinger | grep measuredWarmup
    

    您应该看到如下输出

    sampleRate=44100 frameCount=256 measuredWarmup=X ms, warmupCycles=X
    

    measuredWarmup=X 是第一组 HAL write() 完成所花费的 X 毫秒数。

    warmupCycles=X 是在 write() 的执行时间与预期值匹配之前所需的 HAL 写入请求数。

  6. 进行五次测量并记录所有测量值以及平均值。如果它们并非都大致相同,则可能是某个测量值不正确。例如,如果您在音频关闭后等待的时间不够长,您将看到比平均值低的预热时间。

测量输入预热

目前没有提供用于测量音频输入预热的工具。但是,可以通过观察 startRecording() 返回所需的时间来估算输入预热时间。

减少预热时间

通常可以通过以下组合来减少预热时间

  • 良好的电路设计
  • 内核设备驱动程序中的精确时间延迟
  • 并行而不是顺序执行独立的预热操作
  • 保持电路通电或不重新配置时钟(增加空闲功耗)
  • 缓存计算参数

但是,请注意过度优化。您可能会发现需要在低预热时间和电源转换时避免爆音之间进行权衡。