openALでソース取得時にリークがおこる
Posted: 2014年9月19日(金) 17:13
お世話になっております。
以前自己解決したと思っていたopenALについて再度リークがおこったので
質問させていただきます。
具体的にはこのサイト
(http://news.mynavi.jp/column/iphone/014/)
にあるコードの
内でリークがおこるようです(Xcode付属のinstrumentsによると、この関数内でmallocのリークがおこっているらしいそうです。)
また、プリプロセッサで囲いながら追っていくと を追加したときにリークが発生することが分かりました。(こちらはopenalの内部関数なのでその他の場所だと思いますが…)
バッファとソースの取得はその他のサイトのGetOpenALAudioDataも試しましたがどうも解決しません。
解放し忘れは見当たらなかったので原因がよく分からず困っております。
宜しくお願いします。
以前自己解決したと思っていた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;
}
また、プリプロセッサで囲いながら追っていくと を追加したときにリークが発生することが分かりました。(こちらはopenalの内部関数なのでその他の場所だと思いますが…)
バッファとソースの取得はその他のサイトのGetOpenALAudioDataも試しましたがどうも解決しません。
解放し忘れは見当たらなかったので原因がよく分からず困っております。
宜しくお願いします。