iOS アプリでの同期で再生を処理するために、The Amazing Audio Engine を使用しています。
フレームワークでは、オーディオ スレッドで呼び出されるコール バック (playbackTimingReceiver) として C 関数を使用する必要があります。次に、ハンドラー (pageTurnHandler) を渡す C 関数 (AEAudioControllerSendAsynchronousMessageToMainThread) を使用して、メイン スレッドに再度メッセージを送信する必要があります。
私はCでの作業にあまり経験がありませんが、私が理解しているように、逆参照する必要があるメッセージにポインターを渡しています。
次の行で正常に達成できます。
PlaybackManager* receiver = *((PlaybackManager**)userInfo);
ただし、プロジェクトターゲットのコンパイル済みソースで -fno-objc-arc フラグを使用して、そのファイルのプロジェクトで ARC をオフにした場合のみです。
私の質問に対して、ARCをオンにしてこれを達成することは可能ですか? もしそうなら、正しい構文は何ですか?
関連するコード セグメント:
#pragma mark - Audio Timing Callback
-(AEAudioControllerTimingCallback)timingReceiverCallback
{
return playbackTimingReceiver;
}
static void playbackTimingReceiver(PlaybackManager* receiver,
AEAudioController *audioController,
const AudioTimeStamp *time,
UInt32 const frames,
AEAudioTimingContext context)
{
receiver->_hostTime = getUptimeInMilliseconds(time->mHostTime);
AEAudioControllerSendAsynchronousMessageToMainThread(audioController,
pageTurnHandler,
&audioController,
sizeof(id));
}
static void pageTurnHandler(AEAudioController *audioController, void *userInfo, int userInfoLength)
{
PlaybackManager* receiver = *((PlaybackManager**)userInfo);
NSLog(@"Receiver:%@", receiver);
}