【问题标题】:Clearing OpenAL for loading new sounds清除 OpenAL 以加载新声音
【发布时间】:2012-02-11 02:30:18
【问题描述】:

我正在将 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];

知道哪里出了问题吗?

【问题讨论】:

  • 还没有回复。有人有机会研究这个吗?

标签: iphone ios openal


【解决方案1】:

经过将近一周的分析,我发现了这个错误。问题是我没有关闭 AudioFile。在我使用 fileID 后添加这段代码后一切正常

AudioFileClose(fileID);

【讨论】:

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