AudioDeviceDetection

Version 7 (Adrian Georgescu, 07/25/2010 02:22 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 7 Adrian Georgescu
[[Image(wiki:AudioDeviceDetection:SipSimpleAudioDevicesChange.png, width=800)]]
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.