4#include <QtMultimedia/private/qcoreaudiosessionmanager_p.h>
6#import <AVFoundation/AVAudioSession.h>
7#import <Foundation/Foundation.h>
11@interface CoreAudioSessionObserver : NSObject
13 CoreAudioSessionManager *m_sessionManager;
14 AVAudioSession *m_audioSession;
17@property (readonly, getter=sessionManager) CoreAudioSessionManager *m_sessionManager;
18@property (readonly, getter=audioSession) AVAudioSession *m_audioSession;
20-(CoreAudioSessionObserver *)initWithAudioSessionManager:(CoreAudioSessionManager *)sessionManager;
23-(BOOL)deactivateAudio;
26-(
void)audioSessionInterruption:(NSNotification *)notification;
27-(
void)audioSessionRouteChange:(NSNotification *)notification;
28-(
void)audioSessionMediaServicesWereReset:(NSNotification *)notification;
32@implementation CoreAudioSessionObserver
34@synthesize m_sessionManager, m_audioSession;
36-(CoreAudioSessionObserver *)initWithAudioSessionManager:(CoreAudioSessionManager *)sessionManager
38 if (!(self = [super init]))
41 self->m_sessionManager = sessionManager;
42 self->m_audioSession = [AVAudioSession sharedInstance];
45 [[NSNotificationCenter defaultCenter] addObserver:self
46 selector:@selector(audioSessionInterruption:)
47 name:AVAudioSessionInterruptionNotification
48 object:self->m_audioSession];
49 [[NSNotificationCenter defaultCenter] addObserver:self
50 selector:@selector(audioSessionMediaServicesWereReset:)
51 name:AVAudioSessionMediaServicesWereResetNotification
52 object:self->m_audioSession];
53 [[NSNotificationCenter defaultCenter] addObserver:self
54 selector:@selector(audioSessionRouteChange:)
55 name:AVAudioSessionRouteChangeNotification
56 object:self->m_audioSession];
63#ifdef QT_DEBUG_COREAUDIO
64 qDebug() << Q_FUNC_INFO;
67 [[NSNotificationCenter defaultCenter] removeObserver:self
68 name:AVAudioSessionInterruptionNotification
69 object:self->m_audioSession];
70 [[NSNotificationCenter defaultCenter] removeObserver:self
71 name:AVAudioSessionMediaServicesWereResetNotification
72 object:self->m_audioSession];
73 [[NSNotificationCenter defaultCenter] removeObserver:self
74 name:AVAudioSessionRouteChangeNotification
75 object:self->m_audioSession];
83 BOOL success = [self->m_audioSession setActive:YES error:&error];
84 if (![self->m_audioSession setActive:YES error:&error]) {
85#ifdef QT_DEBUG_COREAUDIO
86 qDebug(
"audio session activation failed: %s", [[error localizedDescription] UTF8String]);
88 qDebug(
"audio session activated");
98 BOOL success = [m_audioSession setActive:NO error:&error];
99#ifdef QT_DEBUG_COREAUDIO
101 qDebug(
"%s", [[error localizedDescription] UTF8String]);
107-(
void)audioSessionInterruption:(NSNotification *)notification
109 NSNumber *type = [[notification userInfo] valueForKey:AVAudioSessionInterruptionTypeKey];
110 if ([type intValue] == AVAudioSessionInterruptionTypeBegan) {
111#ifdef QT_DEBUG_COREAUDIO
112 qDebug(
"audioSession Interuption begain");
114 }
else if ([type intValue] == AVAudioSessionInterruptionTypeEnded) {
115#ifdef QT_DEBUG_COREAUDIO
116 qDebug(
"audioSession Interuption ended");
118 NSNumber *option = [[notification userInfo] valueForKey:AVAudioSessionInterruptionOptionKey];
119 if ([option intValue] == AVAudioSessionInterruptionOptionShouldResume) {
120#ifdef QT_DEBUG_COREAUDIO
121 qDebug(
"audioSession is active and immediately ready to be used.");
124 [self activateAudio];
129-(
void)audioSessionMediaServicesWereReset:(NSNotification *)notification
131 Q_UNUSED(notification);
132#ifdef QT_DEBUG_COREAUDIO
133 qDebug(
"audioSession Media Services were reset");
136 [self activateAudio];
139-(
void)audioSessionRouteChange:(NSNotification *)notification
141 NSNumber *reason = [[notification userInfo] valueForKey:AVAudioSessionRouteChangeReasonKey];
142 NSUInteger reasonEnum = [reason intValue];
144 if (reasonEnum == AVAudioSessionRouteChangeReasonUnknown) {
145#ifdef QT_DEBUG_COREAUDIO
146 qDebug(
"audioSession route changed. reason: unknown");
148 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonNewDeviceAvailable) {
149#ifdef QT_DEBUG_COREAUDIO
150 qDebug(
"audioSession route changed. reason: new device available");
152 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
153#ifdef QT_DEBUG_COREAUDIO
154 qDebug(
"audioSession route changed. reason: old device unavailable");
156 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonCategoryChange) {
157#ifdef QT_DEBUG_COREAUDIO
158 qDebug(
"audioSession route changed. reason: category changed");
160 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonOverride) {
161#ifdef QT_DEBUG_COREAUDIO
162 qDebug(
"audioSession route changed. reason: override");
164 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonWakeFromSleep) {
165#ifdef QT_DEBUG_COREAUDIO
166 qDebug(
"audioSession route changed. reason: woken from sleep");
168 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory) {
169#ifdef QT_DEBUG_COREAUDIO
170 qDebug(
"audioSession route changed. reason: no suitable route for category");
174 m_sessionManager->devicesAvailableChanged();
179CoreAudioSessionManager::CoreAudioSessionManager() :
182 m_sessionObserver = [[CoreAudioSessionObserver alloc] initWithAudioSessionManager:
this];
185CoreAudioSessionManager::~CoreAudioSessionManager()
187#ifdef QT_DEBUG_COREAUDIO
188 qDebug() << Q_FUNC_INFO;
190 [m_sessionObserver release];
194CoreAudioSessionManager &CoreAudioSessionManager::instance()
196 static CoreAudioSessionManager instance;
200bool CoreAudioSessionManager::setActive(
bool active)
203 return [m_sessionObserver activateAudio];
205 return [m_sessionObserver deactivateAudio];
209bool CoreAudioSessionManager::setCategory(CoreAudioSessionManager::AudioSessionCategorys category, CoreAudioSessionManager::AudioSessionCategoryOptions options)
211 NSString *targetCategory = nil;
214 case CoreAudioSessionManager::Ambient:
215 targetCategory = AVAudioSessionCategoryAmbient;
217 case CoreAudioSessionManager::SoloAmbient:
218 targetCategory = AVAudioSessionCategorySoloAmbient;
220 case CoreAudioSessionManager::Playback:
221 targetCategory = AVAudioSessionCategoryPlayback;
223 case CoreAudioSessionManager::Record:
224 targetCategory = AVAudioSessionCategoryRecord;
226 case CoreAudioSessionManager::PlayAndRecord:
227 targetCategory = AVAudioSessionCategoryPlayAndRecord;
229 case CoreAudioSessionManager::MultiRoute:
230 targetCategory = AVAudioSessionCategoryMultiRoute;
234 if (targetCategory == nil)
237 return [[m_sessionObserver audioSession] setCategory:targetCategory
238 withOptions:(AVAudioSessionCategoryOptions)options
242bool CoreAudioSessionManager::setMode(CoreAudioSessionManager::AudioSessionModes mode)
244 NSString *targetMode = nil;
246 case CoreAudioSessionManager::Default:
247 targetMode = AVAudioSessionModeDefault;
249 case CoreAudioSessionManager::VoiceChat:
250 targetMode = AVAudioSessionModeVoiceChat;
252 case CoreAudioSessionManager::GameChat:
253 targetMode = AVAudioSessionModeGameChat;
255 case CoreAudioSessionManager::VideoRecording:
256 targetMode = AVAudioSessionModeVideoRecording;
258 case CoreAudioSessionManager::Measurement:
259 targetMode = AVAudioSessionModeMeasurement;
261 case CoreAudioSessionManager::MoviePlayback:
262 targetMode = AVAudioSessionModeMoviePlayback;
266 if (targetMode == nil)
269 return [[m_sessionObserver audioSession] setMode:targetMode error:nil];
273CoreAudioSessionManager::AudioSessionCategorys CoreAudioSessionManager::category()
275 NSString *category = [[m_sessionObserver audioSession] category];
276 AudioSessionCategorys localCategory = Ambient;
278 if (category == AVAudioSessionCategoryAmbient) {
279 localCategory = Ambient;
280 }
else if (category == AVAudioSessionCategorySoloAmbient) {
281 localCategory = SoloAmbient;
282 }
else if (category == AVAudioSessionCategoryPlayback) {
283 localCategory = Playback;
284 }
else if (category == AVAudioSessionCategoryRecord) {
285 localCategory = Record;
286 }
else if (category == AVAudioSessionCategoryPlayAndRecord) {
287 localCategory = PlayAndRecord;
288 }
else if (category == AVAudioSessionCategoryMultiRoute) {
289 localCategory = MultiRoute;
292 return localCategory;
295CoreAudioSessionManager::AudioSessionModes CoreAudioSessionManager::mode()
297 NSString *mode = [[m_sessionObserver audioSession] mode];
298 AudioSessionModes localMode = Default;
300 if (mode == AVAudioSessionModeDefault) {
302 }
else if (mode == AVAudioSessionModeVoiceChat) {
303 localMode = VoiceChat;
304 }
else if (mode == AVAudioSessionModeGameChat) {
305 localMode = GameChat;
306 }
else if (mode == AVAudioSessionModeVideoRecording) {
307 localMode = VideoRecording;
308 }
else if (mode == AVAudioSessionModeMeasurement) {
309 localMode = Measurement;
310 }
else if (mode == AVAudioSessionModeMoviePlayback) {
311 localMode = MoviePlayback;
317QList<QByteArray> CoreAudioSessionManager::inputDevices()
322 QList<QByteArray> inputDevices;
323 inputDevices <<
"default";
327QList<QByteArray> CoreAudioSessionManager::outputDevices()
332 QList<QByteArray> outputDevices;
333 outputDevices <<
"default";
334 return outputDevices;
337float CoreAudioSessionManager::currentIOBufferDuration()
339 return [[m_sessionObserver audioSession] IOBufferDuration];
342float CoreAudioSessionManager::preferredSampleRate()
344 return [[m_sessionObserver audioSession] preferredSampleRate];
347#ifdef QT_DEBUG_COREAUDIO
348QDebug operator<<(QDebug dbg, CoreAudioSessionManager::AudioSessionCategorys category)
350 QDebug output = dbg.nospace();
352 case CoreAudioSessionManager::Ambient:
353 output <<
"AudioSessionCategoryAmbient";
355 case CoreAudioSessionManager::SoloAmbient:
356 output <<
"AudioSessionCategorySoloAmbient";
358 case CoreAudioSessionManager::Playback:
359 output <<
"AudioSessionCategoryPlayback";
361 case CoreAudioSessionManager::Record:
362 output <<
"AudioSessionCategoryRecord";
364 case CoreAudioSessionManager::PlayAndRecord:
365 output <<
"AudioSessionCategoryPlayAndRecord";
367 case CoreAudioSessionManager::MultiRoute:
368 output <<
"AudioSessionCategoryMultiRoute";
374QDebug operator<<(QDebug dbg, CoreAudioSessionManager::AudioSessionCategoryOptions option)
376 QDebug output = dbg.nospace();
378 case CoreAudioSessionManager::None:
379 output <<
"AudioSessionCategoryOptionNone";
381 case CoreAudioSessionManager::MixWithOthers:
382 output <<
"AudioSessionCategoryOptionMixWithOthers";
384 case CoreAudioSessionManager::DuckOthers:
385 output <<
"AudioSessionCategoryOptionDuckOthers";
387 case CoreAudioSessionManager::AllowBluetooth:
388 output <<
"AudioSessionCategoryOptionAllowBluetooth";
390 case CoreAudioSessionManager::DefaultToSpeaker:
391 output <<
"AudioSessionCategoryOptionDefaultToSpeaker";
397QDebug operator<<(QDebug dbg, CoreAudioSessionManager::AudioSessionModes mode)
399 QDebug output = dbg.nospace();
401 case CoreAudioSessionManager::Default:
402 output <<
"AudioSessionModeDefault";
404 case CoreAudioSessionManager::VoiceChat:
405 output <<
"AudioSessionModeVoiceChat";
407 case CoreAudioSessionManager::GameChat:
408 output <<
"AudioSessionModeGameChat";
410 case CoreAudioSessionManager::VideoRecording:
411 output <<
"AudioSessionModeVideoRecording";
413 case CoreAudioSessionManager::Measurement:
414 output <<
"AudioSessionModeMeasurement";
416 case CoreAudioSessionManager::MoviePlayback:
417 output <<
"AudioSessionModeMoviePlayback";
424#include "moc_qcoreaudiosessionmanager_p.cpp"