diff options
author | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-04-10 17:38:23 +0200 |
---|---|---|
committer | Yoann Lopes <yoann.lopes@theqtcompany.com> | 2015-04-14 14:30:10 +0000 |
commit | f3a07360dd5a7b8e8b13217b08a952a1584e8101 (patch) | |
tree | a5788f2e3e6683c865d3571fe7fd7f70bdbdc973 | |
parent | def89d71716c7909351f6ccce512a0bff6492417 (diff) | |
download | qtmultimedia-f3a07360dd5a7b8e8b13217b08a952a1584e8101.tar.gz |
CoreAudio: fix crash on iOS 5.
The plugin was using some iOS 6 APIs, even though we're supposed to
support iOS 5.
Add version checks for all these APIs.
Task-number: QTBUG-44790
Change-Id: I9268963b7d3601222451ce0c948c2d024d37c86f
Reviewed-by: Christian Stromme <christian.stromme@theqtcompany.com>
-rw-r--r-- | src/plugins/coreaudio/coreaudiosessionmanager.mm | 115 |
1 files changed, 86 insertions, 29 deletions
diff --git a/src/plugins/coreaudio/coreaudiosessionmanager.mm b/src/plugins/coreaudio/coreaudiosessionmanager.mm index 6a8e97f4a..42c1684c6 100644 --- a/src/plugins/coreaudio/coreaudiosessionmanager.mm +++ b/src/plugins/coreaudio/coreaudiosessionmanager.mm @@ -44,6 +44,10 @@ #import <AVFoundation/AVAudioSession.h> #import <Foundation/Foundation.h> +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) +#include <AudioToolbox/AudioToolbox.h> +#endif + QT_BEGIN_NAMESPACE @interface CoreAudioSessionObserver : NSObject @@ -79,19 +83,24 @@ QT_BEGIN_NAMESPACE self->m_sessionManager = sessionManager; self->m_audioSession = [AVAudioSession sharedInstance]; - //Set up observers - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(audioSessionInterruption:) - name:AVAudioSessionInterruptionNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(audioSessionMediaServicesWereReset:) - name:AVAudioSessionMediaServicesWereResetNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(audioSessionRouteChange:) - name:AVAudioSessionRouteChangeNotification - object:self->m_audioSession]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif + { + //Set up observers + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(audioSessionInterruption:) + name:AVAudioSessionInterruptionNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(audioSessionMediaServicesWereReset:) + name:AVAudioSessionMediaServicesWereResetNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] addObserver:self + selector:@selector(audioSessionRouteChange:) + name:AVAudioSessionRouteChangeNotification + object:self->m_audioSession]; + } return self; } @@ -101,15 +110,22 @@ QT_BEGIN_NAMESPACE #ifdef QT_DEBUG_COREAUDIO qDebug() << Q_FUNC_INFO; #endif - [[NSNotificationCenter defaultCenter] removeObserver:self - name:AVAudioSessionInterruptionNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:AVAudioSessionMediaServicesWereResetNotification - object:self->m_audioSession]; - [[NSNotificationCenter defaultCenter] removeObserver:self - name:AVAudioSessionRouteChangeNotification - object:self->m_audioSession]; + +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif + { + [[NSNotificationCenter defaultCenter] removeObserver:self + name:AVAudioSessionInterruptionNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:AVAudioSessionMediaServicesWereResetNotification + object:self->m_audioSession]; + [[NSNotificationCenter defaultCenter] removeObserver:self + name:AVAudioSessionRouteChangeNotification + object:self->m_audioSession]; + } + [super dealloc]; } @@ -269,6 +285,9 @@ bool CoreAudioSessionManager::setCategory(CoreAudioSessionManager::AudioSessionC targetCategory = AVAudioSessionCategoryAudioProcessing; break; case CoreAudioSessionManager::MultiRoute: +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif targetCategory = AVAudioSessionCategoryMultiRoute; break; } @@ -276,9 +295,16 @@ bool CoreAudioSessionManager::setCategory(CoreAudioSessionManager::AudioSessionC if (targetCategory == nil) return false; - return [[m_sessionObserver audioSession] setCategory:targetCategory - withOptions:(AVAudioSessionCategoryOptions)options - error:nil]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_6_0) { + return [[m_sessionObserver audioSession] setCategory:targetCategory error:nil]; + } else +#endif + { + return [[m_sessionObserver audioSession] setCategory:targetCategory + withOptions:(AVAudioSessionCategoryOptions)options + error:nil]; + } } bool CoreAudioSessionManager::setMode(CoreAudioSessionManager::AudioSessionModes mode) @@ -301,6 +327,9 @@ bool CoreAudioSessionManager::setMode(CoreAudioSessionManager::AudioSessionModes targetMode = AVAudioSessionModeMeasurement; break; case CoreAudioSessionManager::MoviePlayback: +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0) +#endif targetMode = AVAudioSessionModeMoviePlayback; break; } @@ -329,7 +358,11 @@ CoreAudioSessionManager::AudioSessionCategorys CoreAudioSessionManager::category localCategory = PlayAndRecord; } else if (category == AVAudioSessionCategoryAudioProcessing) { localCategory = AudioProcessing; - } else if (category == AVAudioSessionCategoryMultiRoute) { + } else if ( +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0 && +#endif + category == AVAudioSessionCategoryMultiRoute) { localCategory = MultiRoute; } @@ -351,7 +384,11 @@ CoreAudioSessionManager::AudioSessionModes CoreAudioSessionManager::mode() localMode = VideoRecording; } else if (mode == AVAudioSessionModeMeasurement) { localMode = Measurement; - } else if (mode == AVAudioSessionModeMoviePlayback) { + } else if ( +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + QSysInfo::MacintoshVersion >= QSysInfo::MV_IOS_6_0 && +#endif + mode == AVAudioSessionModeMoviePlayback) { localMode = MoviePlayback; } @@ -380,12 +417,32 @@ QList<QByteArray> CoreAudioSessionManager::outputDevices() float CoreAudioSessionManager::currentIOBufferDuration() { - return [[m_sessionObserver audioSession] IOBufferDuration]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_6_0) { + Float32 duration; + UInt32 size = sizeof(duration); + AudioSessionGetProperty(kAudioSessionProperty_CurrentHardwareIOBufferDuration, &size, &duration); + return duration; + } else +#endif + { + return [[m_sessionObserver audioSession] IOBufferDuration]; + } } float CoreAudioSessionManager::preferredSampleRate() { - return [[m_sessionObserver audioSession] preferredSampleRate]; +#if QT_IOS_DEPLOYMENT_TARGET_BELOW(__IPHONE_6_0) + if (QSysInfo::MacintoshVersion < QSysInfo::MV_IOS_6_0) { + Float64 sampleRate; + UInt32 size = sizeof(sampleRate); + AudioSessionGetProperty(kAudioSessionProperty_PreferredHardwareSampleRate, &size, &sampleRate); + return sampleRate; + } else +#endif + { + return [[m_sessionObserver audioSession] preferredSampleRate]; + } } #ifdef QT_DEBUG_COREAUDIO |