| Guide to using M-Audio Audiophile USB with ALSA and Jack v1.3 |
| ======================================================== |
| |
| Thibault Le Meur <Thibault.LeMeur@supelec.fr> |
| |
| This document is a guide to using the M-Audio Audiophile USB (tm) device with |
| ALSA and JACK. |
| |
| 1 - Audiophile USB Specs and correct usage |
| ========================================== |
| This part is a reminder of important facts about the functions and limitations |
| of the device. |
| |
| The device has 4 audio interfaces, and 2 MIDI ports: |
| * Analog Stereo Input (Ai) |
| - This port supports 2 pairs of line-level audio inputs (1/4" TS and RCA) |
| - When the 1/4" TS (jack) connectors are connected, the RCA connectors |
| are disabled |
| * Analog Stereo Output (Ao) |
| * Digital Stereo Input (Di) |
| * Digital Stereo Output (Do) |
| * Midi In (Mi) |
| * Midi Out (Mo) |
| |
| The internal DAC/ADC has the following characteristics: |
| * sample depth of 16 or 24 bits |
| * sample rate from 8kHz to 96kHz |
| * Two ports can't use different sample depths at the same time. Moreover, the |
| Audiophile USB documentation gives the following Warning: "Please exit any |
| audio application running before switching between bit depths" |
| |
| Due to the USB 1.1 bandwidth limitation, a limited number of interfaces can be |
| activated at the same time depending on the audio mode selected: |
| * 16-bit/48kHz ==> 4 channels in/4 channels out |
| - Ai+Ao+Di+Do |
| * 24-bit/48kHz ==> 4 channels in/2 channels out, |
| or 2 channels in/4 channels out |
| - Ai+Ao+Do or Ai+Di+Ao or Ai+Di+Do or Di+Ao+Do |
| * 24-bit/96kHz ==> 2 channels in, or 2 channels out (half duplex only) |
| - Ai or Ao or Di or Do |
| |
| Important facts about the Digital interface: |
| -------------------------------------------- |
| * The Do port additionally supports surround-encoded AC-3 and DTS passthrough, |
| though I haven't tested it under Linux |
| - Note that in this setup only the Do interface can be enabled |
| * Apart from recording an audio digital stream, enabling the Di port is a way |
| to synchronize the device to an external sample clock |
| - As a consequence, the Di port must be enable only if an active Digital |
| source is connected |
| - Enabling Di when no digital source is connected can result in a |
| synchronization error (for instance sound played at an odd sample rate) |
| |
| |
| 2 - Audiophile USB support in ALSA |
| ================================== |
| |
| 2.1 - MIDI ports |
| ---------------- |
| The Audiophile USB MIDI ports will be automatically supported once the |
| following modules have been loaded: |
| * snd-usb-audio |
| * snd-seq-midi |
| |
| No additional setting is required. |
| |
| 2.2 - Audio ports |
| ----------------- |
| |
| Audio functions of the Audiophile USB device are handled by the snd-usb-audio |
| module. This module can work in a default mode (without any device-specific |
| parameter), or in an "advanced" mode with the device-specific parameter called |
| "device_setup". |
| |
| 2.2.1 - Default Alsa driver mode |
| |
| The default behavior of the snd-usb-audio driver is to parse the device |
| capabilities at startup and enable all functions inside the device (including |
| all ports at any supported sample rates and sample depths). This approach |
| has the advantage to let the driver easily switch from sample rates/depths |
| automatically according to the need of the application claiming the device. |
| |
| In this case the Audiophile ports are mapped to alsa pcm devices in the |
| following way (I suppose the device's index is 1): |
| * hw:1,0 is Ao in playback and Di in capture |
| * hw:1,1 is Do in playback and Ai in capture |
| * hw:1,2 is Do in AC3/DTS passthrough mode |
| |
| You must note as well that the device uses Big Endian byte encoding so that |
| supported audio format are S16_BE for 16-bit depth modes and S24_3BE for |
| 24-bits depth mode. One exception is the hw:1,2 port which is Little Endian |
| compliant and thus uses S16_LE. |
| |
| Examples: |
| * playing a S24_3BE encoded raw file to the Ao port |
| % aplay -D hw:1,0 -c2 -t raw -r48000 -fS24_3BE test.raw |
| * recording a S24_3BE encoded raw file from the Ai port |
| % arecord -D hw:1,1 -c2 -t raw -r48000 -fS24_3BE test.raw |
| * playing a S16_BE encoded raw file to the Do port |
| % aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_BE test.raw |
| |
| If you're happy with the default Alsa driver setup and don't experience any |
| issue with this mode, then you can skip the following chapter. |
| |
| 2.2.2 - Advanced module setup |
| |
| Due to the hardware constraints described above, the device initialization made |
| by the Alsa driver in default mode may result in a corrupted state of the |
| device. For instance, a particularly annoying issue is that the sound captured |
| from the Ai port sounds distorted (as if boosted with an excessive high volume |
| gain). |
| |
| For people having this problem, the snd-usb-audio module has a new module |
| parameter called "device_setup". |
| |
| 2.2.2.1 - Initializing the working mode of the Audiophile USB |
| |
| As far as the Audiophile USB device is concerned, this value let the user |
| specify: |
| * the sample depth |
| * the sample rate |
| * whether the Di port is used or not |
| |
| Here is a list of supported device_setup values for this device: |
| * device_setup=0x00 (or omitted) |
| - Alsa driver default mode |
| - maintains backward compatibility with setups that do not use this |
| parameter by not introducing any change |
| - results sometimes in corrupted sound as described earlier |
| * device_setup=0x01 |
| - 16bits 48kHz mode with Di disabled |
| - Ai,Ao,Do can be used at the same time |
| - hw:1,0 is not available in capture mode |
| - hw:1,2 is not available |
| * device_setup=0x11 |
| - 16bits 48kHz mode with Di enabled |
| - Ai,Ao,Di,Do can be used at the same time |
| - hw:1,0 is available in capture mode |
| - hw:1,2 is not available |
| * device_setup=0x09 |
| - 24bits 48kHz mode with Di disabled |
| - Ai,Ao,Do can be used at the same time |
| - hw:1,0 is not available in capture mode |
| - hw:1,2 is not available |
| * device_setup=0x19 |
| - 24bits 48kHz mode with Di enabled |
| - 3 ports from {Ai,Ao,Di,Do} can be used at the same time |
| - hw:1,0 is available in capture mode and an active digital source must be |
| connected to Di |
| - hw:1,2 is not available |
| * device_setup=0x0D or 0x10 |
| - 24bits 96kHz mode |
| - Di is enabled by default for this mode but does not need to be connected |
| to an active source |
| - Only 1 port from {Ai,Ao,Di,Do} can be used at the same time |
| - hw:1,0 is available in captured mode |
| - hw:1,2 is not available |
| * device_setup=0x03 |
| - 16bits 48kHz mode with only the Do port enabled |
| - AC3 with DTS passthru (not tested) |
| - Caution with this setup the Do port is mapped to the pcm device hw:1,0 |
| |
| 2.2.2.2 - Setting and switching configurations with the device_setup parameter |
| |
| The parameter can be given: |
| * By manually probing the device (as root): |
| # modprobe -r snd-usb-audio |
| # modprobe snd-usb-audio index=1 device_setup=0x09 |
| * Or while configuring the modules options in your modules configuration file |
| - For Fedora distributions, edit the /etc/modprobe.conf file: |
| alias snd-card-1 snd-usb-audio |
| options snd-usb-audio index=1 device_setup=0x09 |
| |
| IMPORTANT NOTE WHEN SWITCHING CONFIGURATION: |
| ------------------------------------------- |
| * You may need to _first_ initialize the module with the correct device_setup |
| parameter and _only_after_ turn on the Audiophile USB device |
| * This is especially true when switching the sample depth: |
| - first turn off the device |
| - de-register the snd-usb-audio module (modprobe -r) |
| - change the device_setup parameter by changing the device_setup |
| option in /etc/modprobe.conf |
| - turn on the device |
| |
| 2.2.2.3 - Audiophile USB's device_setup structure |
| |
| If you want to understand the device_setup magic numbers for the Audiophile |
| USB, you need some very basic understanding of binary computation. However, |
| this is not required to use the parameter and you may skip this section. |
| |
| The device_setup is one byte long and its structure is the following: |
| |
| +---+---+---+---+---+---+---+---+ |
| | b7| b6| b5| b4| b3| b2| b1| b0| |
| +---+---+---+---+---+---+---+---+ |
| | 0 | 0 | 0 | Di|24B|96K|DTS|SET| |
| +---+---+---+---+---+---+---+---+ |
| |
| Where: |
| * b0 is the "SET" bit |
| - it MUST be set if device_setup is initialized |
| * b1 is the "DTS" bit |
| - it is set only for Digital output with DTS/AC3 |
| - this setup is not tested |
| * b2 is the Rate selection flag |
| - When set to "1" the rate range is 48.1-96kHz |
| - Otherwise the sample rate range is 8-48kHz |
| * b3 is the bit depth selection flag |
| - When set to "1" samples are 24bits long |
| - Otherwise they are 16bits long |
| - Note that b2 implies b3 as the 96kHz mode is only supported for 24 bits |
| samples |
| * b4 is the Digital input flag |
| - When set to "1" the device assumes that an active digital source is |
| connected |
| - You shouldn't enable Di if no source is seen on the port (this leads to |
| synchronization issues) |
| - b4 is implied by b2 (since only one port is enabled at a time no synch |
| error can occur) |
| * b5 to b7 are reserved for future uses, and must be set to "0" |
| - might become Ao, Do, Ai, for b7, b6, b4 respectively |
| |
| Caution: |
| * there is no check on the value you will give to device_setup |
| - for instance choosing 0x05 (16bits 96kHz) will fail back to 0x09 since |
| b2 implies b3. But _there_will_be_no_warning_ in /var/log/messages |
| * Hardware constraints due to the USB bus limitation aren't checked |
| - choosing b2 will prepare all interfaces for 24bits/96kHz but you'll |
| only be able to use one at the same time |
| |
| 2.2.3 - USB implementation details for this device |
| |
| You may safely skip this section if you're not interested in driver |
| development. |
| |
| This section describes some internal aspects of the device and summarize the |
| data I got by usb-snooping the windows and Linux drivers. |
| |
| The M-Audio Audiophile USB has 7 USB Interfaces: |
| a "USB interface": |
| * USB Interface nb.0 |
| * USB Interface nb.1 |
| - Audio Control function |
| * USB Interface nb.2 |
| - Analog Output |
| * USB Interface nb.3 |
| - Digital Output |
| * USB Interface nb.4 |
| - Analog Input |
| * USB Interface nb.5 |
| - Digital Input |
| * USB Interface nb.6 |
| - MIDI interface compliant with the MIDIMAN quirk |
| |
| Each interface has 5 altsettings (AltSet 1,2,3,4,5) except: |
| * Interface 3 (Digital Out) has an extra Alset nb.6 |
| * Interface 5 (Digital In) does not have Alset nb.3 and 5 |
| |
| Here is a short description of the AltSettings capabilities: |
| * AltSettings 1 corresponds to |
| - 24-bit depth, 48.1-96kHz sample mode |
| - Adaptive playback (Ao and Do), Synch capture (Ai), or Asynch capture (Di) |
| * AltSettings 2 corresponds to |
| - 24-bit depth, 8-48kHz sample mode |
| - Asynch capture and playback (Ao,Ai,Do,Di) |
| * AltSettings 3 corresponds to |
| - 24-bit depth, 8-48kHz sample mode |
| - Synch capture (Ai) and Adaptive playback (Ao,Do) |
| * AltSettings 4 corresponds to |
| - 16-bit depth, 8-48kHz sample mode |
| - Asynch capture and playback (Ao,Ai,Do,Di) |
| * AltSettings 5 corresponds to |
| - 16-bit depth, 8-48kHz sample mode |
| - Synch capture (Ai) and Adaptive playback (Ao,Do) |
| * AltSettings 6 corresponds to |
| - 16-bit depth, 8-48kHz sample mode |
| - Synch playback (Do), audio format type III IEC1937_AC-3 |
| |
| In order to ensure a correct initialization of the device, the driver |
| _must_know_ how the device will be used: |
| * if DTS is chosen, only Interface 2 with AltSet nb.6 must be |
| registered |
| * if 96KHz only AltSets nb.1 of each interface must be selected |
| * if samples are using 24bits/48KHz then AltSet 2 must me used if |
| Digital input is connected, and only AltSet nb.3 if Digital input |
| is not connected |
| * if samples are using 16bits/48KHz then AltSet 4 must me used if |
| Digital input is connected, and only AltSet nb.5 if Digital input |
| is not connected |
| |
| When device_setup is given as a parameter to the snd-usb-audio module, the |
| parse_audio_endpoints function uses a quirk called |
| "audiophile_skip_setting_quirk" in order to prevent AltSettings not |
| corresponding to device_setup from being registered in the driver. |
| |
| 3 - Audiophile USB and Jack support |
| =================================== |
| |
| This section deals with support of the Audiophile USB device in Jack. |
| The main issue regarding this support is that the device is Big Endian |
| compliant. |
| |
| 3.1 - Using the plug alsa plugin |
| -------------------------------- |
| |
| Jack doesn't directly support big endian devices. Thus, one way to have support |
| for this device with Alsa is to use the Alsa "plug" converter. |
| |
| For instance here is one way to run Jack with 2 playback channels on Ao and 2 |
| capture channels from Ai: |
| % jackd -R -dalsa -dplughw:1 -r48000 -p256 -n2 -D -Cplughw:1,1 |
| |
| |
| However you may see the following warning message: |
| "You appear to be using the ALSA software "plug" layer, probably a result of |
| using the "default" ALSA device. This is less efficient than it could be. |
| Consider using a hardware device instead rather than using the plug layer." |
| |
| 3.2 - Patching alsa to use direct pcm device |
| -------------------------------------------- |
| A patch for Jack by Andreas Steinmetz adds support for Big Endian devices. |
| However it has not been included in the CVS tree. |
| |
| You can find it at the following URL: |
| http://sourceforge.net/tracker/index.php?func=detail&aid=1289682&group_id=39687& |
| atid=425939 |
| |
| After having applied the patch you can run jackd with the following command |
| line: |
| % jackd -R -dalsa -Phw:1,0 -r48000 -p128 -n2 -D -Chw:1,1 |
| |
| 3.2 - Getting 2 input and/or output interfaces in Jack |
| ------------------------------------------------------ |
| |
| As you can see, starting the Jack server this way will only enable 1 stereo |
| input (Di or Ai) and 1 stereo output (Ao or Do). |
| |
| This is due to the following restrictions: |
| * Jack can only open one capture device and one playback device at a time |
| * The Audiophile USB is seen as 2 (or three) Alsa devices: hw:1,0, hw:1,1 |
| (and optionally hw:1,2) |
| If you want to get Ai+Di and/or Ao+Do support with Jack, you would need to |
| combine the Alsa devices into one logical "complex" device. |
| |
| If you want to give it a try, I recommend reading the information from |
| this page: http://www.sound-man.co.uk/linuxaudio/ice1712multi.html |
| It is related to another device (ice1712) but can be adapted to suit |
| the Audiophile USB. |
| |
| Enabling multiple Audiophile USB interfaces for Jackd will certainly require: |
| * patching Jack with the previously mentioned "Big Endian" patch |
| * patching Jackd with the MMAP_COMPLEX patch (see the ice1712 page) |
| * patching the alsa-lib/src/pcm/pcm_multi.c file (see the ice1712 page) |
| * define a multi device (combination of hw:1,0 and hw:1,1) in your .asoundrc |
| file |
| * start jackd with this device |
| |
| I had no success in testing this for now, but this may be due to my OS |
| configuration. If you have any success with this kind of setup, please |
| drop me an email. |