AudioQueue是Mac
OS X与iPhone中提供录音、播放功能的高级框架,比AudioUnit等框架更方便,而且不要求掌握更多专门的知识。
从AudioQueue的名称就可以看出,AudioQueue框架以队列的形式处理音频数据。因此使用时需要给队列分配缓存空间,由回调(Callback)函数完成向队列缓存读写音频数据的功能。另外,AudioQueue是AudioToolbox框架的一部分,使用前需要将AudioToolbox框架导入进来。
使用AudioQueue来实现音频播放功能时最主要的步骤,可以更简练的归纳如下。
1.
2.
3.
4.
5.
6.
以下是贯彻上述六个主要步骤的代码实例,只需要向[play:]中传入音频文件的路径就可以开始音频播放。稍加修改可以直接应用到自己的程序中。
Source
#import <Foundation/Foundation.h>
#import <AudioToolbox/AudioToolbox.h>
#import <AudioToolbox/AudioFile.h>
#define NUM_BUFFERS 3
@interface AudioPlayer : NSObject {
}
//定义队列为实例属性
@property AudioQueueRef queue;
//播放方法定义
- (void) play:(CFURLRef) path;
//定义缓存数据读取方法
- (void) audioQueueOutputWithQueu
//定义回调(Callback)函数
static void BufferCallback(void *inUserData, AudioQueueRef inAQ,
buffer);
//定义包数据的读取方法
- (UInt32)readPacketsIntoBuffer:(AudioQueueBufferRef)buffer;
@end
Source Audioplay.m
static UInt32 gBufferSizeBytes = 0x10000;
@implementation AudioPlayer
@synthesize queue;
//
static void BufferCallback(void *inUserData, AudioQueueRef inAQ,
queueBuffer:buffer];
}
//初始化方法(为NSObject中定义的初始化方法)
- (id) init {
}
//缓存数据读取方法的实现
- (void) audioQueueOutputWithQueu
{
= numPacketsToRead;
NO, &numBytes, packetDescs,
&numPackets, audioQueueBuffer->mAudioData);
audioQueueBuffer, numPackets, packetDescs);
}
//音频播放方法的实现
-(void) play:(CFURLRef) path {
maxPacketSize;
&dataFormat);
nil, nil, 0, &queue);
&size, &maxPacketSize);