Я использую The Amazing Audio Engine для обработки воспроизведения при синхронизации в приложении iOS.
Платформа требует, чтобы вы использовали функции C в качестве обратного вызова (playbackTimingReceiver), который вызывается в аудиопотоке. Затем вам нужно снова отправить сообщение основному потоку, используя функцию C (AEAudioControllerSendAsynchronousMessageToMainThread), которой вы передаете обработчик (pageTurnHandler).
У меня нет большого опыта работы с C, но, насколько я понимаю, я передаю указатель в сообщении, которое нужно разыменовать.
Чего я могу успешно достичь с помощью строки:
PlaybackManager* receiver = *((PlaybackManager**)userInfo);
Но только если я отключу ARC в проекте для этого файла, используя флаг -fno-objc-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);
}