2011-10-12 86 views
0

我在新的目标 - Visual C ...IOS/OpenAL的声音干扰

我发现了源代码如何使用的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); 

回答

0

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

free(buffer); 

您的声音数据从内存中擦除,alBufferData()仅将OpenAL绑定到声音数据。我建议将缓冲区指针存储在其他地方,以便在需要从内存中移除声音时释放它。

+0

其实,alBufferData()使音频数据的副本。如果你希望它只是绑定到现有的缓冲区,你需要使用alBufferDataStatic(一个苹果扩展到OpenAL)。 – Karl

+0

啊,是的,谢谢你纠正我的回应。我曾经认为alBufferData()和alBufferDataStatic()以相同的方式操作。嗯,不知道那会是什么错误。 – james82345