简介
本文主要介绍如何使用OpenAL进行PCM数据的播放,文中会讲解我在项目中遇到的问题以及如何解决的,对于什么是采样率等基本知识,在此不做介绍。
OpenAL有使用手册,具体的API作用,可以自己进行查阅。
刚进公司,就被分配来做一个项目,项目是接收胎心仪蓝牙传输的数据,进行实时绘制胎心率曲线和实时播放胎心音,其中播放胎心音我使用的便是OpenAL。
先上代码:
OGOpenAL.h
#import <OpenAL/al.h>
#import <OpenAL/alc.h>
#import <UIKit/UIKit.h>
#define AUDIO_SIMPLE_RATE 8000//采样率
#define SOUND_SAMPLES AL_FORMAT_MONO8//声道,8位
//最大缓存个数,如果数据缓存多余MAX_BUFFERS时,数据不加载,抛弃掉。解决延时问题
#define MAX_BUFFERS 13
@interface OGOpenAl : NSObject {
//内容,相当于给音频播放器提供一个环境描述
ALCcontext *m_Context;
//硬件,获取电脑或者ios设备上的硬件,提供支持
ALCdevice *m_Device;
//音源,相当于一个ID,用来标识音源
ALuint m_sourceID;
//线程锁
NSCondition *m_DecodeLock;
}
//初始化播放器
-(BOOL)initOpenAl;
//连续传入PCM音频数据的方法
-(void)openAudio:(NSData *)data length:(UInt32)pLength;
//停止播放
-(void)stopSound;
//释放播放器占用
-(void)clearOpenAL;
@end
OGOpenAL.m
#import "OGOpenAl.h"
#import <AVFoundation/AVFoundation.h>
@implementation OGOpenAl
-(BOOL)initOpenAl {
NSLog(@"初始化播放器");
if (m_Device ==nil) {
//参数为NULL , 让ALC 使用默认设备,默认一个只能指定一个设备,多次指定会一直返回NULL,导致下面m_Device为nil
m_Device = alcOpenDevice(NULL);
}
if (m_Device==nil) {
//注:执行clearOpenA