`
jsntghf
  • 浏览: 2533216 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

OpenAL的简单示例

    博客分类:
  • iOS
阅读更多

首先,需要导入AudioToolbox.framework和OpenAL.framework。

 

OpenALViewController.h

 

#import <UIKit/UIKit.h>
#import <OpenAL/alc.h>

@interface OpenALViewController : UIViewController {
	ALCcontext *mContext;
	ALCdevice *mDevice;
	NSUInteger sourceID;
	NSUInteger bufferID;
	
	BOOL isPlaying;
}

- (IBAction)playPause:(id)sender;

@end

 

OpenALViewController.m

 

#import "OpenALViewController.h"
#import <AudioToolbox/AudioFile.h>
#import <OpenAL/al.h>

@implementation OpenALViewController

- (void)initOpenAL {
	mDevice = alcOpenDevice(NULL); 
	if (mDevice) {
		mContext = alcCreateContext(mDevice, NULL);
		alcMakeContextCurrent(mContext);
	}
}

- (AudioFileID)openAudioFile:(NSString *)filePath {
	AudioFileID outAFID;
	NSURL *afUrl = [NSURL fileURLWithPath:filePath];
    
#if TARGET_OS_IPHONE
	OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, kAudioFileReadPermission, 0, &outAFID);
#else
	OSStatus result = AudioFileOpenURL((CFURLRef)afUrl, fsRdPerm, 0, &outAFID);
#endif
	if (result != 0) NSLog(@"cannot open file: %@", filePath);
	return outAFID;
}

- (UInt32)audioFileSize:(AudioFileID)fileDescriptor {
	UInt64 outDataSize = 0;
	UInt32 thePropSize = sizeof(UInt64);
	OSStatus result = AudioFileGetProperty(fileDescriptor, kAudioFilePropertyAudioDataByteCount, &thePropSize, &outDataSize);
	if(result != 0) NSLog(@"cannot find file size");
	return (UInt32)outDataSize;
}

- (void)cleanUpOpenAL {
	alDeleteSources(1, &sourceID);
	alDeleteBuffers(1, &bufferID);
	alcDestroyContext(mContext);
	alcCloseDevice(mDevice);
}

- (IBAction)playPause:(id)sender {
	UIButton *btnPlay = (UIButton *)sender;
	if(!isPlaying) {
		alSourcePlay(sourceID);
		isPlaying = YES;
		[btnPlay setTitle:@"Pause" forState:UIControlStateNormal];
	} else {
		alSourceStop(sourceID);
		isPlaying = NO;
		[btnPlay setTitle:@"Play" forState:UIControlStateNormal];
	}
}

#pragma mark -

- (void)viewDidLoad {
    [super viewDidLoad];
	
	isPlaying = NO;		
	
	[self initOpenAL];
    
	NSString *fileName = [[NSBundle mainBundle] pathForResource:@"outSound" ofType:@"caf"];
	AudioFileID fileID = [self openAudioFile:fileName];
	UInt32 fileSize = [self audioFileSize:fileID];
    
	unsigned char *outData = malloc(fileSize);
	OSStatus result = noErr;
	result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData);
	AudioFileClose(fileID); 
	
	if (result != 0) NSLog(@"cannot load effect: %@", fileName);
    
	alGenBuffers(1, &bufferID);
	alBufferData(bufferID, AL_FORMAT_STEREO16, outData, fileSize, 8000); 
	alGenSources(1, &sourceID); 
	alSourcei(sourceID, AL_BUFFER, bufferID);
	alSourcef(sourceID, AL_PITCH, 1.0f);
	alSourcef(sourceID, AL_GAIN, 1.0f);
	alSourcei(sourceID, AL_LOOPING, AL_TRUE);
    
	if (outData) {
		free(outData);
		outData = NULL;
	}
}

- (void)dealloc {
	[self cleanUpOpenAL];
    [super dealloc];
}

@end
分享到:
评论

相关推荐

    openal教程 3d音效

    下面是一段简单的OpenAL示例代码,展示了如何加载和播放音频文件: ```c #include #include #include #include #include #include ALuint Buffer; // 存储声音数据 ALuint Source; // 用于播放声音 int ...

    openal 1.1 sdk

    4. **示例程序**:提供了一些简单的应用实例,展示了如何使用OpenAL API创建和播放音频,是学习OpenAL API的好起点。 5. **文档**:可能包含API参考手册、教程和最佳实践指南,帮助开发者理解OpenAL的工作原理和...

    openal_test

    OpenAL_test这个项目显然是一个使用OpenAL进行音频处理的示例程序。 OpenAL的核心概念包括源(Sources)、缓冲区(Buffers)和上下文(Context)。源是音频数据的发射器,缓冲区用于存储音频数据,而上下文则是...

    OpenAL流畅播放封装类

    演示部分通常会包含一个简单的示例程序,展示如何实例化该类、加载音频文件、播放音频以及处理其他交互。这个例子对于开发者来说非常有价值,因为它能让他们快速了解如何在自己的项目中使用这个类。 总之,这个...

    ios应用源码之两个openal例子,网上找的,共享一供学习19_22495_5075

    1. **基本播放示例**:演示如何加载音频文件并简单播放,可能包括缓冲区的创建、源的配置以及播放控制。 2. **3D音频示例**:展示如何实现3D音效,包括声音的位置移动、距离衰减等,可能使用到`alListener`接口来...

    OpenAL+ALUT安装包

    在编程时,你可以通过以下示例代码来体验OpenAL和ALUT的基本用法: ```c #include #include #include int main(int argc, char* argv[]) { ALUTInit(&argc, argv); ALCdevice* device = alcOpenDevice(NULL);...

    test_openal.zip_openAL

    通过“test_openal.zip”中的简单实现,我们可以了解OpenAL的基本操作流程,并在此基础上探索更复杂的音频编程技术。理解并熟练掌握OpenAL,将为游戏和多媒体应用带来更加生动和真实的听觉体验。

    ios应用源码之两个openal例子,网上找的,共享一供学习openaltest 2018127

    第一个例子可能涉及到创建一个简单的音频播放器,展示如何加载音频文件到OpenAL缓冲区,然后使用OpenAL的源对象来播放这些缓冲区。开发者可能会遇到以下概念: 1. **音频格式转换**:OpenAL可能不直接支持所有音频...

    IOS应用源码——两个OPENAL例子,网上找的,共享一供学习OpenAlTest.rar

    Apple的AudioToolbox框架集成了OpenAL,使得在Objective-C或Swift项目中使用OpenAL变得简单。 3. **OpenAL基本概念**: - **音频源(Sources)**:OpenAL中的音频源代表声音的发生点,可以控制其音量、位置、速度...

    OpenAL的ALUT工具包使用指南中文注释版

    - **延迟**:`alutSleep`提供了一个简单的睡眠功能,可用于控制程序的执行速度。 #### 四、ALUT的宏与命名约定 - **宏命名**:ALUT为预处理器宏保留了“ALUT_”前缀,这意味着用户定义的宏不应使用该前缀。 - **...

    cl-openal:OpenAL 音频库的通用 Lisp 绑定

    从 C 绑定到 lispy 绑定的转换非常简单,本质上遵循 cl-opengl 的示例。 加载中 cl-openal 依赖于 CFFI 来加载。 它分为三个独立的系统:用于基本 OpenAL 绑定的 cl-openal、用于 ALC 的 cl-alc 和用于 ALUT 的 cl-...

    射击游戏示例.rar

    4. **物理引擎**:尽管这是一个简单的射击游戏示例,可能没有复杂的物理模拟,但至少会有一些基础的碰撞检测和响应机制。开发者可能使用自定义的简单算法或者预封装的库如Box2D来处理这部分。 5. **游戏循环**:...

    vopenal:V包装器到OpenAL

    【vOpenAL: V语言与OpenAL的交互接口】 ...总之,vOpenAL为V语言开发者提供了与OpenAL的无缝集成,让音频处理变得简单而高效。结合V语言的性能和易用性,开发者可以创造出更加生动且沉浸式的3D音频应用。

    类似抢滩登陆界面的VC++游戏引擎及示例

    游戏以其独特的2D视角和简单的操作方式吸引了大量玩家。在VC++环境中,我们可以利用DirectX或OpenGL等图形库来实现这样的3D游戏场景。 VC/C++源码是微软的C++编译器所使用的代码格式,开发者可以借此深入了解游戏...

    joamp第一课显示一个黑黑的窗口

    描述中提到的“joamp示例第一课源码”是一个教学资源,包含了一个简单的Java程序,这个程序在运行时会打开一个黑色的窗口,这是OpenGL应用程序常见的初始画面,因为默认情况下它并不绘制任何内容。这个源码文件可能...

    简单的C++游戏代码

    在压缩包中的“游戏代码示例”中,我们可以期待找到上述部分或全部概念的实际应用。通过阅读和分析这些代码,初学者可以逐步理解游戏开发的各个环节,并通过实践提升编程技能。同时,这也是一个很好的机会去了解如何...

    一个RPG游戏源代码(带示例)

    《一个RPG游戏源代码(带示例)》 在这个资源包中,包含了一个RPG(角色扮演游戏)的游戏源代码,对于想要学习游戏开发,尤其是RPG类型游戏开发的编程爱好者来说,这是一个非常宝贵的参考资料。RPG游戏以其丰富的剧情...

    语音播报 简单例子(源码)

    本示例“语音播报简单例子(源码)”提供了一个实现语音播报功能的源代码,这通常是通过集成特定的语音合成引擎来完成的。 源代码通常包括一个或多个文件,这些文件构成了程序的各个部分,例如主程序、配置文件、接口...

    reinforcement-learning-kr-v2:[使用Python和Keras进行强化学习] TensorFlow 2.0修订示例

    所需的库(依赖项) Python 3.6 Tensorflow 2.1.0 numpy的1.17.0 体育馆0.16.0 枕头6.1.0 Matplot 3.1.1 scikit图像0.15.0安装要求pip install -r requirements.txt目录Grid World-在相对简单的环境Grid World中奠定...

    好例子网_openTKdemo.zip

    示例可能会展示如何画出简单的几何形状,如三角形或矩形。 3. **着色器使用**:现代OpenGL不再依赖固定功能管道,而是使用可编程的着色器进行渲染。OpenTK允许加载和使用顶点着色器、片段着色器,这些着色器可以...

Global site tag (gtag.js) - Google Analytics