AudioDeviceDetection
Version 4 (Anonymous, 07/25/2010 12:17 pm)
1 | 1 | Adrian Georgescu | = Audio Device Detection = |
---|---|---|---|
2 | 2 | Adrian Georgescu | |
3 | 3 | Adrian Georgescu | [[TOC(Design*, AudioDeviceDetection, depth=1)]] |
4 | 4 | Adrian Georgescu | |
5 | 4 | Adrian Georgescu | == Introduction == |
6 | 4 | Adrian Georgescu | |
7 | 4 | Adrian Georgescu | The idea behind audio device detection is to allow SIP users to switch headphones, speakers or microphones as they are plugged or unplugged from the computer. |
8 | 4 | Adrian Georgescu | |
9 | 4 | Adrian Georgescu | Many SIP applications allow this. Some require to restart the application, while others can detect it while running. SIP SIMPLE client can currently detect hotplugged devices in Mac OS X platforms. |
10 | 4 | Adrian Georgescu | |
11 | 4 | Adrian Georgescu | |
12 | 4 | Adrian Georgescu | == Goal == |
13 | 4 | Adrian Georgescu | |
14 | 4 | Adrian Georgescu | The ultimate goal is to enable SIP SIMPLE client applications to detect audio device changes on the fly in all currently supported platforms, with the most immediate priority being [ticket:117 Windows platform]. |
15 | 4 | Adrian Georgescu | |
16 | 4 | Adrian Georgescu | |
17 | 4 | Adrian Georgescu | == Schematic Overview == |
18 | 4 | Adrian Georgescu | |
19 | 4 | Adrian Georgescu | [[Image(wiki:AudioDeviceDetection:SipSimpleAudioDevicesChange.svg)]] |
20 | 4 | Adrian Georgescu | |
21 | 4 | Adrian Georgescu | |
22 | 4 | Adrian Georgescu | == Required Modifications == |
23 | 4 | Adrian Georgescu | |
24 | 4 | Adrian Georgescu | After a first analysis of the SIP SIMPLE client SDK, these are the necessary code modifications: |
25 | 4 | Adrian Georgescu | |
26 | 4 | Adrian Georgescu | === PortAudio modifications === |
27 | 4 | Adrian Georgescu | |
28 | 4 | Adrian Georgescu | First, it's necessary to hook up into the host OS multimedia system in order to get notified when new devices are added or old ones removed. If the OS doesn't provide a notification API, a poll loop with sensible frequency settings will need to be used. |
29 | 4 | Adrian Georgescu | * Currently, this is already achieved in Mac OS X through the `AudioHardwareAddPropertyListener` function in Core Audio API. |
30 | 4 | Adrian Georgescu | * In Windows platforms (under `WMME` hostapi), `WM_DEVICECHANGE` notification or similar methods may be used (proper research of `mmsystem` API is pending). |
31 | 4 | Adrian Georgescu | * Each of the rest of platforms (or corresponding hostapis) will need their own implementations too. |
32 | 4 | Adrian Georgescu | |
33 | 4 | Adrian Georgescu | Second, the hostapi needs to react to the `DevicesChanged` notification, by updating the internal audio devices data (after which PortAudio will proceed to notify upper layers about the availability of a new devices list). This is achieved through the `RescanDevices` function. |
34 | 4 | Adrian Georgescu | * Mac OS X hostapi, Audiocore, already updates its internal devices list with `RescanDevices()`. |
35 | 4 | Adrian Georgescu | * Windows platform lacks such a function. [http://osdir.com/ml/audio.portaudio.devel/2007-02/msg00094.html Partial implementations] have been provided in PortAudio mailing list, but have not yet been integrated into SIP SIMPLE client official releases. |
36 | 4 | Adrian Georgescu | * The rest of platforms will need their own implementations too. |
37 | 4 | Adrian Georgescu | |
38 | 4 | Adrian Georgescu | === SIP SIMPLE client modifications === |
39 | 4 | Adrian Georgescu | |
40 | 4 | Adrian Georgescu | The Windows version of SIP SIMPLE client SDK may need some very minor tweaks. |
41 | 4 | Adrian Georgescu | |
42 | 4 | Adrian Georgescu | At first sight, `AudioDevicesDidChange` and `DefaultAudioDeviceDidChange` observers have to be added to `Application` implementation. |