2011-10-12 3 views
0

Je suis nouveau dans l'objectif - C ...IOS/OpenAL Son Interférences

Je trouve le code source comment utiliser OpenAL, copier puis ce test, mais le son a été joué avec une interférence. Pouvez-vous regarder le code et dire ce qui ne va pas?

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); 

Répondre

0

Le son ne sera pas lu si les données audio ne sont pas stockées dans la mémoire. Vos données audio sont effacées de la mémoire, alBufferData() ne lie qu'OpenAL aux données audio. Je suggère de stocker le pointeur de tampon ailleurs afin qu'il puisse être libéré lorsque vous voulez que le son soit supprimé de la mémoire.

+0

En fait, alBufferData() fait une copie des données audio. Si vous voulez simplement lier au tampon existant, vous devez utiliser alBufferDataStatic (une extension Apple à OpenAL). – Karl

+0

Ah oui, merci de corriger ma réponse. J'avais pensé que alBufferData() et alBufferDataStatic() fonctionnaient de la même manière. Hmm, je ne sais pas ce qui ne va pas alors. – james82345

Questions connexes