97
107
public int Size { get; set; }
98
108
public IntPtr Data { get; set; }
111
public class AudioSessionRouteChangeEventArgs : EventArgs {
112
static IntPtr route_change_key, previous_route_key, current_route_key;
114
static AudioSessionRouteChangeEventArgs ()
116
var lib = Dlfcn.dlopen (Constants.AudioToolboxLibrary, 0);
117
route_change_key = Dlfcn.GetIntPtr (lib, "kAudioSession_RouteChangeKey_Reason");
118
previous_route_key = Dlfcn.GetIntPtr (lib, "kAudioSession_AudioRouteChangeKey_PreviousRouteDescription");
119
current_route_key = Dlfcn.GetIntPtr (lib, "kAudioSession_AudioRouteChangeKey_CurrentRouteDescription");
124
public NSDictionary Dictionary { get; private set; }
126
public AudioSessionRouteChangeEventArgs (IntPtr dictHandle)
128
Dictionary = new NSDictionary (dictHandle);
131
public AudioSessionRouteChangeReason Reason {
133
using (var num = new NSNumber (Dictionary.LowlevelObjectForKey (route_change_key))){
134
return (AudioSessionRouteChangeReason) num.Int32Value;
139
NSArray Extract (IntPtr key, NSString secondKey)
141
var dictH = Dictionary.LowlevelObjectForKey (key);
142
if (dictH == IntPtr.Zero)
145
// Console.WriteLine ("Extracting from {2} {0} and getting {1}", new NSString (key), new NSDictionary (dictH).Description, Dictionary.Description);
146
// Description dictionary, indexed by the second key, the result is an array
147
using (var descDict = new NSDictionary (dictH)){
148
var sdict = descDict.LowlevelObjectForKey (secondKey.Handle);
149
if (sdict == IntPtr.Zero)
152
return new NSArray (sdict);
156
public AudioSessionInputRouteKind PreviousInputRoute {
158
using (var array = Extract (previous_route_key, AudioSession.AudioRouteKey_Inputs))
159
return AudioSession.GetInputRoute (array);
163
public AudioSessionOutputRouteKind [] PreviousOutputRoutes {
165
using (var array = Extract (previous_route_key, AudioSession.AudioRouteKey_Outputs))
166
return AudioSession.GetOutputRoutes (array);
170
public AudioSessionInputRouteKind CurrentInputRoute {
172
using (var array = Extract (current_route_key, AudioSession.AudioRouteKey_Inputs))
173
return AudioSession.GetInputRoute (array);
177
public AudioSessionOutputRouteKind [] CurrentOutputRoutes {
179
using (var array = Extract (current_route_key, AudioSession.AudioRouteKey_Outputs))
180
return AudioSession.GetOutputRoutes (array);
101
185
public static class AudioSession {
102
186
static bool initialized;
103
187
public static event EventHandler Interrupted;
104
188
public static event EventHandler Resumed;
106
static NSString AudioRouteKey_Type;
107
static NSString AudioRouteKey_Inputs;
108
static NSString AudioRouteKey_Outputs;
190
internal static NSString AudioRouteKey_Type;
191
internal static NSString AudioRouteKey_Inputs;
192
internal static NSString AudioRouteKey_Outputs;
110
194
static NSString InputRoute_LineIn;
111
195
static NSString InputRoute_BuiltInMic;
404
[Obsolete ("Deprecated in iOS 5.0. Use InputRoute or OutputRoute instead")]
300
405
static public string AudioRoute {
302
407
return CFString.FetchString ((IntPtr) GetInt (AudioSessionProperty.AudioRoute));
306
static public AudioSessionInputRouteKind InputRoute {
308
var arr = (NSArray) AudioRouteDescription [AudioRouteKey_Inputs];
310
if (arr == null || arr.Count == 0)
311
return AudioSessionInputRouteKind.None;
313
var dict = new NSDictionary (arr.ValueAt (0));
412
static public AccessoryInfo[] InputSources {
414
using (var array = new CFArray ((IntPtr) GetInt (AudioSessionProperty.InputSources))) {
415
var res = new AccessoryInfo [array.Count];
416
for (int i = 0; i < res.Length; ++i) {
417
var dict = array.GetValue (i);
418
var id = new NSNumber (CFDictionary.GetValue (dict, InputSourceKey_ID.Handle));
419
var desc = CFString.FetchString (CFDictionary.GetValue (dict, InputSourceKey_Description.Handle));
421
res [i] = new AccessoryInfo ((int) id, desc);
430
static public AccessoryInfo[] OutputDestinations {
432
using (var array = new CFArray ((IntPtr) GetInt (AudioSessionProperty.OutputDestinations))) {
433
var res = new AccessoryInfo [array.Count];
434
for (int i = 0; i < res.Length; ++i) {
435
var dict = array.GetValue (i);
436
var id = new NSNumber (CFDictionary.GetValue (dict, OutputDestinationKey_ID.Handle));
437
var desc = CFString.FetchString (CFDictionary.GetValue (dict, OutputDestinationKey_Description.Handle));
439
res [i] = new AccessoryInfo ((int) id, desc);
447
/* Could not test what sort of unique CFNumberRef value it's
450
static public int InputSource {
452
return GetInt (AudioSessionProperty.InputSource);
455
SetInt (AudioSessionProperty.InputSource, value);
460
static public int OutputDestination {
462
return GetInt (AudioSessionProperty.OutputDestination);
465
SetInt (AudioSessionProperty.OutputDestination, value);
471
static internal AudioSessionInputRouteKind GetInputRoute (NSArray arr)
473
if (arr == null || arr.Count == 0)
474
return AudioSessionInputRouteKind.None;
476
var dict = new NSDictionary (arr.ValueAt (0));
478
if (dict == null || dict.Count == 0)
479
return AudioSessionInputRouteKind.None;
481
var val = (NSString) dict [AudioRouteKey_Type];
484
return AudioSessionInputRouteKind.None;
486
if (val == InputRoute_LineIn) {
487
return AudioSessionInputRouteKind.LineIn;
488
} else if (val == InputRoute_BuiltInMic) {
489
return AudioSessionInputRouteKind.BuiltInMic;
490
} else if (val == InputRoute_HeadsetMic) {
491
return AudioSessionInputRouteKind.HeadsetMic;
492
} else if (val == InputRoute_BluetoothHFP) {
493
return AudioSessionInputRouteKind.BluetoothHFP;
494
} else if (val == InputRoute_USBAudio) {
495
return AudioSessionInputRouteKind.USBAudio;
497
return (AudioSessionInputRouteKind) val.Handle;
501
static internal AudioSessionOutputRouteKind [] GetOutputRoutes (NSArray arr)
503
if (arr == null || arr.Count == 0)
506
var result = new AudioSessionOutputRouteKind [arr.Count];
507
for (uint i = 0; i < arr.Count; i++) {
508
var dict = new NSDictionary ((IntPtr) arr.ValueAt (i));
510
result [i] = AudioSessionOutputRouteKind.None;
315
512
if (dict == null || dict.Count == 0)
316
return AudioSessionInputRouteKind.None;
318
515
var val = (NSString) dict [AudioRouteKey_Type];
321
return AudioSessionInputRouteKind.None;
323
if (val == InputRoute_LineIn) {
324
return AudioSessionInputRouteKind.LineIn;
325
} else if (val == InputRoute_BuiltInMic) {
326
return AudioSessionInputRouteKind.BuiltInMic;
327
} else if (val == InputRoute_HeadsetMic) {
328
return AudioSessionInputRouteKind.HeadsetMic;
329
} else if (val == InputRoute_BluetoothHFP) {
330
return AudioSessionInputRouteKind.BluetoothHFP;
331
} else if (val == InputRoute_USBAudio) {
332
return AudioSessionInputRouteKind.USBAudio;
335
throw new Exception (); // return AudioSessionInputRouteKind.None;
520
if (val == OutputRoute_LineOut) {
521
result [i] = AudioSessionOutputRouteKind.LineOut;
522
} else if (val == OutputRoute_Headphones) {
523
result [i] = AudioSessionOutputRouteKind.Headphones;
524
} else if (val == OutputRoute_BluetoothHFP) {
525
result [i] = AudioSessionOutputRouteKind.BluetoothHFP;
526
} else if (val == OutputRoute_BluetoothA2DP) {
527
result [i] = AudioSessionOutputRouteKind.BluetoothA2DP;
528
} else if (val == OutputRoute_BuiltInReceiver) {
529
result [i] = AudioSessionOutputRouteKind.BuiltInReceiver;
530
} else if (val == OutputRoute_BuiltInSpeaker) {
531
result [i] = AudioSessionOutputRouteKind.BuiltInSpeaker;
532
} else if (val == OutputRoute_USBAudio) {
533
result [i] = AudioSessionOutputRouteKind.USBAudio;
534
} else if (val == OutputRoute_HDMI) {
535
result [i] = AudioSessionOutputRouteKind.HDMI;
536
} else if (val == OutputRoute_AirPlay) {
537
result [i] = AudioSessionOutputRouteKind.AirPlay;
539
result [i] = (AudioSessionOutputRouteKind) val.Handle;
545
static public AudioSessionInputRouteKind InputRoute {
547
return GetInputRoute ((NSArray) AudioRouteDescription [AudioRouteKey_Inputs]);
340
552
static public AudioSessionOutputRouteKind [] OutputRoutes {
342
var arr = (NSArray) AudioRouteDescription [AudioRouteKey_Outputs];
344
if (arr == null || arr.Count == 0)
347
var result = new AudioSessionOutputRouteKind [arr.Count];
348
for (uint i = 0; i < arr.Count; i++) {
349
var dict = new NSDictionary ((IntPtr) arr.ValueAt (i));
351
result [i] = AudioSessionOutputRouteKind.None;
353
if (dict == null || dict.Count == 0)
356
var val = (NSString) dict [AudioRouteKey_Type];
361
if (val == OutputRoute_LineOut) {
362
result [i] = AudioSessionOutputRouteKind.LineOut;
363
} else if (val == OutputRoute_Headphones) {
364
result [i] = AudioSessionOutputRouteKind.Headphones;
365
} else if (val == OutputRoute_BluetoothHFP) {
366
result [i] = AudioSessionOutputRouteKind.BluetoothHFP;
367
} else if (val == OutputRoute_BluetoothA2DP) {
368
result [i] = AudioSessionOutputRouteKind.BluetoothA2DP;
369
} else if (val == OutputRoute_BuiltInReceiver) {
370
result [i] = AudioSessionOutputRouteKind.BuiltInReceiver;
371
} else if (val == OutputRoute_BuiltInSpeaker) {
372
result [i] = AudioSessionOutputRouteKind.BuiltInSpeaker;
373
} else if (val == OutputRoute_USBAudio) {
374
result [i] = AudioSessionOutputRouteKind.USBAudio;
375
} else if (val == OutputRoute_HDMI) {
376
result [i] = AudioSessionOutputRouteKind.HDMI;
377
} else if (val == OutputRoute_AirPlay) {
378
result [i] = AudioSessionOutputRouteKind.AirPlay;
554
return GetOutputRoutes ((NSArray) AudioRouteDescription [AudioRouteKey_Outputs]);