如果您能将音频数据转换为OpenAL所需的原始PCM格式,那么您就可以将其加载到ObjectAL中。
您需要的是:
- 音频数据
- 数据的字节大小
- 数据格式(AL_FORMAT_MONO16或AL_FORMAT_STEREO16)
- 采样率
您还需要一个ALSource来播放缓冲区。如果您与OALSimpleAudio一起使用(建议这样做,因为它会为您处理设备和上下文),则需要告诉它不要占用所有可用的源。
[OALSimpleAudio sharedInstance].reservedSources = 20
创建源代码(应在init中执行):
mySource = [[ALSource source] retain]
您可以按照以下方式使用自定义数据创建ALBuffer:
ALBuffer* myBuffer = [ALBuffer bufferWithName:someName
data:myAudioData
size:audioDataSizeInBytes
format:audioFormat
frequency:sampleRateInHz]
现在您可以玩:
[mySource play:myBuffer];
编辑:ALBuffer接管了音频数据的管理,并在其解除分配时调用free()。因此,请注意不要重复释放:)
编辑2:我刚刚为ALBuffer添加了“freeDataOnDestroy”属性,因此您现在可以控制它是否释放数据(默认为YES)。
编辑3:算了吧,既然已经走到这一步,那就彻底走下去吧。在OALSimpleAudio中添加了“playBuffer”方法。
所以现在您可以完全使用OALSimpleAudio:
myBuffer = [[ALBuffer bufferWithName:someName
data:myAudioData
size:audioDataSizeInBytes
format:audioFormat
frequency:sampleRateInHz] retain]
...
id<ALSoundSource> source = [[OALSimpleAudio sharedInstance] playBuffer:myBuffer
volume:1.0
pitch:1.0
pan:0
loop:NO]
[source pitchTo:2.0
duration:5.0
target:nil
selector:nil]
// And so on...
[[OALManager sharedInstance] bufferFromUrl:url reduceToMono:NO]
调用,它在内部使用了bufferWithName:data:size:format:frequency
。使用它来创建ALBuffer *
,然后使用playBuffer
方法。 - Courtney Christensen