5#import <AVFoundation/AVAudioSession.h>
6#import <Foundation/Foundation.h>
10@interface CoreAudioSessionObserver : NSObject
12 CoreAudioSessionManager *m_sessionManager;
13 AVAudioSession *m_audioSession;
16@property (readonly, getter=sessionManager) CoreAudioSessionManager *m_sessionManager;
17@property (readonly, getter=audioSession) AVAudioSession *m_audioSession;
19-(CoreAudioSessionObserver *)initWithAudioSessionManager:(CoreAudioSessionManager *)sessionManager;
22-(BOOL)deactivateAudio;
25-(
void)audioSessionInterruption:(NSNotification *)notification;
26-(
void)audioSessionRouteChange:(NSNotification *)notification;
27-(
void)audioSessionMediaServicesWereReset:(NSNotification *)notification;
31@implementation CoreAudioSessionObserver
33@synthesize m_sessionManager, m_audioSession;
35-(CoreAudioSessionObserver *)initWithAudioSessionManager:(CoreAudioSessionManager *)sessionManager
37 if (!(self = [super init]))
40 self->m_sessionManager = sessionManager;
41 self->m_audioSession = [AVAudioSession sharedInstance];
44 [[NSNotificationCenter defaultCenter] addObserver:self
45 selector:@selector(audioSessionInterruption:)
46 name:AVAudioSessionInterruptionNotification
47 object:self->m_audioSession];
48 [[NSNotificationCenter defaultCenter] addObserver:self
49 selector:@selector(audioSessionMediaServicesWereReset:)
50 name:AVAudioSessionMediaServicesWereResetNotification
51 object:self->m_audioSession];
52 [[NSNotificationCenter defaultCenter] addObserver:self
53 selector:@selector(audioSessionRouteChange:)
54 name:AVAudioSessionRouteChangeNotification
55 object:self->m_audioSession];
62#ifdef QT_DEBUG_COREAUDIO
63 qDebug() << Q_FUNC_INFO;
66 [[NSNotificationCenter defaultCenter] removeObserver:self
67 name:AVAudioSessionInterruptionNotification
68 object:self->m_audioSession];
69 [[NSNotificationCenter defaultCenter] removeObserver:self
70 name:AVAudioSessionMediaServicesWereResetNotification
71 object:self->m_audioSession];
72 [[NSNotificationCenter defaultCenter] removeObserver:self
73 name:AVAudioSessionRouteChangeNotification
74 object:self->m_audioSession];
82 BOOL success = [self->m_audioSession setActive:YES error:&error];
83 if (![self->m_audioSession setActive:YES error:&error]) {
84#ifdef QT_DEBUG_COREAUDIO
85 qDebug(
"audio session activation failed: %s", [[error localizedDescription] UTF8String]);
87 qDebug(
"audio session activated");
97 BOOL success = [m_audioSession setActive:NO error:&error];
98#ifdef QT_DEBUG_COREAUDIO
100 qDebug(
"%s", [[error localizedDescription] UTF8String]);
106-(
void)audioSessionInterruption:(NSNotification *)notification
108 NSNumber *type = [[notification userInfo] valueForKey:AVAudioSessionInterruptionTypeKey];
109 if ([type intValue] == AVAudioSessionInterruptionTypeBegan) {
110#ifdef QT_DEBUG_COREAUDIO
111 qDebug(
"audioSession Interuption begain");
113 }
else if ([type intValue] == AVAudioSessionInterruptionTypeEnded) {
114#ifdef QT_DEBUG_COREAUDIO
115 qDebug(
"audioSession Interuption ended");
117 NSNumber *option = [[notification userInfo] valueForKey:AVAudioSessionInterruptionOptionKey];
118 if ([option intValue] == AVAudioSessionInterruptionOptionShouldResume) {
119#ifdef QT_DEBUG_COREAUDIO
120 qDebug(
"audioSession is active and immediately ready to be used.");
123 [self activateAudio];
128-(
void)audioSessionMediaServicesWereReset:(NSNotification *)notification
130 Q_UNUSED(notification);
131#ifdef QT_DEBUG_COREAUDIO
132 qDebug(
"audioSession Media Services were reset");
135 [self activateAudio];
138-(
void)audioSessionRouteChange:(NSNotification *)notification
140 NSNumber *reason = [[notification userInfo] valueForKey:AVAudioSessionRouteChangeReasonKey];
141 NSUInteger reasonEnum = [reason intValue];
143 if (reasonEnum == AVAudioSessionRouteChangeReasonUnknown) {
144#ifdef QT_DEBUG_COREAUDIO
145 qDebug(
"audioSession route changed. reason: unknown");
147 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonNewDeviceAvailable) {
148#ifdef QT_DEBUG_COREAUDIO
149 qDebug(
"audioSession route changed. reason: new device available");
151 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonOldDeviceUnavailable) {
152#ifdef QT_DEBUG_COREAUDIO
153 qDebug(
"audioSession route changed. reason: old device unavailable");
155 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonCategoryChange) {
156#ifdef QT_DEBUG_COREAUDIO
157 qDebug(
"audioSession route changed. reason: category changed");
159 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonOverride) {
160#ifdef QT_DEBUG_COREAUDIO
161 qDebug(
"audioSession route changed. reason: override");
163 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonWakeFromSleep) {
164#ifdef QT_DEBUG_COREAUDIO
165 qDebug(
"audioSession route changed. reason: woken from sleep");
167 }
else if (reasonEnum == AVAudioSessionRouteChangeReasonNoSuitableRouteForCategory) {
168#ifdef QT_DEBUG_COREAUDIO
169 qDebug(
"audioSession route changed. reason: no suitable route for category");
173 m_sessionManager->devicesAvailableChanged();
178CoreAudioSessionManager::CoreAudioSessionManager() :
181 m_sessionObserver = [[CoreAudioSessionObserver alloc] initWithAudioSessionManager:
this];
184CoreAudioSessionManager::~CoreAudioSessionManager()
186#ifdef QT_DEBUG_COREAUDIO
187 qDebug() << Q_FUNC_INFO;
189 [m_sessionObserver release];
193CoreAudioSessionManager &CoreAudioSessionManager::instance()
195 static CoreAudioSessionManager instance;
199bool CoreAudioSessionManager::setActive(
bool active)
202 return [m_sessionObserver activateAudio];
204 return [m_sessionObserver deactivateAudio];
208bool CoreAudioSessionManager::setCategory(CoreAudioSessionManager::AudioSessionCategorys category, CoreAudioSessionManager::AudioSessionCategoryOptions options)
210 NSString *targetCategory = nil;
213 case CoreAudioSessionManager::Ambient:
214 targetCategory = AVAudioSessionCategoryAmbient;
216 case CoreAudioSessionManager::SoloAmbient:
217 targetCategory = AVAudioSessionCategorySoloAmbient;
219 case CoreAudioSessionManager::Playback:
220 targetCategory = AVAudioSessionCategoryPlayback;
222 case CoreAudioSessionManager::Record:
223 targetCategory = AVAudioSessionCategoryRecord;
225 case CoreAudioSessionManager::PlayAndRecord:
226 targetCategory = AVAudioSessionCategoryPlayAndRecord;
228 case CoreAudioSessionManager::MultiRoute:
229 targetCategory = AVAudioSessionCategoryMultiRoute;
233 if (targetCategory == nil)
236 return [[m_sessionObserver audioSession] setCategory:targetCategory
237 withOptions:(AVAudioSessionCategoryOptions)options
241bool CoreAudioSessionManager::setMode(CoreAudioSessionManager::AudioSessionModes mode)
243 NSString *targetMode = nil;
245 case CoreAudioSessionManager::Default:
246 targetMode = AVAudioSessionModeDefault;
248 case CoreAudioSessionManager::VoiceChat:
249 targetMode = AVAudioSessionModeVoiceChat;
251 case CoreAudioSessionManager::GameChat:
252 targetMode = AVAudioSessionModeGameChat;
254 case CoreAudioSessionManager::VideoRecording:
255 targetMode = AVAudioSessionModeVideoRecording;
257 case CoreAudioSessionManager::Measurement:
258 targetMode = AVAudioSessionModeMeasurement;
260 case CoreAudioSessionManager::MoviePlayback:
261 targetMode = AVAudioSessionModeMoviePlayback;
265 if (targetMode == nil)
268 return [[m_sessionObserver audioSession] setMode:targetMode error:nil];
272CoreAudioSessionManager::AudioSessionCategorys CoreAudioSessionManager::category()
274 NSString *category = [[m_sessionObserver audioSession] category];
275 AudioSessionCategorys localCategory = Ambient;
277 if (category == AVAudioSessionCategoryAmbient) {
278 localCategory = Ambient;
279 }
else if (category == AVAudioSessionCategorySoloAmbient) {
280 localCategory = SoloAmbient;
281 }
else if (category == AVAudioSessionCategoryPlayback) {
282 localCategory = Playback;
283 }
else if (category == AVAudioSessionCategoryRecord) {
284 localCategory = Record;
285 }
else if (category == AVAudioSessionCategoryPlayAndRecord) {
286 localCategory = PlayAndRecord;
287 }
else if (category == AVAudioSessionCategoryMultiRoute) {
288 localCategory = MultiRoute;
291 return localCategory;
294CoreAudioSessionManager::AudioSessionModes CoreAudioSessionManager::mode()
296 NSString *mode = [[m_sessionObserver audioSession] mode];
297 AudioSessionModes localMode = Default;
299 if (mode == AVAudioSessionModeDefault) {
301 }
else if (mode == AVAudioSessionModeVoiceChat) {
302 localMode = VoiceChat;
303 }
else if (mode == AVAudioSessionModeGameChat) {
304 localMode = GameChat;
305 }
else if (mode == AVAudioSessionModeVideoRecording) {
306 localMode = VideoRecording;
307 }
else if (mode == AVAudioSessionModeMeasurement) {
308 localMode = Measurement;
309 }
else if (mode == AVAudioSessionModeMoviePlayback) {
310 localMode = MoviePlayback;
316QList<QByteArray> CoreAudioSessionManager::inputDevices()
321 QList<QByteArray> inputDevices;
322 inputDevices <<
"default";
326QList<QByteArray> CoreAudioSessionManager::outputDevices()
331 QList<QByteArray> outputDevices;
332 outputDevices <<
"default";
333 return outputDevices;
336float CoreAudioSessionManager::currentIOBufferDuration()
338 return [[m_sessionObserver audioSession] IOBufferDuration];
341float CoreAudioSessionManager::preferredSampleRate()
343 return [[m_sessionObserver audioSession] preferredSampleRate];
346#ifdef QT_DEBUG_COREAUDIO
347QDebug operator<<(QDebug dbg, CoreAudioSessionManager::AudioSessionCategorys category)
349 QDebug output = dbg.nospace();
351 case CoreAudioSessionManager::Ambient:
352 output <<
"AudioSessionCategoryAmbient";
354 case CoreAudioSessionManager::SoloAmbient:
355 output <<
"AudioSessionCategorySoloAmbient";
357 case CoreAudioSessionManager::Playback:
358 output <<
"AudioSessionCategoryPlayback";
360 case CoreAudioSessionManager::Record:
361 output <<
"AudioSessionCategoryRecord";
363 case CoreAudioSessionManager::PlayAndRecord:
364 output <<
"AudioSessionCategoryPlayAndRecord";
366 case CoreAudioSessionManager::MultiRoute:
367 output <<
"AudioSessionCategoryMultiRoute";
373QDebug operator<<(QDebug dbg, CoreAudioSessionManager::AudioSessionCategoryOptions option)
375 QDebug output = dbg.nospace();
377 case CoreAudioSessionManager::None:
378 output <<
"AudioSessionCategoryOptionNone";
380 case CoreAudioSessionManager::MixWithOthers:
381 output <<
"AudioSessionCategoryOptionMixWithOthers";
383 case CoreAudioSessionManager::DuckOthers:
384 output <<
"AudioSessionCategoryOptionDuckOthers";
386 case CoreAudioSessionManager::AllowBluetooth:
387 output <<
"AudioSessionCategoryOptionAllowBluetooth";
389 case CoreAudioSessionManager::DefaultToSpeaker:
390 output <<
"AudioSessionCategoryOptionDefaultToSpeaker";
396QDebug operator<<(QDebug dbg, CoreAudioSessionManager::AudioSessionModes mode)
398 QDebug output = dbg.nospace();
400 case CoreAudioSessionManager::Default:
401 output <<
"AudioSessionModeDefault";
403 case CoreAudioSessionManager::VoiceChat:
404 output <<
"AudioSessionModeVoiceChat";
406 case CoreAudioSessionManager::GameChat:
407 output <<
"AudioSessionModeGameChat";
409 case CoreAudioSessionManager::VideoRecording:
410 output <<
"AudioSessionModeVideoRecording";
412 case CoreAudioSessionManager::Measurement:
413 output <<
"AudioSessionModeMeasurement";
415 case CoreAudioSessionManager::MoviePlayback:
416 output <<
"AudioSessionModeMoviePlayback";
425#include "moc_qcoreaudiosessionmanager_p.cpp"