123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443 |
- Guide to using M-Audio Audiophile USB with ALSA and Jack v1.5
- ========================================================
- 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.
- History
- =======
- * v1.4 - Thibault Le Meur (2007-07-11)
- - Added Low Endianness nature of 16bits-modes
- found by Hakan Lennestal <Hakan.Lennestal@brfsodrahamn.se>
- - Modifying document structure
- * v1.5 - Thibault Le Meur (2007-07-12)
- - Added AC3/DTS passthru info
- 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 interfaces 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 MIDI support in ALSA
- =======================================
- 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.
- 3 - Audiophile USB Audio support in ALSA
- ========================================
- 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".
- 3.1 - Default Alsa driver mode
- ------------------------------
- The default behavior of the snd-usb-audio driver is to list the device
- capabilities at startup and activate the required mode when required
- by the applications: for instance if the user is recording in a
- 24bit-depth-mode and immediately after wants to switch to a 16bit-depth mode,
- the snd-usb-audio module will reconfigure the device on the fly.
- This approach has the advantage to let the driver automatically switch from sample
- rates/depths automatically according to the user's needs. However, those who
- are using the device under windows know that this is not how the device is meant to
- work: under windows applications must be closed before using the m-audio control
- panel to switch the device working mode. Thus as we'll see in next section, this
- Default Alsa driver mode can lead to device misconfigurations.
- Let's get back to the Default Alsa driver mode for now. In this case the
- Audiophile interfaces 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
- In this mode, 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 was reported to be Little Endian
- compliant (supposedly supporting S16_LE) but processes in fact only S16_BE streams.
- This has been fixed in kernel 2.6.23 and above and now the hw:1,2 interface
- is reported to be big endian in this default driver mode.
- 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
- * playing an ac3 sample file to the Do port
- % aplay -D hw:1,2 --channels=6 ac3_S16_BE_encoded_file.raw
- If you're happy with the default Alsa driver mode and don't experience any
- issue with this mode, then you can skip the following chapter.
- 3.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 interface 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" (this parameter was introduced in kernel
- release 2.6.17)
- 3.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
- When initialized with "device_setup=0x00", the snd-usb-audio module has
- the same behaviour as when the parameter is omitted (see paragraph "Default
- Alsa driver mode" above)
- Others modes are described in the following subsections.
- 3.2.1.1 - 16-bit modes
- The two supported modes are:
- * 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
- In this modes the device operates only at 16bits-modes. Before kernel 2.6.23,
- the devices where reported to be Big-Endian when in fact they were Little-Endian
- so that playing a file was a matter of using:
- % aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_BE test_S16_LE.raw
- where "test_S16_LE.raw" was in fact a little-endian sample file.
- Thanks to Hakan Lennestal (who discovered the Little-Endiannes of the device in
- these modes) a fix has been committed (expected in kernel 2.6.23) and
- Alsa now reports Little-Endian interfaces. Thus playing a file now is as simple as
- using:
- % aplay -D hw:1,1 -c2 -t raw -r48000 -fS16_LE test_S16_LE.raw
- 3.2.1.2 - 24-bit modes
- The three supported modes are:
- * 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
- In these modes the device is only Big-Endian compliant (see "Default Alsa driver
- mode" above for an aplay command example)
- 3.2.1.3 - AC3 w/ DTS passthru mode
- Thanks to Hakan Lennestal, I now have a report saying that this mode works.
- * device_setup=0x03
- - 16bits 48kHz mode with only the Do port enabled
- - AC3 with DTS passthru
- - Caution with this setup the Do port is mapped to the pcm device hw:1,0
- The command line used to playback the AC3/DTS encoded .wav-files in this mode:
- % aplay -D hw:1,0 --channels=6 ac3_S16_LE_encoded_file.raw
- 3.2.2 - How to use 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
- (typically a .conf file in /etc/modprobe.d/ directory:
- alias snd-card-1 snd-usb-audio
- options snd-usb-audio index=1 device_setup=0x09
- CAUTION when initializing the device
- -------------------------------------
- * Correct initialization on the device requires that device_setup is given to
- the module BEFORE the device is turned on. So, if you use the "manual probing"
- method described above, take care to power-on the device AFTER this initialization.
- * Failing to respect this will lead to a misconfiguration of the device. In this case
- turn off the device, unprobe the snd-usb-audio module, then probe it again with
- correct device_setup parameter and then (and only then) turn on the device again.
- * If you've correctly initialized the device in a valid mode and then want to switch
- to another mode (possibly with another sample-depth), please use also the following
- procedure:
- - 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.d/*.conf
- - turn on the device
- * A workaround for this last issue has been applied to kernel 2.6.23, but it may not
- be enough to ensure the 'stability' of the device initialization.
- 3.2.3 - Technical details for hackers
- -------------------------------------
- This section is for hackers, wanting to understand details about the device
- internals and how Alsa supports it.
- 3.2.3.1 - 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
- 3.2.3.2 - USB implementation details for this device
- You may safely skip this section if you're not interested in driver
- hacking.
- This section describes some internal aspects of the device and summarizes 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.
- 4 - Audiophile USB and Jack support
- ===================================
- This section deals with support of the Audiophile USB device in Jack.
- There are 2 main potential issues when using Jackd with the device:
- * support for Big-Endian devices in 24-bit modes
- * support for 4-in / 4-out channels
- 4.1 - Direct support in Jackd
- -----------------------------
- Jack supports big endian devices only in recent versions (thanks to
- Andreas Steinmetz for his first big-endian patch). I can't remember
- exactly when this support was released into jackd, let's just say that
- with jackd version 0.103.0 it's almost ok (just a small bug is affecting
- 16bits Big-Endian devices, but since you've read carefully the above
- paragraphs, you're now using kernel >= 2.6.23 and your 16bits devices
- are now Little Endians ;-) ).
- You can run jackd with the following command for playback with Ao and
- record with Ai:
- % jackd -R -dalsa -Phw:1,0 -r48000 -p128 -n2 -D -Chw:1,1
- 4.2 - Using Alsa plughw
- -----------------------
- If you don't have a recent Jackd installed, you can downgrade to using
- 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."
- 4.3 - 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:
- * Making sure your Jackd version has the MMAP_COMPLEX patch (see the ice1712 page)
- * (maybe) 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, if you have any success with this kind
- of setup, please drop me an email.
|