Нет звука в приложении iOS, использующем RemoteIO AudioUnit при перезапуске iPad
У меня странная проблема, когда разработанное мной приложение для iOS работает нормально, когда я собираю и запускаю его из XCode на устройстве. Однако при перезапуске устройства и запуске приложения я не получаю звука вообще. Если я впоследствии отключу приложение и перезапущу его с устройства, я снова начну получать звук. Сначала я думал, что это проблема с обработчиком прерываний, но я больше не уверен. Любая помощь будет оценена!
Вот мой обработчик прерываний на всякий случай.
static void MyInterruptionListener (void *inUserData,
UInt32 inInterruptionState) {
printf ("Interrupted! inInterruptionState=%ld\n", inInterruptionState);
pediViewController *pediController = (__bridge pediViewController*)inUserData;
switch (inInterruptionState) {
case kAudioSessionBeginInterruption:
CheckError (AudioOutputUnitStop (pediController.effectState.rioUnit),
"Couldn't start RIO unit");
case kAudioSessionEndInterruption:
// TODO: doesn't work!
CheckError(AudioSessionSetActive(true),
"Couldn't set audio session active");
CheckError (AudioOutputUnitStart (pediController.effectState.rioUnit),
"Couldn't start RIO unit");
break;
default:
break;
};
}
2 ответа
Проблема ушла при обновлении до iOS 6. Я провел некоторую интенсивную отладку, закомментировав каждую строку кода в звуковом обратном вызове и протестировав, перезапустив iPad и снова запустив приложение по 3 раза. Наконец, это было решено путем обновления iOS 6 на устройстве и запуска на нем. Я также получил огромный прирост производительности в этом!
Вы должны обрабатывать входящее и исходящее приложение, используя обратный вызов изменения маршрута аудио, а не обработчик прерываний.
Это то, что работало для меня в любом случае, когда у меня была проблема, подобная вашей (если я правильно понимаю вашу проблему).
Вот пример
AudioSessionAddPropertyListener (
kAudioSessionProperty_AudioRouteChange,
audioRouteChangeListenerCallback,
(__bridge void*) self
);
void audioRouteChangeListenerCallback (
void *inUserData,
AudioSessionPropertyID inPropertyID,
UInt32 inPropertyValueSize,
const void *inPropertyValue
) {
// Ensure that this callback was invoked because of an audio route change
if (inPropertyID != kAudioSessionProperty_AudioRouteChange) return;
AudioEngine *audioObject = (__bridge AudioEngine *) inUserData;
// if application sound is not playing, there's nothing to do, so return.
if (NO == audioObject.isPlaying) {
NSLog (@"Audio route change while application audio is stopped.");
return;
} else {
CFDictionaryRef routeChangeDictionary = inPropertyValue;
CFNumberRef routeChangeReasonRef =
CFDictionaryGetValue (
routeChangeDictionary,
CFSTR (kAudioSession_AudioRouteChangeKey_Reason)
);
SInt32 routeChangeReason;
CFNumberGetValue (
routeChangeReasonRef,
kCFNumberSInt32Type,
&routeChangeReason
);
if (routeChangeReason == kAudioSessionRouteChangeReason_OldDeviceUnavailable) {
NSLog (@"Audio output device was removed; stopping audio playback.");
NSString *MixerHostAudioObjectPlaybackStateDidChangeNotification = @"MixerHostAudioObjectPlaybackStateDidChangeNotification";
[[NSNotificationCenter defaultCenter] postNotificationName: MixerHostAudioObjectPlaybackStateDidChangeNotification object: audioObject];
} else {
NSLog (@"A route change occurred that does not require stopping application audio.");
}
}
}