ページ 11

openALでソース取得時にリークがおこる

Posted: 2014年9月19日(金) 17:13
by bonbo
お世話になっております。
以前自己解決したと思っていたopenALについて再度リークがおこったので
質問させていただきます。
具体的にはこのサイト
(http://news.mynavi.jp/column/iphone/014/)
にあるコードの

コード:

void* GetOpenALAudioData(
        CFURLRef fileURL, ALsizei* dataSize, ALenum* dataFormat, ALsizei *sampleRate)
{
    OSStatus    err;
    UInt32      size;

    // オーディオファイルを開く
    ExtAudioFileRef audioFile;
    err = ExtAudioFileOpenURL(fileURL, &audioFile);
    if (err) {
        goto Exit;
    }

    // オーディオデータフォーマットを取得する
    AudioStreamBasicDescription fileFormat;
    size = sizeof(fileFormat);
    err = ExtAudioFileGetProperty(
            audioFile, kExtAudioFileProperty_FileDataFormat, &size, &fileFormat);
    if (err) {
        goto Exit;
    }

    // アウトプットフォーマットを設定する
    AudioStreamBasicDescription outputFormat;
    outputFormat.mSampleRate = fileFormat.mSampleRate;
    outputFormat.mChannelsPerFrame = fileFormat.mChannelsPerFrame;
    outputFormat.mFormatID = kAudioFormatLinearPCM;
    outputFormat.mBytesPerPacket = 2 * outputFormat.mChannelsPerFrame;
    outputFormat.mFramesPerPacket = 1;
    outputFormat.mBytesPerFrame = 2 * outputFormat.mChannelsPerFrame;
    outputFormat.mBitsPerChannel = 16;
    outputFormat.mFormatFlags = kAudioFormatFlagsNativeEndian | kAudioFormatFlagIsPacked | kAudioFormatFlagIsSignedInteger;
    err = ExtAudioFileSetProperty(
            audioFile, kExtAudioFileProperty_ClientDataFormat, sizeof(outputFormat), &outputFormat);
    if (err) {
        goto Exit;
    }

    // フレーム数を取得する
    SInt64  fileLengthFrames = 0;
    size = sizeof(fileLengthFrames);
    err = ExtAudioFileGetProperty(
            audioFile, kExtAudioFileProperty_FileLengthFrames, &size, &fileLengthFrames);
    if (err) {
        goto Exit;
    }

    // バッファを用意する
    UInt32          bufferSize;
    void*           data;
    AudioBufferList dataBuffer;
    bufferSize = fileLengthFrames * outputFormat.mBytesPerFrame;;
    data = malloc(bufferSize);
    dataBuffer.mNumberBuffers = 1;
    dataBuffer.mBuffers[0].mDataByteSize = bufferSize;
    dataBuffer.mBuffers[0].mNumberChannels = outputFormat.mChannelsPerFrame;
    dataBuffer.mBuffers[0].mData = data;

    // バッファにデータを読み込む
    err = ExtAudioFileRead(audioFile, (UInt32*)&fileLengthFrames, &dataB    uffer);
    if (err) {
        free(data);
        goto Exit;
    }

    // 出力値を設定する
    *dataSize = (ALsizei)bufferSize;
    *dataFormat = (outputFormat.mChannelsPerFrame > 1) ? AL_FORMAT_STEREO16 : AL_FORMAT_MONO16;
    *sampleRate = (ALsizei)outputFormat.mSampleRate;

Exit:
    // オーディオファイルを破棄する
    if (audioFile) {
        ExtAudioFileDispose(audioFile);
    }

    return data;
}
内でリークがおこるようです(Xcode付属のinstrumentsによると、この関数内でmallocのリークがおこっているらしいそうです。)
また、プリプロセッサで囲いながら追っていくと

コード:

ExtAudioFileRead(audioFile, (UInt32*)&fileLengthFrames, &dataBuffer)
を追加したときにリークが発生することが分かりました。(こちらはopenalの内部関数なのでその他の場所だと思いますが…)
バッファとソースの取得はその他のサイトのGetOpenALAudioDataも試しましたがどうも解決しません。
解放し忘れは見当たらなかったので原因がよく分からず困っております。
宜しくお願いします。

Re: openALでソース取得時にリークがおこる

Posted: 2014年9月19日(金) 21:17
by bonbo
http://blog.livedoor.jp/tek_nishi/archives/3414255.html
とりあえず
こちらの関数実装でGetOpenALAudioData内のリークはほぼなくなりました。
まだ謎の16bite mallocが残っていますが…