AudioRingBuffer::GetTimeBoundsからEXC_BAD_ACCESSが起きる場合の対応法

| コメント(0) | トラックバック(0)
ExtAudioFileを使って録音のファイル書き込みを行う際に
 1. 録音終了したファイルAを閉じる
 2. すぐ新規録音を開始し、録音データをファイルBに書き込む(ExtAudioFileWriteAsync)
このようなケースでAudioRingBuffer::GetTimeBoundsからEXC_BAD_ACCESSが発生する事があります。

ファイルへの書き込みはExtAudioFileWriteAsyncによって非同期に書き込まれる為、古いファイル(A)への処理が完結する前に新しいファイル(B)への書き込みが行われる事で発生するものと考えられます。

解決策として、排他制御(mutex)を用います。
 ※mutexを用いる為にpthread.hをimportする必用があります。
pthread_mutex_init() mutexの初期化
pthread_mutex_lock() mutexのロック
pthread_mutex_trylock() ブロックしないで行うmutexのロック
pthread_mutex_unlock() mutexのロック解除
pthread_mutex_destroy() mutexの削除

排他制御のキーとなるmutexはpthread_mutex_t型で宣言します。
static pthread_mutex_t fileMutex;

録音を始めるより前にmutexを初期化します。
pthread_mutex_init(&fileMutex, nil);

後は排他制御が必用な箇所をロックとアンロック処理で挟み込みます。
ファイルへの書き込みとファイルを閉じる箇所について挟み込むと問題が解決しました。
例)
// ファイルへの書き込み
if (pthread_mutex_trylock(&fileMutex)) {
    ExtAudioFileWriteAsync(...);
}
pthread_mutex_unlock(&fileMutex);

// ファイルを閉じる
pthread_mutex_lock(&fileMutex);
ExtAudioFileDispose(...);
pthread_mutex_unlock(&fileMutex);

最後に必用の無くなったmutexを削除します。
pthread_mutex_destroy(&fileMutex);

トラックバック(0)

トラックバックURL: http://www.ict-fractal.com/MovableType/mt/mt-tb.cgi/75

コメントする

Twitterボタン
Twitterブログパーツ