OpenAL播放器使用

本文详细介绍了如何使用OpenAL播放PCM音频数据,包括初始化播放器、播放数据及释放资源的步骤。作者分享了在项目中遇到的设备获取、播放通道设置、数据转化等问题及其解决方案,并提醒读者注意播放器的缓存管理和延时控制,以避免程序崩溃和声音不连续。
摘要由CSDN通过智能技术生成

简介

本文主要介绍如何使用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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值