【问题标题】:IOS/OpenAl Sound InterferenceIOS/OpenAl 声音干扰
【发布时间】:2011-10-12 13:30:28
【问题描述】:

我是 Objective - C 的新手...

我找到了如何使用 OpenAl 的源代码,复制它然后测试,但播放声音时受到干扰。你能看一下代码并说出什么是错的吗?

ALCcontext *context = NULL;
ALCdevice *device = alcOpenDevice(NULL);
if (device)
{
    context = alcCreateContext(device, NULL);
    alcMakeContextCurrent(context);
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"sound" ofType:@"caf"];

AudioFileID fileID = 0;
NSURL *url = [NSURL fileURLWithPath:path];

OSStatus result = AudioFileOpenURL((CFURLRef)url, kAudioFileReadPermission, 0, &fileID);
if (result != 0)
    NSLog(@"Faild to load file at path:%@",path);

UInt32 fileSize = 0;
UInt32 propSize = sizeof(UInt64);

OSStatus result1 = AudioFileGetProperty(fileID, kAudioFilePropertyAudioDataByteCount, &propSize, &fileSize);
if (result1 != 0)
    NSLog(@"Cannot get size of file!");

unsigned char *buffer = malloc(fileSize);
OSStatus result2 = noErr;
result2 = AudioFileReadBytes(fileID, false, 0, &fileSize, buffer);
AudioFileClose(fileID);
if (result2 != 0)
    NSLog(@"Cannot load data from file!");

ALuint bufferId = 0;
alGenBuffers(1, &bufferId);
alBufferData(bufferId, AL_FORMAT_STEREO16,  buffer, fileSize, 44100);

free(buffer); 

ALuint sourceId = 0;
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);

alSourcePlay(sourceId);

【问题讨论】:

    标签: ios4 openal


    【解决方案1】:

    如果声音数据没有存储在内存中,声音将不会播放。

    free(buffer); 
    

    您的声音数据已从内存中擦除,alBufferData() 仅将 OpenAL 绑定到声音数据。我建议将缓冲区指针存储在其他位置,以便在您希望将声音从内存中删除时释放它。

    【讨论】:

    • 实际上,alBufferData() 会复制音频数据。如果您希望它简单地绑定到现有缓冲区,则需要使用 alBufferDataStatic(Apple 对 OpenAL 的扩展)。
    • 啊,是的,感谢您纠正我的回复。我曾认为 alBufferData() 和 alBufferDataStatic() 的操作方式相同。嗯,不知道会出什么问题。
    【解决方案2】:

    您对磁盘上的源数据做了很多假设(字节序、通道数、交错、格式)。加载文件时,您应该查看 ASBD 并让音频服务为您转换。

    下面是加载音频数据以在 OpenAL 中使用的示例:https://github.com/kstenerud/ObjectAL-for-iPhone/blob/master/libs/ObjectAL/Support/OALAudioFile.m

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多