AAudio
发布时间:2019-09-26 发布者:文案编辑 来源:原创/投稿/转载

  AAudio 是在 Android O 版本中引入的全新 Android C API。 此 API 是专为需要低延迟的高性能音频应用而设计。 应用通过读取并将数据写入流来与 AAudio 进行通信。

  AAudio 在您的应用与 Android 设备的音频输入端及输出端之间移动音频数据。 您的应用通过读取和写入以 AAudioStream 结构表示的音频流来传入和传出数据。 这些读取/写入调用可以是阻塞式调用或非阻塞式调用。

  音频设备是硬件接口或虚拟端点,用作连续的数字音频数据流的来源或接收器。 请勿将音频设备(内置麦克风或蓝牙耳机)与运行应用的Android 设备(手机或智能手表)混淆。

  Android 设备上的每个音频设备都具有唯一 ID。 您可使用该 ID 将音频流与特定音频设备绑定。 但是,在大多数情况下,您可以让 AAudio 选择默认的主要设备,无需自己指定。

  连接到流的音频设备确定该流是用于输入还是输出。 流只能在一个方向上移动数据。 定义流时,您还可以设置其方向。 打开流时,Android 会执行检查,确保音频设备与流方向一致。

  表示该流对其音频设备进行独占访问;该设备不可供任何其他音频流使用。 如果音频设备已在使用当中,流可能无法对其进行独占访问。 独占流的延迟时间往往较短,但连接断开的可能性也较大。 如果不再需要独占流,应尽快予以关闭,以便其他应用访问该设备。 独占流可以最大限度缩短延迟时间。

  允许 AAudio 混合音频。 AAudio 会将分配给同一设备的所有共享流混合。

  您可以在创建流时明确设置共享模式。 默认情况下,共享模式为SHARED。

  AAudio 可以独立执行样本转换。 例如,如果应用写入 FLOAT 数据,但 HAL 使用 PCM_I16,AAudio 可以自动转换样本。 转换可以在任一方向上发生。 如果应用要处理音频输入,最好验证输入格式,做好必要时转换数据的准备,如以下示例所示:

  如果您未指定 deviceId,则默认为主要输出设备。 如果您未指定流方向,则会默认为输出流。 对于所有其他参数,您可明确设置值,也可以完全不指定参数或将其设置为AAUDIO_UNSPECIFIED,让系统指派最佳值。

  创建流之后,验证其配置。 如果您已指定样本格式、采样率或每帧采样数,则这些设置不会变更。 如果您已指定共享模式或缓冲区容量,这些设置可能会变更,具体取决于流的音频设备能力,以及运行该流的 Android 设备。 作为一种良好的防御性编程习惯,您应该先检查流的配置,然后再使用。 您可使用相应函数检索与每项构建器设置对应的流设置:

  AAudio 流一般有五种稳定状态(本节末将介绍错误状态 Disconnected):

  仅当流处于 Started 状态时,数据才会通过流来流动。 要转换流所处的状态,请使用以下其中一个请求转换状态的函数:

  这些函数是异步函数,因此状态不会立即变更。 当您请求变更状态时,流会进入相应的过渡状态,即以下状态之一:

  以下状态图将稳定状态显示为圆角矩形,而将过渡状态显示为虚线矩形。 尽管未显示,但您可从任意状态调用close()

  此函数本身并不会检测状态变更情况,也不会等待特定的状态, 而是等待当前状态不同于您指定的inputState。

  例如,请求暂停后,流应立即进入 Pausing 过渡状态,并在稍后某个时刻进入 Paused 状态,但不保证一定如此。 由于无法等待 Paused 状态,请使用waitForStateChange()来等待除 Pausing 之外的任何状态。 方法如下:

  如果流的状态并非 Pausing(即inputState,我们假定这就是当前执行调用时的状态),该函数会立即返回。 否则,函数会阻止运行,直至状态不再是 Pausing,或者超时。 当函数返回时,参数nextState会显示流的当前状态。

相关内容