博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
oalTouch (OpenAL的一个应用)
阅读量:6215 次
发布时间:2019-06-21

本文共 3002 字,大约阅读时间需要 10 分钟。

程序名:oalTouch (OpenAL的一个应用)

功能
通过AVAudioPlayer播放背景音乐,通过OpenAL播放自定音乐,其中自定音乐可播放、暂停,当两个音乐同时播放时可实现混音效果。(我去掉了重力检测和AudioSession两个非主要功能)
实现步骤
直接调用AVAudioPlayer播放音乐较为简单:

  1. 通过AVAudioPlay的init方法设定音乐文件的路径
  2. 通过其play方法播放背景音乐
复制代码

使用openAL播放音乐实现步骤较为烦琐,此处由于用OpenAL播放的只有一个音乐,去掉了创建Session的内容。

  1. 得到设备device
  2. 创建一块设备的音频存储空间context
  3. 把音频数据data添加到缓存buffer中
  4. 把缓存buffer附加到数据源source中
  5. 播放数据源source

关键代码

一、AVAudioPlayer播放音乐

1        NSURL *bgURL = [[NSURL alloc] initFileURLWithPath: [[NSBundle mainBundle] pathForResource:@"background" ofType:@"m4a"]]; 2         bgPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:bgURL error:nil]; 3         bgPlayer.numberOfLoops = -1;        // infinite loop 4         if (bgPlayer) {
5 [bgPlayer play]; 6 }

二、OpenAL

1. 初始化设备device和音频存储空间context

1 -(void)initOpenAL  2 {
3 // Initialization 4 mDevice = alcOpenDevice(NULL); // select the "preferred device" 5 if (mDevice) {
6 // use the device to make a context 7 mContext = alcCreateContext(mDevice,NULL); 8 // set my context to the currently active one 9 alcMakeContextCurrent(mContext); 10 } 11 }

 

2. 得到音乐文件长度

1 -(AudioFileID)openAudioFile:(NSString*)filePath        // 给出文件路径调用此方法得到fileID  2 {
3 AudioFileID outAFID; 4 // use the NSURl instead of a cfurlref cuz it is easier 5 NSURL * afUrl = [NSURL fileURLWithPath:filePath]; 6 7 // do some platform specific stuff.. 8 OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, kAudioFileReadPermission, 0, &outAFID); 9 if (result != 0) NSLog(@"cannot openf file: %@",filePath); 10 return outAFID; 11 } 12 -(UInt32)audioFileSize:(AudioFileID)fileDescriptor // 给出fileID调用此方法,得到fileSize 13 {
14 UInt64 outDataSize = 0; 15 UInt32 thePropSize = sizeof(UInt64); 16 OSStatus result = AudioFileGetProperty(fileDescriptor, kAudioFilePropertyAudioDataByteCount, &thePropSize, &outDataSize); 17 if(result != 0) NSLog(@"cannot find file size"); 18 return (UInt32)outDataSize; 19 }

 

3. 得到音乐数据

1         unsigned char * outData = malloc(fileSize); 2         // this where we actually get the bytes from the file and put them 3 // into the data buffer 4         OSStatus result = noErr; 5         result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData); 6         AudioFileClose(fileID); //close the file

 

4. 得到缓存buffer

1        alGenBuffers(1, &bufferID); 2         // jam the audio data into the new buffer 3 // 16位立体声格式,8k采样频率 4         alBufferData(bufferID, AL_FORMAT_STEREO16, outData, fileSize, 8000);

 

5. 得到数据源source

1        alGenSources(1, &sourceID); 2         // attach the buffer to the source 3         alSourcei(sourceID, AL_BUFFER, bufferID); 4         // loop the sound 5         alSourcei(sourceID, AL_LOOPING, AL_TRUE);

程序效果

背景音乐播放的是一个进行曲
按Play/Pause可播放或暂停自己的音乐文件(一个bubble声)
附件
附件中的项目OpenALTest实现了oalTouch中的主要功能,大家可以下载源码看看

 

转载地址:http://cwpja.baihongyu.com/

你可能感兴趣的文章
jsp页面的html代码显示不出来,提示Uncaught SyntaxError: Unexpected token <
查看>>
linux下修改tomcat使用的jdk版本
查看>>
mac ssh 连接超时
查看>>
Duplicate modifier for the method isExist in type UploadMusicInfoController
查看>>
LightOJ 1277 Looking for a Subsequence(LIS)
查看>>
用C读取json文件
查看>>
IIS负载均衡-Application Request Route详解第四篇:使用ARR实现三层部署架构
查看>>
在ASP.NET非MVC环境中(WebForm中)构造MVC的URL参数,以及如何根据URL解析出匹配到MVC路由的Controller和Action...
查看>>
二叉树的建树,按层遍历,结点总数,页结点,深度以及三序非递归遍历二叉树,建立中序线索二叉树...
查看>>
Linux 内核动态函数调用可视化工具
查看>>
MySQL性能优化
查看>>
log4cplus使用
查看>>
正确的使用枚举(Enum)
查看>>
Web API应用架构设计分析(1)
查看>>
Java时间操作(一):关于UTC格式时间处理
查看>>
威佐夫博弈模板
查看>>
mysql show variables系统变量详解
查看>>
JAVASCRIPT中的THIS指向问题
查看>>
c语言中使用宏,需要注意的的几点
查看>>
公钥,私钥和数字签名这样最好理解
查看>>