Очистка OpenAL для загрузки новых звуков - PullRequest
1 голос
/ 01 февраля 2012

Я загружаю начальный набор из 100+ звуков в буфер OpenAL.Через некоторое время я очищаю контекст OpenAL и перезагружаю другой набор звуков.Но вновь загруженные файлы не воспроизводятся.Кажется, что предыдущие буферы OpenAL на самом деле не выпущены.

Вот мой код для инициализации и уничтожения OpenAL

- (void)initOpenAL
{
    // Initialization
    mDevice = alcOpenDevice(NULL); // select the “preferred device”
    if (mDevice) {
        // use the device to make a context
        mContext=alcCreateContext(mDevice,NULL);
        // set my context to the currently active one
        alcMakeContextCurrent(mContext);
    }
}

- (void)cleanUpOpenAL
{
    // delete the sources
    for (NSNumber * sourceNumber in [soundDictionary allValues]) 
    {
        NSUInteger sourceID = [sourceNumber unsignedIntegerValue];
        alDeleteSources(1, &sourceID);
    }

    [soundDictionary removeAllObjects];

    // delete the buffers
    for (NSNumber * bufferNumber in bufferStorageArray) 
    {
        NSUInteger bufferID = [bufferNumber unsignedIntegerValue];
        alDeleteBuffers(1, &bufferID);
    }

    [bufferStorageArray removeAllObjects];

    // destroy the context
    alcDestroyContext(mContext);
    // close the device
    alcCloseDevice(mDevice);
}

Вот как я загружаю звуки внутри цикла:

NSString *filePath = [[NSBundle mainBundle] pathForResource:subString ofType:@"wav"];
        AudioFileID fileID = [self openAudioFile:filePath];

        // find out how big the actual audio data is
        UInt32 fileSize = (UInt32)[self audioFileSize:fileID];

        // this is where the audio data will live for the moment
        unsigned char * outData = malloc(fileSize);

        // this where we actually get the bytes from the file and put them
        // into the data buffer
        OSStatus result = noErr;
        result = AudioFileReadBytes(fileID, false, 0, &fileSize, outData);

        if (result != 0) NSLog(@"cannot load effect: %@",fileName);

        NSUInteger bufferID;
        // grab a buffer ID from openAL
        alGenBuffers(1, &bufferID);
        if((alGetError()) != AL_NO_ERROR) {
            printf("Error!");
        }

        // jam the audio data into the new buffer
        alBufferData(bufferID,AL_FORMAT_STEREO16,outData,fileSize,44100);
        if((alGetError()) != AL_NO_ERROR) {
            printf("Error!");
        }

        // clean up the buffer
        if (outData)
        {
            free(outData);
        }
        else
        {
            outData = NULL;
        }

        // save the buffer so I can release it later
        [bufferStorageArray addObject:[NSNumber numberWithUnsignedInteger:bufferID]];

        NSUInteger sourceID;

        // grab a source ID from openAL
        alGenSources(1, &sourceID);

        // attach the buffer to the source
        alSourcei(sourceID, AL_BUFFER, bufferID);

        // store this for future use
        [soundDictionary setObject:[NSNumber numberWithUnsignedInt:sourceID] forKey: [NSNumber numberWithUnsignedInt:i+(padNumber*10)]];

        subString = NULL;
        filePath = NULL;

И это то, что я делаю перед тем, как перезагружать новый набор звуков:

[self cleanUpOpenAL];
[self initOpenAL];

Есть идеи, где что-то идет не так?

1 Ответ

1 голос
/ 10 февраля 2012

После почти недели анализа я нашел ошибку.Проблема была в том, что я не закрывал AudioFile.Все работало после того, как я добавил этот кусок кода после того, как я использовал fileID

AudioFileClose(fileID);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...