2011-10-12 4 views
0

새로운 기능 Objective-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 (오디오 데이터의 사본을 만든다 :

여기 OpenAL에 사용하기위한로드 오디오 데이터의 예이다. 단순히 기존 버퍼에 바인드하려면 alBufferDataStatic (OpenAL의 Apple 확장)을 사용해야합니다. – Karl

+0

아, 답변을 수정 해 주셔서 감사합니다. 나는 alBufferData()와 alBufferDataStatic()이 같은 방식으로 작동한다고 생각했다. 흠, 그때 무엇이 ​​잘못 될지 확실하지 않습니다. – james82345