AudioQueue 函数解析

原文:http://www.verydemo.com/demo_c134_i40117.html

在文章的开始出,总是先要对AudioQueue有一个总体的认识。

ios的AudioQueue,是一个可以录制和播放音频的对象,AudioQueue负责以下几方面的工作:

---连接音频硬件。

---管理内存。

---对需要解码的音频文件进行解码。

---调节(mediating)回放或录音的效果。

有了AudioQueue服务,我们可以播放 linear PCM文件、部分压缩文件(如aac等)、其他格式用户有解码器的文件;它还支持多个audioQueue的回放混合以及音频和视频的同步等。

 

Controlling Audio Queues包括:AudioQueueStart,AudioQueuePrime,AudioQueueFlush,

AudioQueueStop,AudioQueuePause,AudioQueueReset六个部分。

1,AudioQueueStart

函数功能:开始播放或者录制音频

函数原型:

OSStatus AudioQueueStart (
   AudioQueueRef inAQ,
   const AudioTimeStamp *inStartTime
);

参数解析:

inAQ:将要被启动的队列的实例.

inStartTime:这个音频队列实例开始的时间。如果需要指定一个时间的话,要根据AudioTimeStamp创建一个结构。如果这个参数传NULL的话,表明这个audioQueue队列应该尽快开启。(as soon as possible)】

调用实例:

XThrowIfError(AudioQueueStart(myInfo.mQueue, NULL), "AudioQueueStart failed");

 

2,AudioQueuePrime

函数功能:对已经进入AudioQueue中的缓冲进行解码,为回放做准备。

函数原型:

 OSStatus AudioQueuePrime (
   AudioQueueRef inAQ,
   UInt32 inNumberOfFramesToPrepare,
   UInt32 *outNumberOfFramesPrepared
);
参数解析:
inAQ:队列ID
inNumberOfFramesToPrepare:这个函数返回之前,需要解码是frames数。
outNumberOfFramesToPrepare:函数返回前实际解码的个数,如果不想关注这个信息,这个参数传入NULL就行。
调用实例:在使用这个函数时,一般有以下顺序:
---先调用 AudioQueueEnqueueBuffer
--- AudioQueuePrime
--- AudioQueueStart
 
3,AudioQueueFlush
函数功能:重新设置解码器的解码状态。
函数原型:
OSStatus AudioQueueFlush (
   AudioQueueRef inAQ
);
参数解析:
  这个函数的参数感觉没什么好解释的。
关于这个函数的讨论:
为了使所有进入audioQueue的数据都被处理,在最后一个音频缓冲进入音频队列后,调用这个函数可以使即将结束的audioQueue不会影响到后面的audioQueue。
  在AudioQueueStop之前调用AudioQueueFlush可以确保所有进入队列的数据都达到了目的地(意思是:被处理)。
 
4,AudioQueueStop
函数功能:
   停止播放或者录音。
函数原型:
OSStatus AudioQueueStop (
   AudioQueueRef inAQ,
   Boolean inImmediate
);
参数解析:
inAQ:将要被停止的音频队列的ID。
inImmediate:是否马上停止,如果传true的话,stop马上进行,即,是同步进行的。如果传flase,则是异步进行的,函数先返回,但是音频队列直到,队列中所有的的数据被录制或者回放完成才真正结束。
 
5,AudioQueuePause
函数功能:
暂停播放或者录制。
函数原型:
OSStatus AudioQueuePause (
   AudioQueueRef inAQ
);
参数解析:
inAQ:将要被暂停的音频队列。
关于这个函数的一点讨论:
对一个音频队列调用暂停,不会影响队列中已经有的buffers、也不会reset(重置)这个音频队列。如果要恢复播放或者录制,只需要调用:AudioQueueStart.
 
6,AudioQueueReset
函数功能:
重置一个音频队列。
 
函数原型:
OSStatus AudioQueueReset (
   AudioQueueRef inAQ
);
 
参数解析:
inAQ:将要被Reset的队列。
 
一点讨论:
  立马初始化一个音频队列,将队列中已有的buffers数据清空、重置解码器和数字化信息等、、、
posted @ 2014-06-15 22:06  程序熊  阅读(2258)  评论(0编辑  收藏  举报