返回首页

AAudio(2)

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

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

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

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

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

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

  对于传输指定帧数的阻塞读取或写入操作,请将 timeoutNanos 设置为大于零。 对于非阻塞调用,请将 timeoutNanos 设置为零。 在这种情况下,结果将是传输的实际帧数。

  读取输入值时,您应验证是否已读取正确数量的帧。 如果并非如此,则缓冲区可能包含未知的数据,从而引起音频干扰。 您可以在缓冲区中填入零,以产生静音效果:

  您可以先准备好流的缓冲区,再通过将数据写入或静音写入其中来启动流。 此操作必须在 timeoutNanos 设置为零的情况下,通过非阻塞调用来完成。

  流断开连接后,其状态为“Disconnected”,任何尝试执行 write() 或其他函数的操作都会返回AAUDIO_ERROR_DISCONNECTED。 流断开连接后,您只能将其关闭。

  回调应检查流的状态,如以下示例所示。 您不应从回调中关闭或重新打开流,而应使用另一个线程。 请注意,如果打开新的流,其特征可能与原始流不同(例如,framesPerBurst):

  您可以通过调整内部缓冲区,以及使用特殊的高优先级线程,优化音频应用的性能。

  AAudio 会将数据传入其维护的内部缓冲区,并从中传出数据(每个音频设备各有一个内部缓冲区)。

  注:请勿将 AAudio 的内部缓冲区与 AAudio 流读写函数的缓冲区参数混淆。

  应用不必使用缓冲区的全部容量。 您可以设置 AAudio 填充缓冲区的大小上限。 缓冲区大小不得超过其容量,而且通常较小。 您可以通过控制缓冲区大小,确定填充缓冲区所需的脉冲串数,从而控制延迟时间。 您可使用AAudioStreamBuilder_setBufferSizeInFrames()和AAudioStreamBuilder_getBufferSizeInFrames()方法来处理缓冲区大小。

  应用播放音频时,会将数据写入缓冲区并阻止运行,直至写入完成。 AAudio 以离散的脉冲串从缓冲区中读取数据。 每个脉冲串都包含多个音频帧,而且通常小于所读取的缓冲区大小。 脉冲串的大小及速率由系统控制,而这些属性通常由音频设备的电路指定。 虽然您无法更改脉冲串的大小或速率,但可根据内部缓冲区所含的脉冲串数量来设置内部缓冲区大小。 通常,当 AAudioStream 的缓冲区大小是所报告脉冲串大小的倍数时,延迟时间最短。

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