mirror of
https://github.com/AetherDroid/android_kernel_samsung_on5xelte.git
synced 2025-09-05 07:57:45 -04:00
Fixed MTP to work with TWRP
This commit is contained in:
commit
f6dfaef42e
50820 changed files with 20846062 additions and 0 deletions
2321
Documentation/sound/alsa/ALSA-Configuration.txt
Normal file
2321
Documentation/sound/alsa/ALSA-Configuration.txt
Normal file
File diff suppressed because it is too large
Load diff
345
Documentation/sound/alsa/Audigy-mixer.txt
Normal file
345
Documentation/sound/alsa/Audigy-mixer.txt
Normal file
|
@ -0,0 +1,345 @@
|
|||
|
||||
Sound Blaster Audigy mixer / default DSP code
|
||||
===========================================
|
||||
|
||||
This is based on SB-Live-mixer.txt.
|
||||
|
||||
The EMU10K2 chips have a DSP part which can be programmed to support
|
||||
various ways of sample processing, which is described here.
|
||||
(This article does not deal with the overall functionality of the
|
||||
EMU10K2 chips. See the manuals section for further details.)
|
||||
|
||||
The ALSA driver programs this portion of chip by default code
|
||||
(can be altered later) which offers the following functionality:
|
||||
|
||||
|
||||
1) Digital mixer controls
|
||||
-------------------------
|
||||
|
||||
These controls are built using the DSP instructions. They offer extended
|
||||
functionality. Only the default build-in code in the ALSA driver is described
|
||||
here. Note that the controls work as attenuators: the maximum value is the
|
||||
neutral position leaving the signal unchanged. Note that if the same destination
|
||||
is mentioned in multiple controls, the signal is accumulated and can be wrapped
|
||||
(set to maximal or minimal value without checking of overflow).
|
||||
|
||||
|
||||
Explanation of used abbreviations:
|
||||
|
||||
DAC - digital to analog converter
|
||||
ADC - analog to digital converter
|
||||
I2S - one-way three wire serial bus for digital sound by Philips Semiconductors
|
||||
(this standard is used for connecting standalone DAC and ADC converters)
|
||||
LFE - low frequency effects (subwoofer signal)
|
||||
AC97 - a chip containing an analog mixer, DAC and ADC converters
|
||||
IEC958 - S/PDIF
|
||||
FX-bus - the EMU10K2 chip has an effect bus containing 64 accumulators.
|
||||
Each of the synthesizer voices can feed its output to these accumulators
|
||||
and the DSP microcontroller can operate with the resulting sum.
|
||||
|
||||
name='PCM Front Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right front PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 8 and 9 for left and right front PCM
|
||||
samples for 5.1 playback. The result samples are forwarded to the front DAC PCM
|
||||
slots of the Philips DAC.
|
||||
|
||||
name='PCM Surround Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right surround PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 2 and 3 for left and right surround PCM
|
||||
samples for 5.1 playback. The result samples are forwarded to the surround DAC PCM
|
||||
slots of the Philips DAC.
|
||||
|
||||
name='PCM Center Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for center PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 6 for center PCM sample for 5.1 playback. The result sample
|
||||
is forwarded to the center DAC PCM slot of the Philips DAC.
|
||||
|
||||
name='PCM LFE Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate sample for LFE PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 7 for LFE PCM sample for 5.1 playback. The result sample
|
||||
is forwarded to the LFE DAC PCM slot of the Philips DAC.
|
||||
|
||||
name='PCM Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples for
|
||||
stereo playback. The result samples are forwarded to the front DAC PCM slots
|
||||
of the Philips DAC.
|
||||
|
||||
name='PCM Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulator. ALSA uses accumulators 0 and 1 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Music Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulators. ALSA uses accumulators 4 and 5 for left and right MIDI samples.
|
||||
The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Music Capture Volume',index=0
|
||||
|
||||
These controls are used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulator. ALSA uses accumulators 4 and 5 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Mic Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right Mic input.
|
||||
For Mic input is used AC97 codec. The result samples are forwarded to
|
||||
the front DAC PCM slots of the Philips DAC. Samples are forwarded to Mic
|
||||
capture FIFO (device 1 - 16bit/8KHz mono) too without volume control.
|
||||
|
||||
name='Mic Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right Mic input.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Audigy CD Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the front DAC PCM slots of the Philips DAC.
|
||||
|
||||
name='Audigy CD Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='IEC958 Optical Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital input. The result samples are forwarded to the front DAC PCM slots
|
||||
of the Philips DAC.
|
||||
|
||||
name='IEC958 Optical Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital inputs. The result samples are forwarded to the ADC capture FIFO
|
||||
(thus to the standard capture PCM device).
|
||||
|
||||
name='Line2 Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the front
|
||||
DAC PCM slots of the Philips DAC.
|
||||
|
||||
name='Line2 Capture Volume',index=1
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Analog Mix Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs from Philips ADC. The result samples are forwarded to the front
|
||||
DAC PCM slots of the Philips DAC. This contains mix from analog sources
|
||||
like CD, Line In, Aux, ....
|
||||
|
||||
name='Analog Mix Capture Volume',index=1
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs Philips ADC. The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Aux2 Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the front
|
||||
DAC PCM slots of the Philips DAC.
|
||||
|
||||
name='Aux2 Capture Volume',index=1
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the AudigyDrive). The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Front Playback Volume',index=0
|
||||
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate samples for left and right front speakers of
|
||||
this mix.
|
||||
|
||||
name='Surround Playback Volume',index=0
|
||||
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate samples for left and right surround speakers of
|
||||
this mix.
|
||||
|
||||
name='Center Playback Volume',index=0
|
||||
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate sample for center speaker of this mix.
|
||||
|
||||
name='LFE Playback Volume',index=0
|
||||
|
||||
All stereo signals are mixed together and mirrored to surround, center and LFE.
|
||||
This control is used to attenuate sample for LFE speaker of this mix.
|
||||
|
||||
name='Tone Control - Switch',index=0
|
||||
|
||||
This control turns the tone control on or off. The samples for front, rear
|
||||
and center / LFE outputs are affected.
|
||||
|
||||
name='Tone Control - Bass',index=0
|
||||
|
||||
This control sets the bass intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='Tone Control - Treble',index=0
|
||||
|
||||
This control sets the treble intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='Master Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for front, surround, center and
|
||||
LFE outputs.
|
||||
|
||||
name='IEC958 Optical Raw Playback Switch',index=0
|
||||
|
||||
If this switch is on, then the samples for the IEC958 (S/PDIF) digital
|
||||
output are taken only from the raw FX8010 PCM, otherwise standard front
|
||||
PCM samples are taken.
|
||||
|
||||
|
||||
2) PCM stream related controls
|
||||
------------------------------
|
||||
|
||||
name='EMU10K1 PCM Volume',index 0-31
|
||||
|
||||
Channel volume attenuation in range 0-0xffff. The maximum value (no
|
||||
attenuation) is default. The channel mapping for three values is
|
||||
as follows:
|
||||
|
||||
0 - mono, default 0xffff (no attenuation)
|
||||
1 - left, default 0xffff (no attenuation)
|
||||
2 - right, default 0xffff (no attenuation)
|
||||
|
||||
name='EMU10K1 PCM Send Routing',index 0-31
|
||||
|
||||
This control specifies the destination - FX-bus accumulators. There 24
|
||||
values with this mapping:
|
||||
|
||||
0 - mono, A destination (FX-bus 0-63), default 0
|
||||
1 - mono, B destination (FX-bus 0-63), default 1
|
||||
2 - mono, C destination (FX-bus 0-63), default 2
|
||||
3 - mono, D destination (FX-bus 0-63), default 3
|
||||
4 - mono, E destination (FX-bus 0-63), default 0
|
||||
5 - mono, F destination (FX-bus 0-63), default 0
|
||||
6 - mono, G destination (FX-bus 0-63), default 0
|
||||
7 - mono, H destination (FX-bus 0-63), default 0
|
||||
8 - left, A destination (FX-bus 0-63), default 0
|
||||
9 - left, B destination (FX-bus 0-63), default 1
|
||||
10 - left, C destination (FX-bus 0-63), default 2
|
||||
11 - left, D destination (FX-bus 0-63), default 3
|
||||
12 - left, E destination (FX-bus 0-63), default 0
|
||||
13 - left, F destination (FX-bus 0-63), default 0
|
||||
14 - left, G destination (FX-bus 0-63), default 0
|
||||
15 - left, H destination (FX-bus 0-63), default 0
|
||||
16 - right, A destination (FX-bus 0-63), default 0
|
||||
17 - right, B destination (FX-bus 0-63), default 1
|
||||
18 - right, C destination (FX-bus 0-63), default 2
|
||||
19 - right, D destination (FX-bus 0-63), default 3
|
||||
20 - right, E destination (FX-bus 0-63), default 0
|
||||
21 - right, F destination (FX-bus 0-63), default 0
|
||||
22 - right, G destination (FX-bus 0-63), default 0
|
||||
23 - right, H destination (FX-bus 0-63), default 0
|
||||
|
||||
Don't forget that it's illegal to assign a channel to the same FX-bus accumulator
|
||||
more than once (it means 0=0 && 1=0 is an invalid combination).
|
||||
|
||||
name='EMU10K1 PCM Send Volume',index 0-31
|
||||
|
||||
It specifies the attenuation (amount) for given destination in range 0-255.
|
||||
The channel mapping is following:
|
||||
|
||||
0 - mono, A destination attn, default 255 (no attenuation)
|
||||
1 - mono, B destination attn, default 255 (no attenuation)
|
||||
2 - mono, C destination attn, default 0 (mute)
|
||||
3 - mono, D destination attn, default 0 (mute)
|
||||
4 - mono, E destination attn, default 0 (mute)
|
||||
5 - mono, F destination attn, default 0 (mute)
|
||||
6 - mono, G destination attn, default 0 (mute)
|
||||
7 - mono, H destination attn, default 0 (mute)
|
||||
8 - left, A destination attn, default 255 (no attenuation)
|
||||
9 - left, B destination attn, default 0 (mute)
|
||||
10 - left, C destination attn, default 0 (mute)
|
||||
11 - left, D destination attn, default 0 (mute)
|
||||
12 - left, E destination attn, default 0 (mute)
|
||||
13 - left, F destination attn, default 0 (mute)
|
||||
14 - left, G destination attn, default 0 (mute)
|
||||
15 - left, H destination attn, default 0 (mute)
|
||||
16 - right, A destination attn, default 0 (mute)
|
||||
17 - right, B destination attn, default 255 (no attenuation)
|
||||
18 - right, C destination attn, default 0 (mute)
|
||||
19 - right, D destination attn, default 0 (mute)
|
||||
20 - right, E destination attn, default 0 (mute)
|
||||
21 - right, F destination attn, default 0 (mute)
|
||||
22 - right, G destination attn, default 0 (mute)
|
||||
23 - right, H destination attn, default 0 (mute)
|
||||
|
||||
|
||||
|
||||
4) MANUALS/PATENTS:
|
||||
-------------------
|
||||
|
||||
ftp://opensource.creative.com/pub/doc
|
||||
-------------------------------------
|
||||
|
||||
Files:
|
||||
LM4545.pdf AC97 Codec
|
||||
|
||||
m2049.pdf The EMU10K1 Digital Audio Processor
|
||||
|
||||
hog63.ps FX8010 - A DSP Chip Architecture for Audio Effects
|
||||
|
||||
|
||||
WIPO Patents
|
||||
------------
|
||||
Patent numbers:
|
||||
WO 9901813 (A1) Audio Effects Processor with multiple asynchronous (Jan. 14, 1999)
|
||||
streams
|
||||
|
||||
WO 9901814 (A1) Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
|
||||
|
||||
WO 9901953 (A1) Audio Effects Processor having Decoupled Instruction
|
||||
Execution and Audio Data Sequencing (Jan. 14, 1999)
|
||||
|
||||
|
||||
US Patents (http://www.uspto.gov/)
|
||||
----------------------------------
|
||||
|
||||
US 5925841 Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
|
||||
US 5928342 Audio Effects Processor integrated on a single chip (Jul. 27, 1999)
|
||||
with a multiport memory onto which multiple asynchronous
|
||||
digital sound samples can be concurrently loaded
|
||||
|
||||
US 5930158 Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
|
||||
|
||||
US 6032235 Memory initialization circuit (Tram) (Feb. 29, 2000)
|
||||
|
||||
US 6138207 Interpolation looping of audio samples in cache connected to (Oct. 24, 2000)
|
||||
system bus with prioritization and modification of bus transfers
|
||||
in accordance with loop ends and minimum block sizes
|
||||
|
||||
US 6151670 Method for conserving memory storage using a (Nov. 21, 2000)
|
||||
pool of short term memory registers
|
||||
|
||||
US 6195715 Interrupt control for multiple programs communicating with (Feb. 27, 2001)
|
||||
a common interrupt by associating programs to GP registers,
|
||||
defining interrupt register, polling GP registers, and invoking
|
||||
callback routine associated with defined interrupt register
|
442
Documentation/sound/alsa/Audiophile-Usb.txt
Normal file
442
Documentation/sound/alsa/Audiophile-Usb.txt
Normal file
|
@ -0,0 +1,442 @@
|
|||
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.
|
78
Documentation/sound/alsa/Bt87x.txt
Normal file
78
Documentation/sound/alsa/Bt87x.txt
Normal file
|
@ -0,0 +1,78 @@
|
|||
Intro
|
||||
=====
|
||||
|
||||
You might have noticed that the bt878 grabber cards have actually
|
||||
_two_ PCI functions:
|
||||
|
||||
$ lspci
|
||||
[ ... ]
|
||||
00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 02)
|
||||
00:0a.1 Multimedia controller: Brooktree Corporation Bt878 (rev 02)
|
||||
[ ... ]
|
||||
|
||||
The first does video, it is backward compatible to the bt848. The second
|
||||
does audio. snd-bt87x is a driver for the second function. It's a sound
|
||||
driver which can be used for recording sound (and _only_ recording, no
|
||||
playback). As most TV cards come with a short cable which can be plugged
|
||||
into your sound card's line-in you probably don't need this driver if all
|
||||
you want to do is just watching TV...
|
||||
|
||||
Some cards do not bother to connect anything to the audio input pins of
|
||||
the chip, and some other cards use the audio function to transport MPEG
|
||||
video data, so it's quite possible that audio recording may not work
|
||||
with your card.
|
||||
|
||||
|
||||
Driver Status
|
||||
=============
|
||||
|
||||
The driver is now stable. However, it doesn't know about many TV cards,
|
||||
and it refuses to load for cards it doesn't know.
|
||||
|
||||
If the driver complains ("Unknown TV card found, the audio driver will
|
||||
not load"), you can specify the load_all=1 option to force the driver to
|
||||
try to use the audio capture function of your card. If the frequency of
|
||||
recorded data is not right, try to specify the digital_rate option with
|
||||
other values than the default 32000 (often it's 44100 or 64000).
|
||||
|
||||
If you have an unknown card, please mail the ID and board name to
|
||||
<alsa-devel@alsa-project.org>, regardless of whether audio capture works
|
||||
or not, so that future versions of this driver know about your card.
|
||||
|
||||
|
||||
Audio modes
|
||||
===========
|
||||
|
||||
The chip knows two different modes (digital/analog). snd-bt87x
|
||||
registers two PCM devices, one for each mode. They cannot be used at
|
||||
the same time.
|
||||
|
||||
|
||||
Digital audio mode
|
||||
==================
|
||||
|
||||
The first device (hw:X,0) gives you 16 bit stereo sound. The sample
|
||||
rate depends on the external source which feeds the Bt87x with digital
|
||||
sound via I2S interface.
|
||||
|
||||
|
||||
Analog audio mode (A/D)
|
||||
=======================
|
||||
|
||||
The second device (hw:X,1) gives you 8 or 16 bit mono sound. Supported
|
||||
sample rates are between 119466 and 448000 Hz (yes, these numbers are
|
||||
that high). If you've set the CONFIG_SND_BT87X_OVERCLOCK option, the
|
||||
maximum sample rate is 1792000 Hz, but audio data becomes unusable
|
||||
beyond 896000 Hz on my card.
|
||||
|
||||
The chip has three analog inputs. Consequently you'll get a mixer
|
||||
device to control these.
|
||||
|
||||
|
||||
Have fun,
|
||||
|
||||
Clemens
|
||||
|
||||
|
||||
Written by Clemens Ladisch <clemens@ladisch.de>
|
||||
big parts copied from btaudio.txt by Gerd Knorr <kraxel@bytesex.org>
|
254
Documentation/sound/alsa/CMIPCI.txt
Normal file
254
Documentation/sound/alsa/CMIPCI.txt
Normal file
|
@ -0,0 +1,254 @@
|
|||
Brief Notes on C-Media 8338/8738/8768/8770 Driver
|
||||
=================================================
|
||||
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
|
||||
Front/Rear Multi-channel Playback
|
||||
---------------------------------
|
||||
|
||||
CM8x38 chip can use ADC as the second DAC so that two different stereo
|
||||
channels can be used for front/rear playbacks. Since there are two
|
||||
DACs, both streams are handled independently unlike the 4/6ch multi-
|
||||
channel playbacks in the section below.
|
||||
|
||||
As default, ALSA driver assigns the first PCM device (i.e. hw:0,0 for
|
||||
card#0) for front and 4/6ch playbacks, while the second PCM device
|
||||
(hw:0,1) is assigned to the second DAC for rear playback.
|
||||
|
||||
There are slight differences between the two DACs:
|
||||
|
||||
- The first DAC supports U8 and S16LE formats, while the second DAC
|
||||
supports only S16LE.
|
||||
- The second DAC supports only two channel stereo.
|
||||
|
||||
Please note that the CM8x38 DAC doesn't support continuous playback
|
||||
rate but only fixed rates: 5512, 8000, 11025, 16000, 22050, 32000,
|
||||
44100 and 48000 Hz.
|
||||
|
||||
The rear output can be heard only when "Four Channel Mode" switch is
|
||||
disabled. Otherwise no signal will be routed to the rear speakers.
|
||||
As default it's turned on.
|
||||
|
||||
*** WARNING ***
|
||||
When "Four Channel Mode" switch is off, the output from rear speakers
|
||||
will be FULL VOLUME regardless of Master and PCM volumes.
|
||||
This might damage your audio equipment. Please disconnect speakers
|
||||
before your turn off this switch.
|
||||
*** WARNING ***
|
||||
|
||||
[ Well.. I once got the output with correct volume (i.e. same with the
|
||||
front one) and was so excited. It was even with "Four Channel" bit
|
||||
on and "double DAC" mode. Actually I could hear separate 4 channels
|
||||
from front and rear speakers! But.. after reboot, all was gone.
|
||||
It's a very pity that I didn't save the register dump at that
|
||||
time.. Maybe there is an unknown register to achieve this... ]
|
||||
|
||||
If your card has an extra output jack for the rear output, the rear
|
||||
playback should be routed there as default. If not, there is a
|
||||
control switch in the driver "Line-In As Rear", which you can change
|
||||
via alsamixer or somewhat else. When this switch is on, line-in jack
|
||||
is used as rear output.
|
||||
|
||||
There are two more controls regarding to the rear output.
|
||||
The "Exchange DAC" switch is used to exchange front and rear playback
|
||||
routes, i.e. the 2nd DAC is output from front output.
|
||||
|
||||
|
||||
4/6 Multi-Channel Playback
|
||||
--------------------------
|
||||
|
||||
The recent CM8738 chips support for the 4/6 multi-channel playback
|
||||
function. This is useful especially for AC3 decoding.
|
||||
|
||||
When the multi-channel is supported, the driver name has a suffix
|
||||
"-MC" such like "CMI8738-MC6". You can check this name from
|
||||
/proc/asound/cards.
|
||||
|
||||
When the 4/6-ch output is enabled, the second DAC accepts up to 6 (or
|
||||
4) channels. While the dual DAC supports two different rates or
|
||||
formats, the 4/6-ch playback supports only the same condition for all
|
||||
channels. Since the multi-channel playback mode uses both DACs, you
|
||||
cannot operate with full-duplex.
|
||||
|
||||
The 4.0 and 5.1 modes are defined as the pcm "surround40" and "surround51"
|
||||
in alsa-lib. For example, you can play a WAV file with 6 channels like
|
||||
|
||||
% aplay -Dsurround51 sixchannels.wav
|
||||
|
||||
For programming the 4/6 channel playback, you need to specify the PCM
|
||||
channels as you like and set the format S16LE. For example, for playback
|
||||
with 4 channels,
|
||||
|
||||
snd_pcm_hw_params_set_access(pcm, hw, SND_PCM_ACCESS_RW_INTERLEAVED);
|
||||
// or mmap if you like
|
||||
snd_pcm_hw_params_set_format(pcm, hw, SND_PCM_FORMAT_S16_LE);
|
||||
snd_pcm_hw_params_set_channels(pcm, hw, 4);
|
||||
|
||||
and use the interleaved 4 channel data.
|
||||
|
||||
There are some control switches affecting to the speaker connections:
|
||||
|
||||
"Line-In Mode" - an enum control to change the behavior of line-in
|
||||
jack. Either "Line-In", "Rear Output" or "Bass Output" can
|
||||
be selected. The last item is available only with model 039
|
||||
or newer.
|
||||
When "Rear Output" is chosen, the surround channels 3 and 4
|
||||
are output to line-in jack.
|
||||
"Mic-In Mode" - an enum control to change the behavior of mic-in
|
||||
jack. Either "Mic-In" or "Center/LFE Output" can be
|
||||
selected.
|
||||
When "Center/LFE Output" is chosen, the center and bass
|
||||
channels (channels 5 and 6) are output to mic-in jack.
|
||||
|
||||
Digital I/O
|
||||
-----------
|
||||
|
||||
The CM8x38 provides the excellent SPDIF capability with very cheap
|
||||
price (yes, that's the reason I bought the card :)
|
||||
|
||||
The SPDIF playback and capture are done via the third PCM device
|
||||
(hw:0,2). Usually this is assigned to the PCM device "spdif".
|
||||
The available rates are 44100 and 48000 Hz.
|
||||
For playback with aplay, you can run like below:
|
||||
|
||||
% aplay -Dhw:0,2 foo.wav
|
||||
|
||||
or
|
||||
|
||||
% aplay -Dspdif foo.wav
|
||||
|
||||
24bit format is also supported experimentally.
|
||||
|
||||
The playback and capture over SPDIF use normal DAC and ADC,
|
||||
respectively, so you cannot playback both analog and digital streams
|
||||
simultaneously.
|
||||
|
||||
To enable SPDIF output, you need to turn on "IEC958 Output Switch"
|
||||
control via mixer or alsactl ("IEC958" is the official name of
|
||||
so-called S/PDIF). Then you'll see the red light on from the card so
|
||||
you know that's working obviously :)
|
||||
The SPDIF input is always enabled, so you can hear SPDIF input data
|
||||
from line-out with "IEC958 In Monitor" switch at any time (see
|
||||
below).
|
||||
|
||||
You can play via SPDIF even with the first device (hw:0,0),
|
||||
but SPDIF is enabled only when the proper format (S16LE), sample rate
|
||||
(441100 or 48000) and channels (2) are used. Otherwise it's turned
|
||||
off. (Also don't forget to turn on "IEC958 Output Switch", too.)
|
||||
|
||||
|
||||
Additionally there are relevant control switches:
|
||||
|
||||
"IEC958 Mix Analog" - Mix analog PCM playback and FM-OPL/3 streams and
|
||||
output through SPDIF. This switch appears only on old chip
|
||||
models (CM8738 033 and 037).
|
||||
Note: without this control you can output PCM to SPDIF.
|
||||
This is "mixing" of streams, so e.g. it's not for AC3 output
|
||||
(see the next section).
|
||||
|
||||
"IEC958 In Select" - Select SPDIF input, the internal CD-in (false)
|
||||
and the external input (true).
|
||||
|
||||
"IEC958 Loop" - SPDIF input data is loop back into SPDIF
|
||||
output (aka bypass)
|
||||
|
||||
"IEC958 Copyright" - Set the copyright bit.
|
||||
|
||||
"IEC958 5V" - Select 0.5V (coax) or 5V (optical) interface.
|
||||
On some cards this doesn't work and you need to change the
|
||||
configuration with hardware dip-switch.
|
||||
|
||||
"IEC958 In Monitor" - SPDIF input is routed to DAC.
|
||||
|
||||
"IEC958 In Phase Inverse" - Set SPDIF input format as inverse.
|
||||
[FIXME: this doesn't work on all chips..]
|
||||
|
||||
"IEC958 In Valid" - Set input validity flag detection.
|
||||
|
||||
Note: When "PCM Playback Switch" is on, you'll hear the digital output
|
||||
stream through analog line-out.
|
||||
|
||||
|
||||
The AC3 (RAW DIGITAL) OUTPUT
|
||||
----------------------------
|
||||
|
||||
The driver supports raw digital (typically AC3) i/o over SPDIF. This
|
||||
can be toggled via IEC958 playback control, but usually you need to
|
||||
access it via alsa-lib. See alsa-lib documents for more details.
|
||||
|
||||
On the raw digital mode, the "PCM Playback Switch" is automatically
|
||||
turned off so that non-audio data is heard from the analog line-out.
|
||||
Similarly the following switches are off: "IEC958 Mix Analog" and
|
||||
"IEC958 Loop". The switches are resumed after closing the SPDIF PCM
|
||||
device automatically to the previous state.
|
||||
|
||||
On the model 033, AC3 is implemented by the software conversion in
|
||||
the alsa-lib. If you need to bypass the software conversion of IEC958
|
||||
subframes, pass the "soft_ac3=0" module option. This doesn't matter
|
||||
on the newer models.
|
||||
|
||||
|
||||
ANALOG MIXER INTERFACE
|
||||
----------------------
|
||||
|
||||
The mixer interface on CM8x38 is similar to SB16.
|
||||
There are Master, PCM, Synth, CD, Line, Mic and PC Speaker playback
|
||||
volumes. Synth, CD, Line and Mic have playback and capture switches,
|
||||
too, as well as SB16.
|
||||
|
||||
In addition to the standard SB mixer, CM8x38 provides more functions.
|
||||
- PCM playback switch
|
||||
- PCM capture switch (to capture the data sent to DAC)
|
||||
- Mic Boost switch
|
||||
- Mic capture volume
|
||||
- Aux playback volume/switch and capture switch
|
||||
- 3D control switch
|
||||
|
||||
|
||||
MIDI CONTROLLER
|
||||
---------------
|
||||
|
||||
With CMI8338 chips, the MPU401-UART interface is disabled as default.
|
||||
You need to set the module option "mpu_port" to a valid I/O port address
|
||||
to enable MIDI support. Valid I/O ports are 0x300, 0x310, 0x320 and
|
||||
0x330. Choose a value that doesn't conflict with other cards.
|
||||
|
||||
With CMI8738 and newer chips, the MIDI interface is enabled by default
|
||||
and the driver automatically chooses a port address.
|
||||
|
||||
There is _no_ hardware wavetable function on this chip (except for
|
||||
OPL3 synth below).
|
||||
What's said as MIDI synth on Windows is a software synthesizer
|
||||
emulation. On Linux use TiMidity or other softsynth program for
|
||||
playing MIDI music.
|
||||
|
||||
|
||||
FM OPL/3 Synth
|
||||
--------------
|
||||
|
||||
The FM OPL/3 is also enabled as default only for the first card.
|
||||
Set "fm_port" module option for more cards.
|
||||
|
||||
The output quality of FM OPL/3 is, however, very weird.
|
||||
I don't know why..
|
||||
|
||||
CMI8768 and newer chips do not have the FM synth.
|
||||
|
||||
|
||||
Joystick and Modem
|
||||
------------------
|
||||
|
||||
The legacy joystick is supported. To enable the joystick support, pass
|
||||
joystick_port=1 module option. The value 1 means the auto-detection.
|
||||
If the auto-detection fails, try to pass the exact I/O address.
|
||||
|
||||
The modem is enabled dynamically via a card control switch "Modem".
|
||||
|
||||
|
||||
Debugging Information
|
||||
---------------------
|
||||
|
||||
The registers are shown in /proc/asound/cardX/cmipci. If you have any
|
||||
problem (especially unexpected behavior of mixer), please attach the
|
||||
output of this proc file together with the bug report.
|
153
Documentation/sound/alsa/Channel-Mapping-API.txt
Normal file
153
Documentation/sound/alsa/Channel-Mapping-API.txt
Normal file
|
@ -0,0 +1,153 @@
|
|||
ALSA PCM channel-mapping API
|
||||
============================
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
GENERAL
|
||||
-------
|
||||
|
||||
The channel mapping API allows user to query the possible channel maps
|
||||
and the current channel map, also optionally to modify the channel map
|
||||
of the current stream.
|
||||
|
||||
A channel map is an array of position for each PCM channel.
|
||||
Typically, a stereo PCM stream has a channel map of
|
||||
{ front_left, front_right }
|
||||
while a 4.0 surround PCM stream has a channel map of
|
||||
{ front left, front right, rear left, rear right }.
|
||||
|
||||
The problem, so far, was that we had no standard channel map
|
||||
explicitly, and applications had no way to know which channel
|
||||
corresponds to which (speaker) position. Thus, applications applied
|
||||
wrong channels for 5.1 outputs, and you hear suddenly strange sound
|
||||
from rear. Or, some devices secretly assume that center/LFE is the
|
||||
third/fourth channels while others that C/LFE as 5th/6th channels.
|
||||
|
||||
Also, some devices such as HDMI are configurable for different speaker
|
||||
positions even with the same number of total channels. However, there
|
||||
was no way to specify this because of lack of channel map
|
||||
specification. These are the main motivations for the new channel
|
||||
mapping API.
|
||||
|
||||
|
||||
DESIGN
|
||||
------
|
||||
|
||||
Actually, "the channel mapping API" doesn't introduce anything new in
|
||||
the kernel/user-space ABI perspective. It uses only the existing
|
||||
control element features.
|
||||
|
||||
As a ground design, each PCM substream may contain a control element
|
||||
providing the channel mapping information and configuration. This
|
||||
element is specified by:
|
||||
iface = SNDRV_CTL_ELEM_IFACE_PCM
|
||||
name = "Playback Channel Map" or "Capture Channel Map"
|
||||
device = the same device number for the assigned PCM substream
|
||||
index = the same index number for the assigned PCM substream
|
||||
|
||||
Note the name is different depending on the PCM substream direction.
|
||||
|
||||
Each control element provides at least the TLV read operation and the
|
||||
read operation. Optionally, the write operation can be provided to
|
||||
allow user to change the channel map dynamically.
|
||||
|
||||
* TLV
|
||||
|
||||
The TLV operation gives the list of available channel
|
||||
maps. A list item of a channel map is usually a TLV of
|
||||
type data-bytes ch0 ch1 ch2...
|
||||
where type is the TLV type value, the second argument is the total
|
||||
bytes (not the numbers) of channel values, and the rest are the
|
||||
position value for each channel.
|
||||
|
||||
As a TLV type, either SNDRV_CTL_TLVT_CHMAP_FIXED,
|
||||
SNDRV_CTL_TLV_CHMAP_VAR or SNDRV_CTL_TLVT_CHMAP_PAIRED can be used.
|
||||
The _FIXED type is for a channel map with the fixed channel position
|
||||
while the latter two are for flexible channel positions. _VAR type is
|
||||
for a channel map where all channels are freely swappable and _PAIRED
|
||||
type is where pair-wise channels are swappable. For example, when you
|
||||
have {FL/FR/RL/RR} channel map, _PAIRED type would allow you to swap
|
||||
only {RL/RR/FL/FR} while _VAR type would allow even swapping FL and
|
||||
RR.
|
||||
|
||||
These new TLV types are defined in sound/tlv.h.
|
||||
|
||||
The available channel position values are defined in sound/asound.h,
|
||||
here is a cut:
|
||||
|
||||
/* channel positions */
|
||||
enum {
|
||||
SNDRV_CHMAP_UNKNOWN = 0,
|
||||
SNDRV_CHMAP_NA, /* N/A, silent */
|
||||
SNDRV_CHMAP_MONO, /* mono stream */
|
||||
/* this follows the alsa-lib mixer channel value + 3 */
|
||||
SNDRV_CHMAP_FL, /* front left */
|
||||
SNDRV_CHMAP_FR, /* front right */
|
||||
SNDRV_CHMAP_RL, /* rear left */
|
||||
SNDRV_CHMAP_RR, /* rear right */
|
||||
SNDRV_CHMAP_FC, /* front center */
|
||||
SNDRV_CHMAP_LFE, /* LFE */
|
||||
SNDRV_CHMAP_SL, /* side left */
|
||||
SNDRV_CHMAP_SR, /* side right */
|
||||
SNDRV_CHMAP_RC, /* rear center */
|
||||
/* new definitions */
|
||||
SNDRV_CHMAP_FLC, /* front left center */
|
||||
SNDRV_CHMAP_FRC, /* front right center */
|
||||
SNDRV_CHMAP_RLC, /* rear left center */
|
||||
SNDRV_CHMAP_RRC, /* rear right center */
|
||||
SNDRV_CHMAP_FLW, /* front left wide */
|
||||
SNDRV_CHMAP_FRW, /* front right wide */
|
||||
SNDRV_CHMAP_FLH, /* front left high */
|
||||
SNDRV_CHMAP_FCH, /* front center high */
|
||||
SNDRV_CHMAP_FRH, /* front right high */
|
||||
SNDRV_CHMAP_TC, /* top center */
|
||||
SNDRV_CHMAP_TFL, /* top front left */
|
||||
SNDRV_CHMAP_TFR, /* top front right */
|
||||
SNDRV_CHMAP_TFC, /* top front center */
|
||||
SNDRV_CHMAP_TRL, /* top rear left */
|
||||
SNDRV_CHMAP_TRR, /* top rear right */
|
||||
SNDRV_CHMAP_TRC, /* top rear center */
|
||||
SNDRV_CHMAP_LAST = SNDRV_CHMAP_TRC,
|
||||
};
|
||||
|
||||
When a PCM stream can provide more than one channel map, you can
|
||||
provide multiple channel maps in a TLV container type. The TLV data
|
||||
to be returned will contain such as:
|
||||
SNDRV_CTL_TLVT_CONTAINER 96
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 4 SNDRV_CHMAP_FC
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 8 SNDRV_CHMAP_FL SNDRV_CHMAP_FR
|
||||
SNDRV_CTL_TLVT_CHMAP_FIXED 16 NDRV_CHMAP_FL SNDRV_CHMAP_FR \
|
||||
SNDRV_CHMAP_RL SNDRV_CHMAP_RR
|
||||
|
||||
The channel position is provided in LSB 16bits. The upper bits are
|
||||
used for bit flags.
|
||||
|
||||
#define SNDRV_CHMAP_POSITION_MASK 0xffff
|
||||
#define SNDRV_CHMAP_PHASE_INVERSE (0x01 << 16)
|
||||
#define SNDRV_CHMAP_DRIVER_SPEC (0x02 << 16)
|
||||
|
||||
SNDRV_CHMAP_PHASE_INVERSE indicates the channel is phase inverted,
|
||||
(thus summing left and right channels would result in almost silence).
|
||||
Some digital mic devices have this.
|
||||
|
||||
When SNDRV_CHMAP_DRIVER_SPEC is set, all the channel position values
|
||||
don't follow the standard definition above but driver-specific.
|
||||
|
||||
* READ OPERATION
|
||||
|
||||
The control read operation is for providing the current channel map of
|
||||
the given stream. The control element returns an integer array
|
||||
containing the position of each channel.
|
||||
|
||||
When this is performed before the number of the channel is specified
|
||||
(i.e. hw_params is set), it should return all channels set to
|
||||
UNKNOWN.
|
||||
|
||||
* WRITE OPERATION
|
||||
|
||||
The control write operation is optional, and only for devices that can
|
||||
change the channel configuration on the fly, such as HDMI. User needs
|
||||
to pass an integer value containing the valid channel positions for
|
||||
all channels of the assigned PCM substream.
|
||||
|
||||
This operation is allowed only at PCM PREPARED state. When called in
|
||||
other states, it shall return an error.
|
85
Documentation/sound/alsa/ControlNames.txt
Normal file
85
Documentation/sound/alsa/ControlNames.txt
Normal file
|
@ -0,0 +1,85 @@
|
|||
This document describes standard names of mixer controls.
|
||||
|
||||
Syntax: SOURCE [DIRECTION] FUNCTION
|
||||
|
||||
DIRECTION:
|
||||
<nothing> (both directions)
|
||||
Playback
|
||||
Capture
|
||||
Bypass Playback
|
||||
Bypass Capture
|
||||
|
||||
FUNCTION:
|
||||
Switch (on/off switch)
|
||||
Volume
|
||||
Route (route control, hardware specific)
|
||||
|
||||
SOURCE:
|
||||
Master
|
||||
Master Mono
|
||||
Hardware Master
|
||||
Speaker (internal speaker)
|
||||
Headphone
|
||||
Beep (beep generator)
|
||||
Phone
|
||||
Phone Input
|
||||
Phone Output
|
||||
Synth
|
||||
FM
|
||||
Mic
|
||||
Line
|
||||
CD
|
||||
Video
|
||||
Zoom Video
|
||||
Aux
|
||||
PCM
|
||||
PCM Front
|
||||
PCM Rear
|
||||
PCM Pan
|
||||
Loopback
|
||||
Analog Loopback (D/A -> A/D loopback)
|
||||
Digital Loopback (playback -> capture loopback - without analog path)
|
||||
Mono
|
||||
Mono Output
|
||||
Multi
|
||||
ADC
|
||||
Wave
|
||||
Music
|
||||
I2S
|
||||
IEC958
|
||||
|
||||
Exceptions:
|
||||
[Digital] Capture Source
|
||||
[Digital] Capture Switch (aka input gain switch)
|
||||
[Digital] Capture Volume (aka input gain volume)
|
||||
[Digital] Playback Switch (aka output gain switch)
|
||||
[Digital] Playback Volume (aka output gain volume)
|
||||
Tone Control - Switch
|
||||
Tone Control - Bass
|
||||
Tone Control - Treble
|
||||
3D Control - Switch
|
||||
3D Control - Center
|
||||
3D Control - Depth
|
||||
3D Control - Wide
|
||||
3D Control - Space
|
||||
3D Control - Level
|
||||
Mic Boost [(?dB)]
|
||||
|
||||
PCM interface:
|
||||
|
||||
Sample Clock Source { "Word", "Internal", "AutoSync" }
|
||||
Clock Sync Status { "Lock", "Sync", "No Lock" }
|
||||
External Rate /* external capture rate */
|
||||
Capture Rate /* capture rate taken from external source */
|
||||
|
||||
IEC958 (S/PDIF) interface:
|
||||
|
||||
IEC958 [...] [Playback|Capture] Switch /* turn on/off the IEC958 interface */
|
||||
IEC958 [...] [Playback|Capture] Volume /* digital volume control */
|
||||
IEC958 [...] [Playback|Capture] Default /* default or global value - read/write */
|
||||
IEC958 [...] [Playback|Capture] Mask /* consumer and professional mask */
|
||||
IEC958 [...] [Playback|Capture] Con Mask /* consumer mask */
|
||||
IEC958 [...] [Playback|Capture] Pro Mask /* professional mask */
|
||||
IEC958 [...] [Playback|Capture] PCM Stream /* the settings assigned to a PCM stream */
|
||||
IEC958 Q-subcode [Playback|Capture] Default /* Q-subcode bits */
|
||||
IEC958 Preamble [Playback|Capture] Default /* burst preamble words (4*16bits) */
|
116
Documentation/sound/alsa/HD-Audio-Controls.txt
Normal file
116
Documentation/sound/alsa/HD-Audio-Controls.txt
Normal file
|
@ -0,0 +1,116 @@
|
|||
This file explains the codec-specific mixer controls.
|
||||
|
||||
Realtek codecs
|
||||
--------------
|
||||
|
||||
* Channel Mode
|
||||
This is an enum control to change the surround-channel setup,
|
||||
appears only when the surround channels are available.
|
||||
It gives the number of channels to be used, "2ch", "4ch", "6ch",
|
||||
and "8ch". According to the configuration, this also controls the
|
||||
jack-retasking of multi-I/O jacks.
|
||||
|
||||
* Auto-Mute Mode
|
||||
This is an enum control to change the auto-mute behavior of the
|
||||
headphone and line-out jacks. If built-in speakers and headphone
|
||||
and/or line-out jacks are available on a machine, this controls
|
||||
appears.
|
||||
When there are only either headphones or line-out jacks, it gives
|
||||
"Disabled" and "Enabled" state. When enabled, the speaker is muted
|
||||
automatically when a jack is plugged.
|
||||
|
||||
When both headphone and line-out jacks are present, it gives
|
||||
"Disabled", "Speaker Only" and "Line-Out+Speaker". When
|
||||
speaker-only is chosen, plugging into a headphone or a line-out jack
|
||||
mutes the speakers, but not line-outs. When line-out+speaker is
|
||||
selected, plugging to a headphone jack mutes both speakers and
|
||||
line-outs.
|
||||
|
||||
|
||||
IDT/Sigmatel codecs
|
||||
-------------------
|
||||
|
||||
* Analog Loopback
|
||||
This control enables/disables the analog-loopback circuit. This
|
||||
appears only when "loopback" is set to true in a codec hint
|
||||
(see HD-Audio.txt). Note that on some codecs the analog-loopback
|
||||
and the normal PCM playback are exclusive, i.e. when this is on, you
|
||||
won't hear any PCM stream.
|
||||
|
||||
* Swap Center/LFE
|
||||
Swaps the center and LFE channel order. Normally, the left
|
||||
corresponds to the center and the right to the LFE. When this is
|
||||
ON, the left to the LFE and the right to the center.
|
||||
|
||||
* Headphone as Line Out
|
||||
When this control is ON, treat the headphone jacks as line-out
|
||||
jacks. That is, the headphone won't auto-mute the other line-outs,
|
||||
and no HP-amp is set to the pins.
|
||||
|
||||
* Mic Jack Mode, Line Jack Mode, etc
|
||||
These enum controls the direction and the bias of the input jack
|
||||
pins. Depending on the jack type, it can set as "Mic In" and "Line
|
||||
In", for determining the input bias, or it can be set to "Line Out"
|
||||
when the pin is a multi-I/O jack for surround channels.
|
||||
|
||||
|
||||
VIA codecs
|
||||
----------
|
||||
|
||||
* Smart 5.1
|
||||
An enum control to re-task the multi-I/O jacks for surround outputs.
|
||||
When it's ON, the corresponding input jacks (usually a line-in and a
|
||||
mic-in) are switched as the surround and the CLFE output jacks.
|
||||
|
||||
* Independent HP
|
||||
When this enum control is enabled, the headphone output is routed
|
||||
from an individual stream (the third PCM such as hw:0,2) instead of
|
||||
the primary stream. In the case the headphone DAC is shared with a
|
||||
side or a CLFE-channel DAC, the DAC is switched to the headphone
|
||||
automatically.
|
||||
|
||||
* Loopback Mixing
|
||||
An enum control to determine whether the analog-loopback route is
|
||||
enabled or not. When it's enabled, the analog-loopback is mixed to
|
||||
the front-channel. Also, the same route is used for the headphone
|
||||
and speaker outputs. As a side-effect, when this mode is set, the
|
||||
individual volume controls will be no longer available for
|
||||
headphones and speakers because there is only one DAC connected to a
|
||||
mixer widget.
|
||||
|
||||
* Dynamic Power-Control
|
||||
This control determines whether the dynamic power-control per jack
|
||||
detection is enabled or not. When enabled, the widgets power state
|
||||
(D0/D3) are changed dynamically depending on the jack plugging
|
||||
state for saving power consumptions. However, if your system
|
||||
doesn't provide a proper jack-detection, this won't work; in such a
|
||||
case, turn this control OFF.
|
||||
|
||||
* Jack Detect
|
||||
This control is provided only for VT1708 codec which gives no proper
|
||||
unsolicited event per jack plug. When this is on, the driver polls
|
||||
the jack detection so that the headphone auto-mute can work, while
|
||||
turning this off would reduce the power consumption.
|
||||
|
||||
|
||||
Conexant codecs
|
||||
---------------
|
||||
|
||||
* Auto-Mute Mode
|
||||
See Reatek codecs.
|
||||
|
||||
|
||||
Analog codecs
|
||||
--------------
|
||||
|
||||
* Channel Mode
|
||||
This is an enum control to change the surround-channel setup,
|
||||
appears only when the surround channels are available.
|
||||
It gives the number of channels to be used, "2ch", "4ch" and "6ch".
|
||||
According to the configuration, this also controls the
|
||||
jack-retasking of multi-I/O jacks.
|
||||
|
||||
* Independent HP
|
||||
When this enum control is enabled, the headphone output is routed
|
||||
from an individual stream (the third PCM such as hw:0,2) instead of
|
||||
the primary stream.
|
318
Documentation/sound/alsa/HD-Audio-Models.txt
Normal file
318
Documentation/sound/alsa/HD-Audio-Models.txt
Normal file
|
@ -0,0 +1,318 @@
|
|||
Model name Description
|
||||
---------- -----------
|
||||
ALC880
|
||||
======
|
||||
3stack 3-jack in back and a headphone out
|
||||
3stack-digout 3-jack in back, a HP out and a SPDIF out
|
||||
5stack 5-jack in back, 2-jack in front
|
||||
5stack-digout 5-jack in back, 2-jack in front, a SPDIF out
|
||||
6stack 6-jack in back, 2-jack in front
|
||||
6stack-digout 6-jack with a SPDIF out
|
||||
|
||||
ALC260
|
||||
======
|
||||
N/A
|
||||
|
||||
ALC262
|
||||
======
|
||||
inv-dmic Inverted internal mic workaround
|
||||
|
||||
ALC267/268
|
||||
==========
|
||||
inv-dmic Inverted internal mic workaround
|
||||
|
||||
ALC269/270/275/276/28x/29x
|
||||
======
|
||||
laptop-amic Laptops with analog-mic input
|
||||
laptop-dmic Laptops with digital-mic input
|
||||
alc269-dmic Enable ALC269(VA) digital mic workaround
|
||||
alc271-dmic Enable ALC271X digital mic workaround
|
||||
inv-dmic Inverted internal mic workaround
|
||||
headset-mic Indicates a combined headset (headphone+mic) jack
|
||||
lenovo-dock Enables docking station I/O for some Lenovos
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
dell-headset-dock Headset jack (without mic-in), and also dock I/O
|
||||
|
||||
ALC66x/67x/892
|
||||
==============
|
||||
mario Chromebook mario model fixup
|
||||
asus-mode1 ASUS
|
||||
asus-mode2 ASUS
|
||||
asus-mode3 ASUS
|
||||
asus-mode4 ASUS
|
||||
asus-mode5 ASUS
|
||||
asus-mode6 ASUS
|
||||
asus-mode7 ASUS
|
||||
asus-mode8 ASUS
|
||||
inv-dmic Inverted internal mic workaround
|
||||
dell-headset-multi Headset jack, which can also be used as mic-in
|
||||
|
||||
ALC680
|
||||
======
|
||||
N/A
|
||||
|
||||
ALC88x/898/1150
|
||||
======================
|
||||
acer-aspire-4930g Acer Aspire 4930G/5930G/6530G/6930G/7730G
|
||||
acer-aspire-8930g Acer Aspire 8330G/6935G
|
||||
acer-aspire Acer Aspire others
|
||||
inv-dmic Inverted internal mic workaround
|
||||
no-primary-hp VAIO Z/VGC-LN51JGB workaround (for fixed speaker DAC)
|
||||
|
||||
ALC861/660
|
||||
==========
|
||||
N/A
|
||||
|
||||
ALC861VD/660VD
|
||||
==============
|
||||
N/A
|
||||
|
||||
CMI9880
|
||||
=======
|
||||
minimal 3-jack in back
|
||||
min_fp 3-jack in back, 2-jack in front
|
||||
full 6-jack in back, 2-jack in front
|
||||
full_dig 6-jack in back, 2-jack in front, SPDIF I/O
|
||||
allout 5-jack in back, 2-jack in front, SPDIF out
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
AD1882 / AD1882A
|
||||
================
|
||||
3stack 3-stack mode
|
||||
3stack-automute 3-stack with automute front HP (default)
|
||||
6stack 6-stack mode
|
||||
|
||||
AD1884A / AD1883 / AD1984A / AD1984B
|
||||
====================================
|
||||
desktop 3-stack desktop (default)
|
||||
laptop laptop with HP jack sensing
|
||||
mobile mobile devices with HP jack sensing
|
||||
thinkpad Lenovo Thinkpad X300
|
||||
touchsmart HP Touchsmart
|
||||
|
||||
AD1884
|
||||
======
|
||||
N/A
|
||||
|
||||
AD1981
|
||||
======
|
||||
basic 3-jack (default)
|
||||
hp HP nx6320
|
||||
thinkpad Lenovo Thinkpad T60/X60/Z60
|
||||
toshiba Toshiba U205
|
||||
|
||||
AD1983
|
||||
======
|
||||
N/A
|
||||
|
||||
AD1984
|
||||
======
|
||||
basic default configuration
|
||||
thinkpad Lenovo Thinkpad T61/X61
|
||||
dell_desktop Dell T3400
|
||||
|
||||
AD1986A
|
||||
=======
|
||||
6stack 6-jack, separate surrounds (default)
|
||||
3stack 3-stack, shared surrounds
|
||||
laptop 2-channel only (FSC V2060, Samsung M50)
|
||||
laptop-eapd 2-channel with EAPD (ASUS A6J)
|
||||
laptop-automute 2-channel with EAPD and HP-automute (Lenovo N100)
|
||||
ultra 2-channel with EAPD (Samsung Ultra tablet PC)
|
||||
samsung 2-channel with EAPD (Samsung R65)
|
||||
samsung-p50 2-channel with HP-automute (Samsung P50)
|
||||
|
||||
AD1988/AD1988B/AD1989A/AD1989B
|
||||
==============================
|
||||
6stack 6-jack
|
||||
6stack-dig ditto with SPDIF
|
||||
3stack 3-jack
|
||||
3stack-dig ditto with SPDIF
|
||||
laptop 3-jack with hp-jack automute
|
||||
laptop-dig ditto with SPDIF
|
||||
auto auto-config reading BIOS (default)
|
||||
|
||||
Conexant 5045
|
||||
=============
|
||||
laptop-hpsense Laptop with HP sense (old model laptop)
|
||||
laptop-micsense Laptop with Mic sense (old model fujitsu)
|
||||
laptop-hpmicsense Laptop with HP and Mic senses
|
||||
benq Benq R55E
|
||||
laptop-hp530 HP 530 laptop
|
||||
test for testing/debugging purpose, almost all controls
|
||||
can be adjusted. Appearing only when compiled with
|
||||
$CONFIG_SND_DEBUG=y
|
||||
|
||||
Conexant 5047
|
||||
=============
|
||||
laptop Basic Laptop config
|
||||
laptop-hp Laptop config for some HP models (subdevice 30A5)
|
||||
laptop-eapd Laptop config with EAPD support
|
||||
test for testing/debugging purpose, almost all controls
|
||||
can be adjusted. Appearing only when compiled with
|
||||
$CONFIG_SND_DEBUG=y
|
||||
|
||||
Conexant 5051
|
||||
=============
|
||||
laptop Basic Laptop config (default)
|
||||
hp HP Spartan laptop
|
||||
hp-dv6736 HP dv6736
|
||||
hp-f700 HP Compaq Presario F700
|
||||
ideapad Lenovo IdeaPad laptop
|
||||
toshiba Toshiba Satellite M300
|
||||
|
||||
Conexant 5066
|
||||
=============
|
||||
laptop Basic Laptop config (default)
|
||||
hp-laptop HP laptops, e g G60
|
||||
asus Asus K52JU, Lenovo G560
|
||||
dell-laptop Dell laptops
|
||||
dell-vostro Dell Vostro
|
||||
olpc-xo-1_5 OLPC XO 1.5
|
||||
ideapad Lenovo IdeaPad U150
|
||||
thinkpad Lenovo Thinkpad
|
||||
|
||||
STAC9200
|
||||
========
|
||||
ref Reference board
|
||||
oqo OQO Model 2
|
||||
dell-d21 Dell (unknown)
|
||||
dell-d22 Dell (unknown)
|
||||
dell-d23 Dell (unknown)
|
||||
dell-m21 Dell Inspiron 630m, Dell Inspiron 640m
|
||||
dell-m22 Dell Latitude D620, Dell Latitude D820
|
||||
dell-m23 Dell XPS M1710, Dell Precision M90
|
||||
dell-m24 Dell Latitude 120L
|
||||
dell-m25 Dell Inspiron E1505n
|
||||
dell-m26 Dell Inspiron 1501
|
||||
dell-m27 Dell Inspiron E1705/9400
|
||||
gateway-m4 Gateway laptops with EAPD control
|
||||
gateway-m4-2 Gateway laptops with EAPD control
|
||||
panasonic Panasonic CF-74
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9205/9254
|
||||
=============
|
||||
ref Reference board
|
||||
dell-m42 Dell (unknown)
|
||||
dell-m43 Dell Precision
|
||||
dell-m44 Dell Inspiron
|
||||
eapd Keep EAPD on (e.g. Gateway T1616)
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9220/9221
|
||||
=============
|
||||
ref Reference board
|
||||
3stack D945 3stack
|
||||
5stack D945 5stack + SPDIF
|
||||
intel-mac-v1 Intel Mac Type 1
|
||||
intel-mac-v2 Intel Mac Type 2
|
||||
intel-mac-v3 Intel Mac Type 3
|
||||
intel-mac-v4 Intel Mac Type 4
|
||||
intel-mac-v5 Intel Mac Type 5
|
||||
intel-mac-auto Intel Mac (detect type according to subsystem id)
|
||||
macmini Intel Mac Mini (equivalent with type 3)
|
||||
macbook Intel Mac Book (eq. type 5)
|
||||
macbook-pro-v1 Intel Mac Book Pro 1st generation (eq. type 3)
|
||||
macbook-pro Intel Mac Book Pro 2nd generation (eq. type 3)
|
||||
imac-intel Intel iMac (eq. type 2)
|
||||
imac-intel-20 Intel iMac (newer version) (eq. type 3)
|
||||
ecs202 ECS/PC chips
|
||||
dell-d81 Dell (unknown)
|
||||
dell-d82 Dell (unknown)
|
||||
dell-m81 Dell (unknown)
|
||||
dell-m82 Dell XPS M1210
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9202/9250/9251
|
||||
==================
|
||||
ref Reference board, base config
|
||||
m1 Some Gateway MX series laptops (NX560XL)
|
||||
m1-2 Some Gateway MX series laptops (MX6453)
|
||||
m2 Some Gateway MX series laptops (M255)
|
||||
m2-2 Some Gateway MX series laptops
|
||||
m3 Some Gateway MX series laptops
|
||||
m5 Some Gateway MX series laptops (MP6954)
|
||||
m6 Some Gateway NX series laptops
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC9227/9228/9229/927x
|
||||
=======================
|
||||
ref Reference board
|
||||
ref-no-jd Reference board without HP/Mic jack detection
|
||||
3stack D965 3stack
|
||||
5stack D965 5stack + SPDIF
|
||||
5stack-no-fp D965 5stack without front panel
|
||||
dell-3stack Dell Dimension E520
|
||||
dell-bios Fixes with Dell BIOS setup
|
||||
dell-bios-amic Fixes with Dell BIOS setup including analog mic
|
||||
volknob Fixes with volume-knob widget 0x24
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD71B*
|
||||
============
|
||||
ref Reference board
|
||||
dell-m4-1 Dell desktops
|
||||
dell-m4-2 Dell desktops
|
||||
dell-m4-3 Dell desktops
|
||||
hp-m4 HP mini 1000
|
||||
hp-dv5 HP dv series
|
||||
hp-hdx HP HDX series
|
||||
hp-dv4-1222nr HP dv4-1222nr (with LED support)
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD73*
|
||||
===========
|
||||
ref Reference board
|
||||
no-jd BIOS setup but without jack-detection
|
||||
intel Intel DG45* mobos
|
||||
dell-m6-amic Dell desktops/laptops with analog mics
|
||||
dell-m6-dmic Dell desktops/laptops with digital mics
|
||||
dell-m6 Dell desktops/laptops with both type of mics
|
||||
dell-eq Dell desktops/laptops
|
||||
alienware Alienware M17x
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD83*
|
||||
===========
|
||||
ref Reference board
|
||||
mic-ref Reference board with power management for ports
|
||||
dell-s14 Dell laptop
|
||||
dell-vostro-3500 Dell Vostro 3500 laptop
|
||||
hp-dv7-4000 HP dv-7 4000
|
||||
hp_cNB11_intquad HP CNB models with 4 speakers
|
||||
hp-zephyr HP Zephyr
|
||||
hp-led HP with broken BIOS for mute LED
|
||||
hp-inv-led HP with broken BIOS for inverted mute LED
|
||||
hp-mic-led HP with mic-mute LED
|
||||
headset-jack Dell Latitude with a 4-pin headset jack
|
||||
hp-envy-bass Pin fixup for HP Envy bass speaker (NID 0x0f)
|
||||
hp-envy-ts-bass Pin fixup for HP Envy TS bass speaker (NID 0x10)
|
||||
hp-bnb13-eq Hardware equalizer setup for HP laptops
|
||||
auto BIOS setup (default)
|
||||
|
||||
STAC92HD95
|
||||
==========
|
||||
hp-led LED support for HP laptops
|
||||
hp-bass Bass HPF setup for HP Spectre 13
|
||||
|
||||
STAC9872
|
||||
========
|
||||
vaio VAIO laptop without SPDIF
|
||||
auto BIOS setup (default)
|
||||
|
||||
Cirrus Logic CS4206/4207
|
||||
========================
|
||||
mbp55 MacBook Pro 5,5
|
||||
imac27 IMac 27 Inch
|
||||
auto BIOS setup (default)
|
||||
|
||||
Cirrus Logic CS4208
|
||||
===================
|
||||
mba6 MacBook Air 6,1 and 6,2
|
||||
gpio0 Enable GPIO 0 amp
|
||||
auto BIOS setup (default)
|
||||
|
||||
VIA VT17xx/VT18xx/VT20xx
|
||||
========================
|
||||
auto BIOS setup (default)
|
859
Documentation/sound/alsa/HD-Audio.txt
Normal file
859
Documentation/sound/alsa/HD-Audio.txt
Normal file
|
@ -0,0 +1,859 @@
|
|||
MORE NOTES ON HD-AUDIO DRIVER
|
||||
=============================
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
|
||||
GENERAL
|
||||
-------
|
||||
|
||||
HD-audio is the new standard on-board audio component on modern PCs
|
||||
after AC97. Although Linux has been supporting HD-audio since long
|
||||
time ago, there are often problems with new machines. A part of the
|
||||
problem is broken BIOS, and the rest is the driver implementation.
|
||||
This document explains the brief trouble-shooting and debugging
|
||||
methods for the HD-audio hardware.
|
||||
|
||||
The HD-audio component consists of two parts: the controller chip and
|
||||
the codec chips on the HD-audio bus. Linux provides a single driver
|
||||
for all controllers, snd-hda-intel. Although the driver name contains
|
||||
a word of a well-known hardware vendor, it's not specific to it but for
|
||||
all controller chips by other companies. Since the HD-audio
|
||||
controllers are supposed to be compatible, the single snd-hda-driver
|
||||
should work in most cases. But, not surprisingly, there are known
|
||||
bugs and issues specific to each controller type. The snd-hda-intel
|
||||
driver has a bunch of workarounds for these as described below.
|
||||
|
||||
A controller may have multiple codecs. Usually you have one audio
|
||||
codec and optionally one modem codec. In theory, there might be
|
||||
multiple audio codecs, e.g. for analog and digital outputs, and the
|
||||
driver might not work properly because of conflict of mixer elements.
|
||||
This should be fixed in future if such hardware really exists.
|
||||
|
||||
The snd-hda-intel driver has several different codec parsers depending
|
||||
on the codec. It has a generic parser as a fallback, but this
|
||||
functionality is fairly limited until now. Instead of the generic
|
||||
parser, usually the codec-specific parser (coded in patch_*.c) is used
|
||||
for the codec-specific implementations. The details about the
|
||||
codec-specific problems are explained in the later sections.
|
||||
|
||||
If you are interested in the deep debugging of HD-audio, read the
|
||||
HD-audio specification at first. The specification is found on
|
||||
Intel's web page, for example:
|
||||
|
||||
- http://www.intel.com/standards/hdaudio/
|
||||
|
||||
|
||||
HD-AUDIO CONTROLLER
|
||||
-------------------
|
||||
|
||||
DMA-Position Problem
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
The most common problem of the controller is the inaccurate DMA
|
||||
pointer reporting. The DMA pointer for playback and capture can be
|
||||
read in two ways, either via a LPIB register or via a position-buffer
|
||||
map. As default the driver tries to read from the io-mapped
|
||||
position-buffer, and falls back to LPIB if the position-buffer appears
|
||||
dead. However, this detection isn't perfect on some devices. In such
|
||||
a case, you can change the default method via `position_fix` option.
|
||||
|
||||
`position_fix=1` means to use LPIB method explicitly.
|
||||
`position_fix=2` means to use the position-buffer.
|
||||
`position_fix=3` means to use a combination of both methods, needed
|
||||
for some VIA controllers. The capture stream position is corrected
|
||||
by comparing both LPIB and position-buffer values.
|
||||
`position_fix=4` is another combination available for all controllers,
|
||||
and uses LPIB for the playback and the position-buffer for the capture
|
||||
streams.
|
||||
0 is the default value for all other
|
||||
controllers, the automatic check and fallback to LPIB as described in
|
||||
the above. If you get a problem of repeated sounds, this option might
|
||||
help.
|
||||
|
||||
In addition to that, every controller is known to be broken regarding
|
||||
the wake-up timing. It wakes up a few samples before actually
|
||||
processing the data on the buffer. This caused a lot of problems, for
|
||||
example, with ALSA dmix or JACK. Since 2.6.27 kernel, the driver puts
|
||||
an artificial delay to the wake up timing. This delay is controlled
|
||||
via `bdl_pos_adj` option.
|
||||
|
||||
When `bdl_pos_adj` is a negative value (as default), it's assigned to
|
||||
an appropriate value depending on the controller chip. For Intel
|
||||
chips, it'd be 1 while it'd be 32 for others. Usually this works.
|
||||
Only in case it doesn't work and you get warning messages, you should
|
||||
change this parameter to other values.
|
||||
|
||||
|
||||
Codec-Probing Problem
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
A less often but a more severe problem is the codec probing. When
|
||||
BIOS reports the available codec slots wrongly, the driver gets
|
||||
confused and tries to access the non-existing codec slot. This often
|
||||
results in the total screw-up, and destructs the further communication
|
||||
with the codec chips. The symptom appears usually as error messages
|
||||
like:
|
||||
------------------------------------------------------------------------
|
||||
hda_intel: azx_get_response timeout, switching to polling mode:
|
||||
last cmd=0x12345678
|
||||
hda_intel: azx_get_response timeout, switching to single_cmd mode:
|
||||
last cmd=0x12345678
|
||||
------------------------------------------------------------------------
|
||||
|
||||
The first line is a warning, and this is usually relatively harmless.
|
||||
It means that the codec response isn't notified via an IRQ. The
|
||||
driver uses explicit polling method to read the response. It gives
|
||||
very slight CPU overhead, but you'd unlikely notice it.
|
||||
|
||||
The second line is, however, a fatal error. If this happens, usually
|
||||
it means that something is really wrong. Most likely you are
|
||||
accessing a non-existing codec slot.
|
||||
|
||||
Thus, if the second error message appears, try to narrow the probed
|
||||
codec slots via `probe_mask` option. It's a bitmask, and each bit
|
||||
corresponds to the codec slot. For example, to probe only the first
|
||||
slot, pass `probe_mask=1`. For the first and the third slots, pass
|
||||
`probe_mask=5` (where 5 = 1 | 4), and so on.
|
||||
|
||||
Since 2.6.29 kernel, the driver has a more robust probing method, so
|
||||
this error might happen rarely, though.
|
||||
|
||||
On a machine with a broken BIOS, sometimes you need to force the
|
||||
driver to probe the codec slots the hardware doesn't report for use.
|
||||
In such a case, turn the bit 8 (0x100) of `probe_mask` option on.
|
||||
Then the rest 8 bits are passed as the codec slots to probe
|
||||
unconditionally. For example, `probe_mask=0x103` will force to probe
|
||||
the codec slots 0 and 1 no matter what the hardware reports.
|
||||
|
||||
|
||||
Interrupt Handling
|
||||
~~~~~~~~~~~~~~~~~~
|
||||
HD-audio driver uses MSI as default (if available) since 2.6.33
|
||||
kernel as MSI works better on some machines, and in general, it's
|
||||
better for performance. However, Nvidia controllers showed bad
|
||||
regressions with MSI (especially in a combination with AMD chipset),
|
||||
thus we disabled MSI for them.
|
||||
|
||||
There seem also still other devices that don't work with MSI. If you
|
||||
see a regression wrt the sound quality (stuttering, etc) or a lock-up
|
||||
in the recent kernel, try to pass `enable_msi=0` option to disable
|
||||
MSI. If it works, you can add the known bad device to the blacklist
|
||||
defined in hda_intel.c. In such a case, please report and give the
|
||||
patch back to the upstream developer.
|
||||
|
||||
|
||||
HD-AUDIO CODEC
|
||||
--------------
|
||||
|
||||
Model Option
|
||||
~~~~~~~~~~~~
|
||||
The most common problem regarding the HD-audio driver is the
|
||||
unsupported codec features or the mismatched device configuration.
|
||||
Most of codec-specific code has several preset models, either to
|
||||
override the BIOS setup or to provide more comprehensive features.
|
||||
|
||||
The driver checks PCI SSID and looks through the static configuration
|
||||
table until any matching entry is found. If you have a new machine,
|
||||
you may see a message like below:
|
||||
------------------------------------------------------------------------
|
||||
hda_codec: ALC880: BIOS auto-probing.
|
||||
------------------------------------------------------------------------
|
||||
Meanwhile, in the earlier versions, you would see a message like:
|
||||
------------------------------------------------------------------------
|
||||
hda_codec: Unknown model for ALC880, trying auto-probe from BIOS...
|
||||
------------------------------------------------------------------------
|
||||
Even if you see such a message, DON'T PANIC. Take a deep breath and
|
||||
keep your towel. First of all, it's an informational message, no
|
||||
warning, no error. This means that the PCI SSID of your device isn't
|
||||
listed in the known preset model (white-)list. But, this doesn't mean
|
||||
that the driver is broken. Many codec-drivers provide the automatic
|
||||
configuration mechanism based on the BIOS setup.
|
||||
|
||||
The HD-audio codec has usually "pin" widgets, and BIOS sets the default
|
||||
configuration of each pin, which indicates the location, the
|
||||
connection type, the jack color, etc. The HD-audio driver can guess
|
||||
the right connection judging from these default configuration values.
|
||||
However -- some codec-support codes, such as patch_analog.c, don't
|
||||
support the automatic probing (yet as of 2.6.28). And, BIOS is often,
|
||||
yes, pretty often broken. It sets up wrong values and screws up the
|
||||
driver.
|
||||
|
||||
The preset model (or recently called as "fix-up") is provided
|
||||
basically to overcome such a situation. When the matching preset
|
||||
model is found in the white-list, the driver assumes the static
|
||||
configuration of that preset with the correct pin setup, etc.
|
||||
Thus, if you have a newer machine with a slightly different PCI SSID
|
||||
(or codec SSID) from the existing one, you may have a good chance to
|
||||
re-use the same model. You can pass the `model` option to specify the
|
||||
preset model instead of PCI (and codec-) SSID look-up.
|
||||
|
||||
What `model` option values are available depends on the codec chip.
|
||||
Check your codec chip from the codec proc file (see "Codec Proc-File"
|
||||
section below). It will show the vendor/product name of your codec
|
||||
chip. Then, see Documentation/sound/alsa/HD-Audio-Models.txt file,
|
||||
the section of HD-audio driver. You can find a list of codecs
|
||||
and `model` options belonging to each codec. For example, for Realtek
|
||||
ALC262 codec chip, pass `model=ultra` for devices that are compatible
|
||||
with Samsung Q1 Ultra.
|
||||
|
||||
Thus, the first thing you can do for any brand-new, unsupported and
|
||||
non-working HD-audio hardware is to check HD-audio codec and several
|
||||
different `model` option values. If you have any luck, some of them
|
||||
might suit with your device well.
|
||||
|
||||
There are a few special model option values:
|
||||
- when 'nofixup' is passed, the device-specific fixups in the codec
|
||||
parser are skipped.
|
||||
- when `generic` is passed, the codec-specific parser is skipped and
|
||||
only the generic parser is used.
|
||||
|
||||
|
||||
Speaker and Headphone Output
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
One of the most frequent (and obvious) bugs with HD-audio is the
|
||||
silent output from either or both of a built-in speaker and a
|
||||
headphone jack. In general, you should try a headphone output at
|
||||
first. A speaker output often requires more additional controls like
|
||||
the external amplifier bits. Thus a headphone output has a slightly
|
||||
better chance.
|
||||
|
||||
Before making a bug report, double-check whether the mixer is set up
|
||||
correctly. The recent version of snd-hda-intel driver provides mostly
|
||||
"Master" volume control as well as "Front" volume (where Front
|
||||
indicates the front-channels). In addition, there can be individual
|
||||
"Headphone" and "Speaker" controls.
|
||||
|
||||
Ditto for the speaker output. There can be "External Amplifier"
|
||||
switch on some codecs. Turn on this if present.
|
||||
|
||||
Another related problem is the automatic mute of speaker output by
|
||||
headphone plugging. This feature is implemented in most cases, but
|
||||
not on every preset model or codec-support code.
|
||||
|
||||
In anyway, try a different model option if you have such a problem.
|
||||
Some other models may match better and give you more matching
|
||||
functionality. If none of the available models works, send a bug
|
||||
report. See the bug report section for details.
|
||||
|
||||
If you are masochistic enough to debug the driver problem, note the
|
||||
following:
|
||||
|
||||
- The speaker (and the headphone, too) output often requires the
|
||||
external amplifier. This can be set usually via EAPD verb or a
|
||||
certain GPIO. If the codec pin supports EAPD, you have a better
|
||||
chance via SET_EAPD_BTL verb (0x70c). On others, GPIO pin (mostly
|
||||
it's either GPIO0 or GPIO1) may turn on/off EAPD.
|
||||
- Some Realtek codecs require special vendor-specific coefficients to
|
||||
turn on the amplifier. See patch_realtek.c.
|
||||
- IDT codecs may have extra power-enable/disable controls on each
|
||||
analog pin. See patch_sigmatel.c.
|
||||
- Very rare but some devices don't accept the pin-detection verb until
|
||||
triggered. Issuing GET_PIN_SENSE verb (0xf09) may result in the
|
||||
codec-communication stall. Some examples are found in
|
||||
patch_realtek.c.
|
||||
|
||||
|
||||
Capture Problems
|
||||
~~~~~~~~~~~~~~~~
|
||||
The capture problems are often because of missing setups of mixers.
|
||||
Thus, before submitting a bug report, make sure that you set up the
|
||||
mixer correctly. For example, both "Capture Volume" and "Capture
|
||||
Switch" have to be set properly in addition to the right "Capture
|
||||
Source" or "Input Source" selection. Some devices have "Mic Boost"
|
||||
volume or switch.
|
||||
|
||||
When the PCM device is opened via "default" PCM (without pulse-audio
|
||||
plugin), you'll likely have "Digital Capture Volume" control as well.
|
||||
This is provided for the extra gain/attenuation of the signal in
|
||||
software, especially for the inputs without the hardware volume
|
||||
control such as digital microphones. Unless really needed, this
|
||||
should be set to exactly 50%, corresponding to 0dB -- neither extra
|
||||
gain nor attenuation. When you use "hw" PCM, i.e., a raw access PCM,
|
||||
this control will have no influence, though.
|
||||
|
||||
It's known that some codecs / devices have fairly bad analog circuits,
|
||||
and the recorded sound contains a certain DC-offset. This is no bug
|
||||
of the driver.
|
||||
|
||||
Most of modern laptops have no analog CD-input connection. Thus, the
|
||||
recording from CD input won't work in many cases although the driver
|
||||
provides it as the capture source. Use CDDA instead.
|
||||
|
||||
The automatic switching of the built-in and external mic per plugging
|
||||
is implemented on some codec models but not on every model. Partly
|
||||
because of my laziness but mostly lack of testers. Feel free to
|
||||
submit the improvement patch to the author.
|
||||
|
||||
|
||||
Direct Debugging
|
||||
~~~~~~~~~~~~~~~~
|
||||
If no model option gives you a better result, and you are a tough guy
|
||||
to fight against evil, try debugging via hitting the raw HD-audio
|
||||
codec verbs to the device. Some tools are available: hda-emu and
|
||||
hda-analyzer. The detailed description is found in the sections
|
||||
below. You'd need to enable hwdep for using these tools. See "Kernel
|
||||
Configuration" section.
|
||||
|
||||
|
||||
OTHER ISSUES
|
||||
------------
|
||||
|
||||
Kernel Configuration
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
In general, I recommend you to enable the sound debug option,
|
||||
`CONFIG_SND_DEBUG=y`, no matter whether you are debugging or not.
|
||||
This enables snd_printd() macro and others, and you'll get additional
|
||||
kernel messages at probing.
|
||||
|
||||
In addition, you can enable `CONFIG_SND_DEBUG_VERBOSE=y`. But this
|
||||
will give you far more messages. Thus turn this on only when you are
|
||||
sure to want it.
|
||||
|
||||
Don't forget to turn on the appropriate `CONFIG_SND_HDA_CODEC_*`
|
||||
options. Note that each of them corresponds to the codec chip, not
|
||||
the controller chip. Thus, even if lspci shows the Nvidia controller,
|
||||
you may need to choose the option for other vendors. If you are
|
||||
unsure, just select all yes.
|
||||
|
||||
`CONFIG_SND_HDA_HWDEP` is a useful option for debugging the driver.
|
||||
When this is enabled, the driver creates hardware-dependent devices
|
||||
(one per each codec), and you have a raw access to the device via
|
||||
these device files. For example, `hwC0D2` will be created for the
|
||||
codec slot #2 of the first card (#0). For debug-tools such as
|
||||
hda-verb and hda-analyzer, the hwdep device has to be enabled.
|
||||
Thus, it'd be better to turn this on always.
|
||||
|
||||
`CONFIG_SND_HDA_RECONFIG` is a new option, and this depends on the
|
||||
hwdep option above. When enabled, you'll have some sysfs files under
|
||||
the corresponding hwdep directory. See "HD-audio reconfiguration"
|
||||
section below.
|
||||
|
||||
`CONFIG_SND_HDA_POWER_SAVE` option enables the power-saving feature.
|
||||
See "Power-saving" section below.
|
||||
|
||||
|
||||
Codec Proc-File
|
||||
~~~~~~~~~~~~~~~
|
||||
The codec proc-file is a treasure-chest for debugging HD-audio.
|
||||
It shows most of useful information of each codec widget.
|
||||
|
||||
The proc file is located in /proc/asound/card*/codec#*, one file per
|
||||
each codec slot. You can know the codec vendor, product id and
|
||||
names, the type of each widget, capabilities and so on.
|
||||
This file, however, doesn't show the jack sensing state, so far. This
|
||||
is because the jack-sensing might be depending on the trigger state.
|
||||
|
||||
This file will be picked up by the debug tools, and also it can be fed
|
||||
to the emulator as the primary codec information. See the debug tools
|
||||
section below.
|
||||
|
||||
This proc file can be also used to check whether the generic parser is
|
||||
used. When the generic parser is used, the vendor/product ID name
|
||||
will appear as "Realtek ID 0262", instead of "Realtek ALC262".
|
||||
|
||||
|
||||
HD-Audio Reconfiguration
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
This is an experimental feature to allow you re-configure the HD-audio
|
||||
codec dynamically without reloading the driver. The following sysfs
|
||||
files are available under each codec-hwdep device directory (e.g.
|
||||
/sys/class/sound/hwC0D0):
|
||||
|
||||
vendor_id::
|
||||
Shows the 32bit codec vendor-id hex number. You can change the
|
||||
vendor-id value by writing to this file.
|
||||
subsystem_id::
|
||||
Shows the 32bit codec subsystem-id hex number. You can change the
|
||||
subsystem-id value by writing to this file.
|
||||
revision_id::
|
||||
Shows the 32bit codec revision-id hex number. You can change the
|
||||
revision-id value by writing to this file.
|
||||
afg::
|
||||
Shows the AFG ID. This is read-only.
|
||||
mfg::
|
||||
Shows the MFG ID. This is read-only.
|
||||
name::
|
||||
Shows the codec name string. Can be changed by writing to this
|
||||
file.
|
||||
modelname::
|
||||
Shows the currently set `model` option. Can be changed by writing
|
||||
to this file.
|
||||
init_verbs::
|
||||
The extra verbs to execute at initialization. You can add a verb by
|
||||
writing to this file. Pass three numbers: nid, verb and parameter
|
||||
(separated with a space).
|
||||
hints::
|
||||
Shows / stores hint strings for codec parsers for any use.
|
||||
Its format is `key = value`. For example, passing `jack_detect = no`
|
||||
will disable the jack detection of the machine completely.
|
||||
init_pin_configs::
|
||||
Shows the initial pin default config values set by BIOS.
|
||||
driver_pin_configs::
|
||||
Shows the pin default values set by the codec parser explicitly.
|
||||
This doesn't show all pin values but only the changed values by
|
||||
the parser. That is, if the parser doesn't change the pin default
|
||||
config values by itself, this will contain nothing.
|
||||
user_pin_configs::
|
||||
Shows the pin default config values to override the BIOS setup.
|
||||
Writing this (with two numbers, NID and value) appends the new
|
||||
value. The given will be used instead of the initial BIOS value at
|
||||
the next reconfiguration time. Note that this config will override
|
||||
even the driver pin configs, too.
|
||||
reconfig::
|
||||
Triggers the codec re-configuration. When any value is written to
|
||||
this file, the driver re-initialize and parses the codec tree
|
||||
again. All the changes done by the sysfs entries above are taken
|
||||
into account.
|
||||
clear::
|
||||
Resets the codec, removes the mixer elements and PCM stuff of the
|
||||
specified codec, and clear all init verbs and hints.
|
||||
|
||||
For example, when you want to change the pin default configuration
|
||||
value of the pin widget 0x14 to 0x9993013f, and let the driver
|
||||
re-configure based on that state, run like below:
|
||||
------------------------------------------------------------------------
|
||||
# echo 0x14 0x9993013f > /sys/class/sound/hwC0D0/user_pin_configs
|
||||
# echo 1 > /sys/class/sound/hwC0D0/reconfig
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Hint Strings
|
||||
~~~~~~~~~~~~
|
||||
The codec parser have several switches and adjustment knobs for
|
||||
matching better with the actual codec or device behavior. Many of
|
||||
them can be adjusted dynamically via "hints" strings as mentioned in
|
||||
the section above. For example, by passing `jack_detect = no` string
|
||||
via sysfs or a patch file, you can disable the jack detection, thus
|
||||
the codec parser will skip the features like auto-mute or mic
|
||||
auto-switch. As a boolean value, either `yes`, `no`, `true`, `false`,
|
||||
`1` or `0` can be passed.
|
||||
|
||||
The generic parser supports the following hints:
|
||||
|
||||
- jack_detect (bool): specify whether the jack detection is available
|
||||
at all on this machine; default true
|
||||
- inv_jack_detect (bool): indicates that the jack detection logic is
|
||||
inverted
|
||||
- trigger_sense (bool): indicates that the jack detection needs the
|
||||
explicit call of AC_VERB_SET_PIN_SENSE verb
|
||||
- inv_eapd (bool): indicates that the EAPD is implemented in the
|
||||
inverted logic
|
||||
- pcm_format_first (bool): sets the PCM format before the stream tag
|
||||
and channel ID
|
||||
- sticky_stream (bool): keep the PCM format, stream tag and ID as long
|
||||
as possible; default true
|
||||
- spdif_status_reset (bool): reset the SPDIF status bits at each time
|
||||
the SPDIF stream is set up
|
||||
- pin_amp_workaround (bool): the output pin may have multiple amp
|
||||
values
|
||||
- single_adc_amp (bool): ADCs can have only single input amps
|
||||
- auto_mute (bool): enable/disable the headphone auto-mute feature;
|
||||
default true
|
||||
- auto_mic (bool): enable/disable the mic auto-switch feature; default
|
||||
true
|
||||
- line_in_auto_switch (bool): enable/disable the line-in auto-switch
|
||||
feature; default false
|
||||
- need_dac_fix (bool): limits the DACs depending on the channel count
|
||||
- primary_hp (bool): probe headphone jacks as the primary outputs;
|
||||
default true
|
||||
- multi_io (bool): try probing multi-I/O config (e.g. shared
|
||||
line-in/surround, mic/clfe jacks)
|
||||
- multi_cap_vol (bool): provide multiple capture volumes
|
||||
- inv_dmic_split (bool): provide split internal mic volume/switch for
|
||||
phase-inverted digital mics
|
||||
- indep_hp (bool): provide the independent headphone PCM stream and
|
||||
the corresponding mixer control, if available
|
||||
- add_stereo_mix_input (bool): add the stereo mix (analog-loopback
|
||||
mix) to the input mux if available
|
||||
- add_jack_modes (bool): add "xxx Jack Mode" enum controls to each
|
||||
I/O jack for allowing to change the headphone amp and mic bias VREF
|
||||
capabilities
|
||||
- power_down_unused (bool): power down the unused widgets
|
||||
- add_hp_mic (bool): add the headphone to capture source if possible
|
||||
- hp_mic_detect (bool): enable/disable the hp/mic shared input for a
|
||||
single built-in mic case; default true
|
||||
- mixer_nid (int): specifies the widget NID of the analog-loopback
|
||||
mixer
|
||||
|
||||
|
||||
Early Patching
|
||||
~~~~~~~~~~~~~~
|
||||
When CONFIG_SND_HDA_PATCH_LOADER=y is set, you can pass a "patch" as a
|
||||
firmware file for modifying the HD-audio setup before initializing the
|
||||
codec. This can work basically like the reconfiguration via sysfs in
|
||||
the above, but it does it before the first codec configuration.
|
||||
|
||||
A patch file is a plain text file which looks like below:
|
||||
|
||||
------------------------------------------------------------------------
|
||||
[codec]
|
||||
0x12345678 0xabcd1234 2
|
||||
|
||||
[model]
|
||||
auto
|
||||
|
||||
[pincfg]
|
||||
0x12 0x411111f0
|
||||
|
||||
[verb]
|
||||
0x20 0x500 0x03
|
||||
0x20 0x400 0xff
|
||||
|
||||
[hint]
|
||||
jack_detect = no
|
||||
------------------------------------------------------------------------
|
||||
|
||||
The file needs to have a line `[codec]`. The next line should contain
|
||||
three numbers indicating the codec vendor-id (0x12345678 in the
|
||||
example), the codec subsystem-id (0xabcd1234) and the address (2) of
|
||||
the codec. The rest patch entries are applied to this specified codec
|
||||
until another codec entry is given. Passing 0 or a negative number to
|
||||
the first or the second value will make the check of the corresponding
|
||||
field be skipped. It'll be useful for really broken devices that don't
|
||||
initialize SSID properly.
|
||||
|
||||
The `[model]` line allows to change the model name of the each codec.
|
||||
In the example above, it will be changed to model=auto.
|
||||
Note that this overrides the module option.
|
||||
|
||||
After the `[pincfg]` line, the contents are parsed as the initial
|
||||
default pin-configurations just like `user_pin_configs` sysfs above.
|
||||
The values can be shown in user_pin_configs sysfs file, too.
|
||||
|
||||
Similarly, the lines after `[verb]` are parsed as `init_verbs`
|
||||
sysfs entries, and the lines after `[hint]` are parsed as `hints`
|
||||
sysfs entries, respectively.
|
||||
|
||||
Another example to override the codec vendor id from 0x12345678 to
|
||||
0xdeadbeef is like below:
|
||||
------------------------------------------------------------------------
|
||||
[codec]
|
||||
0x12345678 0xabcd1234 2
|
||||
|
||||
[vendor_id]
|
||||
0xdeadbeef
|
||||
------------------------------------------------------------------------
|
||||
|
||||
In the similar way, you can override the codec subsystem_id via
|
||||
`[subsystem_id]`, the revision id via `[revision_id]` line.
|
||||
Also, the codec chip name can be rewritten via `[chip_name]` line.
|
||||
------------------------------------------------------------------------
|
||||
[codec]
|
||||
0x12345678 0xabcd1234 2
|
||||
|
||||
[subsystem_id]
|
||||
0xffff1111
|
||||
|
||||
[revision_id]
|
||||
0x10
|
||||
|
||||
[chip_name]
|
||||
My-own NEWS-0002
|
||||
------------------------------------------------------------------------
|
||||
|
||||
The hd-audio driver reads the file via request_firmware(). Thus,
|
||||
a patch file has to be located on the appropriate firmware path,
|
||||
typically, /lib/firmware. For example, when you pass the option
|
||||
`patch=hda-init.fw`, the file /lib/firmware/hda-init.fw must be
|
||||
present.
|
||||
|
||||
The patch module option is specific to each card instance, and you
|
||||
need to give one file name for each instance, separated by commas.
|
||||
For example, if you have two cards, one for an on-board analog and one
|
||||
for an HDMI video board, you may pass patch option like below:
|
||||
------------------------------------------------------------------------
|
||||
options snd-hda-intel patch=on-board-patch,hdmi-patch
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Power-Saving
|
||||
~~~~~~~~~~~~
|
||||
The power-saving is a kind of auto-suspend of the device. When the
|
||||
device is inactive for a certain time, the device is automatically
|
||||
turned off to save the power. The time to go down is specified via
|
||||
`power_save` module option, and this option can be changed dynamically
|
||||
via sysfs.
|
||||
|
||||
The power-saving won't work when the analog loopback is enabled on
|
||||
some codecs. Make sure that you mute all unneeded signal routes when
|
||||
you want the power-saving.
|
||||
|
||||
The power-saving feature might cause audible click noises at each
|
||||
power-down/up depending on the device. Some of them might be
|
||||
solvable, but some are hard, I'm afraid. Some distros such as
|
||||
openSUSE enables the power-saving feature automatically when the power
|
||||
cable is unplugged. Thus, if you hear noises, suspect first the
|
||||
power-saving. See /sys/module/snd_hda_intel/parameters/power_save to
|
||||
check the current value. If it's non-zero, the feature is turned on.
|
||||
|
||||
The recent kernel supports the runtime PM for the HD-audio controller
|
||||
chip, too. It means that the HD-audio controller is also powered up /
|
||||
down dynamically. The feature is enabled only for certain controller
|
||||
chips like Intel LynxPoint. You can enable/disable this feature
|
||||
forcibly by setting `power_save_controller` option, which is also
|
||||
available at /sys/module/snd_hda_intel/parameters directory.
|
||||
|
||||
|
||||
Tracepoints
|
||||
~~~~~~~~~~~
|
||||
The hd-audio driver gives a few basic tracepoints.
|
||||
`hda:hda_send_cmd` traces each CORB write while `hda:hda_get_response`
|
||||
traces the response from RIRB (only when read from the codec driver).
|
||||
`hda:hda_bus_reset` traces the bus-reset due to fatal error, etc,
|
||||
`hda:hda_unsol_event` traces the unsolicited events, and
|
||||
`hda:hda_power_down` and `hda:hda_power_up` trace the power down/up
|
||||
via power-saving behavior.
|
||||
|
||||
Enabling all tracepoints can be done like
|
||||
------------------------------------------------------------------------
|
||||
# echo 1 > /sys/kernel/debug/tracing/events/hda/enable
|
||||
------------------------------------------------------------------------
|
||||
then after some commands, you can traces from
|
||||
/sys/kernel/debug/tracing/trace file. For example, when you want to
|
||||
trace what codec command is sent, enable the tracepoint like:
|
||||
------------------------------------------------------------------------
|
||||
# cat /sys/kernel/debug/tracing/trace
|
||||
# tracer: nop
|
||||
#
|
||||
# TASK-PID CPU# TIMESTAMP FUNCTION
|
||||
# | | | | |
|
||||
<...>-7807 [002] 105147.774889: hda_send_cmd: [0:0] val=e3a019
|
||||
<...>-7807 [002] 105147.774893: hda_send_cmd: [0:0] val=e39019
|
||||
<...>-7807 [002] 105147.999542: hda_send_cmd: [0:0] val=e3a01a
|
||||
<...>-7807 [002] 105147.999543: hda_send_cmd: [0:0] val=e3901a
|
||||
<...>-26764 [001] 349222.837143: hda_send_cmd: [0:0] val=e3a019
|
||||
<...>-26764 [001] 349222.837148: hda_send_cmd: [0:0] val=e39019
|
||||
<...>-26764 [001] 349223.058539: hda_send_cmd: [0:0] val=e3a01a
|
||||
<...>-26764 [001] 349223.058541: hda_send_cmd: [0:0] val=e3901a
|
||||
------------------------------------------------------------------------
|
||||
Here `[0:0]` indicates the card number and the codec address, and
|
||||
`val` shows the value sent to the codec, respectively. The value is
|
||||
a packed value, and you can decode it via hda-decode-verb program
|
||||
included in hda-emu package below. For example, the value e3a019 is
|
||||
to set the left output-amp value to 25.
|
||||
------------------------------------------------------------------------
|
||||
% hda-decode-verb 0xe3a019
|
||||
raw value = 0x00e3a019
|
||||
cid = 0, nid = 0x0e, verb = 0x3a0, parm = 0x19
|
||||
raw value: verb = 0x3a0, parm = 0x19
|
||||
verbname = set_amp_gain_mute
|
||||
amp raw val = 0xa019
|
||||
output, left, idx=0, mute=0, val=25
|
||||
------------------------------------------------------------------------
|
||||
|
||||
|
||||
Development Tree
|
||||
~~~~~~~~~~~~~~~~
|
||||
The latest development codes for HD-audio are found on sound git tree:
|
||||
|
||||
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/sound.git
|
||||
|
||||
The master branch or for-next branches can be used as the main
|
||||
development branches in general while the development for the current
|
||||
and next kernels are found in for-linus and for-next branches,
|
||||
respectively.
|
||||
|
||||
If you are using the latest Linus tree, it'd be better to pull the
|
||||
above GIT tree onto it. If you are using the older kernels, an easy
|
||||
way to try the latest ALSA code is to build from the snapshot
|
||||
tarball. There are daily tarballs and the latest snapshot tarball.
|
||||
All can be built just like normal alsa-driver release packages, that
|
||||
is, installed via the usual spells: configure, make and make
|
||||
install(-modules). See INSTALL in the package. The snapshot tarballs
|
||||
are found at:
|
||||
|
||||
- ftp://ftp.suse.com/pub/people/tiwai/snapshot/
|
||||
|
||||
|
||||
Sending a Bug Report
|
||||
~~~~~~~~~~~~~~~~~~~~
|
||||
If any model or module options don't work for your device, it's time
|
||||
to send a bug report to the developers. Give the following in your
|
||||
bug report:
|
||||
|
||||
- Hardware vendor, product and model names
|
||||
- Kernel version (and ALSA-driver version if you built externally)
|
||||
- `alsa-info.sh` output; run with `--no-upload` option. See the
|
||||
section below about alsa-info
|
||||
|
||||
If it's a regression, at best, send alsa-info outputs of both working
|
||||
and non-working kernels. This is really helpful because we can
|
||||
compare the codec registers directly.
|
||||
|
||||
Send a bug report either the followings:
|
||||
|
||||
kernel-bugzilla::
|
||||
https://bugzilla.kernel.org/
|
||||
alsa-devel ML::
|
||||
alsa-devel@alsa-project.org
|
||||
|
||||
|
||||
DEBUG TOOLS
|
||||
-----------
|
||||
|
||||
This section describes some tools available for debugging HD-audio
|
||||
problems.
|
||||
|
||||
alsa-info
|
||||
~~~~~~~~~
|
||||
The script `alsa-info.sh` is a very useful tool to gather the audio
|
||||
device information. You can fetch the latest version from:
|
||||
|
||||
- http://www.alsa-project.org/alsa-info.sh
|
||||
|
||||
Run this script as root, and it will gather the important information
|
||||
such as the module lists, module parameters, proc file contents
|
||||
including the codec proc files, mixer outputs and the control
|
||||
elements. As default, it will store the information onto a web server
|
||||
on alsa-project.org. But, if you send a bug report, it'd be better to
|
||||
run with `--no-upload` option, and attach the generated file.
|
||||
|
||||
There are some other useful options. See `--help` option output for
|
||||
details.
|
||||
|
||||
When a probe error occurs or when the driver obviously assigns a
|
||||
mismatched model, it'd be helpful to load the driver with
|
||||
`probe_only=1` option (at best after the cold reboot) and run
|
||||
alsa-info at this state. With this option, the driver won't configure
|
||||
the mixer and PCM but just tries to probe the codec slot. After
|
||||
probing, the proc file is available, so you can get the raw codec
|
||||
information before modified by the driver. Of course, the driver
|
||||
isn't usable with `probe_only=1`. But you can continue the
|
||||
configuration via hwdep sysfs file if hda-reconfig option is enabled.
|
||||
Using `probe_only` mask 2 skips the reset of HDA codecs (use
|
||||
`probe_only=3` as module option). The hwdep interface can be used
|
||||
to determine the BIOS codec initialization.
|
||||
|
||||
|
||||
hda-verb
|
||||
~~~~~~~~
|
||||
hda-verb is a tiny program that allows you to access the HD-audio
|
||||
codec directly. You can execute a raw HD-audio codec verb with this.
|
||||
This program accesses the hwdep device, thus you need to enable the
|
||||
kernel config `CONFIG_SND_HDA_HWDEP=y` beforehand.
|
||||
|
||||
The hda-verb program takes four arguments: the hwdep device file, the
|
||||
widget NID, the verb and the parameter. When you access to the codec
|
||||
on the slot 2 of the card 0, pass /dev/snd/hwC0D2 to the first
|
||||
argument, typically. (However, the real path name depends on the
|
||||
system.)
|
||||
|
||||
The second parameter is the widget number-id to access. The third
|
||||
parameter can be either a hex/digit number or a string corresponding
|
||||
to a verb. Similarly, the last parameter is the value to write, or
|
||||
can be a string for the parameter type.
|
||||
|
||||
------------------------------------------------------------------------
|
||||
% hda-verb /dev/snd/hwC0D0 0x12 0x701 2
|
||||
nid = 0x12, verb = 0x701, param = 0x2
|
||||
value = 0x0
|
||||
|
||||
% hda-verb /dev/snd/hwC0D0 0x0 PARAMETERS VENDOR_ID
|
||||
nid = 0x0, verb = 0xf00, param = 0x0
|
||||
value = 0x10ec0262
|
||||
|
||||
% hda-verb /dev/snd/hwC0D0 2 set_a 0xb080
|
||||
nid = 0x2, verb = 0x300, param = 0xb080
|
||||
value = 0x0
|
||||
------------------------------------------------------------------------
|
||||
|
||||
Although you can issue any verbs with this program, the driver state
|
||||
won't be always updated. For example, the volume values are usually
|
||||
cached in the driver, and thus changing the widget amp value directly
|
||||
via hda-verb won't change the mixer value.
|
||||
|
||||
The hda-verb program is included now in alsa-tools:
|
||||
|
||||
- git://git.alsa-project.org/alsa-tools.git
|
||||
|
||||
Also, the old stand-alone package is found in the ftp directory:
|
||||
|
||||
- ftp://ftp.suse.com/pub/people/tiwai/misc/
|
||||
|
||||
Also a git repository is available:
|
||||
|
||||
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/hda-verb.git
|
||||
|
||||
See README file in the tarball for more details about hda-verb
|
||||
program.
|
||||
|
||||
|
||||
hda-analyzer
|
||||
~~~~~~~~~~~~
|
||||
hda-analyzer provides a graphical interface to access the raw HD-audio
|
||||
control, based on pyGTK2 binding. It's a more powerful version of
|
||||
hda-verb. The program gives you an easy-to-use GUI stuff for showing
|
||||
the widget information and adjusting the amp values, as well as the
|
||||
proc-compatible output.
|
||||
|
||||
The hda-analyzer:
|
||||
|
||||
- http://git.alsa-project.org/?p=alsa.git;a=tree;f=hda-analyzer
|
||||
|
||||
is a part of alsa.git repository in alsa-project.org:
|
||||
|
||||
- git://git.alsa-project.org/alsa.git
|
||||
|
||||
Codecgraph
|
||||
~~~~~~~~~~
|
||||
Codecgraph is a utility program to generate a graph and visualizes the
|
||||
codec-node connection of a codec chip. It's especially useful when
|
||||
you analyze or debug a codec without a proper datasheet. The program
|
||||
parses the given codec proc file and converts to SVG via graphiz
|
||||
program.
|
||||
|
||||
The tarball and GIT trees are found in the web page at:
|
||||
|
||||
- http://helllabs.org/codecgraph/
|
||||
|
||||
|
||||
hda-emu
|
||||
~~~~~~~
|
||||
hda-emu is an HD-audio emulator. The main purpose of this program is
|
||||
to debug an HD-audio codec without the real hardware. Thus, it
|
||||
doesn't emulate the behavior with the real audio I/O, but it just
|
||||
dumps the codec register changes and the ALSA-driver internal changes
|
||||
at probing and operating the HD-audio driver.
|
||||
|
||||
The program requires a codec proc-file to simulate. Get a proc file
|
||||
for the target codec beforehand, or pick up an example codec from the
|
||||
codec proc collections in the tarball. Then, run the program with the
|
||||
proc file, and the hda-emu program will start parsing the codec file
|
||||
and simulates the HD-audio driver:
|
||||
|
||||
------------------------------------------------------------------------
|
||||
% hda-emu codecs/stac9200-dell-d820-laptop
|
||||
# Parsing..
|
||||
hda_codec: Unknown model for STAC9200, using BIOS defaults
|
||||
hda_codec: pin nid 08 bios pin config 40c003fa
|
||||
....
|
||||
------------------------------------------------------------------------
|
||||
|
||||
The program gives you only a very dumb command-line interface. You
|
||||
can get a proc-file dump at the current state, get a list of control
|
||||
(mixer) elements, set/get the control element value, simulate the PCM
|
||||
operation, the jack plugging simulation, etc.
|
||||
|
||||
The package is found in:
|
||||
|
||||
- ftp://ftp.suse.com/pub/people/tiwai/misc/
|
||||
|
||||
A git repository is available:
|
||||
|
||||
- git://git.kernel.org/pub/scm/linux/kernel/git/tiwai/hda-emu.git
|
||||
|
||||
See README file in the tarball for more details about hda-emu
|
||||
program.
|
||||
|
||||
|
||||
hda-jack-retask
|
||||
~~~~~~~~~~~~~~~
|
||||
hda-jack-retask is a user-friendly GUI program to manipulate the
|
||||
HD-audio pin control for jack retasking. If you have a problem about
|
||||
the jack assignment, try this program and check whether you can get
|
||||
useful results. Once when you figure out the proper pin assignment,
|
||||
it can be fixed either in the driver code statically or via passing a
|
||||
firmware patch file (see "Early Patching" section).
|
||||
|
||||
The program is included in alsa-tools now:
|
||||
|
||||
- git://git.alsa-project.org/alsa-tools.git
|
||||
|
86
Documentation/sound/alsa/Joystick.txt
Normal file
86
Documentation/sound/alsa/Joystick.txt
Normal file
|
@ -0,0 +1,86 @@
|
|||
Analog Joystick Support on ALSA Drivers
|
||||
=======================================
|
||||
Oct. 14, 2003
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
General
|
||||
-------
|
||||
|
||||
First of all, you need to enable GAMEPORT support on Linux kernel for
|
||||
using a joystick with the ALSA driver. For the details of gameport
|
||||
support, refer to Documentation/input/joystick.txt.
|
||||
|
||||
The joystick support of ALSA drivers is different between ISA and PCI
|
||||
cards. In the case of ISA (PnP) cards, it's usually handled by the
|
||||
independent module (ns558). Meanwhile, the ALSA PCI drivers have the
|
||||
built-in gameport support. Hence, when the ALSA PCI driver is built
|
||||
in the kernel, CONFIG_GAMEPORT must be 'y', too. Otherwise, the
|
||||
gameport support on that card will be (silently) disabled.
|
||||
|
||||
Some adapter modules probe the physical connection of the device at
|
||||
the load time. It'd be safer to plug in the joystick device before
|
||||
loading the module.
|
||||
|
||||
|
||||
PCI Cards
|
||||
---------
|
||||
|
||||
For PCI cards, the joystick is enabled when the appropriate module
|
||||
option is specified. Some drivers don't need options, and the
|
||||
joystick support is always enabled. In the former ALSA version, there
|
||||
was a dynamic control API for the joystick activation. It was
|
||||
changed, however, to the static module options because of the system
|
||||
stability and the resource management.
|
||||
|
||||
The following PCI drivers support the joystick natively.
|
||||
|
||||
Driver Module Option Available Values
|
||||
---------------------------------------------------------------------------
|
||||
als4000 joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: any address (e.g. 0x200)
|
||||
au88x0 N/A N/A
|
||||
azf3328 joystick 0 = disable, 1 = enable, -1 = auto (default)
|
||||
ens1370 joystick 0 = disable (default), 1 = enable
|
||||
ens1371 joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: 0x200, 0x208, 0x210, 0x218
|
||||
cmipci joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: any address (e.g. 0x200)
|
||||
cs4281 N/A N/A
|
||||
cs46xx N/A N/A
|
||||
es1938 N/A N/A
|
||||
es1968 joystick 0 = disable (default), 1 = enable
|
||||
sonicvibes N/A N/A
|
||||
trident N/A N/A
|
||||
via82xx(*1) joystick 0 = disable (default), 1 = enable
|
||||
ymfpci joystick_port 0 = disable (default), 1 = auto-detect,
|
||||
manual: 0x201, 0x202, 0x204, 0x205(*2)
|
||||
---------------------------------------------------------------------------
|
||||
|
||||
*1) VIA686A/B only
|
||||
*2) With YMF744/754 chips, the port address can be chosen arbitrarily
|
||||
|
||||
The following drivers don't support gameport natively, but there are
|
||||
additional modules. Load the corresponding module to add the gameport
|
||||
support.
|
||||
|
||||
Driver Additional Module
|
||||
-----------------------------
|
||||
emu10k1 emu10k1-gp
|
||||
fm801 fm801-gp
|
||||
-----------------------------
|
||||
|
||||
Note: the "pcigame" and "cs461x" modules are for the OSS drivers only.
|
||||
These ALSA drivers (cs46xx, trident and au88x0) have the
|
||||
built-in gameport support.
|
||||
|
||||
As mentioned above, ALSA PCI drivers have the built-in gameport
|
||||
support, so you don't have to load ns558 module. Just load "joydev"
|
||||
and the appropriate adapter module (e.g. "analog").
|
||||
|
||||
|
||||
ISA Cards
|
||||
---------
|
||||
|
||||
ALSA ISA drivers don't have the built-in gameport support.
|
||||
Instead, you need to load "ns558" module in addition to "joydev" and
|
||||
the adapter module (e.g. "analog").
|
100
Documentation/sound/alsa/MIXART.txt
Normal file
100
Documentation/sound/alsa/MIXART.txt
Normal file
|
@ -0,0 +1,100 @@
|
|||
Alsa driver for Digigram miXart8 and miXart8AES/EBU soundcards
|
||||
Digigram <alsa@digigram.com>
|
||||
|
||||
|
||||
GENERAL
|
||||
=======
|
||||
|
||||
The miXart8 is a multichannel audio processing and mixing soundcard
|
||||
that has 4 stereo audio inputs and 4 stereo audio outputs.
|
||||
The miXart8AES/EBU is the same with a add-on card that offers further
|
||||
4 digital stereo audio inputs and outputs.
|
||||
Furthermore the add-on card offers external clock synchronisation
|
||||
(AES/EBU, Word Clock, Time Code and Video Synchro)
|
||||
|
||||
The mainboard has a PowerPC that offers onboard mpeg encoding and
|
||||
decoding, samplerate conversions and various effects.
|
||||
|
||||
The driver don't work properly at all until the certain firmwares
|
||||
are loaded, i.e. no PCM nor mixer devices will appear.
|
||||
Use the mixartloader that can be found in the alsa-tools package.
|
||||
|
||||
|
||||
VERSION 0.1.0
|
||||
=============
|
||||
|
||||
One miXart8 board will be represented as 4 alsa cards, each with 1
|
||||
stereo analog capture 'pcm0c' and 1 stereo analog playback 'pcm0p' device.
|
||||
With a miXart8AES/EBU there is in addition 1 stereo digital input
|
||||
'pcm1c' and 1 stereo digital output 'pcm1p' per card.
|
||||
|
||||
Formats
|
||||
-------
|
||||
U8, S16_LE, S16_BE, S24_3LE, S24_3BE, FLOAT_LE, FLOAT_BE
|
||||
Sample rates : 8000 - 48000 Hz continuously
|
||||
|
||||
Playback
|
||||
--------
|
||||
For instance the playback devices are configured to have max. 4
|
||||
substreams performing hardware mixing. This could be changed to a
|
||||
maximum of 24 substreams if wished.
|
||||
Mono files will be played on the left and right channel. Each channel
|
||||
can be muted for each stream to use 8 analog/digital outputs separately.
|
||||
|
||||
Capture
|
||||
-------
|
||||
There is one substream per capture device. For instance only stereo
|
||||
formats are supported.
|
||||
|
||||
Mixer
|
||||
-----
|
||||
<Master> and <Master Capture> : analog volume control of playback and capture PCM.
|
||||
<PCM 0-3> and <PCM Capture> : digital volume control of each analog substream.
|
||||
<AES 0-3> and <AES Capture> : digital volume control of each AES/EBU substream.
|
||||
<Monitoring> : Loopback from 'pcm0c' to 'pcm0p' with digital volume
|
||||
and mute control.
|
||||
|
||||
Rem : for best audio quality try to keep a 0 attenuation on the PCM
|
||||
and AES volume controls which is set by 219 in the range from 0 to 255
|
||||
(about 86% with alsamixer)
|
||||
|
||||
|
||||
NOT YET IMPLEMENTED
|
||||
===================
|
||||
|
||||
- external clock support (AES/EBU, Word Clock, Time Code, Video Sync)
|
||||
- MPEG audio formats
|
||||
- mono record
|
||||
- on-board effects and samplerate conversions
|
||||
- linked streams
|
||||
|
||||
|
||||
FIRMWARE
|
||||
========
|
||||
|
||||
[As of 2.6.11, the firmware can be loaded automatically with hotplug
|
||||
when CONFIG_FW_LOADER is set. The mixartloader is necessary only
|
||||
for older versions or when you build the driver into kernel.]
|
||||
|
||||
For loading the firmware automatically after the module is loaded, use a
|
||||
install command. For example, add the following entry to
|
||||
/etc/modprobe.d/mixart.conf for miXart driver:
|
||||
|
||||
install snd-mixart /sbin/modprobe --first-time -i snd-mixart && \
|
||||
/usr/bin/mixartloader
|
||||
(for 2.2/2.4 kernels, add "post-install snd-mixart /usr/bin/vxloader" to
|
||||
/etc/modules.conf, instead.)
|
||||
|
||||
The firmware binaries are installed on /usr/share/alsa/firmware
|
||||
(or /usr/local/share/alsa/firmware, depending to the prefix option of
|
||||
configure). There will be a miXart.conf file, which define the dsp image
|
||||
files.
|
||||
|
||||
The firmware files are copyright by Digigram SA
|
||||
|
||||
|
||||
COPYRIGHT
|
||||
=========
|
||||
|
||||
Copyright (c) 2003 Digigram SA <alsa@digigram.com>
|
||||
Distributable under GPL.
|
305
Documentation/sound/alsa/OSS-Emulation.txt
Normal file
305
Documentation/sound/alsa/OSS-Emulation.txt
Normal file
|
@ -0,0 +1,305 @@
|
|||
NOTES ON KERNEL OSS-EMULATION
|
||||
=============================
|
||||
|
||||
Jan. 22, 2004 Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
|
||||
Modules
|
||||
=======
|
||||
|
||||
ALSA provides a powerful OSS emulation on the kernel.
|
||||
The OSS emulation for PCM, mixer and sequencer devices is implemented
|
||||
as add-on kernel modules, snd-pcm-oss, snd-mixer-oss and snd-seq-oss.
|
||||
When you need to access the OSS PCM, mixer or sequencer devices, the
|
||||
corresponding module has to be loaded.
|
||||
|
||||
These modules are loaded automatically when the corresponding service
|
||||
is called. The alias is defined sound-service-x-y, where x and y are
|
||||
the card number and the minor unit number. Usually you don't have to
|
||||
define these aliases by yourself.
|
||||
|
||||
Only necessary step for auto-loading of OSS modules is to define the
|
||||
card alias in /etc/modprobe.d/alsa.conf, such as
|
||||
|
||||
alias sound-slot-0 snd-emu10k1
|
||||
|
||||
As the second card, define sound-slot-1 as well.
|
||||
Note that you can't use the aliased name as the target name (i.e.
|
||||
"alias sound-slot-0 snd-card-0" doesn't work any more like the old
|
||||
modutils).
|
||||
|
||||
The currently available OSS configuration is shown in
|
||||
/proc/asound/oss/sndstat. This shows in the same syntax of
|
||||
/dev/sndstat, which is available on the commercial OSS driver.
|
||||
On ALSA, you can symlink /dev/sndstat to this proc file.
|
||||
|
||||
Please note that the devices listed in this proc file appear only
|
||||
after the corresponding OSS-emulation module is loaded. Don't worry
|
||||
even if "NOT ENABLED IN CONFIG" is shown in it.
|
||||
|
||||
|
||||
Device Mapping
|
||||
==============
|
||||
|
||||
ALSA supports the following OSS device files:
|
||||
|
||||
PCM:
|
||||
/dev/dspX
|
||||
/dev/adspX
|
||||
|
||||
Mixer:
|
||||
/dev/mixerX
|
||||
|
||||
MIDI:
|
||||
/dev/midi0X
|
||||
/dev/amidi0X
|
||||
|
||||
Sequencer:
|
||||
/dev/sequencer
|
||||
/dev/sequencer2 (aka /dev/music)
|
||||
|
||||
where X is the card number from 0 to 7.
|
||||
|
||||
(NOTE: Some distributions have the device files like /dev/midi0 and
|
||||
/dev/midi1. They are NOT for OSS but for tclmidi, which is
|
||||
a totally different thing.)
|
||||
|
||||
Unlike the real OSS, ALSA cannot use the device files more than the
|
||||
assigned ones. For example, the first card cannot use /dev/dsp1 or
|
||||
/dev/dsp2, but only /dev/dsp0 and /dev/adsp0.
|
||||
|
||||
As seen above, PCM and MIDI may have two devices. Usually, the first
|
||||
PCM device (hw:0,0 in ALSA) is mapped to /dev/dsp and the secondary
|
||||
device (hw:0,1) to /dev/adsp (if available). For MIDI, /dev/midi and
|
||||
/dev/amidi, respectively.
|
||||
|
||||
You can change this device mapping via the module options of
|
||||
snd-pcm-oss and snd-rawmidi. In the case of PCM, the following
|
||||
options are available for snd-pcm-oss:
|
||||
|
||||
dsp_map PCM device number assigned to /dev/dspX
|
||||
(default = 0)
|
||||
adsp_map PCM device number assigned to /dev/adspX
|
||||
(default = 1)
|
||||
|
||||
For example, to map the third PCM device (hw:0,2) to /dev/adsp0,
|
||||
define like this:
|
||||
|
||||
options snd-pcm-oss adsp_map=2
|
||||
|
||||
The options take arrays. For configuring the second card, specify
|
||||
two entries separated by comma. For example, to map the third PCM
|
||||
device on the second card to /dev/adsp1, define like below:
|
||||
|
||||
options snd-pcm-oss adsp_map=0,2
|
||||
|
||||
To change the mapping of MIDI devices, the following options are
|
||||
available for snd-rawmidi:
|
||||
|
||||
midi_map MIDI device number assigned to /dev/midi0X
|
||||
(default = 0)
|
||||
amidi_map MIDI device number assigned to /dev/amidi0X
|
||||
(default = 1)
|
||||
|
||||
For example, to assign the third MIDI device on the first card to
|
||||
/dev/midi00, define as follows:
|
||||
|
||||
options snd-rawmidi midi_map=2
|
||||
|
||||
|
||||
PCM Mode
|
||||
========
|
||||
|
||||
As default, ALSA emulates the OSS PCM with so-called plugin layer,
|
||||
i.e. tries to convert the sample format, rate or channels
|
||||
automatically when the card doesn't support it natively.
|
||||
This will lead to some problems for some applications like quake or
|
||||
wine, especially if they use the card only in the MMAP mode.
|
||||
|
||||
In such a case, you can change the behavior of PCM per application by
|
||||
writing a command to the proc file. There is a proc file for each PCM
|
||||
stream, /proc/asound/cardX/pcmY[cp]/oss, where X is the card number
|
||||
(zero-based), Y the PCM device number (zero-based), and 'p' is for
|
||||
playback and 'c' for capture, respectively. Note that this proc file
|
||||
exists only after snd-pcm-oss module is loaded.
|
||||
|
||||
The command sequence has the following syntax:
|
||||
|
||||
app_name fragments fragment_size [options]
|
||||
|
||||
app_name is the name of application with (higher priority) or without
|
||||
path.
|
||||
fragments specifies the number of fragments or zero if no specific
|
||||
number is given.
|
||||
fragment_size is the size of fragment in bytes or zero if not given.
|
||||
options is the optional parameters. The following options are
|
||||
available:
|
||||
|
||||
disable the application tries to open a pcm device for
|
||||
this channel but does not want to use it.
|
||||
direct don't use plugins
|
||||
block force block open mode
|
||||
non-block force non-block open mode
|
||||
partial-frag write also partial fragments (affects playback only)
|
||||
no-silence do not fill silence ahead to avoid clicks
|
||||
|
||||
The disable option is useful when one stream direction (playback or
|
||||
capture) is not handled correctly by the application although the
|
||||
hardware itself does support both directions.
|
||||
The direct option is used, as mentioned above, to bypass the automatic
|
||||
conversion and useful for MMAP-applications.
|
||||
For example, to playback the first PCM device without plugins for
|
||||
quake, send a command via echo like the following:
|
||||
|
||||
% echo "quake 0 0 direct" > /proc/asound/card0/pcm0p/oss
|
||||
|
||||
While quake wants only playback, you may append the second command
|
||||
to notify driver that only this direction is about to be allocated:
|
||||
|
||||
% echo "quake 0 0 disable" > /proc/asound/card0/pcm0c/oss
|
||||
|
||||
The permission of proc files depend on the module options of snd.
|
||||
As default it's set as root, so you'll likely need to be superuser for
|
||||
sending the command above.
|
||||
|
||||
The block and non-block options are used to change the behavior of
|
||||
opening the device file.
|
||||
|
||||
As default, ALSA behaves as original OSS drivers, i.e. does not block
|
||||
the file when it's busy. The -EBUSY error is returned in this case.
|
||||
|
||||
This blocking behavior can be changed globally via nonblock_open
|
||||
module option of snd-pcm-oss. For using the blocking mode as default
|
||||
for OSS devices, define like the following:
|
||||
|
||||
options snd-pcm-oss nonblock_open=0
|
||||
|
||||
The partial-frag and no-silence commands have been added recently.
|
||||
Both commands are for optimization use only. The former command
|
||||
specifies to invoke the write transfer only when the whole fragment is
|
||||
filled. The latter stops writing the silence data ahead
|
||||
automatically. Both are disabled as default.
|
||||
|
||||
You can check the currently defined configuration by reading the proc
|
||||
file. The read image can be sent to the proc file again, hence you
|
||||
can save the current configuration
|
||||
|
||||
% cat /proc/asound/card0/pcm0p/oss > /somewhere/oss-cfg
|
||||
|
||||
and restore it like
|
||||
|
||||
% cat /somewhere/oss-cfg > /proc/asound/card0/pcm0p/oss
|
||||
|
||||
Also, for clearing all the current configuration, send "erase" command
|
||||
as below:
|
||||
|
||||
% echo "erase" > /proc/asound/card0/pcm0p/oss
|
||||
|
||||
|
||||
Mixer Elements
|
||||
==============
|
||||
|
||||
Since ALSA has completely different mixer interface, the emulation of
|
||||
OSS mixer is relatively complicated. ALSA builds up a mixer element
|
||||
from several different ALSA (mixer) controls based on the name
|
||||
string. For example, the volume element SOUND_MIXER_PCM is composed
|
||||
from "PCM Playback Volume" and "PCM Playback Switch" controls for the
|
||||
playback direction and from "PCM Capture Volume" and "PCM Capture
|
||||
Switch" for the capture directory (if exists). When the PCM volume of
|
||||
OSS is changed, all the volume and switch controls above are adjusted
|
||||
automatically.
|
||||
|
||||
As default, ALSA uses the following control for OSS volumes:
|
||||
|
||||
OSS volume ALSA control Index
|
||||
-----------------------------------------------------
|
||||
SOUND_MIXER_VOLUME Master 0
|
||||
SOUND_MIXER_BASS Tone Control - Bass 0
|
||||
SOUND_MIXER_TREBLE Tone Control - Treble 0
|
||||
SOUND_MIXER_SYNTH Synth 0
|
||||
SOUND_MIXER_PCM PCM 0
|
||||
SOUND_MIXER_SPEAKER PC Speaker 0
|
||||
SOUND_MIXER_LINE Line 0
|
||||
SOUND_MIXER_MIC Mic 0
|
||||
SOUND_MIXER_CD CD 0
|
||||
SOUND_MIXER_IMIX Monitor Mix 0
|
||||
SOUND_MIXER_ALTPCM PCM 1
|
||||
SOUND_MIXER_RECLEV (not assigned)
|
||||
SOUND_MIXER_IGAIN Capture 0
|
||||
SOUND_MIXER_OGAIN Playback 0
|
||||
SOUND_MIXER_LINE1 Aux 0
|
||||
SOUND_MIXER_LINE2 Aux 1
|
||||
SOUND_MIXER_LINE3 Aux 2
|
||||
SOUND_MIXER_DIGITAL1 Digital 0
|
||||
SOUND_MIXER_DIGITAL2 Digital 1
|
||||
SOUND_MIXER_DIGITAL3 Digital 2
|
||||
SOUND_MIXER_PHONEIN Phone 0
|
||||
SOUND_MIXER_PHONEOUT Phone 1
|
||||
SOUND_MIXER_VIDEO Video 0
|
||||
SOUND_MIXER_RADIO Radio 0
|
||||
SOUND_MIXER_MONITOR Monitor 0
|
||||
|
||||
The second column is the base-string of the corresponding ALSA
|
||||
control. In fact, the controls with "XXX [Playback|Capture]
|
||||
[Volume|Switch]" will be checked in addition.
|
||||
|
||||
The current assignment of these mixer elements is listed in the proc
|
||||
file, /proc/asound/cardX/oss_mixer, which will be like the following
|
||||
|
||||
VOLUME "Master" 0
|
||||
BASS "" 0
|
||||
TREBLE "" 0
|
||||
SYNTH "" 0
|
||||
PCM "PCM" 0
|
||||
...
|
||||
|
||||
where the first column is the OSS volume element, the second column
|
||||
the base-string of the corresponding ALSA control, and the third the
|
||||
control index. When the string is empty, it means that the
|
||||
corresponding OSS control is not available.
|
||||
|
||||
For changing the assignment, you can write the configuration to this
|
||||
proc file. For example, to map "Wave Playback" to the PCM volume,
|
||||
send the command like the following:
|
||||
|
||||
% echo 'VOLUME "Wave Playback" 0' > /proc/asound/card0/oss_mixer
|
||||
|
||||
The command is exactly as same as listed in the proc file. You can
|
||||
change one or more elements, one volume per line. In the last
|
||||
example, both "Wave Playback Volume" and "Wave Playback Switch" will
|
||||
be affected when PCM volume is changed.
|
||||
|
||||
Like the case of PCM proc file, the permission of proc files depend on
|
||||
the module options of snd. you'll likely need to be superuser for
|
||||
sending the command above.
|
||||
|
||||
As well as in the case of PCM proc file, you can save and restore the
|
||||
current mixer configuration by reading and writing the whole file
|
||||
image.
|
||||
|
||||
|
||||
Duplex Streams
|
||||
==============
|
||||
|
||||
Note that when attempting to use a single device file for playback and
|
||||
capture, the OSS API provides no way to set the format, sample rate or
|
||||
number of channels different in each direction. Thus
|
||||
io_handle = open("device", O_RDWR)
|
||||
will only function correctly if the values are the same in each direction.
|
||||
|
||||
To use different values in the two directions, use both
|
||||
input_handle = open("device", O_RDONLY)
|
||||
output_handle = open("device", O_WRONLY)
|
||||
and set the values for the corresponding handle.
|
||||
|
||||
|
||||
Unsupported Features
|
||||
====================
|
||||
|
||||
MMAP on ICE1712 driver
|
||||
----------------------
|
||||
ICE1712 supports only the unconventional format, interleaved
|
||||
10-channels 24bit (packed in 32bit) format. Therefore you cannot mmap
|
||||
the buffer as the conventional (mono or 2-channels, 8 or 16bit) format
|
||||
on OSS.
|
||||
|
243
Documentation/sound/alsa/Procfile.txt
Normal file
243
Documentation/sound/alsa/Procfile.txt
Normal file
|
@ -0,0 +1,243 @@
|
|||
Proc Files of ALSA Drivers
|
||||
==========================
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
General
|
||||
-------
|
||||
|
||||
ALSA has its own proc tree, /proc/asound. Many useful information are
|
||||
found in this tree. When you encounter a problem and need debugging,
|
||||
check the files listed in the following sections.
|
||||
|
||||
Each card has its subtree cardX, where X is from 0 to 7. The
|
||||
card-specific files are stored in the card* subdirectories.
|
||||
|
||||
|
||||
Global Information
|
||||
------------------
|
||||
|
||||
cards
|
||||
Shows the list of currently configured ALSA drivers,
|
||||
index, the id string, short and long descriptions.
|
||||
|
||||
version
|
||||
Shows the version string and compile date.
|
||||
|
||||
modules
|
||||
Lists the module of each card
|
||||
|
||||
devices
|
||||
Lists the ALSA native device mappings.
|
||||
|
||||
meminfo
|
||||
Shows the status of allocated pages via ALSA drivers.
|
||||
Appears only when CONFIG_SND_DEBUG=y.
|
||||
|
||||
hwdep
|
||||
Lists the currently available hwdep devices in format of
|
||||
<card>-<device>: <name>
|
||||
|
||||
pcm
|
||||
Lists the currently available PCM devices in format of
|
||||
<card>-<device>: <id>: <name> : <sub-streams>
|
||||
|
||||
timer
|
||||
Lists the currently available timer devices
|
||||
|
||||
|
||||
oss/devices
|
||||
Lists the OSS device mappings.
|
||||
|
||||
oss/sndstat
|
||||
Provides the output compatible with /dev/sndstat.
|
||||
You can symlink this to /dev/sndstat.
|
||||
|
||||
|
||||
Card Specific Files
|
||||
-------------------
|
||||
|
||||
The card-specific files are found in /proc/asound/card* directories.
|
||||
Some drivers (e.g. cmipci) have their own proc entries for the
|
||||
register dump, etc (e.g. /proc/asound/card*/cmipci shows the register
|
||||
dump). These files would be really helpful for debugging.
|
||||
|
||||
When PCM devices are available on this card, you can see directories
|
||||
like pcm0p or pcm1c. They hold the PCM information for each PCM
|
||||
stream. The number after 'pcm' is the PCM device number from 0, and
|
||||
the last 'p' or 'c' means playback or capture direction. The files in
|
||||
this subtree is described later.
|
||||
|
||||
The status of MIDI I/O is found in midi* files. It shows the device
|
||||
name and the received/transmitted bytes through the MIDI device.
|
||||
|
||||
When the card is equipped with AC97 codecs, there are codec97#*
|
||||
subdirectories (described later).
|
||||
|
||||
When the OSS mixer emulation is enabled (and the module is loaded),
|
||||
oss_mixer file appears here, too. This shows the current mapping of
|
||||
OSS mixer elements to the ALSA control elements. You can change the
|
||||
mapping by writing to this device. Read OSS-Emulation.txt for
|
||||
details.
|
||||
|
||||
|
||||
PCM Proc Files
|
||||
--------------
|
||||
|
||||
card*/pcm*/info
|
||||
The general information of this PCM device: card #, device #,
|
||||
substreams, etc.
|
||||
|
||||
card*/pcm*/xrun_debug
|
||||
This file appears when CONFIG_SND_DEBUG=y and
|
||||
CONFIG_PCM_XRUN_DEBUG=y.
|
||||
This shows the status of xrun (= buffer overrun/xrun) and
|
||||
invalid PCM position debug/check of ALSA PCM middle layer.
|
||||
It takes an integer value, can be changed by writing to this
|
||||
file, such as
|
||||
|
||||
# echo 5 > /proc/asound/card0/pcm0p/xrun_debug
|
||||
|
||||
The value consists of the following bit flags:
|
||||
bit 0 = Enable XRUN/jiffies debug messages
|
||||
bit 1 = Show stack trace at XRUN / jiffies check
|
||||
bit 2 = Enable additional jiffies check
|
||||
bit 3 = Log hwptr update at each period interrupt
|
||||
bit 4 = Log hwptr update at each snd_pcm_update_hw_ptr()
|
||||
bit 5 = Show last 10 positions on error
|
||||
bit 6 = Do above only once
|
||||
|
||||
When the bit 0 is set, the driver will show the messages to
|
||||
kernel log when an xrun is detected. The debug message is
|
||||
shown also when the invalid H/W pointer is detected at the
|
||||
update of periods (usually called from the interrupt
|
||||
handler).
|
||||
|
||||
When the bit 1 is set, the driver will show the stack trace
|
||||
additionally. This may help the debugging.
|
||||
|
||||
Since 2.6.30, this option can enable the hwptr check using
|
||||
jiffies. This detects spontaneous invalid pointer callback
|
||||
values, but can be lead to too much corrections for a (mostly
|
||||
buggy) hardware that doesn't give smooth pointer updates.
|
||||
This feature is enabled via the bit 2.
|
||||
|
||||
Bits 3 and 4 are for logging the hwptr records. Note that
|
||||
these will give flood of kernel messages.
|
||||
|
||||
When bit 5 is set, the driver logs the last 10 xrun errors and
|
||||
the proc file shows each jiffies, position, period_size,
|
||||
buffer_size, old_hw_ptr, and hw_ptr_base values.
|
||||
|
||||
When bit 6 is set, the full xrun log is shown only once.
|
||||
|
||||
card*/pcm*/sub*/info
|
||||
The general information of this PCM sub-stream.
|
||||
|
||||
card*/pcm*/sub*/status
|
||||
The current status of this PCM sub-stream, elapsed time,
|
||||
H/W position, etc.
|
||||
|
||||
card*/pcm*/sub*/hw_params
|
||||
The hardware parameters set for this sub-stream.
|
||||
|
||||
card*/pcm*/sub*/sw_params
|
||||
The soft parameters set for this sub-stream.
|
||||
|
||||
card*/pcm*/sub*/prealloc
|
||||
The buffer pre-allocation information.
|
||||
|
||||
|
||||
AC97 Codec Information
|
||||
----------------------
|
||||
|
||||
card*/codec97#*/ac97#?-?
|
||||
Shows the general information of this AC97 codec chip, such as
|
||||
name, capabilities, set up.
|
||||
|
||||
card*/codec97#0/ac97#?-?+regs
|
||||
Shows the AC97 register dump. Useful for debugging.
|
||||
|
||||
When CONFIG_SND_DEBUG is enabled, you can write to this file for
|
||||
changing an AC97 register directly. Pass two hex numbers.
|
||||
For example,
|
||||
|
||||
# echo 02 9f1f > /proc/asound/card0/codec97#0/ac97#0-0+regs
|
||||
|
||||
|
||||
USB Audio Streams
|
||||
-----------------
|
||||
|
||||
card*/stream*
|
||||
Shows the assignment and the current status of each audio stream
|
||||
of the given card. This information is very useful for debugging.
|
||||
|
||||
|
||||
HD-Audio Codecs
|
||||
---------------
|
||||
|
||||
card*/codec#*
|
||||
Shows the general codec information and the attribute of each
|
||||
widget node.
|
||||
|
||||
card*/eld#*
|
||||
Available for HDMI or DisplayPort interfaces.
|
||||
Shows ELD(EDID Like Data) info retrieved from the attached HDMI sink,
|
||||
and describes its audio capabilities and configurations.
|
||||
|
||||
Some ELD fields may be modified by doing `echo name hex_value > eld#*`.
|
||||
Only do this if you are sure the HDMI sink provided value is wrong.
|
||||
And if that makes your HDMI audio work, please report to us so that we
|
||||
can fix it in future kernel releases.
|
||||
|
||||
|
||||
Sequencer Information
|
||||
---------------------
|
||||
|
||||
seq/drivers
|
||||
Lists the currently available ALSA sequencer drivers.
|
||||
|
||||
seq/clients
|
||||
Shows the list of currently available sequencer clients and
|
||||
ports. The connection status and the running status are shown
|
||||
in this file, too.
|
||||
|
||||
seq/queues
|
||||
Lists the currently allocated/running sequencer queues.
|
||||
|
||||
seq/timer
|
||||
Lists the currently allocated/running sequencer timers.
|
||||
|
||||
seq/oss
|
||||
Lists the OSS-compatible sequencer stuffs.
|
||||
|
||||
|
||||
Help For Debugging?
|
||||
-------------------
|
||||
|
||||
When the problem is related with PCM, first try to turn on xrun_debug
|
||||
mode. This will give you the kernel messages when and where xrun
|
||||
happened.
|
||||
|
||||
If it's really a bug, report it with the following information:
|
||||
|
||||
- the name of the driver/card, show in /proc/asound/cards
|
||||
- the register dump, if available (e.g. card*/cmipci)
|
||||
|
||||
when it's a PCM problem,
|
||||
|
||||
- set-up of PCM, shown in hw_parms, sw_params, and status in the PCM
|
||||
sub-stream directory
|
||||
|
||||
when it's a mixer problem,
|
||||
|
||||
- AC97 proc files, codec97#*/* files
|
||||
|
||||
for USB audio/midi,
|
||||
|
||||
- output of lsusb -v
|
||||
- stream* files in card directory
|
||||
|
||||
|
||||
The ALSA bug-tracking system is found at:
|
||||
|
||||
https://bugtrack.alsa-project.org/alsa-bug/
|
163
Documentation/sound/alsa/README.maya44
Normal file
163
Documentation/sound/alsa/README.maya44
Normal file
|
@ -0,0 +1,163 @@
|
|||
NOTE: The following is the original document of Rainer's patch that the
|
||||
current maya44 code based on. Some contents might be obsoleted, but I
|
||||
keep here as reference -- tiwai
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
STATE OF DEVELOPMENT:
|
||||
|
||||
This driver is being developed on the initiative of Piotr Makowski (oponek@gmail.com) and financed by Lars Bergmann.
|
||||
Development is carried out by Rainer Zimmermann (mail@lightshed.de).
|
||||
|
||||
ESI provided a sample Maya44 card for the development work.
|
||||
|
||||
However, unfortunately it has turned out difficult to get detailed programming information, so I (Rainer Zimmermann) had to find out some card-specific information by experiment and conjecture. Some information (in particular, several GPIO bits) is still missing.
|
||||
|
||||
This is the first testing version of the Maya44 driver released to the alsa-devel mailing list (Feb 5, 2008).
|
||||
|
||||
|
||||
The following functions work, as tested by Rainer Zimmermann and Piotr Makowski:
|
||||
|
||||
- playback and capture at all sampling rates
|
||||
- input/output level
|
||||
- crossmixing
|
||||
- line/mic switch
|
||||
- phantom power switch
|
||||
- analogue monitor a.k.a bypass
|
||||
|
||||
|
||||
The following functions *should* work, but are not fully tested:
|
||||
|
||||
- Channel 3+4 analogue - S/PDIF input switching
|
||||
- S/PDIF output
|
||||
- all inputs/outputs on the M/IO/DIO extension card
|
||||
- internal/external clock selection
|
||||
|
||||
|
||||
*In particular, we would appreciate testing of these functions by anyone who has access to an M/IO/DIO extension card.*
|
||||
|
||||
|
||||
Things that do not seem to work:
|
||||
|
||||
- The level meters ("multi track") in 'alsamixer' do not seem to react to signals in (if this is a bug, it would probably be in the existing ICE1724 code).
|
||||
|
||||
- Ardour 2.1 seems to work only via JACK, not using ALSA directly or via OSS. This still needs to be tracked down.
|
||||
|
||||
|
||||
DRIVER DETAILS:
|
||||
|
||||
the following files were added:
|
||||
|
||||
pci/ice1724/maya44.c - Maya44 specific code
|
||||
pci/ice1724/maya44.h
|
||||
pci/ice1724/ice1724.patch
|
||||
pci/ice1724/ice1724.h.patch - PROPOSED patch to ice1724.h (see SAMPLING RATES)
|
||||
i2c/other/wm8776.c - low-level access routines for Wolfson WM8776 codecs
|
||||
include/wm8776.h
|
||||
|
||||
|
||||
Note that the wm8776.c code is meant to be card-independent and does not actually register the codec with the ALSA infrastructure.
|
||||
This is done in maya44.c, mainly because some of the WM8776 controls are used in Maya44-specific ways, and should be named appropriately.
|
||||
|
||||
|
||||
the following files were created in pci/ice1724, simply #including the corresponding file from the alsa-kernel tree:
|
||||
|
||||
wtm.h
|
||||
vt1720_mobo.h
|
||||
revo.h
|
||||
prodigy192.h
|
||||
pontis.h
|
||||
phase.h
|
||||
maya44.h
|
||||
juli.h
|
||||
aureon.h
|
||||
amp.h
|
||||
envy24ht.h
|
||||
se.h
|
||||
prodigy_hifi.h
|
||||
|
||||
|
||||
*I hope this is the correct way to do things.*
|
||||
|
||||
|
||||
SAMPLING RATES:
|
||||
|
||||
The Maya44 card (or more exactly, the Wolfson WM8776 codecs) allow a maximum sampling rate of 192 kHz for playback and 92 kHz for capture.
|
||||
|
||||
As the ICE1724 chip only allows one global sampling rate, this is handled as follows:
|
||||
|
||||
* setting the sampling rate on any open PCM device on the maya44 card will always set the *global* sampling rate for all playback and capture channels.
|
||||
|
||||
* In the current state of the driver, setting rates of up to 192 kHz is permitted even for capture devices.
|
||||
|
||||
*AVOID CAPTURING AT RATES ABOVE 96kHz*, even though it may appear to work. The codec cannot actually capture at such rates, meaning poor quality.
|
||||
|
||||
|
||||
I propose some additional code for limiting the sampling rate when setting on a capture pcm device. However because of the global sampling rate, this logic would be somewhat problematic.
|
||||
|
||||
The proposed code (currently deactivated) is in ice1712.h.patch, ice1724.c and maya44.c (in pci/ice1712).
|
||||
|
||||
|
||||
SOUND DEVICES:
|
||||
|
||||
PCM devices correspond to inputs/outputs as follows (assuming Maya44 is card #0):
|
||||
|
||||
hw:0,0 input - stereo, analog input 1+2
|
||||
hw:0,0 output - stereo, analog output 1+2
|
||||
hw:0,1 input - stereo, analog input 3+4 OR S/PDIF input
|
||||
hw:0,1 output - stereo, analog output 3+4 (and SPDIF out)
|
||||
|
||||
|
||||
NAMING OF MIXER CONTROLS:
|
||||
|
||||
(for more information about the signal flow, please refer to the block diagram on p.24 of the ESI Maya44 manual, or in the ESI windows software).
|
||||
|
||||
|
||||
PCM: (digital) output level for channel 1+2
|
||||
PCM 1: same for channel 3+4
|
||||
|
||||
Mic Phantom+48V: switch for +48V phantom power for electrostatic microphones on input 1/2.
|
||||
Make sure this is not turned on while any other source is connected to input 1/2.
|
||||
It might damage the source and/or the maya44 card.
|
||||
|
||||
Mic/Line input: if switch is on, input jack 1/2 is microphone input (mono), otherwise line input (stereo).
|
||||
|
||||
Bypass: analogue bypass from ADC input to output for channel 1+2. Same as "Monitor" in the windows driver.
|
||||
Bypass 1: same for channel 3+4.
|
||||
|
||||
Crossmix: cross-mixer from channels 1+2 to channels 3+4
|
||||
Crossmix 1: cross-mixer from channels 3+4 to channels 1+2
|
||||
|
||||
IEC958 Output: switch for S/PDIF output.
|
||||
This is not supported by the ESI windows driver.
|
||||
S/PDIF should output the same signal as channel 3+4. [untested!]
|
||||
|
||||
|
||||
Digitial output selectors:
|
||||
|
||||
These switches allow a direct digital routing from the ADCs to the DACs.
|
||||
Each switch determines where the digital input data to one of the DACs comes from.
|
||||
They are not supported by the ESI windows driver.
|
||||
For normal operation, they should all be set to "PCM out".
|
||||
|
||||
H/W: Output source channel 1
|
||||
H/W 1: Output source channel 2
|
||||
H/W 2: Output source channel 3
|
||||
H/W 3: Output source channel 4
|
||||
|
||||
H/W 4 ... H/W 9: unknown function, left in to enable testing.
|
||||
Possibly some of these control S/PDIF output(s).
|
||||
If these turn out to be unused, they will go away in later driver versions.
|
||||
|
||||
Selectable values for each of the digital output selectors are:
|
||||
"PCM out" -> DAC output of the corresponding channel (default setting)
|
||||
"Input 1"...
|
||||
"Input 4" -> direct routing from ADC output of the selected input channel
|
||||
|
||||
|
||||
--------
|
||||
|
||||
Feb 14, 2008
|
||||
Rainer Zimmermann
|
||||
mail@lightshed.de
|
||||
|
356
Documentation/sound/alsa/SB-Live-mixer.txt
Normal file
356
Documentation/sound/alsa/SB-Live-mixer.txt
Normal file
|
@ -0,0 +1,356 @@
|
|||
|
||||
Sound Blaster Live mixer / default DSP code
|
||||
===========================================
|
||||
|
||||
|
||||
The EMU10K1 chips have a DSP part which can be programmed to support
|
||||
various ways of sample processing, which is described here.
|
||||
(This article does not deal with the overall functionality of the
|
||||
EMU10K1 chips. See the manuals section for further details.)
|
||||
|
||||
The ALSA driver programs this portion of chip by default code
|
||||
(can be altered later) which offers the following functionality:
|
||||
|
||||
|
||||
1) IEC958 (S/PDIF) raw PCM
|
||||
--------------------------
|
||||
|
||||
This PCM device (it's the 4th PCM device (index 3!) and first subdevice
|
||||
(index 0) for a given card) allows to forward 48kHz, stereo, 16-bit
|
||||
little endian streams without any modifications to the digital output
|
||||
(coaxial or optical). The universal interface allows the creation of up
|
||||
to 8 raw PCM devices operating at 48kHz, 16-bit little endian. It would
|
||||
be easy to add support for multichannel devices to the current code,
|
||||
but the conversion routines exist only for stereo (2-channel streams)
|
||||
at the time.
|
||||
|
||||
Look to tram_poke routines in lowlevel/emu10k1/emufx.c for more details.
|
||||
|
||||
|
||||
2) Digital mixer controls
|
||||
-------------------------
|
||||
|
||||
These controls are built using the DSP instructions. They offer extended
|
||||
functionality. Only the default build-in code in the ALSA driver is described
|
||||
here. Note that the controls work as attenuators: the maximum value is the
|
||||
neutral position leaving the signal unchanged. Note that if the same destination
|
||||
is mentioned in multiple controls, the signal is accumulated and can be wrapped
|
||||
(set to maximal or minimal value without checking of overflow).
|
||||
|
||||
|
||||
Explanation of used abbreviations:
|
||||
|
||||
DAC - digital to analog converter
|
||||
ADC - analog to digital converter
|
||||
I2S - one-way three wire serial bus for digital sound by Philips Semiconductors
|
||||
(this standard is used for connecting standalone DAC and ADC converters)
|
||||
LFE - low frequency effects (subwoofer signal)
|
||||
AC97 - a chip containing an analog mixer, DAC and ADC converters
|
||||
IEC958 - S/PDIF
|
||||
FX-bus - the EMU10K1 chip has an effect bus containing 16 accumulators.
|
||||
Each of the synthesizer voices can feed its output to these accumulators
|
||||
and the DSP microcontroller can operate with the resulting sum.
|
||||
|
||||
|
||||
name='Wave Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples.
|
||||
The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Wave Surround Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples.
|
||||
The result samples are forwarded to the rear I2S DACs. These DACs operates
|
||||
separately (they are not inside the AC97 codec).
|
||||
|
||||
name='Wave Center Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM samples.
|
||||
The result is mixed to mono signal (single channel) and forwarded to
|
||||
the ??rear?? right DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='Wave LFE Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 0 and 1 for left and right PCM.
|
||||
The result is mixed to mono signal (single channel) and forwarded to
|
||||
the ??rear?? left DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='Wave Capture Volume',index=0
|
||||
name='Wave Capture Switch',index=0
|
||||
|
||||
These controls are used to attenuate samples for left and right PCM FX-bus
|
||||
accumulator. ALSA uses accumulators 0 and 1 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Synth Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulators. ALSA uses accumulators 4 and 5 for left and right MIDI samples.
|
||||
The result samples are forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Synth Capture Volume',index=0
|
||||
name='Synth Capture Switch',index=0
|
||||
|
||||
These controls are used to attenuate samples for left and right MIDI FX-bus
|
||||
accumulator. ALSA uses accumulators 4 and 5 for left and right PCM.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Surround Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right rear PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 2 and 3 for left and right rear PCM samples.
|
||||
The result samples are forwarded to the rear I2S DACs. These DACs operate
|
||||
separately (they are not inside the AC97 codec).
|
||||
|
||||
name='Surround Capture Volume',index=0
|
||||
name='Surround Capture Switch',index=0
|
||||
|
||||
These controls are used to attenuate samples for left and right rear PCM FX-bus
|
||||
accumulators. ALSA uses accumulators 2 and 3 for left and right rear PCM samples.
|
||||
The result is forwarded to the ADC capture FIFO (thus to the standard capture
|
||||
PCM device).
|
||||
|
||||
name='Center Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate sample for center PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 6 for center PCM sample. The result sample is forwarded
|
||||
to the ??rear?? right DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='LFE Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate sample for center PCM FX-bus accumulator.
|
||||
ALSA uses accumulator 6 for center PCM sample. The result sample is forwarded
|
||||
to the ??rear?? left DAC PCM slot of the AC97 codec.
|
||||
|
||||
name='AC97 Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right front ADC PCM slots
|
||||
of the AC97 codec. The result samples are forwarded to the front DAC PCM
|
||||
slots of the AC97 codec.
|
||||
********************************************************************************
|
||||
*** Note: This control should be zero for the standard operations, otherwise ***
|
||||
*** a digital loopback is activated. ***
|
||||
********************************************************************************
|
||||
|
||||
name='AC97 Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples for left and right front ADC PCM slots
|
||||
of the AC97 codec. The result is forwarded to the ADC capture FIFO (thus to
|
||||
the standard capture PCM device).
|
||||
********************************************************************************
|
||||
*** Note: This control should be 100 (maximal value), otherwise no analog ***
|
||||
*** inputs of the AC97 codec can be captured (recorded). ***
|
||||
********************************************************************************
|
||||
|
||||
name='IEC958 TTL Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='IEC958 TTL Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 TTL
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Zoom Video Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right zoom video
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the front DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Zoom Video Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right zoom video
|
||||
digital inputs (usually used by a CDROM drive). The result samples are
|
||||
forwarded to the ADC capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='IEC958 LiveDrive Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital input. The result samples are forwarded to the front DAC PCM slots
|
||||
of the AC97 codec.
|
||||
|
||||
name='IEC958 LiveDrive Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 optical
|
||||
digital inputs. The result samples are forwarded to the ADC capture FIFO
|
||||
(thus to the standard capture PCM device).
|
||||
|
||||
name='IEC958 Coaxial Playback Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 coaxial
|
||||
digital inputs. The result samples are forwarded to the front DAC PCM slots
|
||||
of the AC97 codec.
|
||||
|
||||
name='IEC958 Coaxial Capture Volume',index=0
|
||||
|
||||
This control is used to attenuate samples from left and right IEC958 coaxial
|
||||
digital inputs. The result samples are forwarded to the ADC capture FIFO
|
||||
(thus to the standard capture PCM device).
|
||||
|
||||
name='Line LiveDrive Playback Volume',index=0
|
||||
name='Line LiveDrive Playback Volume',index=1
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the LiveDrive). The result samples are forwarded to the front
|
||||
DAC PCM slots of the AC97 codec.
|
||||
|
||||
name='Line LiveDrive Capture Volume',index=1
|
||||
name='Line LiveDrive Capture Volume',index=1
|
||||
|
||||
This control is used to attenuate samples from left and right I2S ADC
|
||||
inputs (on the LiveDrive). The result samples are forwarded to the ADC
|
||||
capture FIFO (thus to the standard capture PCM device).
|
||||
|
||||
name='Tone Control - Switch',index=0
|
||||
|
||||
This control turns the tone control on or off. The samples for front, rear
|
||||
and center / LFE outputs are affected.
|
||||
|
||||
name='Tone Control - Bass',index=0
|
||||
|
||||
This control sets the bass intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='Tone Control - Treble',index=0
|
||||
|
||||
This control sets the treble intensity. There is no neutral value!!
|
||||
When the tone control code is activated, the samples are always modified.
|
||||
The closest value to pure signal is 20.
|
||||
|
||||
name='IEC958 Optical Raw Playback Switch',index=0
|
||||
|
||||
If this switch is on, then the samples for the IEC958 (S/PDIF) digital
|
||||
output are taken only from the raw FX8010 PCM, otherwise standard front
|
||||
PCM samples are taken.
|
||||
|
||||
name='Headphone Playback Volume',index=1
|
||||
|
||||
This control attenuates the samples for the headphone output.
|
||||
|
||||
name='Headphone Center Playback Switch',index=1
|
||||
|
||||
If this switch is on, then the sample for the center PCM is put to the
|
||||
left headphone output (useful for SB Live cards without separate center/LFE
|
||||
output).
|
||||
|
||||
name='Headphone LFE Playback Switch',index=1
|
||||
|
||||
If this switch is on, then the sample for the center PCM is put to the
|
||||
right headphone output (useful for SB Live cards without separate center/LFE
|
||||
output).
|
||||
|
||||
|
||||
3) PCM stream related controls
|
||||
------------------------------
|
||||
|
||||
name='EMU10K1 PCM Volume',index 0-31
|
||||
|
||||
Channel volume attenuation in range 0-0xffff. The maximum value (no
|
||||
attenuation) is default. The channel mapping for three values is
|
||||
as follows:
|
||||
|
||||
0 - mono, default 0xffff (no attenuation)
|
||||
1 - left, default 0xffff (no attenuation)
|
||||
2 - right, default 0xffff (no attenuation)
|
||||
|
||||
name='EMU10K1 PCM Send Routing',index 0-31
|
||||
|
||||
This control specifies the destination - FX-bus accumulators. There are
|
||||
twelve values with this mapping:
|
||||
|
||||
0 - mono, A destination (FX-bus 0-15), default 0
|
||||
1 - mono, B destination (FX-bus 0-15), default 1
|
||||
2 - mono, C destination (FX-bus 0-15), default 2
|
||||
3 - mono, D destination (FX-bus 0-15), default 3
|
||||
4 - left, A destination (FX-bus 0-15), default 0
|
||||
5 - left, B destination (FX-bus 0-15), default 1
|
||||
6 - left, C destination (FX-bus 0-15), default 2
|
||||
7 - left, D destination (FX-bus 0-15), default 3
|
||||
8 - right, A destination (FX-bus 0-15), default 0
|
||||
9 - right, B destination (FX-bus 0-15), default 1
|
||||
10 - right, C destination (FX-bus 0-15), default 2
|
||||
11 - right, D destination (FX-bus 0-15), default 3
|
||||
|
||||
Don't forget that it's illegal to assign a channel to the same FX-bus accumulator
|
||||
more than once (it means 0=0 && 1=0 is an invalid combination).
|
||||
|
||||
name='EMU10K1 PCM Send Volume',index 0-31
|
||||
|
||||
It specifies the attenuation (amount) for given destination in range 0-255.
|
||||
The channel mapping is following:
|
||||
|
||||
0 - mono, A destination attn, default 255 (no attenuation)
|
||||
1 - mono, B destination attn, default 255 (no attenuation)
|
||||
2 - mono, C destination attn, default 0 (mute)
|
||||
3 - mono, D destination attn, default 0 (mute)
|
||||
4 - left, A destination attn, default 255 (no attenuation)
|
||||
5 - left, B destination attn, default 0 (mute)
|
||||
6 - left, C destination attn, default 0 (mute)
|
||||
7 - left, D destination attn, default 0 (mute)
|
||||
8 - right, A destination attn, default 0 (mute)
|
||||
9 - right, B destination attn, default 255 (no attenuation)
|
||||
10 - right, C destination attn, default 0 (mute)
|
||||
11 - right, D destination attn, default 0 (mute)
|
||||
|
||||
|
||||
|
||||
4) MANUALS/PATENTS:
|
||||
-------------------
|
||||
|
||||
ftp://opensource.creative.com/pub/doc
|
||||
-------------------------------------
|
||||
|
||||
Files:
|
||||
LM4545.pdf AC97 Codec
|
||||
|
||||
m2049.pdf The EMU10K1 Digital Audio Processor
|
||||
|
||||
hog63.ps FX8010 - A DSP Chip Architecture for Audio Effects
|
||||
|
||||
|
||||
WIPO Patents
|
||||
------------
|
||||
Patent numbers:
|
||||
WO 9901813 (A1) Audio Effects Processor with multiple asynchronous (Jan. 14, 1999)
|
||||
streams
|
||||
|
||||
WO 9901814 (A1) Processor with Instruction Set for Audio Effects (Jan. 14, 1999)
|
||||
|
||||
WO 9901953 (A1) Audio Effects Processor having Decoupled Instruction
|
||||
Execution and Audio Data Sequencing (Jan. 14, 1999)
|
||||
|
||||
|
||||
US Patents (http://www.uspto.gov/)
|
||||
----------------------------------
|
||||
|
||||
US 5925841 Digital Sampling Instrument employing cache memory (Jul. 20, 1999)
|
||||
|
||||
US 5928342 Audio Effects Processor integrated on a single chip (Jul. 27, 1999)
|
||||
with a multiport memory onto which multiple asynchronous
|
||||
digital sound samples can be concurrently loaded
|
||||
|
||||
US 5930158 Processor with Instruction Set for Audio Effects (Jul. 27, 1999)
|
||||
|
||||
US 6032235 Memory initialization circuit (Tram) (Feb. 29, 2000)
|
||||
|
||||
US 6138207 Interpolation looping of audio samples in cache connected to (Oct. 24, 2000)
|
||||
system bus with prioritization and modification of bus transfers
|
||||
in accordance with loop ends and minimum block sizes
|
||||
|
||||
US 6151670 Method for conserving memory storage using a (Nov. 21, 2000)
|
||||
pool of short term memory registers
|
||||
|
||||
US 6195715 Interrupt control for multiple programs communicating with (Feb. 27, 2001)
|
||||
a common interrupt by associating programs to GP registers,
|
||||
defining interrupt register, polling GP registers, and invoking
|
||||
callback routine associated with defined interrupt register
|
8
Documentation/sound/alsa/VIA82xx-mixer.txt
Normal file
8
Documentation/sound/alsa/VIA82xx-mixer.txt
Normal file
|
@ -0,0 +1,8 @@
|
|||
|
||||
VIA82xx mixer
|
||||
=============
|
||||
|
||||
On many VIA82xx boards, the 'Input Source Select' mixer control does not work.
|
||||
Setting it to 'Input2' on such boards will cause recording to hang, or fail
|
||||
with EIO (input/output error) via OSS emulation. This control should be left
|
||||
at 'Input1' for such cards.
|
135
Documentation/sound/alsa/alsa-parameters.txt
Normal file
135
Documentation/sound/alsa/alsa-parameters.txt
Normal file
|
@ -0,0 +1,135 @@
|
|||
ALSA Kernel Parameters
|
||||
~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
See Documentation/kernel-parameters.txt for general information on
|
||||
specifying module parameters.
|
||||
|
||||
This document may not be entirely up to date and comprehensive. The command
|
||||
"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
|
||||
module. Loadable modules, after being loaded into the running kernel, also
|
||||
reveal their parameters in /sys/module/${modulename}/parameters/. Some of these
|
||||
parameters may be changed at runtime by the command
|
||||
"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}".
|
||||
|
||||
|
||||
snd-ad1816a= [HW,ALSA]
|
||||
|
||||
snd-ad1848= [HW,ALSA]
|
||||
|
||||
snd-ali5451= [HW,ALSA]
|
||||
|
||||
snd-als100= [HW,ALSA]
|
||||
|
||||
snd-als4000= [HW,ALSA]
|
||||
|
||||
snd-azt2320= [HW,ALSA]
|
||||
|
||||
snd-cmi8330= [HW,ALSA]
|
||||
|
||||
snd-cmipci= [HW,ALSA]
|
||||
|
||||
snd-cs4231= [HW,ALSA]
|
||||
|
||||
snd-cs4232= [HW,ALSA]
|
||||
|
||||
snd-cs4236= [HW,ALSA]
|
||||
|
||||
snd-cs4281= [HW,ALSA]
|
||||
|
||||
snd-cs46xx= [HW,ALSA]
|
||||
|
||||
snd-dt019x= [HW,ALSA]
|
||||
|
||||
snd-dummy= [HW,ALSA]
|
||||
|
||||
snd-emu10k1= [HW,ALSA]
|
||||
|
||||
snd-ens1370= [HW,ALSA]
|
||||
|
||||
snd-ens1371= [HW,ALSA]
|
||||
|
||||
snd-es968= [HW,ALSA]
|
||||
|
||||
snd-es1688= [HW,ALSA]
|
||||
|
||||
snd-es18xx= [HW,ALSA]
|
||||
|
||||
snd-es1938= [HW,ALSA]
|
||||
|
||||
snd-es1968= [HW,ALSA]
|
||||
|
||||
snd-fm801= [HW,ALSA]
|
||||
|
||||
snd-gusclassic= [HW,ALSA]
|
||||
|
||||
snd-gusextreme= [HW,ALSA]
|
||||
|
||||
snd-gusmax= [HW,ALSA]
|
||||
|
||||
snd-hdsp= [HW,ALSA]
|
||||
|
||||
snd-ice1712= [HW,ALSA]
|
||||
|
||||
snd-intel8x0= [HW,ALSA]
|
||||
|
||||
snd-interwave= [HW,ALSA]
|
||||
|
||||
snd-interwave-stb=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-korg1212= [HW,ALSA]
|
||||
|
||||
snd-maestro3= [HW,ALSA]
|
||||
|
||||
snd-mpu401= [HW,ALSA]
|
||||
|
||||
snd-mtpav= [HW,ALSA]
|
||||
|
||||
snd-nm256= [HW,ALSA]
|
||||
|
||||
snd-opl3sa2= [HW,ALSA]
|
||||
|
||||
snd-opti92x-ad1848=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-opti92x-cs4231=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-opti93x= [HW,ALSA]
|
||||
|
||||
snd-pmac= [HW,ALSA]
|
||||
|
||||
snd-rme32= [HW,ALSA]
|
||||
|
||||
snd-rme96= [HW,ALSA]
|
||||
|
||||
snd-rme9652= [HW,ALSA]
|
||||
|
||||
snd-sb8= [HW,ALSA]
|
||||
|
||||
snd-sb16= [HW,ALSA]
|
||||
|
||||
snd-sbawe= [HW,ALSA]
|
||||
|
||||
snd-serial= [HW,ALSA]
|
||||
|
||||
snd-sgalaxy= [HW,ALSA]
|
||||
|
||||
snd-sonicvibes= [HW,ALSA]
|
||||
|
||||
snd-sun-amd7930=
|
||||
[HW,ALSA]
|
||||
|
||||
snd-sun-cs4231= [HW,ALSA]
|
||||
|
||||
snd-trident= [HW,ALSA]
|
||||
|
||||
snd-usb-audio= [HW,ALSA,USB]
|
||||
|
||||
snd-via82xx= [HW,ALSA]
|
||||
|
||||
snd-virmidi= [HW,ALSA]
|
||||
|
||||
snd-wavefront= [HW,ALSA]
|
||||
|
||||
snd-ymfpci= [HW,ALSA]
|
234
Documentation/sound/alsa/compress_offload.txt
Normal file
234
Documentation/sound/alsa/compress_offload.txt
Normal file
|
@ -0,0 +1,234 @@
|
|||
compress_offload.txt
|
||||
=====================
|
||||
Pierre-Louis.Bossart <pierre-louis.bossart@linux.intel.com>
|
||||
Vinod Koul <vinod.koul@linux.intel.com>
|
||||
|
||||
Overview
|
||||
|
||||
Since its early days, the ALSA API was defined with PCM support or
|
||||
constant bitrates payloads such as IEC61937 in mind. Arguments and
|
||||
returned values in frames are the norm, making it a challenge to
|
||||
extend the existing API to compressed data streams.
|
||||
|
||||
In recent years, audio digital signal processors (DSP) were integrated
|
||||
in system-on-chip designs, and DSPs are also integrated in audio
|
||||
codecs. Processing compressed data on such DSPs results in a dramatic
|
||||
reduction of power consumption compared to host-based
|
||||
processing. Support for such hardware has not been very good in Linux,
|
||||
mostly because of a lack of a generic API available in the mainline
|
||||
kernel.
|
||||
|
||||
Rather than requiring a compatibility break with an API change of the
|
||||
ALSA PCM interface, a new 'Compressed Data' API is introduced to
|
||||
provide a control and data-streaming interface for audio DSPs.
|
||||
|
||||
The design of this API was inspired by the 2-year experience with the
|
||||
Intel Moorestown SOC, with many corrections required to upstream the
|
||||
API in the mainline kernel instead of the staging tree and make it
|
||||
usable by others.
|
||||
|
||||
Requirements
|
||||
|
||||
The main requirements are:
|
||||
|
||||
- separation between byte counts and time. Compressed formats may have
|
||||
a header per file, per frame, or no header at all. The payload size
|
||||
may vary from frame-to-frame. As a result, it is not possible to
|
||||
estimate reliably the duration of audio buffers when handling
|
||||
compressed data. Dedicated mechanisms are required to allow for
|
||||
reliable audio-video synchronization, which requires precise
|
||||
reporting of the number of samples rendered at any given time.
|
||||
|
||||
- Handling of multiple formats. PCM data only requires a specification
|
||||
of the sampling rate, number of channels and bits per sample. In
|
||||
contrast, compressed data comes in a variety of formats. Audio DSPs
|
||||
may also provide support for a limited number of audio encoders and
|
||||
decoders embedded in firmware, or may support more choices through
|
||||
dynamic download of libraries.
|
||||
|
||||
- Focus on main formats. This API provides support for the most
|
||||
popular formats used for audio and video capture and playback. It is
|
||||
likely that as audio compression technology advances, new formats
|
||||
will be added.
|
||||
|
||||
- Handling of multiple configurations. Even for a given format like
|
||||
AAC, some implementations may support AAC multichannel but HE-AAC
|
||||
stereo. Likewise WMA10 level M3 may require too much memory and cpu
|
||||
cycles. The new API needs to provide a generic way of listing these
|
||||
formats.
|
||||
|
||||
- Rendering/Grabbing only. This API does not provide any means of
|
||||
hardware acceleration, where PCM samples are provided back to
|
||||
user-space for additional processing. This API focuses instead on
|
||||
streaming compressed data to a DSP, with the assumption that the
|
||||
decoded samples are routed to a physical output or logical back-end.
|
||||
|
||||
- Complexity hiding. Existing user-space multimedia frameworks all
|
||||
have existing enums/structures for each compressed format. This new
|
||||
API assumes the existence of a platform-specific compatibility layer
|
||||
to expose, translate and make use of the capabilities of the audio
|
||||
DSP, eg. Android HAL or PulseAudio sinks. By construction, regular
|
||||
applications are not supposed to make use of this API.
|
||||
|
||||
|
||||
Design
|
||||
|
||||
The new API shares a number of concepts with the PCM API for flow
|
||||
control. Start, pause, resume, drain and stop commands have the same
|
||||
semantics no matter what the content is.
|
||||
|
||||
The concept of memory ring buffer divided in a set of fragments is
|
||||
borrowed from the ALSA PCM API. However, only sizes in bytes can be
|
||||
specified.
|
||||
|
||||
Seeks/trick modes are assumed to be handled by the host.
|
||||
|
||||
The notion of rewinds/forwards is not supported. Data committed to the
|
||||
ring buffer cannot be invalidated, except when dropping all buffers.
|
||||
|
||||
The Compressed Data API does not make any assumptions on how the data
|
||||
is transmitted to the audio DSP. DMA transfers from main memory to an
|
||||
embedded audio cluster or to a SPI interface for external DSPs are
|
||||
possible. As in the ALSA PCM case, a core set of routines is exposed;
|
||||
each driver implementer will have to write support for a set of
|
||||
mandatory routines and possibly make use of optional ones.
|
||||
|
||||
The main additions are
|
||||
|
||||
- get_caps
|
||||
This routine returns the list of audio formats supported. Querying the
|
||||
codecs on a capture stream will return encoders, decoders will be
|
||||
listed for playback streams.
|
||||
|
||||
- get_codec_caps For each codec, this routine returns a list of
|
||||
capabilities. The intent is to make sure all the capabilities
|
||||
correspond to valid settings, and to minimize the risks of
|
||||
configuration failures. For example, for a complex codec such as AAC,
|
||||
the number of channels supported may depend on a specific profile. If
|
||||
the capabilities were exposed with a single descriptor, it may happen
|
||||
that a specific combination of profiles/channels/formats may not be
|
||||
supported. Likewise, embedded DSPs have limited memory and cpu cycles,
|
||||
it is likely that some implementations make the list of capabilities
|
||||
dynamic and dependent on existing workloads. In addition to codec
|
||||
settings, this routine returns the minimum buffer size handled by the
|
||||
implementation. This information can be a function of the DMA buffer
|
||||
sizes, the number of bytes required to synchronize, etc, and can be
|
||||
used by userspace to define how much needs to be written in the ring
|
||||
buffer before playback can start.
|
||||
|
||||
- set_params
|
||||
This routine sets the configuration chosen for a specific codec. The
|
||||
most important field in the parameters is the codec type; in most
|
||||
cases decoders will ignore other fields, while encoders will strictly
|
||||
comply to the settings
|
||||
|
||||
- get_params
|
||||
This routines returns the actual settings used by the DSP. Changes to
|
||||
the settings should remain the exception.
|
||||
|
||||
- get_timestamp
|
||||
The timestamp becomes a multiple field structure. It lists the number
|
||||
of bytes transferred, the number of samples processed and the number
|
||||
of samples rendered/grabbed. All these values can be used to determine
|
||||
the average bitrate, figure out if the ring buffer needs to be
|
||||
refilled or the delay due to decoding/encoding/io on the DSP.
|
||||
|
||||
Note that the list of codecs/profiles/modes was derived from the
|
||||
OpenMAX AL specification instead of reinventing the wheel.
|
||||
Modifications include:
|
||||
- Addition of FLAC and IEC formats
|
||||
- Merge of encoder/decoder capabilities
|
||||
- Profiles/modes listed as bitmasks to make descriptors more compact
|
||||
- Addition of set_params for decoders (missing in OpenMAX AL)
|
||||
- Addition of AMR/AMR-WB encoding modes (missing in OpenMAX AL)
|
||||
- Addition of format information for WMA
|
||||
- Addition of encoding options when required (derived from OpenMAX IL)
|
||||
- Addition of rateControlSupported (missing in OpenMAX AL)
|
||||
|
||||
Gapless Playback
|
||||
================
|
||||
When playing thru an album, the decoders have the ability to skip the encoder
|
||||
delay and padding and directly move from one track content to another. The end
|
||||
user can perceive this as gapless playback as we dont have silence while
|
||||
switching from one track to another
|
||||
|
||||
Also, there might be low-intensity noises due to encoding. Perfect gapless is
|
||||
difficult to reach with all types of compressed data, but works fine with most
|
||||
music content. The decoder needs to know the encoder delay and encoder padding.
|
||||
So we need to pass this to DSP. This metadata is extracted from ID3/MP4 headers
|
||||
and are not present by default in the bitstream, hence the need for a new
|
||||
interface to pass this information to the DSP. Also DSP and userspace needs to
|
||||
switch from one track to another and start using data for second track.
|
||||
|
||||
The main additions are:
|
||||
|
||||
- set_metadata
|
||||
This routine sets the encoder delay and encoder padding. This can be used by
|
||||
decoder to strip the silence. This needs to be set before the data in the track
|
||||
is written.
|
||||
|
||||
- set_next_track
|
||||
This routine tells DSP that metadata and write operation sent after this would
|
||||
correspond to subsequent track
|
||||
|
||||
- partial drain
|
||||
This is called when end of file is reached. The userspace can inform DSP that
|
||||
EOF is reached and now DSP can start skipping padding delay. Also next write
|
||||
data would belong to next track
|
||||
|
||||
Sequence flow for gapless would be:
|
||||
- Open
|
||||
- Get caps / codec caps
|
||||
- Set params
|
||||
- Set metadata of the first track
|
||||
- Fill data of the first track
|
||||
- Trigger start
|
||||
- User-space finished sending all,
|
||||
- Indicaite next track data by sending set_next_track
|
||||
- Set metadata of the next track
|
||||
- then call partial_drain to flush most of buffer in DSP
|
||||
- Fill data of the next track
|
||||
- DSP switches to second track
|
||||
(note: order for partial_drain and write for next track can be reversed as well)
|
||||
|
||||
Not supported:
|
||||
|
||||
- Support for VoIP/circuit-switched calls is not the target of this
|
||||
API. Support for dynamic bit-rate changes would require a tight
|
||||
coupling between the DSP and the host stack, limiting power savings.
|
||||
|
||||
- Packet-loss concealment is not supported. This would require an
|
||||
additional interface to let the decoder synthesize data when frames
|
||||
are lost during transmission. This may be added in the future.
|
||||
|
||||
- Volume control/routing is not handled by this API. Devices exposing a
|
||||
compressed data interface will be considered as regular ALSA devices;
|
||||
volume changes and routing information will be provided with regular
|
||||
ALSA kcontrols.
|
||||
|
||||
- Embedded audio effects. Such effects should be enabled in the same
|
||||
manner, no matter if the input was PCM or compressed.
|
||||
|
||||
- multichannel IEC encoding. Unclear if this is required.
|
||||
|
||||
- Encoding/decoding acceleration is not supported as mentioned
|
||||
above. It is possible to route the output of a decoder to a capture
|
||||
stream, or even implement transcoding capabilities. This routing
|
||||
would be enabled with ALSA kcontrols.
|
||||
|
||||
- Audio policy/resource management. This API does not provide any
|
||||
hooks to query the utilization of the audio DSP, nor any preemption
|
||||
mechanisms.
|
||||
|
||||
- No notion of underrun/overrun. Since the bytes written are compressed
|
||||
in nature and data written/read doesn't translate directly to
|
||||
rendered output in time, this does not deal with underrun/overrun and
|
||||
maybe dealt in user-library
|
||||
|
||||
Credits:
|
||||
- Mark Brown and Liam Girdwood for discussions on the need for this API
|
||||
- Harsha Priya for her work on intel_sst compressed API
|
||||
- Rakesh Ughreja for valuable feedback
|
||||
- Sing Nallasellan, Sikkandar Madar and Prasanna Samaga for
|
||||
demonstrating and quantifying the benefits of audio offload on a
|
||||
real platform.
|
74
Documentation/sound/alsa/emu10k1-jack.txt
Normal file
74
Documentation/sound/alsa/emu10k1-jack.txt
Normal file
|
@ -0,0 +1,74 @@
|
|||
This document is a guide to using the emu10k1 based devices with JACK for low
|
||||
latency, multichannel recording functionality. All of my recent work to allow
|
||||
Linux users to use the full capabilities of their hardware has been inspired
|
||||
by the kX Project. Without their work I never would have discovered the true
|
||||
power of this hardware.
|
||||
|
||||
http://www.kxproject.com
|
||||
- Lee Revell, 2005.03.30
|
||||
|
||||
Low latency, multichannel audio with JACK and the emu10k1/emu10k2
|
||||
-----------------------------------------------------------------
|
||||
|
||||
Until recently, emu10k1 users on Linux did not have access to the same low
|
||||
latency, multichannel features offered by the "kX ASIO" feature of their
|
||||
Windows driver. As of ALSA 1.0.9 this is no more!
|
||||
|
||||
For those unfamiliar with kX ASIO, this consists of 16 capture and 16 playback
|
||||
channels. With a post 2.6.9 Linux kernel, latencies down to 64 (1.33 ms) or
|
||||
even 32 (0.66ms) frames should work well.
|
||||
|
||||
The configuration is slightly more involved than on Windows, as you have to
|
||||
select the correct device for JACK to use. Actually, for qjackctl users it's
|
||||
fairly self explanatory - select Duplex, then for capture and playback select
|
||||
the multichannel devices, set the in and out channels to 16, and the sample
|
||||
rate to 48000Hz. The command line looks like this:
|
||||
|
||||
/usr/local/bin/jackd -R -dalsa -r48000 -p64 -n2 -D -Chw:0,2 -Phw:0,3 -S
|
||||
|
||||
This will give you 16 input ports and 16 output ports.
|
||||
|
||||
The 16 output ports map onto the 16 FX buses (or the first 16 of 64, for the
|
||||
Audigy). The mapping from FX bus to physical output is described in
|
||||
SB-Live-mixer.txt (or Audigy-mixer.txt).
|
||||
|
||||
The 16 input ports are connected to the 16 physical inputs. Contrary to
|
||||
popular belief, all emu10k1 cards are multichannel cards. Which of these
|
||||
input channels have physical inputs connected to them depends on the card
|
||||
model. Trial and error is highly recommended; the pinout diagrams
|
||||
for the card have been reverse engineered by some enterprising kX users and are
|
||||
available on the internet. Meterbridge is helpful here, and the kX forums are
|
||||
packed with useful information.
|
||||
|
||||
Each input port will either correspond to a digital (SPDIF) input, an analog
|
||||
input, or nothing. The one exception is the SBLive! 5.1. On these devices,
|
||||
the second and third input ports are wired to the center/LFE output. You will
|
||||
still see 16 capture channels, but only 14 are available for recording inputs.
|
||||
|
||||
This chart, borrowed from kxfxlib/da_asio51.cpp, describes the mapping of JACK
|
||||
ports to FXBUS2 (multitrack recording input) and EXTOUT (physical output)
|
||||
channels.
|
||||
|
||||
/*JACK (& ASIO) mappings on 10k1 5.1 SBLive cards:
|
||||
--------------------------------------------
|
||||
JACK Epilog FXBUS2(nr)
|
||||
--------------------------------------------
|
||||
capture_1 asio14 FXBUS2(0xe)
|
||||
capture_2 asio15 FXBUS2(0xf)
|
||||
capture_3 asio0 FXBUS2(0x0)
|
||||
~capture_4 Center EXTOUT(0x11) // mapped to by Center
|
||||
~capture_5 LFE EXTOUT(0x12) // mapped to by LFE
|
||||
capture_6 asio3 FXBUS2(0x3)
|
||||
capture_7 asio4 FXBUS2(0x4)
|
||||
capture_8 asio5 FXBUS2(0x5)
|
||||
capture_9 asio6 FXBUS2(0x6)
|
||||
capture_10 asio7 FXBUS2(0x7)
|
||||
capture_11 asio8 FXBUS2(0x8)
|
||||
capture_12 asio9 FXBUS2(0x9)
|
||||
capture_13 asio10 FXBUS2(0xa)
|
||||
capture_14 asio11 FXBUS2(0xb)
|
||||
capture_15 asio12 FXBUS2(0xc)
|
||||
capture_16 asio13 FXBUS2(0xd)
|
||||
*/
|
||||
|
||||
TODO: describe use of ld10k1/qlo10k1 in conjunction with JACK
|
322
Documentation/sound/alsa/hda_codec.txt
Normal file
322
Documentation/sound/alsa/hda_codec.txt
Normal file
|
@ -0,0 +1,322 @@
|
|||
Notes on Universal Interface for Intel High Definition Audio Codec
|
||||
------------------------------------------------------------------
|
||||
|
||||
Takashi Iwai <tiwai@suse.de>
|
||||
|
||||
|
||||
[Still a draft version]
|
||||
|
||||
|
||||
General
|
||||
=======
|
||||
|
||||
The snd-hda-codec module supports the generic access function for the
|
||||
High Definition (HD) audio codecs. It's designed to be independent
|
||||
from the controller code like ac97 codec module. The real accessors
|
||||
from/to the controller must be implemented in the lowlevel driver.
|
||||
|
||||
The structure of this module is similar with ac97_codec module.
|
||||
Each codec chip belongs to a bus class which communicates with the
|
||||
controller.
|
||||
|
||||
|
||||
Initialization of Bus Instance
|
||||
==============================
|
||||
|
||||
The card driver has to create struct hda_bus at first. The template
|
||||
struct should be filled and passed to the constructor:
|
||||
|
||||
struct hda_bus_template {
|
||||
void *private_data;
|
||||
struct pci_dev *pci;
|
||||
const char *modelname;
|
||||
struct hda_bus_ops ops;
|
||||
};
|
||||
|
||||
The card driver can set and use the private_data field to retrieve its
|
||||
own data in callback functions. The pci field is used when the patch
|
||||
needs to check the PCI subsystem IDs, so on. For non-PCI system, it
|
||||
doesn't have to be set, of course.
|
||||
The modelname field specifies the board's specific configuration. The
|
||||
string is passed to the codec parser, and it depends on the parser how
|
||||
the string is used.
|
||||
These fields, private_data, pci and modelname are all optional.
|
||||
|
||||
The ops field contains the callback functions as the following:
|
||||
|
||||
struct hda_bus_ops {
|
||||
int (*command)(struct hda_codec *codec, hda_nid_t nid, int direct,
|
||||
unsigned int verb, unsigned int parm);
|
||||
unsigned int (*get_response)(struct hda_codec *codec);
|
||||
void (*private_free)(struct hda_bus *);
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
void (*pm_notify)(struct hda_codec *codec);
|
||||
#endif
|
||||
};
|
||||
|
||||
The command callback is called when the codec module needs to send a
|
||||
VERB to the controller. It's always a single command.
|
||||
The get_response callback is called when the codec requires the answer
|
||||
for the last command. These two callbacks are mandatory and have to
|
||||
be given.
|
||||
The third, private_free callback, is optional. It's called in the
|
||||
destructor to release any necessary data in the lowlevel driver.
|
||||
|
||||
The pm_notify callback is available only with
|
||||
CONFIG_SND_HDA_POWER_SAVE kconfig. It's called when the codec needs
|
||||
to power up or may power down. The controller should check the all
|
||||
belonging codecs on the bus whether they are actually powered off
|
||||
(check codec->power_on), and optionally the driver may power down the
|
||||
controller side, too.
|
||||
|
||||
The bus instance is created via snd_hda_bus_new(). You need to pass
|
||||
the card instance, the template, and the pointer to store the
|
||||
resultant bus instance.
|
||||
|
||||
int snd_hda_bus_new(struct snd_card *card, const struct hda_bus_template *temp,
|
||||
struct hda_bus **busp);
|
||||
|
||||
It returns zero if successful. A negative return value means any
|
||||
error during creation.
|
||||
|
||||
|
||||
Creation of Codec Instance
|
||||
==========================
|
||||
|
||||
Each codec chip on the board is then created on the BUS instance.
|
||||
To create a codec instance, call snd_hda_codec_new().
|
||||
|
||||
int snd_hda_codec_new(struct hda_bus *bus, unsigned int codec_addr,
|
||||
struct hda_codec **codecp);
|
||||
|
||||
The first argument is the BUS instance, the second argument is the
|
||||
address of the codec, and the last one is the pointer to store the
|
||||
resultant codec instance (can be NULL if not needed).
|
||||
|
||||
The codec is stored in a linked list of bus instance. You can follow
|
||||
the codec list like:
|
||||
|
||||
struct hda_codec *codec;
|
||||
list_for_each_entry(codec, &bus->codec_list, list) {
|
||||
...
|
||||
}
|
||||
|
||||
The codec isn't initialized at this stage properly. The
|
||||
initialization sequence is called when the controls are built later.
|
||||
|
||||
|
||||
Codec Access
|
||||
============
|
||||
|
||||
To access codec, use snd_hda_codec_read() and snd_hda_codec_write().
|
||||
snd_hda_param_read() is for reading parameters.
|
||||
For writing a sequence of verbs, use snd_hda_sequence_write().
|
||||
|
||||
There are variants of cached read/write, snd_hda_codec_write_cache(),
|
||||
snd_hda_sequence_write_cache(). These are used for recording the
|
||||
register states for the power-management resume. When no PM is needed,
|
||||
these are equivalent with non-cached version.
|
||||
|
||||
To retrieve the number of sub nodes connected to the given node, use
|
||||
snd_hda_get_sub_nodes(). The connection list can be obtained via
|
||||
snd_hda_get_connections() call.
|
||||
|
||||
When an unsolicited event happens, pass the event via
|
||||
snd_hda_queue_unsol_event() so that the codec routines will process it
|
||||
later.
|
||||
|
||||
|
||||
(Mixer) Controls
|
||||
================
|
||||
|
||||
To create mixer controls of all codecs, call
|
||||
snd_hda_build_controls(). It then builds the mixers and does
|
||||
initialization stuff on each codec.
|
||||
|
||||
|
||||
PCM Stuff
|
||||
=========
|
||||
|
||||
snd_hda_build_pcms() gives the necessary information to create PCM
|
||||
streams. When it's called, each codec belonging to the bus stores
|
||||
codec->num_pcms and codec->pcm_info fields. The num_pcms indicates
|
||||
the number of elements in pcm_info array. The card driver is supposed
|
||||
to traverse the codec linked list, read the pcm information in
|
||||
pcm_info array, and build pcm instances according to them.
|
||||
|
||||
The pcm_info array contains the following record:
|
||||
|
||||
/* PCM information for each substream */
|
||||
struct hda_pcm_stream {
|
||||
unsigned int substreams; /* number of substreams, 0 = not exist */
|
||||
unsigned int channels_min; /* min. number of channels */
|
||||
unsigned int channels_max; /* max. number of channels */
|
||||
hda_nid_t nid; /* default NID to query rates/formats/bps, or set up */
|
||||
u32 rates; /* supported rates */
|
||||
u64 formats; /* supported formats (SNDRV_PCM_FMTBIT_) */
|
||||
unsigned int maxbps; /* supported max. bit per sample */
|
||||
struct hda_pcm_ops ops;
|
||||
};
|
||||
|
||||
/* for PCM creation */
|
||||
struct hda_pcm {
|
||||
char *name;
|
||||
struct hda_pcm_stream stream[2];
|
||||
};
|
||||
|
||||
The name can be passed to snd_pcm_new(). The stream field contains
|
||||
the information for playback (SNDRV_PCM_STREAM_PLAYBACK = 0) and
|
||||
capture (SNDRV_PCM_STREAM_CAPTURE = 1) directions. The card driver
|
||||
should pass substreams to snd_pcm_new() for the number of substreams
|
||||
to create.
|
||||
|
||||
The channels_min, channels_max, rates and formats should be copied to
|
||||
runtime->hw record. They and maxbps fields are used also to compute
|
||||
the format value for the HDA codec and controller. Call
|
||||
snd_hda_calc_stream_format() to get the format value.
|
||||
|
||||
The ops field contains the following callback functions:
|
||||
|
||||
struct hda_pcm_ops {
|
||||
int (*open)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
||||
struct snd_pcm_substream *substream);
|
||||
int (*close)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
||||
struct snd_pcm_substream *substream);
|
||||
int (*prepare)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
||||
unsigned int stream_tag, unsigned int format,
|
||||
struct snd_pcm_substream *substream);
|
||||
int (*cleanup)(struct hda_pcm_stream *info, struct hda_codec *codec,
|
||||
struct snd_pcm_substream *substream);
|
||||
};
|
||||
|
||||
All are non-NULL, so you can call them safely without NULL check.
|
||||
|
||||
The open callback should be called in PCM open after runtime->hw is
|
||||
set up. It may override some setting and constraints additionally.
|
||||
Similarly, the close callback should be called in the PCM close.
|
||||
|
||||
The prepare callback should be called in PCM prepare. This will set
|
||||
up the codec chip properly for the operation. The cleanup should be
|
||||
called in hw_free to clean up the configuration.
|
||||
|
||||
The caller should check the return value, at least for open and
|
||||
prepare callbacks. When a negative value is returned, some error
|
||||
occurred.
|
||||
|
||||
|
||||
Proc Files
|
||||
==========
|
||||
|
||||
Each codec dumps the widget node information in
|
||||
/proc/asound/card*/codec#* file. This information would be really
|
||||
helpful for debugging. Please provide its contents together with the
|
||||
bug report.
|
||||
|
||||
|
||||
Power Management
|
||||
================
|
||||
|
||||
It's simple:
|
||||
Call snd_hda_suspend() in the PM suspend callback.
|
||||
Call snd_hda_resume() in the PM resume callback.
|
||||
|
||||
|
||||
Codec Preset (Patch)
|
||||
====================
|
||||
|
||||
To set up and handle the codec functionality fully, each codec may
|
||||
have a codec preset (patch). It's defined in struct hda_codec_preset:
|
||||
|
||||
struct hda_codec_preset {
|
||||
unsigned int id;
|
||||
unsigned int mask;
|
||||
unsigned int subs;
|
||||
unsigned int subs_mask;
|
||||
unsigned int rev;
|
||||
const char *name;
|
||||
int (*patch)(struct hda_codec *codec);
|
||||
};
|
||||
|
||||
When the codec id and codec subsystem id match with the given id and
|
||||
subs fields bitwise (with bitmask mask and subs_mask), the callback
|
||||
patch is called. The patch callback should initialize the codec and
|
||||
set the codec->patch_ops field. This is defined as below:
|
||||
|
||||
struct hda_codec_ops {
|
||||
int (*build_controls)(struct hda_codec *codec);
|
||||
int (*build_pcms)(struct hda_codec *codec);
|
||||
int (*init)(struct hda_codec *codec);
|
||||
void (*free)(struct hda_codec *codec);
|
||||
void (*unsol_event)(struct hda_codec *codec, unsigned int res);
|
||||
#ifdef CONFIG_PM
|
||||
int (*suspend)(struct hda_codec *codec, pm_message_t state);
|
||||
int (*resume)(struct hda_codec *codec);
|
||||
#endif
|
||||
#ifdef CONFIG_SND_HDA_POWER_SAVE
|
||||
int (*check_power_status)(struct hda_codec *codec,
|
||||
hda_nid_t nid);
|
||||
#endif
|
||||
};
|
||||
|
||||
The build_controls callback is called from snd_hda_build_controls().
|
||||
Similarly, the build_pcms callback is called from
|
||||
snd_hda_build_pcms(). The init callback is called after
|
||||
build_controls to initialize the hardware.
|
||||
The free callback is called as a destructor.
|
||||
|
||||
The unsol_event callback is called when an unsolicited event is
|
||||
received.
|
||||
|
||||
The suspend and resume callbacks are for power management.
|
||||
They can be NULL if no special sequence is required. When the resume
|
||||
callback is NULL, the driver calls the init callback and resumes the
|
||||
registers from the cache. If other handling is needed, you'd need to
|
||||
write your own resume callback. There, the amp values can be resumed
|
||||
via
|
||||
void snd_hda_codec_resume_amp(struct hda_codec *codec);
|
||||
and the other codec registers via
|
||||
void snd_hda_codec_resume_cache(struct hda_codec *codec);
|
||||
|
||||
The check_power_status callback is called when the amp value of the
|
||||
given widget NID is changed. The codec code can turn on/off the power
|
||||
appropriately from this information.
|
||||
|
||||
Each entry can be NULL if not necessary to be called.
|
||||
|
||||
|
||||
Generic Parser
|
||||
==============
|
||||
|
||||
When the device doesn't match with any given presets, the widgets are
|
||||
parsed via th generic parser (hda_generic.c). Its support is
|
||||
limited: no multi-channel support, for example.
|
||||
|
||||
|
||||
Digital I/O
|
||||
===========
|
||||
|
||||
Call snd_hda_create_spdif_out_ctls() from the patch to create controls
|
||||
related with SPDIF out.
|
||||
|
||||
|
||||
Helper Functions
|
||||
================
|
||||
|
||||
snd_hda_get_codec_name() stores the codec name on the given string.
|
||||
|
||||
snd_hda_check_board_config() can be used to obtain the configuration
|
||||
information matching with the device. Define the model string table
|
||||
and the table with struct snd_pci_quirk entries (zero-terminated),
|
||||
and pass it to the function. The function checks the modelname given
|
||||
as a module parameter, and PCI subsystem IDs. If the matching entry
|
||||
is found, it returns the config field value.
|
||||
|
||||
snd_hda_add_new_ctls() can be used to create and add control entries.
|
||||
Pass the zero-terminated array of struct snd_kcontrol_new
|
||||
|
||||
Macros HDA_CODEC_VOLUME(), HDA_CODEC_MUTE() and their variables can be
|
||||
used for the entry of struct snd_kcontrol_new.
|
||||
|
||||
The input MUX helper callbacks for such a control are provided, too:
|
||||
snd_hda_input_mux_info() and snd_hda_input_mux_put(). See
|
||||
patch_realtek.c for example.
|
362
Documentation/sound/alsa/hdspm.txt
Normal file
362
Documentation/sound/alsa/hdspm.txt
Normal file
|
@ -0,0 +1,362 @@
|
|||
Software Interface ALSA-DSP MADI Driver
|
||||
|
||||
(translated from German, so no good English ;-),
|
||||
2004 - winfried ritsch
|
||||
|
||||
|
||||
|
||||
Full functionality has been added to the driver. Since some of
|
||||
the Controls and startup-options are ALSA-Standard and only the
|
||||
special Controls are described and discussed below.
|
||||
|
||||
|
||||
hardware functionality:
|
||||
|
||||
|
||||
Audio transmission:
|
||||
|
||||
number of channels -- depends on transmission mode
|
||||
|
||||
The number of channels chosen is from 1..Nmax. The reason to
|
||||
use for a lower number of channels is only resource allocation,
|
||||
since unused DMA channels are disabled and less memory is
|
||||
allocated. So also the throughput of the PCI system can be
|
||||
scaled. (Only important for low performance boards).
|
||||
|
||||
Single Speed -- 1..64 channels
|
||||
|
||||
(Note: Choosing the 56channel mode for transmission or as
|
||||
receiver, only 56 are transmitted/received over the MADI, but
|
||||
all 64 channels are available for the mixer, so channel count
|
||||
for the driver)
|
||||
|
||||
Double Speed -- 1..32 channels
|
||||
|
||||
Note: Choosing the 56-channel mode for
|
||||
transmission/receive-mode , only 28 are transmitted/received
|
||||
over the MADI, but all 32 channels are available for the mixer,
|
||||
so channel count for the driver
|
||||
|
||||
|
||||
Quad Speed -- 1..16 channels
|
||||
|
||||
Note: Choosing the 56-channel mode for
|
||||
transmission/receive-mode , only 14 are transmitted/received
|
||||
over the MADI, but all 16 channels are available for the mixer,
|
||||
so channel count for the driver
|
||||
|
||||
Format -- signed 32 Bit Little Endian (SNDRV_PCM_FMTBIT_S32_LE)
|
||||
|
||||
Sample Rates --
|
||||
|
||||
Single Speed -- 32000, 44100, 48000
|
||||
|
||||
Double Speed -- 64000, 88200, 96000 (untested)
|
||||
|
||||
Quad Speed -- 128000, 176400, 192000 (untested)
|
||||
|
||||
access-mode -- MMAP (memory mapped), Not interleaved
|
||||
(PCM_NON-INTERLEAVED)
|
||||
|
||||
buffer-sizes -- 64,128,256,512,1024,2048,8192 Samples
|
||||
|
||||
fragments -- 2
|
||||
|
||||
Hardware-pointer -- 2 Modi
|
||||
|
||||
|
||||
The Card supports the readout of the actual Buffer-pointer,
|
||||
where DMA reads/writes. Since of the bulk mode of PCI it is only
|
||||
64 Byte accurate. SO it is not really usable for the
|
||||
ALSA-mid-level functions (here the buffer-ID gives a better
|
||||
result), but if MMAP is used by the application. Therefore it
|
||||
can be configured at load-time with the parameter
|
||||
precise-pointer.
|
||||
|
||||
|
||||
(Hint: Experimenting I found that the pointer is maximum 64 to
|
||||
large never to small. So if you subtract 64 you always have a
|
||||
safe pointer for writing, which is used on this mode inside
|
||||
ALSA. In theory now you can get now a latency as low as 16
|
||||
Samples, which is a quarter of the interrupt possibilities.)
|
||||
|
||||
Precise Pointer -- off
|
||||
interrupt used for pointer-calculation
|
||||
|
||||
Precise Pointer -- on
|
||||
hardware pointer used.
|
||||
|
||||
Controller:
|
||||
|
||||
|
||||
Since DSP-MADI-Mixer has 8152 Fader, it does not make sense to
|
||||
use the standard mixer-controls, since this would break most of
|
||||
(especially graphic) ALSA-Mixer GUIs. So Mixer control has be
|
||||
provided by a 2-dimensional controller using the
|
||||
hwdep-interface.
|
||||
|
||||
Also all 128+256 Peak and RMS-Meter can be accessed via the
|
||||
hwdep-interface. Since it could be a performance problem always
|
||||
copying and converting Peak and RMS-Levels even if you just need
|
||||
one, I decided to export the hardware structure, so that of
|
||||
needed some driver-guru can implement a memory-mapping of mixer
|
||||
or peak-meters over ioctl, or also to do only copying and no
|
||||
conversion. A test-application shows the usage of the controller.
|
||||
|
||||
Latency Controls --- not implemented !!!
|
||||
|
||||
|
||||
Note: Within the windows-driver the latency is accessible of a
|
||||
control-panel, but buffer-sizes are controlled with ALSA from
|
||||
hwparams-calls and should not be changed in run-state, I did not
|
||||
implement it here.
|
||||
|
||||
|
||||
System Clock -- suspended !!!!
|
||||
|
||||
Name -- "System Clock Mode"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- "Master" "Slave"
|
||||
|
||||
|
||||
!!!! This is a hardware-function but is in conflict with the
|
||||
Clock-source controller, which is a kind of ALSA-standard. I
|
||||
makes sense to set the card to a special mode (master at some
|
||||
frequency or slave), since even not using an Audio-application
|
||||
a studio should have working synchronisations setup. So use
|
||||
Clock-source-controller instead !!!!
|
||||
|
||||
Clock Source
|
||||
|
||||
Name -- "Sample Clock Source"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- "AutoSync", "Internal 32.0 kHz", "Internal 44.1 kHz",
|
||||
"Internal 48.0 kHz", "Internal 64.0 kHz", "Internal 88.2 kHz",
|
||||
"Internal 96.0 kHz"
|
||||
|
||||
Choose between Master at a specific Frequency and so also the
|
||||
Speed-mode or Slave (Autosync). Also see "Preferred Sync Ref"
|
||||
|
||||
|
||||
!!!! This is no pure hardware function but was implemented by
|
||||
ALSA by some ALSA-drivers before, so I use it also. !!!
|
||||
|
||||
|
||||
Preferred Sync Ref
|
||||
|
||||
Name -- "Preferred Sync Reference"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- "Word" "MADI"
|
||||
|
||||
|
||||
Within the Auto-sync-Mode the preferred Sync Source can be
|
||||
chosen. If it is not available another is used if possible.
|
||||
|
||||
Note: Since MADI has a much higher bit-rate than word-clock, the
|
||||
card should synchronise better in MADI Mode. But since the
|
||||
RME-PLL is very good, there are almost no problems with
|
||||
word-clock too. I never found a difference.
|
||||
|
||||
|
||||
TX 64 channel ---
|
||||
|
||||
Name -- "TX 64 channels mode"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
|
||||
Using 64-channel-modus (1) or 56-channel-modus for
|
||||
MADI-transmission (0).
|
||||
|
||||
|
||||
Note: This control is for output only. Input-mode is detected
|
||||
automatically from hardware sending MADI.
|
||||
|
||||
|
||||
Clear TMS ---
|
||||
|
||||
Name -- "Clear Track Marker"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
|
||||
|
||||
Don't use to lower 5 Audio-bits on AES as additional Bits.
|
||||
|
||||
|
||||
Safe Mode oder Auto Input ---
|
||||
|
||||
Name -- "Safe Mode"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
|
||||
(default on)
|
||||
|
||||
If on (1), then if either the optical or coaxial connection
|
||||
has a failure, there is a takeover to the working one, with no
|
||||
sample failure. Its only useful if you use the second as a
|
||||
backup connection.
|
||||
|
||||
Input ---
|
||||
|
||||
Name -- "Input Select"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- optical coaxial
|
||||
|
||||
|
||||
Choosing the Input, optical or coaxial. If Safe-mode is active,
|
||||
this is the preferred Input.
|
||||
|
||||
-------------- Mixer ----------------------
|
||||
|
||||
Mixer
|
||||
|
||||
Name -- "Mixer"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values - <channel-number 0-127> <Value 0-65535>
|
||||
|
||||
|
||||
Here as a first value the channel-index is taken to get/set the
|
||||
corresponding mixer channel, where 0-63 are the input to output
|
||||
fader and 64-127 the playback to outputs fader. Value 0
|
||||
is channel muted 0 and 32768 an amplification of 1.
|
||||
|
||||
Chn 1-64
|
||||
|
||||
fast mixer for the ALSA-mixer utils. The diagonal of the
|
||||
mixer-matrix is implemented from playback to output.
|
||||
|
||||
|
||||
Line Out
|
||||
|
||||
Name -- "Line Out"
|
||||
|
||||
Access -- Read Write
|
||||
|
||||
Values -- 0 1
|
||||
|
||||
Switching on and off the analog out, which has nothing to do
|
||||
with mixing or routing. the analog outs reflects channel 63,64.
|
||||
|
||||
|
||||
--- information (only read access):
|
||||
|
||||
Sample Rate
|
||||
|
||||
Name -- "System Sample Rate"
|
||||
|
||||
Access -- Read-only
|
||||
|
||||
getting the sample rate.
|
||||
|
||||
|
||||
External Rate measured
|
||||
|
||||
Name -- "External Rate"
|
||||
|
||||
Access -- Read only
|
||||
|
||||
|
||||
Should be "Autosync Rate", but Name used is
|
||||
ALSA-Scheme. External Sample frequency liked used on Autosync is
|
||||
reported.
|
||||
|
||||
|
||||
MADI Sync Status
|
||||
|
||||
Name -- "MADI Sync Lock Status"
|
||||
|
||||
Access -- Read
|
||||
|
||||
Values -- 0,1,2
|
||||
|
||||
MADI-Input is 0=Unlocked, 1=Locked, or 2=Synced.
|
||||
|
||||
|
||||
Word Clock Sync Status
|
||||
|
||||
Name -- "Word Clock Lock Status"
|
||||
|
||||
Access -- Read
|
||||
|
||||
Values -- 0,1,2
|
||||
|
||||
Word Clock Input is 0=Unlocked, 1=Locked, or 2=Synced.
|
||||
|
||||
AutoSync
|
||||
|
||||
Name -- "AutoSync Reference"
|
||||
|
||||
Access -- Read
|
||||
|
||||
Values -- "WordClock", "MADI", "None"
|
||||
|
||||
Sync-Reference is either "WordClock", "MADI" or none.
|
||||
|
||||
RX 64ch --- noch nicht implementiert
|
||||
|
||||
MADI-Receiver is in 64 channel mode oder 56 channel mode.
|
||||
|
||||
|
||||
AB_inp --- not tested
|
||||
|
||||
Used input for Auto-Input.
|
||||
|
||||
|
||||
actual Buffer Position --- not implemented
|
||||
|
||||
!!! this is a ALSA internal function, so no control is used !!!
|
||||
|
||||
|
||||
|
||||
Calling Parameter:
|
||||
|
||||
index int array (min = 1, max = 8),
|
||||
"Index value for RME HDSPM interface." card-index within ALSA
|
||||
|
||||
note: ALSA-standard
|
||||
|
||||
id string array (min = 1, max = 8),
|
||||
"ID string for RME HDSPM interface."
|
||||
|
||||
note: ALSA-standard
|
||||
|
||||
enable int array (min = 1, max = 8),
|
||||
"Enable/disable specific HDSPM sound-cards."
|
||||
|
||||
note: ALSA-standard
|
||||
|
||||
precise_ptr int array (min = 1, max = 8),
|
||||
"Enable precise pointer, or disable."
|
||||
|
||||
note: Use only when the application supports this (which is a special case).
|
||||
|
||||
line_outs_monitor int array (min = 1, max = 8),
|
||||
"Send playback streams to analog outs by default."
|
||||
|
||||
|
||||
note: each playback channel is mixed to the same numbered output
|
||||
channel (routed). This is against the ALSA-convention, where all
|
||||
channels have to be muted on after loading the driver, but was
|
||||
used before on other cards, so i historically use it again)
|
||||
|
||||
|
||||
|
||||
enable_monitor int array (min = 1, max = 8),
|
||||
"Enable Analog Out on Channel 63/64 by default."
|
||||
|
||||
note: here the analog output is enabled (but not routed).
|
41
Documentation/sound/alsa/powersave.txt
Normal file
41
Documentation/sound/alsa/powersave.txt
Normal file
|
@ -0,0 +1,41 @@
|
|||
Notes on Power-Saving Mode
|
||||
==========================
|
||||
|
||||
AC97 and HD-audio drivers have the automatic power-saving mode.
|
||||
This feature is enabled via Kconfig CONFIG_SND_AC97_POWER_SAVE
|
||||
and CONFIG_SND_HDA_POWER_SAVE options, respectively.
|
||||
|
||||
With the automatic power-saving, the driver turns off the codec power
|
||||
appropriately when no operation is required. When no applications use
|
||||
the device and/or no analog loopback is set, the power disablement is
|
||||
done fully or partially. It'll save a certain power consumption, thus
|
||||
good for laptops (even for desktops).
|
||||
|
||||
The time-out for automatic power-off can be specified via power_save
|
||||
module option of snd-ac97-codec and snd-hda-intel modules. Specify
|
||||
the time-out value in seconds. 0 means to disable the automatic
|
||||
power-saving. The default value of timeout is given via
|
||||
CONFIG_SND_AC97_POWER_SAVE_DEFAULT and
|
||||
CONFIG_SND_HDA_POWER_SAVE_DEFAULT Kconfig options. Setting this to 1
|
||||
(the minimum value) isn't recommended because many applications try to
|
||||
reopen the device frequently. 10 would be a good choice for normal
|
||||
operations.
|
||||
|
||||
The power_save option is exported as writable. This means you can
|
||||
adjust the value via sysfs on the fly. For example, to turn on the
|
||||
automatic power-save mode with 10 seconds, write to
|
||||
/sys/modules/snd_ac97_codec/parameters/power_save (usually as root):
|
||||
|
||||
# echo 10 > /sys/modules/snd_ac97_codec/parameters/power_save
|
||||
|
||||
|
||||
Note that you might hear click noise/pop when changing the power
|
||||
state. Also, it often takes certain time to wake up from the
|
||||
power-down to the active state. These are often hardly to fix, so
|
||||
don't report extra bug reports unless you have a fix patch ;-)
|
||||
|
||||
For HD-audio interface, there is another module option,
|
||||
power_save_controller. This enables/disables the power-save mode of
|
||||
the controller side. Setting this on may reduce a bit more power
|
||||
consumption, but might result in longer wake-up time and click noise.
|
||||
Try to turn it off when you experience such a thing too often.
|
409
Documentation/sound/alsa/seq_oss.html
Normal file
409
Documentation/sound/alsa/seq_oss.html
Normal file
|
@ -0,0 +1,409 @@
|
|||
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
|
||||
<HTML>
|
||||
<HEAD>
|
||||
<TITLE>OSS Sequencer Emulation on ALSA</TITLE>
|
||||
</HEAD>
|
||||
<BODY>
|
||||
|
||||
<CENTER>
|
||||
<H1>
|
||||
|
||||
<HR WIDTH="100%"></H1></CENTER>
|
||||
|
||||
<CENTER>
|
||||
<H1>
|
||||
OSS Sequencer Emulation on ALSA</H1></CENTER>
|
||||
|
||||
<HR WIDTH="100%">
|
||||
<P>Copyright (c) 1998,1999 by Takashi Iwai
|
||||
<TT><A HREF="mailto:iwai@ww.uni-erlangen.de"><iwai@ww.uni-erlangen.de></A></TT>
|
||||
<P>ver.0.1.8; Nov. 16, 1999
|
||||
<H2>
|
||||
|
||||
<HR WIDTH="100%"></H2>
|
||||
|
||||
<H2>
|
||||
1. Description</H2>
|
||||
This directory contains the OSS sequencer emulation driver on ALSA. Note
|
||||
that this program is still in the development state.
|
||||
<P>What this does - it provides the emulation of the OSS sequencer, access
|
||||
via
|
||||
<TT>/dev/sequencer</TT> and <TT>/dev/music</TT> devices.
|
||||
The most of applications using OSS can run if the appropriate ALSA
|
||||
sequencer is prepared.
|
||||
<P>The following features are emulated by this driver:
|
||||
<UL>
|
||||
<LI>
|
||||
Normal sequencer and MIDI events:</LI>
|
||||
|
||||
<BR>They are converted to the ALSA sequencer events, and sent to the corresponding
|
||||
port.
|
||||
<LI>
|
||||
Timer events:</LI>
|
||||
|
||||
<BR>The timer is not selectable by ioctl. The control rate is fixed to
|
||||
100 regardless of HZ. That is, even on Alpha system, a tick is always
|
||||
1/100 second. The base rate and tempo can be changed in <TT>/dev/music</TT>.
|
||||
|
||||
<LI>
|
||||
Patch loading:</LI>
|
||||
|
||||
<BR>It purely depends on the synth drivers whether it's supported since
|
||||
the patch loading is realized by callback to the synth driver.
|
||||
<LI>
|
||||
I/O controls:</LI>
|
||||
|
||||
<BR>Most of controls are accepted. Some controls
|
||||
are dependent on the synth driver, as well as even on original OSS.</UL>
|
||||
Furthermore, you can find the following advanced features:
|
||||
<UL>
|
||||
<LI>
|
||||
Better queue mechanism:</LI>
|
||||
|
||||
<BR>The events are queued before processing them.
|
||||
<LI>
|
||||
Multiple applications:</LI>
|
||||
|
||||
<BR>You can run two or more applications simultaneously (even for OSS sequencer)!
|
||||
However, each MIDI device is exclusive - that is, if a MIDI device is opened
|
||||
once by some application, other applications can't use it. No such a restriction
|
||||
in synth devices.
|
||||
<LI>
|
||||
Real-time event processing:</LI>
|
||||
|
||||
<BR>The events can be processed in real time without using out of bound
|
||||
ioctl. To switch to real-time mode, send ABSTIME 0 event. The followed
|
||||
events will be processed in real-time without queued. To switch off the
|
||||
real-time mode, send RELTIME 0 event.
|
||||
<LI>
|
||||
<TT>/proc</TT> interface:</LI>
|
||||
|
||||
<BR>The status of applications and devices can be shown via <TT>/proc/asound/seq/oss</TT>
|
||||
at any time. In the later version, configuration will be changed via <TT>/proc</TT>
|
||||
interface, too.</UL>
|
||||
|
||||
<H2>
|
||||
2. Installation</H2>
|
||||
Run configure script with both sequencer support (<TT>--with-sequencer=yes</TT>)
|
||||
and OSS emulation (<TT>--with-oss=yes</TT>) options. A module <TT>snd-seq-oss.o</TT>
|
||||
will be created. If the synth module of your sound card supports for OSS
|
||||
emulation (so far, only Emu8000 driver), this module will be loaded automatically.
|
||||
Otherwise, you need to load this module manually.
|
||||
<P>At beginning, this module probes all the MIDI ports which have been
|
||||
already connected to the sequencer. Once after that, the creation and deletion
|
||||
of ports are watched by announcement mechanism of ALSA sequencer.
|
||||
<P>The available synth and MIDI devices can be found in proc interface.
|
||||
Run "<TT>cat /proc/asound/seq/oss</TT>", and check the devices. For example,
|
||||
if you use an AWE64 card, you'll see like the following:
|
||||
<PRE> OSS sequencer emulation version 0.1.8
|
||||
ALSA client number 63
|
||||
ALSA receiver port 0
|
||||
|
||||
Number of applications: 0
|
||||
|
||||
Number of synth devices: 1
|
||||
|
||||
synth 0: [EMU8000]
|
||||
type 0x1 : subtype 0x20 : voices 32
|
||||
capabilties : ioctl enabled / load_patch enabled
|
||||
|
||||
Number of MIDI devices: 3
|
||||
|
||||
midi 0: [Emu8000 Port-0] ALSA port 65:0
|
||||
capability write / opened none
|
||||
|
||||
midi 1: [Emu8000 Port-1] ALSA port 65:1
|
||||
capability write / opened none
|
||||
|
||||
midi 2: [0: MPU-401 (UART)] ALSA port 64:0
|
||||
capability read/write / opened none</PRE>
|
||||
Note that the device number may be different from the information of
|
||||
<TT>/proc/asound/oss-devices</TT>
|
||||
or ones of the original OSS driver. Use the device number listed in <TT>/proc/asound/seq/oss</TT>
|
||||
to play via OSS sequencer emulation.
|
||||
<H2>
|
||||
3. Using Synthesizer Devices</H2>
|
||||
Run your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1
|
||||
and xmp-1.1.5. You can load samples via <TT>/dev/sequencer</TT> like sfxload,
|
||||
too.
|
||||
<P>If the lowlevel driver supports multiple access to synth devices (like
|
||||
Emu8000 driver), two or more applications are allowed to run at the same
|
||||
time.
|
||||
<H2>
|
||||
4. Using MIDI Devices</H2>
|
||||
So far, only MIDI output was tested. MIDI input was not checked at all,
|
||||
but hopefully it will work. Use the device number listed in <TT>/proc/asound/seq/oss</TT>.
|
||||
Be aware that these numbers are mostly different from the list in
|
||||
<TT>/proc/asound/oss-devices</TT>.
|
||||
<H2>
|
||||
5. Module Options</H2>
|
||||
The following module options are available:
|
||||
<UL>
|
||||
<LI>
|
||||
<TT>maxqlen</TT></LI>
|
||||
|
||||
<BR>specifies the maximum read/write queue length. This queue is private
|
||||
for OSS sequencer, so that it is independent from the queue length of ALSA
|
||||
sequencer. Default value is 1024.
|
||||
<LI>
|
||||
<TT>seq_oss_debug</TT></LI>
|
||||
|
||||
<BR>specifies the debug level and accepts zero (= no debug message) or
|
||||
positive integer. Default value is 0.</UL>
|
||||
|
||||
<H2>
|
||||
6. Queue Mechanism</H2>
|
||||
OSS sequencer emulation uses an ALSA priority queue. The
|
||||
events from <TT>/dev/sequencer</TT> are processed and put onto the queue
|
||||
specified by module option.
|
||||
<P>All the events from <TT>/dev/sequencer</TT> are parsed at beginning.
|
||||
The timing events are also parsed at this moment, so that the events may
|
||||
be processed in real-time. Sending an event ABSTIME 0 switches the operation
|
||||
mode to real-time mode, and sending an event RELTIME 0 switches it off.
|
||||
In the real-time mode, all events are dispatched immediately.
|
||||
<P>The queued events are dispatched to the corresponding ALSA sequencer
|
||||
ports after scheduled time by ALSA sequencer dispatcher.
|
||||
<P>If the write-queue is full, the application sleeps until a certain amount
|
||||
(as default one half) becomes empty in blocking mode. The synchronization
|
||||
to write timing was implemented, too.
|
||||
<P>The input from MIDI devices or echo-back events are stored on read FIFO
|
||||
queue. If application reads <TT>/dev/sequencer</TT> in blocking mode, the
|
||||
process will be awaked.
|
||||
|
||||
<H2>
|
||||
7. Interface to Synthesizer Device</H2>
|
||||
|
||||
<H3>
|
||||
7.1. Registration</H3>
|
||||
To register an OSS synthesizer device, use <TT>snd_seq_oss_synth_register</TT>
|
||||
function.
|
||||
<PRE>int snd_seq_oss_synth_register(char *name, int type, int subtype, int nvoices,
|
||||
snd_seq_oss_callback_t *oper, void *private_data)</PRE>
|
||||
The arguments <TT>name</TT>, <TT>type</TT>, <TT>subtype</TT> and
|
||||
<TT>nvoices</TT>
|
||||
are used for making the appropriate synth_info structure for ioctl. The
|
||||
return value is an index number of this device. This index must be remembered
|
||||
for unregister. If registration is failed, -errno will be returned.
|
||||
<P>To release this device, call <TT>snd_seq_oss_synth_unregister function</TT>:
|
||||
<PRE>int snd_seq_oss_synth_unregister(int index),</PRE>
|
||||
where the <TT>index</TT> is the index number returned by register function.
|
||||
<H3>
|
||||
7.2. Callbacks</H3>
|
||||
OSS synthesizer devices have capability for sample downloading and ioctls
|
||||
like sample reset. In OSS emulation, these special features are realized
|
||||
by using callbacks. The registration argument oper is used to specify these
|
||||
callbacks. The following callback functions must be defined:
|
||||
<PRE>snd_seq_oss_callback_t:
|
||||
int (*open)(snd_seq_oss_arg_t *p, void *closure);
|
||||
int (*close)(snd_seq_oss_arg_t *p);
|
||||
int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg);
|
||||
int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char *buf, int offs, int count);
|
||||
int (*reset)(snd_seq_oss_arg_t *p);
|
||||
Except for <TT>open</TT> and <TT>close</TT> callbacks, they are allowed
|
||||
to be NULL.
|
||||
<P>Each callback function takes the argument type snd_seq_oss_arg_t as the
|
||||
first argument.
|
||||
<PRE>struct snd_seq_oss_arg_t {
|
||||
int app_index;
|
||||
int file_mode;
|
||||
int seq_mode;
|
||||
snd_seq_addr_t addr;
|
||||
void *private_data;
|
||||
int event_passing;
|
||||
};</PRE>
|
||||
The first three fields, <TT>app_index</TT>, <TT>file_mode</TT> and
|
||||
<TT>seq_mode</TT>
|
||||
are initialized by OSS sequencer. The <TT>app_index</TT> is the application
|
||||
index which is unique to each application opening OSS sequencer. The
|
||||
<TT>file_mode</TT>
|
||||
is bit-flags indicating the file operation mode. See
|
||||
<TT>seq_oss.h</TT>
|
||||
for its meaning. The <TT>seq_mode</TT> is sequencer operation mode. In
|
||||
the current version, only <TT>SND_OSSSEQ_MODE_SYNTH</TT> is used.
|
||||
<P>The next two fields, <TT>addr</TT> and <TT>private_data</TT>, must be
|
||||
filled by the synth driver at open callback. The <TT>addr</TT> contains
|
||||
the address of ALSA sequencer port which is assigned to this device. If
|
||||
the driver allocates memory for <TT>private_data</TT>, it must be released
|
||||
in close callback by itself.
|
||||
<P>The last field, <TT>event_passing</TT>, indicates how to translate note-on
|
||||
/ off events. In <TT>PROCESS_EVENTS</TT> mode, the note 255 is regarded
|
||||
as velocity change, and key pressure event is passed to the port. In <TT>PASS_EVENTS</TT>
|
||||
mode, all note on/off events are passed to the port without modified. <TT>PROCESS_KEYPRESS</TT>
|
||||
mode checks the note above 128 and regards it as key pressure event (mainly
|
||||
for Emu8000 driver).
|
||||
<H4>
|
||||
7.2.1. Open Callback</H4>
|
||||
The <TT>open</TT> is called at each time this device is opened by an application
|
||||
using OSS sequencer. This must not be NULL. Typically, the open callback
|
||||
does the following procedure:
|
||||
<OL>
|
||||
<LI>
|
||||
Allocate private data record.</LI>
|
||||
|
||||
<LI>
|
||||
Create an ALSA sequencer port.</LI>
|
||||
|
||||
<LI>
|
||||
Set the new port address on arg->addr.</LI>
|
||||
|
||||
<LI>
|
||||
Set the private data record pointer on arg->private_data.</LI>
|
||||
</OL>
|
||||
Note that the type bit-flags in port_info of this synth port must NOT contain
|
||||
<TT>TYPE_MIDI_GENERIC</TT>
|
||||
bit. Instead, <TT>TYPE_SPECIFIC</TT> should be used. Also, <TT>CAP_SUBSCRIPTION</TT>
|
||||
bit should NOT be included, too. This is necessary to tell it from other
|
||||
normal MIDI devices. If the open procedure succeeded, return zero. Otherwise,
|
||||
return -errno.
|
||||
<H4>
|
||||
7.2.2 Ioctl Callback</H4>
|
||||
The <TT>ioctl</TT> callback is called when the sequencer receives device-specific
|
||||
ioctls. The following two ioctls should be processed by this callback:
|
||||
<UL>
|
||||
<LI>
|
||||
<TT>IOCTL_SEQ_RESET_SAMPLES</TT></LI>
|
||||
|
||||
<BR>reset all samples on memory -- return 0
|
||||
<LI>
|
||||
<TT>IOCTL_SYNTH_MEMAVL</TT></LI>
|
||||
|
||||
<BR>return the available memory size
|
||||
<LI>
|
||||
<TT>FM_4OP_ENABLE</TT></LI>
|
||||
|
||||
<BR>can be ignored usually</UL>
|
||||
The other ioctls are processed inside the sequencer without passing to
|
||||
the lowlevel driver.
|
||||
<H4>
|
||||
7.2.3 Load_Patch Callback</H4>
|
||||
The <TT>load_patch</TT> callback is used for sample-downloading. This callback
|
||||
must read the data on user-space and transfer to each device. Return 0
|
||||
if succeeded, and -errno if failed. The format argument is the patch key
|
||||
in patch_info record. The buf is user-space pointer where patch_info record
|
||||
is stored. The offs can be ignored. The count is total data size of this
|
||||
sample data.
|
||||
<H4>
|
||||
7.2.4 Close Callback</H4>
|
||||
The <TT>close</TT> callback is called when this device is closed by the
|
||||
application. If any private data was allocated in open callback, it must
|
||||
be released in the close callback. The deletion of ALSA port should be
|
||||
done here, too. This callback must not be NULL.
|
||||
<H4>
|
||||
7.2.5 Reset Callback</H4>
|
||||
The <TT>reset</TT> callback is called when sequencer device is reset or
|
||||
closed by applications. The callback should turn off the sounds on the
|
||||
relevant port immediately, and initialize the status of the port. If this
|
||||
callback is undefined, OSS seq sends a <TT>HEARTBEAT</TT> event to the
|
||||
port.
|
||||
<H3>
|
||||
7.3 Events</H3>
|
||||
Most of the events are processed by sequencer and translated to the adequate
|
||||
ALSA sequencer events, so that each synth device can receive by input_event
|
||||
callback of ALSA sequencer port. The following ALSA events should be implemented
|
||||
by the driver:
|
||||
<BR>
|
||||
<TABLE BORDER WIDTH="75%" NOSAVE >
|
||||
<TR NOSAVE>
|
||||
<TD NOSAVE><B>ALSA event</B></TD>
|
||||
|
||||
<TD><B>Original OSS events</B></TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>NOTEON</TD>
|
||||
|
||||
<TD>SEQ_NOTEON
|
||||
<BR>MIDI_NOTEON</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>NOTE</TD>
|
||||
|
||||
<TD>SEQ_NOTEOFF
|
||||
<BR>MIDI_NOTEOFF</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD NOSAVE>KEYPRESS</TD>
|
||||
|
||||
<TD>MIDI_KEY_PRESSURE</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD>CHANPRESS</TD>
|
||||
|
||||
<TD NOSAVE>SEQ_AFTERTOUCH
|
||||
<BR>MIDI_CHN_PRESSURE</TD>
|
||||
</TR>
|
||||
|
||||
<TR NOSAVE>
|
||||
<TD NOSAVE>PGMCHANGE</TD>
|
||||
|
||||
<TD NOSAVE>SEQ_PGMCHANGE
|
||||
<BR>MIDI_PGM_CHANGE</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>PITCHBEND</TD>
|
||||
|
||||
<TD>SEQ_CONTROLLER(CTRL_PITCH_BENDER)
|
||||
<BR>MIDI_PITCH_BEND</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>CONTROLLER</TD>
|
||||
|
||||
<TD>MIDI_CTL_CHANGE
|
||||
<BR>SEQ_BALANCE (with CTL_PAN)</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>CONTROL14</TD>
|
||||
|
||||
<TD>SEQ_CONTROLLER</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>REGPARAM</TD>
|
||||
|
||||
<TD>SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE)</TD>
|
||||
</TR>
|
||||
|
||||
<TR>
|
||||
<TD>SYSEX</TD>
|
||||
|
||||
<TD>SEQ_SYSEX</TD>
|
||||
</TR>
|
||||
</TABLE>
|
||||
|
||||
<P>The most of these behavior can be realized by MIDI emulation driver
|
||||
included in the Emu8000 lowlevel driver. In the future release, this module
|
||||
will be independent.
|
||||
<P>Some OSS events (<TT>SEQ_PRIVATE</TT> and <TT>SEQ_VOLUME</TT> events) are passed as event
|
||||
type SND_SEQ_OSS_PRIVATE. The OSS sequencer passes these event 8 byte
|
||||
packets without any modification. The lowlevel driver should process these
|
||||
events appropriately.
|
||||
<H2>
|
||||
8. Interface to MIDI Device</H2>
|
||||
Since the OSS emulation probes the creation and deletion of ALSA MIDI sequencer
|
||||
ports automatically by receiving announcement from ALSA sequencer, the
|
||||
MIDI devices don't need to be registered explicitly like synth devices.
|
||||
However, the MIDI port_info registered to ALSA sequencer must include a group
|
||||
name <TT>SND_SEQ_GROUP_DEVICE</TT> and a capability-bit <TT>CAP_READ</TT> or
|
||||
<TT>CAP_WRITE</TT>. Also, subscription capabilities, <TT>CAP_SUBS_READ</TT> or <TT>CAP_SUBS_WRITE</TT>,
|
||||
must be defined, too. If these conditions are not satisfied, the port is not
|
||||
registered as OSS sequencer MIDI device.
|
||||
<P>The events via MIDI devices are parsed in OSS sequencer and converted
|
||||
to the corresponding ALSA sequencer events. The input from MIDI sequencer
|
||||
is also converted to MIDI byte events by OSS sequencer. This works just
|
||||
a reverse way of seq_midi module.
|
||||
<H2>
|
||||
9. Known Problems / TODO's</H2>
|
||||
|
||||
<UL>
|
||||
<LI>
|
||||
Patch loading via ALSA instrument layer is not implemented yet.</LI>
|
||||
</UL>
|
||||
|
||||
</BODY>
|
||||
</HTML>
|
88
Documentation/sound/alsa/serial-u16550.txt
Normal file
88
Documentation/sound/alsa/serial-u16550.txt
Normal file
|
@ -0,0 +1,88 @@
|
|||
|
||||
Serial UART 16450/16550 MIDI driver
|
||||
===================================
|
||||
|
||||
The adaptor module parameter allows you to select either:
|
||||
|
||||
0 - Roland Soundcanvas support (default)
|
||||
1 - Midiator MS-124T support (1)
|
||||
2 - Midiator MS-124W S/A mode (2)
|
||||
3 - MS-124W M/B mode support (3)
|
||||
4 - Generic device with multiple input support (4)
|
||||
|
||||
For the Midiator MS-124W, you must set the physical M-S and A-B
|
||||
switches on the Midiator to match the driver mode you select.
|
||||
|
||||
In Roland Soundcanvas mode, multiple ALSA raw MIDI substreams are supported
|
||||
(midiCnD0-midiCnD15). Whenever you write to a different substream, the driver
|
||||
sends the nonstandard MIDI command sequence F5 NN, where NN is the substream
|
||||
number plus 1. Roland modules use this command to switch between different
|
||||
"parts", so this feature lets you treat each part as a distinct raw MIDI
|
||||
substream. The driver provides no way to send F5 00 (no selection) or to not
|
||||
send the F5 NN command sequence at all; perhaps it ought to.
|
||||
|
||||
Usage example for simple serial converter:
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 speed=115200
|
||||
|
||||
Usage example for Roland SoundCanvas with 4 MIDI ports:
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 outs=4
|
||||
|
||||
In MS-124T mode, one raw MIDI substream is supported (midiCnD0); the outs
|
||||
module parameter is automatically set to 1. The driver sends the same data to
|
||||
all four MIDI Out connectors. Set the A-B switch and the speed module
|
||||
parameter to match (A=19200, B=9600).
|
||||
|
||||
Usage example for MS-124T, with A-B switch in A position:
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 adaptor=1 \
|
||||
speed=19200
|
||||
|
||||
In MS-124W S/A mode, one raw MIDI substream is supported (midiCnD0);
|
||||
the outs module parameter is automatically set to 1. The driver sends
|
||||
the same data to all four MIDI Out connectors at full MIDI speed.
|
||||
|
||||
Usage example for S/A mode:
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 adaptor=2
|
||||
|
||||
In MS-124W M/B mode, the driver supports 16 ALSA raw MIDI substreams;
|
||||
the outs module parameter is automatically set to 16. The substream
|
||||
number gives a bitmask of which MIDI Out connectors the data should be
|
||||
sent to, with midiCnD1 sending to Out 1, midiCnD2 to Out 2, midiCnD4 to
|
||||
Out 3, and midiCnD8 to Out 4. Thus midiCnD15 sends the data to all 4 ports.
|
||||
As a special case, midiCnD0 also sends to all ports, since it is not useful
|
||||
to send the data to no ports. M/B mode has extra overhead to select the MIDI
|
||||
Out for each byte, so the aggregate data rate across all four MIDI Outs is
|
||||
at most one byte every 520 us, as compared with the full MIDI data rate of
|
||||
one byte every 320 us per port.
|
||||
|
||||
Usage example for M/B mode:
|
||||
|
||||
/sbin/setserial /dev/ttyS0 uart none
|
||||
/sbin/modprobe snd-serial-u16550 port=0x3f8 irq=4 adaptor=3
|
||||
|
||||
The MS-124W hardware's M/A mode is currently not supported. This mode allows
|
||||
the MIDI Outs to act independently at double the aggregate throughput of M/B,
|
||||
but does not allow sending the same byte simultaneously to multiple MIDI Outs.
|
||||
The M/A protocol requires the driver to twiddle the modem control lines under
|
||||
timing constraints, so it would be a bit more complicated to implement than
|
||||
the other modes.
|
||||
|
||||
Midiator models other than MS-124W and MS-124T are currently not supported.
|
||||
Note that the suffix letter is significant; the MS-124 and MS-124B are not
|
||||
compatible, nor are the other known models MS-101, MS-101B, MS-103, and MS-114.
|
||||
I do have documentation (tim.mann@compaq.com) that partially covers these models,
|
||||
but no units to experiment with. The MS-124W support is tested with a real unit.
|
||||
The MS-124T support is untested, but should work.
|
||||
|
||||
The Generic driver supports multiple input and output substreams over a single
|
||||
serial port. Similar to Roland Soundcanvas mode, F5 NN is used to select the
|
||||
appropriate input or output stream (depending on the data direction).
|
||||
Additionally, the CTS signal is used to regulate the data flow. The number of
|
||||
inputs is specified by the ins parameter.
|
56
Documentation/sound/alsa/soc/DAI.txt
Normal file
56
Documentation/sound/alsa/soc/DAI.txt
Normal file
|
@ -0,0 +1,56 @@
|
|||
ASoC currently supports the three main Digital Audio Interfaces (DAI) found on
|
||||
SoC controllers and portable audio CODECs today, namely AC97, I2S and PCM.
|
||||
|
||||
|
||||
AC97
|
||||
====
|
||||
|
||||
AC97 is a five wire interface commonly found on many PC sound cards. It is
|
||||
now also popular in many portable devices. This DAI has a reset line and time
|
||||
multiplexes its data on its SDATA_OUT (playback) and SDATA_IN (capture) lines.
|
||||
The bit clock (BCLK) is always driven by the CODEC (usually 12.288MHz) and the
|
||||
frame (FRAME) (usually 48kHz) is always driven by the controller. Each AC97
|
||||
frame is 21uS long and is divided into 13 time slots.
|
||||
|
||||
The AC97 specification can be found at :-
|
||||
http://www.intel.com/p/en_US/business/design
|
||||
|
||||
|
||||
I2S
|
||||
===
|
||||
|
||||
I2S is a common 4 wire DAI used in HiFi, STB and portable devices. The Tx and
|
||||
Rx lines are used for audio transmission, whilst the bit clock (BCLK) and
|
||||
left/right clock (LRC) synchronise the link. I2S is flexible in that either the
|
||||
controller or CODEC can drive (master) the BCLK and LRC clock lines. Bit clock
|
||||
usually varies depending on the sample rate and the master system clock
|
||||
(SYSCLK). LRCLK is the same as the sample rate. A few devices support separate
|
||||
ADC and DAC LRCLKs, this allows for simultaneous capture and playback at
|
||||
different sample rates.
|
||||
|
||||
I2S has several different operating modes:-
|
||||
|
||||
o I2S - MSB is transmitted on the falling edge of the first BCLK after LRC
|
||||
transition.
|
||||
|
||||
o Left Justified - MSB is transmitted on transition of LRC.
|
||||
|
||||
o Right Justified - MSB is transmitted sample size BCLKs before LRC
|
||||
transition.
|
||||
|
||||
PCM
|
||||
===
|
||||
|
||||
PCM is another 4 wire interface, very similar to I2S, which can support a more
|
||||
flexible protocol. It has bit clock (BCLK) and sync (SYNC) lines that are used
|
||||
to synchronise the link whilst the Tx and Rx lines are used to transmit and
|
||||
receive the audio data. Bit clock usually varies depending on sample rate
|
||||
whilst sync runs at the sample rate. PCM also supports Time Division
|
||||
Multiplexing (TDM) in that several devices can use the bus simultaneously (this
|
||||
is sometimes referred to as network mode).
|
||||
|
||||
Common PCM operating modes:-
|
||||
|
||||
o Mode A - MSB is transmitted on falling edge of first BCLK after FRAME/SYNC.
|
||||
|
||||
o Mode B - MSB is transmitted on rising edge of FRAME/SYNC.
|
380
Documentation/sound/alsa/soc/DPCM.txt
Normal file
380
Documentation/sound/alsa/soc/DPCM.txt
Normal file
|
@ -0,0 +1,380 @@
|
|||
Dynamic PCM
|
||||
===========
|
||||
|
||||
1. Description
|
||||
==============
|
||||
|
||||
Dynamic PCM allows an ALSA PCM device to digitally route its PCM audio to
|
||||
various digital endpoints during the PCM stream runtime. e.g. PCM0 can route
|
||||
digital audio to I2S DAI0, I2S DAI1 or PDM DAI2. This is useful for on SoC DSP
|
||||
drivers that expose several ALSA PCMs and can route to multiple DAIs.
|
||||
|
||||
The DPCM runtime routing is determined by the ALSA mixer settings in the same
|
||||
way as the analog signal is routed in an ASoC codec driver. DPCM uses a DAPM
|
||||
graph representing the DSP internal audio paths and uses the mixer settings to
|
||||
determine the patch used by each ALSA PCM.
|
||||
|
||||
DPCM re-uses all the existing component codec, platform and DAI drivers without
|
||||
any modifications.
|
||||
|
||||
|
||||
Phone Audio System with SoC based DSP
|
||||
-------------------------------------
|
||||
|
||||
Consider the following phone audio subsystem. This will be used in this
|
||||
document for all examples :-
|
||||
|
||||
| Front End PCMs | SoC DSP | Back End DAIs | Audio devices |
|
||||
|
||||
*************
|
||||
PCM0 <------------> * * <----DAI0-----> Codec Headset
|
||||
* *
|
||||
PCM1 <------------> * * <----DAI1-----> Codec Speakers
|
||||
* DSP *
|
||||
PCM2 <------------> * * <----DAI2-----> MODEM
|
||||
* *
|
||||
PCM3 <------------> * * <----DAI3-----> BT
|
||||
* *
|
||||
* * <----DAI4-----> DMIC
|
||||
* *
|
||||
* * <----DAI5-----> FM
|
||||
*************
|
||||
|
||||
This diagram shows a simple smart phone audio subsystem. It supports Bluetooth,
|
||||
FM digital radio, Speakers, Headset Jack, digital microphones and cellular
|
||||
modem. This sound card exposes 4 DSP front end (FE) ALSA PCM devices and
|
||||
supports 6 back end (BE) DAIs. Each FE PCM can digitally route audio data to any
|
||||
of the BE DAIs. The FE PCM devices can also route audio to more than 1 BE DAI.
|
||||
|
||||
|
||||
|
||||
Example - DPCM Switching playback from DAI0 to DAI1
|
||||
---------------------------------------------------
|
||||
|
||||
Audio is being played to the Headset. After a while the user removes the headset
|
||||
and audio continues playing on the speakers.
|
||||
|
||||
Playback on PCM0 to Headset would look like :-
|
||||
|
||||
*************
|
||||
PCM0 <============> * * <====DAI0=====> Codec Headset
|
||||
* *
|
||||
PCM1 <------------> * * <----DAI1-----> Codec Speakers
|
||||
* DSP *
|
||||
PCM2 <------------> * * <----DAI2-----> MODEM
|
||||
* *
|
||||
PCM3 <------------> * * <----DAI3-----> BT
|
||||
* *
|
||||
* * <----DAI4-----> DMIC
|
||||
* *
|
||||
* * <----DAI5-----> FM
|
||||
*************
|
||||
|
||||
The headset is removed from the jack by user so the speakers must now be used :-
|
||||
|
||||
*************
|
||||
PCM0 <============> * * <----DAI0-----> Codec Headset
|
||||
* *
|
||||
PCM1 <------------> * * <====DAI1=====> Codec Speakers
|
||||
* DSP *
|
||||
PCM2 <------------> * * <----DAI2-----> MODEM
|
||||
* *
|
||||
PCM3 <------------> * * <----DAI3-----> BT
|
||||
* *
|
||||
* * <----DAI4-----> DMIC
|
||||
* *
|
||||
* * <----DAI5-----> FM
|
||||
*************
|
||||
|
||||
The audio driver processes this as follows :-
|
||||
|
||||
1) Machine driver receives Jack removal event.
|
||||
|
||||
2) Machine driver OR audio HAL disables the Headset path.
|
||||
|
||||
3) DPCM runs the PCM trigger(stop), hw_free(), shutdown() operations on DAI0
|
||||
for headset since the path is now disabled.
|
||||
|
||||
4) Machine driver or audio HAL enables the speaker path.
|
||||
|
||||
5) DPCM runs the PCM ops for startup(), hw_params(), prepapre() and
|
||||
trigger(start) for DAI1 Speakers since the path is enabled.
|
||||
|
||||
In this example, the machine driver or userspace audio HAL can alter the routing
|
||||
and then DPCM will take care of managing the DAI PCM operations to either bring
|
||||
the link up or down. Audio playback does not stop during this transition.
|
||||
|
||||
|
||||
|
||||
DPCM machine driver
|
||||
===================
|
||||
|
||||
The DPCM enabled ASoC machine driver is similar to normal machine drivers
|
||||
except that we also have to :-
|
||||
|
||||
1) Define the FE and BE DAI links.
|
||||
|
||||
2) Define any FE/BE PCM operations.
|
||||
|
||||
3) Define widget graph connections.
|
||||
|
||||
|
||||
1 FE and BE DAI links
|
||||
---------------------
|
||||
|
||||
| Front End PCMs | SoC DSP | Back End DAIs | Audio devices |
|
||||
|
||||
*************
|
||||
PCM0 <------------> * * <----DAI0-----> Codec Headset
|
||||
* *
|
||||
PCM1 <------------> * * <----DAI1-----> Codec Speakers
|
||||
* DSP *
|
||||
PCM2 <------------> * * <----DAI2-----> MODEM
|
||||
* *
|
||||
PCM3 <------------> * * <----DAI3-----> BT
|
||||
* *
|
||||
* * <----DAI4-----> DMIC
|
||||
* *
|
||||
* * <----DAI5-----> FM
|
||||
*************
|
||||
|
||||
For the example above we have to define 4 FE DAI links and 6 BE DAI links. The
|
||||
FE DAI links are defined as follows :-
|
||||
|
||||
static struct snd_soc_dai_link machine_dais[] = {
|
||||
{
|
||||
.name = "PCM0 System",
|
||||
.stream_name = "System Playback",
|
||||
.cpu_dai_name = "System Pin",
|
||||
.platform_name = "dsp-audio",
|
||||
.codec_name = "snd-soc-dummy",
|
||||
.codec_dai_name = "snd-soc-dummy-dai",
|
||||
.dynamic = 1,
|
||||
.trigger = {SND_SOC_DPCM_TRIGGER_POST, SND_SOC_DPCM_TRIGGER_POST},
|
||||
.dpcm_playback = 1,
|
||||
},
|
||||
.....< other FE and BE DAI links here >
|
||||
};
|
||||
|
||||
This FE DAI link is pretty similar to a regular DAI link except that we also
|
||||
set the DAI link to a DPCM FE with the "dynamic = 1". The supported FE stream
|
||||
directions should also be set with the "dpcm_playback" and "dpcm_capture"
|
||||
flags. There is also an option to specify the ordering of the trigger call for
|
||||
each FE. This allows the ASoC core to trigger the DSP before or after the other
|
||||
components (as some DSPs have strong requirements for the ordering DAI/DSP
|
||||
start and stop sequences).
|
||||
|
||||
The FE DAI above sets the codec and code DAIs to dummy devices since the BE is
|
||||
dynamic and will change depending on runtime config.
|
||||
|
||||
The BE DAIs are configured as follows :-
|
||||
|
||||
static struct snd_soc_dai_link machine_dais[] = {
|
||||
.....< FE DAI links here >
|
||||
{
|
||||
.name = "Codec Headset",
|
||||
.cpu_dai_name = "ssp-dai.0",
|
||||
.platform_name = "snd-soc-dummy",
|
||||
.no_pcm = 1,
|
||||
.codec_name = "rt5640.0-001c",
|
||||
.codec_dai_name = "rt5640-aif1",
|
||||
.ignore_suspend = 1,
|
||||
.ignore_pmdown_time = 1,
|
||||
.be_hw_params_fixup = hswult_ssp0_fixup,
|
||||
.ops = &haswell_ops,
|
||||
.dpcm_playback = 1,
|
||||
.dpcm_capture = 1,
|
||||
},
|
||||
.....< other BE DAI links here >
|
||||
};
|
||||
|
||||
This BE DAI link connects DAI0 to the codec (in this case RT5460 AIF1). It sets
|
||||
the "no_pcm" flag to mark it has a BE and sets flags for supported stream
|
||||
directions using "dpcm_playback" and "dpcm_capture" above.
|
||||
|
||||
The BE has also flags set for ignoring suspend and PM down time. This allows
|
||||
the BE to work in a hostless mode where the host CPU is not transferring data
|
||||
like a BT phone call :-
|
||||
|
||||
*************
|
||||
PCM0 <------------> * * <----DAI0-----> Codec Headset
|
||||
* *
|
||||
PCM1 <------------> * * <----DAI1-----> Codec Speakers
|
||||
* DSP *
|
||||
PCM2 <------------> * * <====DAI2=====> MODEM
|
||||
* *
|
||||
PCM3 <------------> * * <====DAI3=====> BT
|
||||
* *
|
||||
* * <----DAI4-----> DMIC
|
||||
* *
|
||||
* * <----DAI5-----> FM
|
||||
*************
|
||||
|
||||
This allows the host CPU to sleep whilst the DSP, MODEM DAI and the BT DAI are
|
||||
still in operation.
|
||||
|
||||
A BE DAI link can also set the codec to a dummy device if the code is a device
|
||||
that is managed externally.
|
||||
|
||||
Likewise a BE DAI can also set a dummy cpu DAI if the CPU DAI is managed by the
|
||||
DSP firmware.
|
||||
|
||||
|
||||
2 FE/BE PCM operations
|
||||
----------------------
|
||||
|
||||
The BE above also exports some PCM operations and a "fixup" callback. The fixup
|
||||
callback is used by the machine driver to (re)configure the DAI based upon the
|
||||
FE hw params. i.e. the DSP may perform SRC or ASRC from the FE to BE.
|
||||
|
||||
e.g. DSP converts all FE hw params to run at fixed rate of 48k, 16bit, stereo for
|
||||
DAI0. This means all FE hw_params have to be fixed in the machine driver for
|
||||
DAI0 so that the DAI is running at desired configuration regardless of the FE
|
||||
configuration.
|
||||
|
||||
static int dai0_fixup(struct snd_soc_pcm_runtime *rtd,
|
||||
struct snd_pcm_hw_params *params)
|
||||
{
|
||||
struct snd_interval *rate = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_RATE);
|
||||
struct snd_interval *channels = hw_param_interval(params,
|
||||
SNDRV_PCM_HW_PARAM_CHANNELS);
|
||||
|
||||
/* The DSP will covert the FE rate to 48k, stereo */
|
||||
rate->min = rate->max = 48000;
|
||||
channels->min = channels->max = 2;
|
||||
|
||||
/* set DAI0 to 16 bit */
|
||||
snd_mask_set(¶ms->masks[SNDRV_PCM_HW_PARAM_FORMAT -
|
||||
SNDRV_PCM_HW_PARAM_FIRST_MASK],
|
||||
SNDRV_PCM_FORMAT_S16_LE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
The other PCM operation are the same as for regular DAI links. Use as necessary.
|
||||
|
||||
|
||||
3 Widget graph connections
|
||||
--------------------------
|
||||
|
||||
The BE DAI links will normally be connected to the graph at initialisation time
|
||||
by the ASoC DAPM core. However, if the BE codec or BE DAI is a dummy then this
|
||||
has to be set explicitly in the driver :-
|
||||
|
||||
/* BE for codec Headset - DAI0 is dummy and managed by DSP FW */
|
||||
{"DAI0 CODEC IN", NULL, "AIF1 Capture"},
|
||||
{"AIF1 Playback", NULL, "DAI0 CODEC OUT"},
|
||||
|
||||
|
||||
Writing a DPCM DSP driver
|
||||
=========================
|
||||
|
||||
The DPCM DSP driver looks much like a standard platform class ASoC driver
|
||||
combined with elements from a codec class driver. A DSP platform driver must
|
||||
implement :-
|
||||
|
||||
1) Front End PCM DAIs - i.e. struct snd_soc_dai_driver.
|
||||
|
||||
2) DAPM graph showing DSP audio routing from FE DAIs to BEs.
|
||||
|
||||
3) DAPM widgets from DSP graph.
|
||||
|
||||
4) Mixers for gains, routing, etc.
|
||||
|
||||
5) DMA configuration.
|
||||
|
||||
6) BE AIF widgets.
|
||||
|
||||
Items 6 is important for routing the audio outside of the DSP. AIF need to be
|
||||
defined for each BE and each stream direction. e.g for BE DAI0 above we would
|
||||
have :-
|
||||
|
||||
SND_SOC_DAPM_AIF_IN("DAI0 RX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("DAI0 TX", NULL, 0, SND_SOC_NOPM, 0, 0),
|
||||
|
||||
The BE AIF are used to connect the DSP graph to the graphs for the other
|
||||
component drivers (e.g. codec graph).
|
||||
|
||||
|
||||
Hostless PCM streams
|
||||
====================
|
||||
|
||||
A hostless PCM stream is a stream that is not routed through the host CPU. An
|
||||
example of this would be a phone call from handset to modem.
|
||||
|
||||
|
||||
*************
|
||||
PCM0 <------------> * * <----DAI0-----> Codec Headset
|
||||
* *
|
||||
PCM1 <------------> * * <====DAI1=====> Codec Speakers/Mic
|
||||
* DSP *
|
||||
PCM2 <------------> * * <====DAI2=====> MODEM
|
||||
* *
|
||||
PCM3 <------------> * * <----DAI3-----> BT
|
||||
* *
|
||||
* * <----DAI4-----> DMIC
|
||||
* *
|
||||
* * <----DAI5-----> FM
|
||||
*************
|
||||
|
||||
In this case the PCM data is routed via the DSP. The host CPU in this use case
|
||||
is only used for control and can sleep during the runtime of the stream.
|
||||
|
||||
The host can control the hostless link either by :-
|
||||
|
||||
1) Configuring the link as a CODEC <-> CODEC style link. In this case the link
|
||||
is enabled or disabled by the state of the DAPM graph. This usually means
|
||||
there is a mixer control that can be used to connect or disconnect the path
|
||||
between both DAIs.
|
||||
|
||||
2) Hostless FE. This FE has a virtual connection to the BE DAI links on the DAPM
|
||||
graph. Control is then carried out by the FE as regular PCM operations.
|
||||
This method gives more control over the DAI links, but requires much more
|
||||
userspace code to control the link. Its recommended to use CODEC<->CODEC
|
||||
unless your HW needs more fine grained sequencing of the PCM ops.
|
||||
|
||||
|
||||
CODEC <-> CODEC link
|
||||
--------------------
|
||||
|
||||
This DAI link is enabled when DAPM detects a valid path within the DAPM graph.
|
||||
The machine driver sets some additional parameters to the DAI link i.e.
|
||||
|
||||
static const struct snd_soc_pcm_stream dai_params = {
|
||||
.formats = SNDRV_PCM_FMTBIT_S32_LE,
|
||||
.rate_min = 8000,
|
||||
.rate_max = 8000,
|
||||
.channels_min = 2,
|
||||
.channels_max = 2,
|
||||
};
|
||||
|
||||
static struct snd_soc_dai_link dais[] = {
|
||||
< ... more DAI links above ... >
|
||||
{
|
||||
.name = "MODEM",
|
||||
.stream_name = "MODEM",
|
||||
.cpu_dai_name = "dai2",
|
||||
.codec_dai_name = "modem-aif1",
|
||||
.codec_name = "modem",
|
||||
.dai_fmt = SND_SOC_DAIFMT_I2S | SND_SOC_DAIFMT_NB_NF
|
||||
| SND_SOC_DAIFMT_CBM_CFM,
|
||||
.params = &dai_params,
|
||||
}
|
||||
< ... more DAI links here ... >
|
||||
|
||||
These parameters are used to configure the DAI hw_params() when DAPM detects a
|
||||
valid path and then calls the PCM operations to start the link. DAPM will also
|
||||
call the appropriate PCM operations to disable the DAI when the path is no
|
||||
longer valid.
|
||||
|
||||
|
||||
Hostless FE
|
||||
-----------
|
||||
|
||||
The DAI link(s) are enabled by a FE that does not read or write any PCM data.
|
||||
This means creating a new FE that is connected with a virtual path to both
|
||||
DAI links. The DAI links will be started when the FE PCM is started and stopped
|
||||
when the FE PCM is stopped. Note that the FE PCM cannot read or write data in
|
||||
this configuration.
|
||||
|
||||
|
51
Documentation/sound/alsa/soc/clocking.txt
Normal file
51
Documentation/sound/alsa/soc/clocking.txt
Normal file
|
@ -0,0 +1,51 @@
|
|||
Audio Clocking
|
||||
==============
|
||||
|
||||
This text describes the audio clocking terms in ASoC and digital audio in
|
||||
general. Note: Audio clocking can be complex!
|
||||
|
||||
|
||||
Master Clock
|
||||
------------
|
||||
|
||||
Every audio subsystem is driven by a master clock (sometimes referred to as MCLK
|
||||
or SYSCLK). This audio master clock can be derived from a number of sources
|
||||
(e.g. crystal, PLL, CPU clock) and is responsible for producing the correct
|
||||
audio playback and capture sample rates.
|
||||
|
||||
Some master clocks (e.g. PLLs and CPU based clocks) are configurable in that
|
||||
their speed can be altered by software (depending on the system use and to save
|
||||
power). Other master clocks are fixed at a set frequency (i.e. crystals).
|
||||
|
||||
|
||||
DAI Clocks
|
||||
----------
|
||||
The Digital Audio Interface is usually driven by a Bit Clock (often referred to
|
||||
as BCLK). This clock is used to drive the digital audio data across the link
|
||||
between the codec and CPU.
|
||||
|
||||
The DAI also has a frame clock to signal the start of each audio frame. This
|
||||
clock is sometimes referred to as LRC (left right clock) or FRAME. This clock
|
||||
runs at exactly the sample rate (LRC = Rate).
|
||||
|
||||
Bit Clock can be generated as follows:-
|
||||
|
||||
BCLK = MCLK / x
|
||||
|
||||
or
|
||||
|
||||
BCLK = LRC * x
|
||||
|
||||
or
|
||||
|
||||
BCLK = LRC * Channels * Word Size
|
||||
|
||||
This relationship depends on the codec or SoC CPU in particular. In general
|
||||
it is best to configure BCLK to the lowest possible speed (depending on your
|
||||
rate, number of channels and word size) to save on power.
|
||||
|
||||
It is also desirable to use the codec (if possible) to drive (or master) the
|
||||
audio clocks as it usually gives more accurate sample rates than the CPU.
|
||||
|
||||
|
||||
|
179
Documentation/sound/alsa/soc/codec.txt
Normal file
179
Documentation/sound/alsa/soc/codec.txt
Normal file
|
@ -0,0 +1,179 @@
|
|||
ASoC Codec Class Driver
|
||||
=======================
|
||||
|
||||
The codec class driver is generic and hardware independent code that configures
|
||||
the codec, FM, MODEM, BT or external DSP to provide audio capture and playback.
|
||||
It should contain no code that is specific to the target platform or machine.
|
||||
All platform and machine specific code should be added to the platform and
|
||||
machine drivers respectively.
|
||||
|
||||
Each codec class driver *must* provide the following features:-
|
||||
|
||||
1) Codec DAI and PCM configuration
|
||||
2) Codec control IO - using RegMap API
|
||||
3) Mixers and audio controls
|
||||
4) Codec audio operations
|
||||
5) DAPM description.
|
||||
6) DAPM event handler.
|
||||
|
||||
Optionally, codec drivers can also provide:-
|
||||
|
||||
7) DAC Digital mute control.
|
||||
|
||||
Its probably best to use this guide in conjunction with the existing codec
|
||||
driver code in sound/soc/codecs/
|
||||
|
||||
ASoC Codec driver breakdown
|
||||
===========================
|
||||
|
||||
1 - Codec DAI and PCM configuration
|
||||
-----------------------------------
|
||||
Each codec driver must have a struct snd_soc_dai_driver to define its DAI and
|
||||
PCM capabilities and operations. This struct is exported so that it can be
|
||||
registered with the core by your machine driver.
|
||||
|
||||
e.g.
|
||||
|
||||
static struct snd_soc_dai_ops wm8731_dai_ops = {
|
||||
.prepare = wm8731_pcm_prepare,
|
||||
.hw_params = wm8731_hw_params,
|
||||
.shutdown = wm8731_shutdown,
|
||||
.digital_mute = wm8731_mute,
|
||||
.set_sysclk = wm8731_set_dai_sysclk,
|
||||
.set_fmt = wm8731_set_dai_fmt,
|
||||
};
|
||||
|
||||
struct snd_soc_dai_driver wm8731_dai = {
|
||||
.name = "wm8731-hifi",
|
||||
.playback = {
|
||||
.stream_name = "Playback",
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rates = WM8731_RATES,
|
||||
.formats = WM8731_FORMATS,},
|
||||
.capture = {
|
||||
.stream_name = "Capture",
|
||||
.channels_min = 1,
|
||||
.channels_max = 2,
|
||||
.rates = WM8731_RATES,
|
||||
.formats = WM8731_FORMATS,},
|
||||
.ops = &wm8731_dai_ops,
|
||||
.symmetric_rates = 1,
|
||||
};
|
||||
|
||||
|
||||
2 - Codec control IO
|
||||
--------------------
|
||||
The codec can usually be controlled via an I2C or SPI style interface
|
||||
(AC97 combines control with data in the DAI). The codec driver should use the
|
||||
Regmap API for all codec IO. Please see include/linux/regmap.h and existing
|
||||
codec drivers for example regmap usage.
|
||||
|
||||
|
||||
3 - Mixers and audio controls
|
||||
-----------------------------
|
||||
All the codec mixers and audio controls can be defined using the convenience
|
||||
macros defined in soc.h.
|
||||
|
||||
#define SOC_SINGLE(xname, reg, shift, mask, invert)
|
||||
|
||||
Defines a single control as follows:-
|
||||
|
||||
xname = Control name e.g. "Playback Volume"
|
||||
reg = codec register
|
||||
shift = control bit(s) offset in register
|
||||
mask = control bit size(s) e.g. mask of 7 = 3 bits
|
||||
invert = the control is inverted
|
||||
|
||||
Other macros include:-
|
||||
|
||||
#define SOC_DOUBLE(xname, reg, shift_left, shift_right, mask, invert)
|
||||
|
||||
A stereo control
|
||||
|
||||
#define SOC_DOUBLE_R(xname, reg_left, reg_right, shift, mask, invert)
|
||||
|
||||
A stereo control spanning 2 registers
|
||||
|
||||
#define SOC_ENUM_SINGLE(xreg, xshift, xmask, xtexts)
|
||||
|
||||
Defines an single enumerated control as follows:-
|
||||
|
||||
xreg = register
|
||||
xshift = control bit(s) offset in register
|
||||
xmask = control bit(s) size
|
||||
xtexts = pointer to array of strings that describe each setting
|
||||
|
||||
#define SOC_ENUM_DOUBLE(xreg, xshift_l, xshift_r, xmask, xtexts)
|
||||
|
||||
Defines a stereo enumerated control
|
||||
|
||||
|
||||
4 - Codec Audio Operations
|
||||
--------------------------
|
||||
The codec driver also supports the following ALSA PCM operations:-
|
||||
|
||||
/* SoC audio ops */
|
||||
struct snd_soc_ops {
|
||||
int (*startup)(struct snd_pcm_substream *);
|
||||
void (*shutdown)(struct snd_pcm_substream *);
|
||||
int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
|
||||
int (*hw_free)(struct snd_pcm_substream *);
|
||||
int (*prepare)(struct snd_pcm_substream *);
|
||||
};
|
||||
|
||||
Please refer to the ALSA driver PCM documentation for details.
|
||||
http://www.alsa-project.org/~iwai/writing-an-alsa-driver/
|
||||
|
||||
|
||||
5 - DAPM description.
|
||||
---------------------
|
||||
The Dynamic Audio Power Management description describes the codec power
|
||||
components and their relationships and registers to the ASoC core.
|
||||
Please read dapm.txt for details of building the description.
|
||||
|
||||
Please also see the examples in other codec drivers.
|
||||
|
||||
|
||||
6 - DAPM event handler
|
||||
----------------------
|
||||
This function is a callback that handles codec domain PM calls and system
|
||||
domain PM calls (e.g. suspend and resume). It is used to put the codec
|
||||
to sleep when not in use.
|
||||
|
||||
Power states:-
|
||||
|
||||
SNDRV_CTL_POWER_D0: /* full On */
|
||||
/* vref/mid, clk and osc on, active */
|
||||
|
||||
SNDRV_CTL_POWER_D1: /* partial On */
|
||||
SNDRV_CTL_POWER_D2: /* partial On */
|
||||
|
||||
SNDRV_CTL_POWER_D3hot: /* Off, with power */
|
||||
/* everything off except vref/vmid, inactive */
|
||||
|
||||
SNDRV_CTL_POWER_D3cold: /* Everything Off, without power */
|
||||
|
||||
|
||||
7 - Codec DAC digital mute control
|
||||
----------------------------------
|
||||
Most codecs have a digital mute before the DACs that can be used to
|
||||
minimise any system noise. The mute stops any digital data from
|
||||
entering the DAC.
|
||||
|
||||
A callback can be created that is called by the core for each codec DAI
|
||||
when the mute is applied or freed.
|
||||
|
||||
i.e.
|
||||
|
||||
static int wm8974_mute(struct snd_soc_dai *dai, int mute)
|
||||
{
|
||||
struct snd_soc_codec *codec = dai->codec;
|
||||
u16 mute_reg = snd_soc_read(codec, WM8974_DAC) & 0xffbf;
|
||||
|
||||
if (mute)
|
||||
snd_soc_write(codec, WM8974_DAC, mute_reg | 0x40);
|
||||
else
|
||||
snd_soc_write(codec, WM8974_DAC, mute_reg);
|
||||
return 0;
|
||||
}
|
305
Documentation/sound/alsa/soc/dapm.txt
Normal file
305
Documentation/sound/alsa/soc/dapm.txt
Normal file
|
@ -0,0 +1,305 @@
|
|||
Dynamic Audio Power Management for Portable Devices
|
||||
===================================================
|
||||
|
||||
1. Description
|
||||
==============
|
||||
|
||||
Dynamic Audio Power Management (DAPM) is designed to allow portable
|
||||
Linux devices to use the minimum amount of power within the audio
|
||||
subsystem at all times. It is independent of other kernel PM and as
|
||||
such, can easily co-exist with the other PM systems.
|
||||
|
||||
DAPM is also completely transparent to all user space applications as
|
||||
all power switching is done within the ASoC core. No code changes or
|
||||
recompiling are required for user space applications. DAPM makes power
|
||||
switching decisions based upon any audio stream (capture/playback)
|
||||
activity and audio mixer settings within the device.
|
||||
|
||||
DAPM spans the whole machine. It covers power control within the entire
|
||||
audio subsystem, this includes internal codec power blocks and machine
|
||||
level power systems.
|
||||
|
||||
There are 4 power domains within DAPM
|
||||
|
||||
1. Codec bias domain - VREF, VMID (core codec and audio power)
|
||||
Usually controlled at codec probe/remove and suspend/resume, although
|
||||
can be set at stream time if power is not needed for sidetone, etc.
|
||||
|
||||
2. Platform/Machine domain - physically connected inputs and outputs
|
||||
Is platform/machine and user action specific, is configured by the
|
||||
machine driver and responds to asynchronous events e.g when HP
|
||||
are inserted
|
||||
|
||||
3. Path domain - audio subsystem signal paths
|
||||
Automatically set when mixer and mux settings are changed by the user.
|
||||
e.g. alsamixer, amixer.
|
||||
|
||||
4. Stream domain - DACs and ADCs.
|
||||
Enabled and disabled when stream playback/capture is started and
|
||||
stopped respectively. e.g. aplay, arecord.
|
||||
|
||||
All DAPM power switching decisions are made automatically by consulting an audio
|
||||
routing map of the whole machine. This map is specific to each machine and
|
||||
consists of the interconnections between every audio component (including
|
||||
internal codec components). All audio components that effect power are called
|
||||
widgets hereafter.
|
||||
|
||||
|
||||
2. DAPM Widgets
|
||||
===============
|
||||
|
||||
Audio DAPM widgets fall into a number of types:-
|
||||
|
||||
o Mixer - Mixes several analog signals into a single analog signal.
|
||||
o Mux - An analog switch that outputs only one of many inputs.
|
||||
o PGA - A programmable gain amplifier or attenuation widget.
|
||||
o ADC - Analog to Digital Converter
|
||||
o DAC - Digital to Analog Converter
|
||||
o Switch - An analog switch
|
||||
o Input - A codec input pin
|
||||
o Output - A codec output pin
|
||||
o Headphone - Headphone (and optional Jack)
|
||||
o Mic - Mic (and optional Jack)
|
||||
o Line - Line Input/Output (and optional Jack)
|
||||
o Speaker - Speaker
|
||||
o Supply - Power or clock supply widget used by other widgets.
|
||||
o Regulator - External regulator that supplies power to audio components.
|
||||
o Clock - External clock that supplies clock to audio components.
|
||||
o AIF IN - Audio Interface Input (with TDM slot mask).
|
||||
o AIF OUT - Audio Interface Output (with TDM slot mask).
|
||||
o Siggen - Signal Generator.
|
||||
o DAI IN - Digital Audio Interface Input.
|
||||
o DAI OUT - Digital Audio Interface Output.
|
||||
o DAI Link - DAI Link between two DAI structures */
|
||||
o Pre - Special PRE widget (exec before all others)
|
||||
o Post - Special POST widget (exec after all others)
|
||||
|
||||
(Widgets are defined in include/sound/soc-dapm.h)
|
||||
|
||||
Widgets can be added to the sound card by any of the component driver types.
|
||||
There are convenience macros defined in soc-dapm.h that can be used to quickly
|
||||
build a list of widgets of the codecs and machines DAPM widgets.
|
||||
|
||||
Most widgets have a name, register, shift and invert. Some widgets have extra
|
||||
parameters for stream name and kcontrols.
|
||||
|
||||
|
||||
2.1 Stream Domain Widgets
|
||||
-------------------------
|
||||
|
||||
Stream Widgets relate to the stream power domain and only consist of ADCs
|
||||
(analog to digital converters), DACs (digital to analog converters),
|
||||
AIF IN and AIF OUT.
|
||||
|
||||
Stream widgets have the following format:-
|
||||
|
||||
SND_SOC_DAPM_DAC(name, stream name, reg, shift, invert),
|
||||
SND_SOC_DAPM_AIF_IN(name, stream, slot, reg, shift, invert)
|
||||
|
||||
NOTE: the stream name must match the corresponding stream name in your codec
|
||||
snd_soc_codec_dai.
|
||||
|
||||
e.g. stream widgets for HiFi playback and capture
|
||||
|
||||
SND_SOC_DAPM_DAC("HiFi DAC", "HiFi Playback", REG, 3, 1),
|
||||
SND_SOC_DAPM_ADC("HiFi ADC", "HiFi Capture", REG, 2, 1),
|
||||
|
||||
e.g. stream widgets for AIF
|
||||
|
||||
SND_SOC_DAPM_AIF_IN("AIF1RX", "AIF1 Playback", 0, SND_SOC_NOPM, 0, 0),
|
||||
SND_SOC_DAPM_AIF_OUT("AIF1TX", "AIF1 Capture", 0, SND_SOC_NOPM, 0, 0),
|
||||
|
||||
|
||||
2.2 Path Domain Widgets
|
||||
-----------------------
|
||||
|
||||
Path domain widgets have a ability to control or affect the audio signal or
|
||||
audio paths within the audio subsystem. They have the following form:-
|
||||
|
||||
SND_SOC_DAPM_PGA(name, reg, shift, invert, controls, num_controls)
|
||||
|
||||
Any widget kcontrols can be set using the controls and num_controls members.
|
||||
|
||||
e.g. Mixer widget (the kcontrols are declared first)
|
||||
|
||||
/* Output Mixer */
|
||||
static const snd_kcontrol_new_t wm8731_output_mixer_controls[] = {
|
||||
SOC_DAPM_SINGLE("Line Bypass Switch", WM8731_APANA, 3, 1, 0),
|
||||
SOC_DAPM_SINGLE("Mic Sidetone Switch", WM8731_APANA, 5, 1, 0),
|
||||
SOC_DAPM_SINGLE("HiFi Playback Switch", WM8731_APANA, 4, 1, 0),
|
||||
};
|
||||
|
||||
SND_SOC_DAPM_MIXER("Output Mixer", WM8731_PWR, 4, 1, wm8731_output_mixer_controls,
|
||||
ARRAY_SIZE(wm8731_output_mixer_controls)),
|
||||
|
||||
If you dont want the mixer elements prefixed with the name of the mixer widget,
|
||||
you can use SND_SOC_DAPM_MIXER_NAMED_CTL instead. the parameters are the same
|
||||
as for SND_SOC_DAPM_MIXER.
|
||||
|
||||
|
||||
2.3 Machine domain Widgets
|
||||
--------------------------
|
||||
|
||||
Machine widgets are different from codec widgets in that they don't have a
|
||||
codec register bit associated with them. A machine widget is assigned to each
|
||||
machine audio component (non codec or DSP) that can be independently
|
||||
powered. e.g.
|
||||
|
||||
o Speaker Amp
|
||||
o Microphone Bias
|
||||
o Jack connectors
|
||||
|
||||
A machine widget can have an optional call back.
|
||||
|
||||
e.g. Jack connector widget for an external Mic that enables Mic Bias
|
||||
when the Mic is inserted:-
|
||||
|
||||
static int spitz_mic_bias(struct snd_soc_dapm_widget* w, int event)
|
||||
{
|
||||
gpio_set_value(SPITZ_GPIO_MIC_BIAS, SND_SOC_DAPM_EVENT_ON(event));
|
||||
return 0;
|
||||
}
|
||||
|
||||
SND_SOC_DAPM_MIC("Mic Jack", spitz_mic_bias),
|
||||
|
||||
|
||||
2.4 Codec (BIAS) Domain
|
||||
-----------------------
|
||||
|
||||
The codec bias power domain has no widgets and is handled by the codecs DAPM
|
||||
event handler. This handler is called when the codec powerstate is changed wrt
|
||||
to any stream event or by kernel PM events.
|
||||
|
||||
|
||||
2.5 Virtual Widgets
|
||||
-------------------
|
||||
|
||||
Sometimes widgets exist in the codec or machine audio map that don't have any
|
||||
corresponding soft power control. In this case it is necessary to create
|
||||
a virtual widget - a widget with no control bits e.g.
|
||||
|
||||
SND_SOC_DAPM_MIXER("AC97 Mixer", SND_SOC_DAPM_NOPM, 0, 0, NULL, 0),
|
||||
|
||||
This can be used to merge to signal paths together in software.
|
||||
|
||||
After all the widgets have been defined, they can then be added to the DAPM
|
||||
subsystem individually with a call to snd_soc_dapm_new_control().
|
||||
|
||||
|
||||
3. Codec/DSP Widget Interconnections
|
||||
====================================
|
||||
|
||||
Widgets are connected to each other within the codec, platform and machine by
|
||||
audio paths (called interconnections). Each interconnection must be defined in
|
||||
order to create a map of all audio paths between widgets.
|
||||
|
||||
This is easiest with a diagram of the codec or DSP (and schematic of the machine
|
||||
audio system), as it requires joining widgets together via their audio signal
|
||||
paths.
|
||||
|
||||
e.g., from the WM8731 output mixer (wm8731.c)
|
||||
|
||||
The WM8731 output mixer has 3 inputs (sources)
|
||||
|
||||
1. Line Bypass Input
|
||||
2. DAC (HiFi playback)
|
||||
3. Mic Sidetone Input
|
||||
|
||||
Each input in this example has a kcontrol associated with it (defined in example
|
||||
above) and is connected to the output mixer via its kcontrol name. We can now
|
||||
connect the destination widget (wrt audio signal) with its source widgets.
|
||||
|
||||
/* output mixer */
|
||||
{"Output Mixer", "Line Bypass Switch", "Line Input"},
|
||||
{"Output Mixer", "HiFi Playback Switch", "DAC"},
|
||||
{"Output Mixer", "Mic Sidetone Switch", "Mic Bias"},
|
||||
|
||||
So we have :-
|
||||
|
||||
Destination Widget <=== Path Name <=== Source Widget
|
||||
|
||||
Or:-
|
||||
|
||||
Sink, Path, Source
|
||||
|
||||
Or :-
|
||||
|
||||
"Output Mixer" is connected to the "DAC" via the "HiFi Playback Switch".
|
||||
|
||||
When there is no path name connecting widgets (e.g. a direct connection) we
|
||||
pass NULL for the path name.
|
||||
|
||||
Interconnections are created with a call to:-
|
||||
|
||||
snd_soc_dapm_connect_input(codec, sink, path, source);
|
||||
|
||||
Finally, snd_soc_dapm_new_widgets(codec) must be called after all widgets and
|
||||
interconnections have been registered with the core. This causes the core to
|
||||
scan the codec and machine so that the internal DAPM state matches the
|
||||
physical state of the machine.
|
||||
|
||||
|
||||
3.1 Machine Widget Interconnections
|
||||
-----------------------------------
|
||||
Machine widget interconnections are created in the same way as codec ones and
|
||||
directly connect the codec pins to machine level widgets.
|
||||
|
||||
e.g. connects the speaker out codec pins to the internal speaker.
|
||||
|
||||
/* ext speaker connected to codec pins LOUT2, ROUT2 */
|
||||
{"Ext Spk", NULL , "ROUT2"},
|
||||
{"Ext Spk", NULL , "LOUT2"},
|
||||
|
||||
This allows the DAPM to power on and off pins that are connected (and in use)
|
||||
and pins that are NC respectively.
|
||||
|
||||
|
||||
4 Endpoint Widgets
|
||||
===================
|
||||
An endpoint is a start or end point (widget) of an audio signal within the
|
||||
machine and includes the codec. e.g.
|
||||
|
||||
o Headphone Jack
|
||||
o Internal Speaker
|
||||
o Internal Mic
|
||||
o Mic Jack
|
||||
o Codec Pins
|
||||
|
||||
Endpoints are added to the DAPM graph so that their usage can be determined in
|
||||
order to save power. e.g. NC codecs pins will be switched OFF, unconnected
|
||||
jacks can also be switched OFF.
|
||||
|
||||
|
||||
5 DAPM Widget Events
|
||||
====================
|
||||
|
||||
Some widgets can register their interest with the DAPM core in PM events.
|
||||
e.g. A Speaker with an amplifier registers a widget so the amplifier can be
|
||||
powered only when the spk is in use.
|
||||
|
||||
/* turn speaker amplifier on/off depending on use */
|
||||
static int corgi_amp_event(struct snd_soc_dapm_widget *w, int event)
|
||||
{
|
||||
gpio_set_value(CORGI_GPIO_APM_ON, SND_SOC_DAPM_EVENT_ON(event));
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* corgi machine dapm widgets */
|
||||
static const struct snd_soc_dapm_widget wm8731_dapm_widgets =
|
||||
SND_SOC_DAPM_SPK("Ext Spk", corgi_amp_event);
|
||||
|
||||
Please see soc-dapm.h for all other widgets that support events.
|
||||
|
||||
|
||||
5.1 Event types
|
||||
---------------
|
||||
|
||||
The following event types are supported by event widgets.
|
||||
|
||||
/* dapm event types */
|
||||
#define SND_SOC_DAPM_PRE_PMU 0x1 /* before widget power up */
|
||||
#define SND_SOC_DAPM_POST_PMU 0x2 /* after widget power up */
|
||||
#define SND_SOC_DAPM_PRE_PMD 0x4 /* before widget power down */
|
||||
#define SND_SOC_DAPM_POST_PMD 0x8 /* after widget power down */
|
||||
#define SND_SOC_DAPM_PRE_REG 0x10 /* before audio path setup */
|
||||
#define SND_SOC_DAPM_POST_REG 0x20 /* after audio path setup */
|
71
Documentation/sound/alsa/soc/jack.txt
Normal file
71
Documentation/sound/alsa/soc/jack.txt
Normal file
|
@ -0,0 +1,71 @@
|
|||
ASoC jack detection
|
||||
===================
|
||||
|
||||
ALSA has a standard API for representing physical jacks to user space,
|
||||
the kernel side of which can be seen in include/sound/jack.h. ASoC
|
||||
provides a version of this API adding two additional features:
|
||||
|
||||
- It allows more than one jack detection method to work together on one
|
||||
user visible jack. In embedded systems it is common for multiple
|
||||
to be present on a single jack but handled by separate bits of
|
||||
hardware.
|
||||
|
||||
- Integration with DAPM, allowing DAPM endpoints to be updated
|
||||
automatically based on the detected jack status (eg, turning off the
|
||||
headphone outputs if no headphones are present).
|
||||
|
||||
This is done by splitting the jacks up into three things working
|
||||
together: the jack itself represented by a struct snd_soc_jack, sets of
|
||||
snd_soc_jack_pins representing DAPM endpoints to update and blocks of
|
||||
code providing jack reporting mechanisms.
|
||||
|
||||
For example, a system may have a stereo headset jack with two reporting
|
||||
mechanisms, one for the headphone and one for the microphone. Some
|
||||
systems won't be able to use their speaker output while a headphone is
|
||||
connected and so will want to make sure to update both speaker and
|
||||
headphone when the headphone jack status changes.
|
||||
|
||||
The jack - struct snd_soc_jack
|
||||
==============================
|
||||
|
||||
This represents a physical jack on the system and is what is visible to
|
||||
user space. The jack itself is completely passive, it is set up by the
|
||||
machine driver and updated by jack detection methods.
|
||||
|
||||
Jacks are created by the machine driver calling snd_soc_jack_new().
|
||||
|
||||
snd_soc_jack_pin
|
||||
================
|
||||
|
||||
These represent a DAPM pin to update depending on some of the status
|
||||
bits supported by the jack. Each snd_soc_jack has zero or more of these
|
||||
which are updated automatically. They are created by the machine driver
|
||||
and associated with the jack using snd_soc_jack_add_pins(). The status
|
||||
of the endpoint may configured to be the opposite of the jack status if
|
||||
required (eg, enabling a built in microphone if a microphone is not
|
||||
connected via a jack).
|
||||
|
||||
Jack detection methods
|
||||
======================
|
||||
|
||||
Actual jack detection is done by code which is able to monitor some
|
||||
input to the system and update a jack by calling snd_soc_jack_report(),
|
||||
specifying a subset of bits to update. The jack detection code should
|
||||
be set up by the machine driver, taking configuration for the jack to
|
||||
update and the set of things to report when the jack is connected.
|
||||
|
||||
Often this is done based on the status of a GPIO - a handler for this is
|
||||
provided by the snd_soc_jack_add_gpio() function. Other methods are
|
||||
also available, for example integrated into CODECs. One example of
|
||||
CODEC integrated jack detection can be see in the WM8350 driver.
|
||||
|
||||
Each jack may have multiple reporting mechanisms, though it will need at
|
||||
least one to be useful.
|
||||
|
||||
Machine drivers
|
||||
===============
|
||||
|
||||
These are all hooked together by the machine driver depending on the
|
||||
system hardware. The machine driver will set up the snd_soc_jack and
|
||||
the list of pins to update then set up one or more jack detection
|
||||
mechanisms to update that jack based on their current status.
|
93
Documentation/sound/alsa/soc/machine.txt
Normal file
93
Documentation/sound/alsa/soc/machine.txt
Normal file
|
@ -0,0 +1,93 @@
|
|||
ASoC Machine Driver
|
||||
===================
|
||||
|
||||
The ASoC machine (or board) driver is the code that glues together all the
|
||||
component drivers (e.g. codecs, platforms and DAIs). It also describes the
|
||||
relationships between each componnent which include audio paths, GPIOs,
|
||||
interrupts, clocking, jacks and voltage regulators.
|
||||
|
||||
The machine driver can contain codec and platform specific code. It registers
|
||||
the audio subsystem with the kernel as a platform device and is represented by
|
||||
the following struct:-
|
||||
|
||||
/* SoC machine */
|
||||
struct snd_soc_card {
|
||||
char *name;
|
||||
|
||||
...
|
||||
|
||||
int (*probe)(struct platform_device *pdev);
|
||||
int (*remove)(struct platform_device *pdev);
|
||||
|
||||
/* the pre and post PM functions are used to do any PM work before and
|
||||
* after the codec and DAIs do any PM work. */
|
||||
int (*suspend_pre)(struct platform_device *pdev, pm_message_t state);
|
||||
int (*suspend_post)(struct platform_device *pdev, pm_message_t state);
|
||||
int (*resume_pre)(struct platform_device *pdev);
|
||||
int (*resume_post)(struct platform_device *pdev);
|
||||
|
||||
...
|
||||
|
||||
/* CPU <--> Codec DAI links */
|
||||
struct snd_soc_dai_link *dai_link;
|
||||
int num_links;
|
||||
|
||||
...
|
||||
};
|
||||
|
||||
probe()/remove()
|
||||
----------------
|
||||
probe/remove are optional. Do any machine specific probe here.
|
||||
|
||||
|
||||
suspend()/resume()
|
||||
------------------
|
||||
The machine driver has pre and post versions of suspend and resume to take care
|
||||
of any machine audio tasks that have to be done before or after the codec, DAIs
|
||||
and DMA is suspended and resumed. Optional.
|
||||
|
||||
|
||||
Machine DAI Configuration
|
||||
-------------------------
|
||||
The machine DAI configuration glues all the codec and CPU DAIs together. It can
|
||||
also be used to set up the DAI system clock and for any machine related DAI
|
||||
initialisation e.g. the machine audio map can be connected to the codec audio
|
||||
map, unconnected codec pins can be set as such.
|
||||
|
||||
struct snd_soc_dai_link is used to set up each DAI in your machine. e.g.
|
||||
|
||||
/* corgi digital audio interface glue - connects codec <--> CPU */
|
||||
static struct snd_soc_dai_link corgi_dai = {
|
||||
.name = "WM8731",
|
||||
.stream_name = "WM8731",
|
||||
.cpu_dai_name = "pxa-is2-dai",
|
||||
.codec_dai_name = "wm8731-hifi",
|
||||
.platform_name = "pxa-pcm-audio",
|
||||
.codec_name = "wm8713-codec.0-001a",
|
||||
.init = corgi_wm8731_init,
|
||||
.ops = &corgi_ops,
|
||||
};
|
||||
|
||||
struct snd_soc_card then sets up the machine with its DAIs. e.g.
|
||||
|
||||
/* corgi audio machine driver */
|
||||
static struct snd_soc_card snd_soc_corgi = {
|
||||
.name = "Corgi",
|
||||
.dai_link = &corgi_dai,
|
||||
.num_links = 1,
|
||||
};
|
||||
|
||||
|
||||
Machine Power Map
|
||||
-----------------
|
||||
|
||||
The machine driver can optionally extend the codec power map and to become an
|
||||
audio power map of the audio subsystem. This allows for automatic power up/down
|
||||
of speaker/HP amplifiers, etc. Codec pins can be connected to the machines jack
|
||||
sockets in the machine init function.
|
||||
|
||||
|
||||
Machine Controls
|
||||
----------------
|
||||
|
||||
Machine specific audio mixer controls can be added in the DAI init function.
|
95
Documentation/sound/alsa/soc/overview.txt
Normal file
95
Documentation/sound/alsa/soc/overview.txt
Normal file
|
@ -0,0 +1,95 @@
|
|||
ALSA SoC Layer
|
||||
==============
|
||||
|
||||
The overall project goal of the ALSA System on Chip (ASoC) layer is to
|
||||
provide better ALSA support for embedded system-on-chip processors (e.g.
|
||||
pxa2xx, au1x00, iMX, etc) and portable audio codecs. Prior to the ASoC
|
||||
subsystem there was some support in the kernel for SoC audio, however it
|
||||
had some limitations:-
|
||||
|
||||
* Codec drivers were often tightly coupled to the underlying SoC
|
||||
CPU. This is not ideal and leads to code duplication - for example,
|
||||
Linux had different wm8731 drivers for 4 different SoC platforms.
|
||||
|
||||
* There was no standard method to signal user initiated audio events (e.g.
|
||||
Headphone/Mic insertion, Headphone/Mic detection after an insertion
|
||||
event). These are quite common events on portable devices and often require
|
||||
machine specific code to re-route audio, enable amps, etc., after such an
|
||||
event.
|
||||
|
||||
* Drivers tended to power up the entire codec when playing (or
|
||||
recording) audio. This is fine for a PC, but tends to waste a lot of
|
||||
power on portable devices. There was also no support for saving
|
||||
power via changing codec oversampling rates, bias currents, etc.
|
||||
|
||||
|
||||
ASoC Design
|
||||
===========
|
||||
|
||||
The ASoC layer is designed to address these issues and provide the following
|
||||
features :-
|
||||
|
||||
* Codec independence. Allows reuse of codec drivers on other platforms
|
||||
and machines.
|
||||
|
||||
* Easy I2S/PCM audio interface setup between codec and SoC. Each SoC
|
||||
interface and codec registers its audio interface capabilities with the
|
||||
core and are subsequently matched and configured when the application
|
||||
hardware parameters are known.
|
||||
|
||||
* Dynamic Audio Power Management (DAPM). DAPM automatically sets the codec to
|
||||
its minimum power state at all times. This includes powering up/down
|
||||
internal power blocks depending on the internal codec audio routing and any
|
||||
active streams.
|
||||
|
||||
* Pop and click reduction. Pops and clicks can be reduced by powering the
|
||||
codec up/down in the correct sequence (including using digital mute). ASoC
|
||||
signals the codec when to change power states.
|
||||
|
||||
* Machine specific controls: Allow machines to add controls to the sound card
|
||||
(e.g. volume control for speaker amplifier).
|
||||
|
||||
To achieve all this, ASoC basically splits an embedded audio system into
|
||||
multiple re-usable component drivers :-
|
||||
|
||||
* Codec class drivers: The codec class driver is platform independent and
|
||||
contains audio controls, audio interface capabilities, codec DAPM
|
||||
definition and codec IO functions. This class extends to BT, FM and MODEM
|
||||
ICs if required. Codec class drivers should be generic code that can run
|
||||
on any architecture and machine.
|
||||
|
||||
* Platform class drivers: The platform class driver includes the audio DMA
|
||||
engine driver, digital audio interface (DAI) drivers (e.g. I2S, AC97, PCM)
|
||||
and any audio DSP drivers for that platform.
|
||||
|
||||
* Machine class driver: The machine driver class acts as the glue that
|
||||
decribes and binds the other component drivers together to form an ALSA
|
||||
"sound card device". It handles any machine specific controls and
|
||||
machine level audio events (e.g. turning on an amp at start of playback).
|
||||
|
||||
|
||||
Documentation
|
||||
=============
|
||||
|
||||
The documentation is spilt into the following sections:-
|
||||
|
||||
overview.txt: This file.
|
||||
|
||||
codec.txt: Codec driver internals.
|
||||
|
||||
DAI.txt: Description of Digital Audio Interface standards and how to configure
|
||||
a DAI within your codec and CPU DAI drivers.
|
||||
|
||||
dapm.txt: Dynamic Audio Power Management
|
||||
|
||||
platform.txt: Platform audio DMA and DAI.
|
||||
|
||||
machine.txt: Machine driver internals.
|
||||
|
||||
pop_clicks.txt: How to minimise audio artifacts.
|
||||
|
||||
clocking.txt: ASoC clocking for best power performance.
|
||||
|
||||
jack.txt: ASoC jack detection.
|
||||
|
||||
DPCM.txt: Dynamic PCM - Describes DPCM with DSP examples.
|
79
Documentation/sound/alsa/soc/platform.txt
Normal file
79
Documentation/sound/alsa/soc/platform.txt
Normal file
|
@ -0,0 +1,79 @@
|
|||
ASoC Platform Driver
|
||||
====================
|
||||
|
||||
An ASoC platform driver class can be divided into audio DMA drivers, SoC DAI
|
||||
drivers and DSP drivers. The platform drivers only target the SoC CPU and must
|
||||
have no board specific code.
|
||||
|
||||
Audio DMA
|
||||
=========
|
||||
|
||||
The platform DMA driver optionally supports the following ALSA operations:-
|
||||
|
||||
/* SoC audio ops */
|
||||
struct snd_soc_ops {
|
||||
int (*startup)(struct snd_pcm_substream *);
|
||||
void (*shutdown)(struct snd_pcm_substream *);
|
||||
int (*hw_params)(struct snd_pcm_substream *, struct snd_pcm_hw_params *);
|
||||
int (*hw_free)(struct snd_pcm_substream *);
|
||||
int (*prepare)(struct snd_pcm_substream *);
|
||||
int (*trigger)(struct snd_pcm_substream *, int);
|
||||
};
|
||||
|
||||
The platform driver exports its DMA functionality via struct
|
||||
snd_soc_platform_driver:-
|
||||
|
||||
struct snd_soc_platform_driver {
|
||||
char *name;
|
||||
|
||||
int (*probe)(struct platform_device *pdev);
|
||||
int (*remove)(struct platform_device *pdev);
|
||||
int (*suspend)(struct platform_device *pdev, struct snd_soc_cpu_dai *cpu_dai);
|
||||
int (*resume)(struct platform_device *pdev, struct snd_soc_cpu_dai *cpu_dai);
|
||||
|
||||
/* pcm creation and destruction */
|
||||
int (*pcm_new)(struct snd_card *, struct snd_soc_codec_dai *, struct snd_pcm *);
|
||||
void (*pcm_free)(struct snd_pcm *);
|
||||
|
||||
/*
|
||||
* For platform caused delay reporting.
|
||||
* Optional.
|
||||
*/
|
||||
snd_pcm_sframes_t (*delay)(struct snd_pcm_substream *,
|
||||
struct snd_soc_dai *);
|
||||
|
||||
/* platform stream ops */
|
||||
struct snd_pcm_ops *pcm_ops;
|
||||
};
|
||||
|
||||
Please refer to the ALSA driver documentation for details of audio DMA.
|
||||
http://www.alsa-project.org/~iwai/writing-an-alsa-driver/
|
||||
|
||||
An example DMA driver is soc/pxa/pxa2xx-pcm.c
|
||||
|
||||
|
||||
SoC DAI Drivers
|
||||
===============
|
||||
|
||||
Each SoC DAI driver must provide the following features:-
|
||||
|
||||
1) Digital audio interface (DAI) description
|
||||
2) Digital audio interface configuration
|
||||
3) PCM's description
|
||||
4) SYSCLK configuration
|
||||
5) Suspend and resume (optional)
|
||||
|
||||
Please see codec.txt for a description of items 1 - 4.
|
||||
|
||||
|
||||
SoC DSP Drivers
|
||||
===============
|
||||
|
||||
Each SoC DSP driver usually supplies the following features :-
|
||||
|
||||
1) DAPM graph
|
||||
2) Mixer controls
|
||||
3) DMA IO to/from DSP buffers (if applicable)
|
||||
4) Definition of DSP front end (FE) PCM devices.
|
||||
|
||||
Please see DPCM.txt for a description of item 4.
|
52
Documentation/sound/alsa/soc/pops_clicks.txt
Normal file
52
Documentation/sound/alsa/soc/pops_clicks.txt
Normal file
|
@ -0,0 +1,52 @@
|
|||
Audio Pops and Clicks
|
||||
=====================
|
||||
|
||||
Pops and clicks are unwanted audio artifacts caused by the powering up and down
|
||||
of components within the audio subsystem. This is noticeable on PCs when an
|
||||
audio module is either loaded or unloaded (at module load time the sound card is
|
||||
powered up and causes a popping noise on the speakers).
|
||||
|
||||
Pops and clicks can be more frequent on portable systems with DAPM. This is
|
||||
because the components within the subsystem are being dynamically powered
|
||||
depending on the audio usage and this can subsequently cause a small pop or
|
||||
click every time a component power state is changed.
|
||||
|
||||
|
||||
Minimising Playback Pops and Clicks
|
||||
===================================
|
||||
|
||||
Playback pops in portable audio subsystems cannot be completely eliminated
|
||||
currently, however future audio codec hardware will have better pop and click
|
||||
suppression. Pops can be reduced within playback by powering the audio
|
||||
components in a specific order. This order is different for startup and
|
||||
shutdown and follows some basic rules:-
|
||||
|
||||
Startup Order :- DAC --> Mixers --> Output PGA --> Digital Unmute
|
||||
|
||||
Shutdown Order :- Digital Mute --> Output PGA --> Mixers --> DAC
|
||||
|
||||
This assumes that the codec PCM output path from the DAC is via a mixer and then
|
||||
a PGA (programmable gain amplifier) before being output to the speakers.
|
||||
|
||||
|
||||
Minimising Capture Pops and Clicks
|
||||
==================================
|
||||
|
||||
Capture artifacts are somewhat easier to get rid as we can delay activating the
|
||||
ADC until all the pops have occurred. This follows similar power rules to
|
||||
playback in that components are powered in a sequence depending upon stream
|
||||
startup or shutdown.
|
||||
|
||||
Startup Order - Input PGA --> Mixers --> ADC
|
||||
|
||||
Shutdown Order - ADC --> Mixers --> Input PGA
|
||||
|
||||
|
||||
Zipper Noise
|
||||
============
|
||||
An unwanted zipper noise can occur within the audio playback or capture stream
|
||||
when a volume control is changed near its maximum gain value. The zipper noise
|
||||
is heard when the gain increase or decrease changes the mean audio signal
|
||||
amplitude too quickly. It can be minimised by enabling the zero cross setting
|
||||
for each volume control. The ZC forces the gain change to occur when the signal
|
||||
crosses the zero amplitude line.
|
66
Documentation/sound/oss/ALS
Normal file
66
Documentation/sound/oss/ALS
Normal file
|
@ -0,0 +1,66 @@
|
|||
ALS-007/ALS-100/ALS-200 based sound cards
|
||||
=========================================
|
||||
|
||||
Support for sound cards based around the Avance Logic
|
||||
ALS-007/ALS-100/ALS-200 chip is included. These chips are a single
|
||||
chip PnP sound solution which is mostly hardware compatible with the
|
||||
Sound Blaster 16 card, with most differences occurring in the use of
|
||||
the mixer registers. For this reason the ALS code is integrated
|
||||
as part of the Sound Blaster 16 driver (adding only 800 bytes to the
|
||||
SB16 driver).
|
||||
|
||||
To use an ALS sound card under Linux, enable the following options as
|
||||
modules in the sound configuration section of the kernel config:
|
||||
- 100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
|
||||
- FM synthesizer (YM3812/OPL-3) support
|
||||
- standalone MPU401 support may be required for some cards; for the
|
||||
ALS-007, when using isapnptools, it is required
|
||||
Since the ALS-007/100/200 are PnP cards, ISAPnP support should probably be
|
||||
compiled in. If kernel level PnP support is not included, isapnptools will
|
||||
be required to configure the card before the sound modules are loaded.
|
||||
|
||||
When using kernel level ISAPnP, the kernel should correctly identify and
|
||||
configure all resources required by the card when the "sb" module is
|
||||
inserted. Note that the ALS-007 does not have a 16 bit DMA channel and that
|
||||
the MPU401 interface on this card uses a different interrupt to the audio
|
||||
section. This should all be correctly configured by the kernel; if problems
|
||||
with the MPU401 interface surface, try using the standalone MPU401 module,
|
||||
passing "0" as the "sb" module's "mpu_io" module parameter to prevent the
|
||||
soundblaster driver attempting to register the MPU401 itself. The onboard
|
||||
synth device can be accessed using the "opl3" module.
|
||||
|
||||
If isapnptools is used to wake up the sound card (as in 2.2.x), the settings
|
||||
of the card's resources should be passed to the kernel modules ("sb", "opl3"
|
||||
and "mpu401") using the module parameters. When configuring an ALS-007, be
|
||||
sure to specify different IRQs for the audio and MPU401 sections - this card
|
||||
requires they be different. For "sb", "io", "irq" and "dma" should be set
|
||||
to the same values used to configure the audio section of the card with
|
||||
isapnp. "dma16" should be explicitly set to "-1" for an ALS-007 since this
|
||||
card does not have a 16 bit dma channel; if not specified the kernel will
|
||||
default to using channel 5 anyway which will cause audio not to work.
|
||||
"mpu_io" should be set to 0. The "io" parameter of the "opl3" module should
|
||||
also agree with the setting used by isapnp. To get the MPU401 interface
|
||||
working on an ALS-007 card, the "mpu401" module will be required since this
|
||||
card uses separate IRQs for the audio and MPU401 sections and there is no
|
||||
parameter available to pass a different IRQ to the "sb" driver (whose
|
||||
inbuilt MPU401 driver would otherwise be fine). Insert the mpu401 module
|
||||
passing appropriate values using the "io" and "irq" parameters.
|
||||
|
||||
The resulting sound driver will provide the following capabilities:
|
||||
- 8 and 16 bit audio playback
|
||||
- 8 and 16 bit audio recording
|
||||
- Software selection of record source (line in, CD, FM, mic, master)
|
||||
- Record and playback of midi data via the external MPU-401
|
||||
- Playback of midi data using inbuilt FM synthesizer
|
||||
- Control of the ALS-007 mixer via any OSS-compatible mixer programs.
|
||||
Controls available are Master (L&R), Line in (L&R), CD (L&R),
|
||||
DSP/PCM/audio out (L&R), FM (L&R) and Mic in (mono).
|
||||
|
||||
Jonathan Woithe
|
||||
jwoithe@just42.net
|
||||
30 March 1998
|
||||
|
||||
Modified 2000-02-26 by Dave Forrest, drf5n@virginia.edu to add ALS100/ALS200
|
||||
Modified 2000-04-10 by Paul Laufer, pelaufer@csupomona.edu to add ISAPnP info.
|
||||
Modified 2000-11-19 by Jonathan Woithe, jwoithe@just42.net
|
||||
- updated information for kernel 2.4.x.
|
101
Documentation/sound/oss/AudioExcelDSP16
Normal file
101
Documentation/sound/oss/AudioExcelDSP16
Normal file
|
@ -0,0 +1,101 @@
|
|||
Driver
|
||||
------
|
||||
|
||||
Information about Audio Excel DSP 16 driver can be found in the source
|
||||
file aedsp16.c
|
||||
Please, read the head of the source before using it. It contain useful
|
||||
information.
|
||||
|
||||
Configuration
|
||||
-------------
|
||||
|
||||
The Audio Excel configuration, is now done with the standard Linux setup.
|
||||
You have to configure the sound card (Sound Blaster or Microsoft Sound System)
|
||||
and, if you want it, the Roland MPU-401 (do not use the Sound Blaster MPU-401,
|
||||
SB-MPU401) in the main driver menu. Activate the lowlevel drivers then select
|
||||
the Audio Excel hardware that you want to initialize. Check the IRQ/DMA/MIRQ
|
||||
of the Audio Excel initialization: it must be the same as the SBPRO (or MSS)
|
||||
setup. If the parameters are different, correct it.
|
||||
I you own a Gallant's audio card based on SC-6600, activate the SC-6600 support.
|
||||
If you want to change the configuration of the sound board, be sure to
|
||||
check off all the configuration items before re-configure it.
|
||||
|
||||
Module parameters
|
||||
-----------------
|
||||
To use this driver as a module, you must configure some module parameters, to
|
||||
set up I/O addresses, IRQ lines and DMA channels. Some parameters are
|
||||
mandatory while some others are optional. Here a list of parameters you can
|
||||
use with this module:
|
||||
|
||||
Name Description
|
||||
==== ===========
|
||||
MANDATORY
|
||||
io I/O base address (0x220 or 0x240)
|
||||
irq irq line (5, 7, 9, 10 or 11)
|
||||
dma dma channel (0, 1 or 3)
|
||||
|
||||
OPTIONAL
|
||||
mss_base I/O base address for activate MSS mode (default SBPRO)
|
||||
(0x530 or 0xE80)
|
||||
mpu_base I/O base address for activate MPU-401 mode
|
||||
(0x300, 0x310, 0x320 or 0x330)
|
||||
mpu_irq MPU-401 irq line (5, 7, 9, 10 or 0)
|
||||
|
||||
A configuration file in /etc/modprobe.d/ directory will have lines like this:
|
||||
|
||||
options opl3 io=0x388
|
||||
options ad1848 io=0x530 irq=11 dma=3
|
||||
options aedsp16 io=0x220 irq=11 dma=3 mss_base=0x530
|
||||
|
||||
Where the aedsp16 options are the options for this driver while opl3 and
|
||||
ad1848 are the corresponding options for the MSS and OPL3 modules.
|
||||
|
||||
Loading MSS and OPL3 needs to pre load the aedsp16 module to set up correctly
|
||||
the sound card. Installation dependencies must be written in configuration
|
||||
files under /etc/modprobe.d/ directory:
|
||||
|
||||
softdep ad1848 pre: aedsp16
|
||||
softdep opl3 pre: aedsp16
|
||||
|
||||
Then you must load the sound modules stack in this order:
|
||||
sound -> aedsp16 -> [ ad1848, opl3 ]
|
||||
|
||||
With the above configuration, loading ad1848 or opl3 modules, will
|
||||
automatically load all the sound stack.
|
||||
|
||||
Sound cards supported
|
||||
---------------------
|
||||
This driver supports the SC-6000 and SC-6600 based Gallant's sound card.
|
||||
It don't support the Audio Excel DSP 16 III (try the SC-6600 code).
|
||||
I'm working on the III version of the card: if someone have useful
|
||||
information about it, please let me know.
|
||||
For all the non-supported audio cards, you have to boot MS-DOS (or WIN95)
|
||||
activating the audio card with the MS-DOS device driver, then you have to
|
||||
<ctrl>-<alt>-<del> and boot Linux.
|
||||
Follow these steps:
|
||||
|
||||
1) Compile Linux kernel with standard sound driver, using the emulation
|
||||
you want, with the parameters of your audio card,
|
||||
e.g. Microsoft Sound System irq10 dma3
|
||||
2) Install your new kernel as the default boot kernel.
|
||||
3) Boot MS-DOS and configure the audio card with the boot time device
|
||||
driver, for MSS irq10 dma3 in our example.
|
||||
4) <ctrl>-<alt>-<del> and boot Linux. This will maintain the DOS configuration
|
||||
and will boot the new kernel with sound driver. The sound driver will find
|
||||
the audio card and will recognize and attach it.
|
||||
|
||||
Reports on User successes
|
||||
-------------------------
|
||||
|
||||
> Date: Mon, 29 Jul 1996 08:35:40 +0100
|
||||
> From: Mr S J Greenaway <sjg95@unixfe.rl.ac.uk>
|
||||
> To: riccardo@cdc8g5.cdc.polimi.it (Riccardo Facchetti)
|
||||
> Subject: Re: Audio Excel DSP 16 initialization code
|
||||
>
|
||||
> Just to let you know got my Audio Excel (emulating a MSS) working
|
||||
> with my original SB16, thanks for the driver!
|
||||
|
||||
|
||||
Last revised: 20 August 1998
|
||||
Riccardo Facchetti
|
||||
fizban@tin.it
|
152
Documentation/sound/oss/CMI8330
Normal file
152
Documentation/sound/oss/CMI8330
Normal file
|
@ -0,0 +1,152 @@
|
|||
Documentation for CMI 8330 (SoundPRO)
|
||||
-------------------------------------
|
||||
Alessandro Zummo <azummo@ita.flashnet.it>
|
||||
|
||||
( Be sure to read Documentation/sound/oss/SoundPro too )
|
||||
|
||||
|
||||
This adapter is now directly supported by the sb driver.
|
||||
|
||||
The only thing you have to do is to compile the kernel sound
|
||||
support as a module and to enable kernel ISAPnP support,
|
||||
as shown below.
|
||||
|
||||
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SOUND_SB=m
|
||||
|
||||
CONFIG_PNP=y
|
||||
CONFIG_ISAPNP=y
|
||||
|
||||
|
||||
and optionally:
|
||||
|
||||
|
||||
CONFIG_SOUND_MPU401=m
|
||||
|
||||
for MPU401 support.
|
||||
|
||||
|
||||
(I suggest you to use "make menuconfig" or "make xconfig"
|
||||
for a more comfortable configuration editing)
|
||||
|
||||
|
||||
|
||||
Then you can do
|
||||
|
||||
modprobe sb
|
||||
|
||||
and everything will be (hopefully) configured.
|
||||
|
||||
You should get something similar in syslog:
|
||||
|
||||
sb: CMI8330 detected.
|
||||
sb: CMI8330 sb base located at 0x220
|
||||
sb: CMI8330 mpu base located at 0x330
|
||||
sb: CMI8330 mail reports to Alessandro Zummo <azummo@ita.flashnet.it>
|
||||
sb: ISAPnP reports CMI 8330 SoundPRO at i/o 0x220, irq 7, dma 1,5
|
||||
|
||||
|
||||
|
||||
|
||||
The old documentation file follows for reference
|
||||
purposes.
|
||||
|
||||
|
||||
How to enable CMI 8330 (SOUNDPRO) soundchip on Linux
|
||||
------------------------------------------
|
||||
Stefan Laudat <Stefan.Laudat@asit.ro>
|
||||
|
||||
[Note: The CMI 8338 is unrelated and is supported by cmpci.o]
|
||||
|
||||
|
||||
In order to use CMI8330 under Linux you just have to use a proper isapnp.conf, a good isapnp and a little bit of patience. I use isapnp 1.17, but
|
||||
you may get a better one I guess at http://www.roestock.demon.co.uk/isapnptools/.
|
||||
|
||||
Of course you will have to compile kernel sound support as module, as shown below:
|
||||
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SOUND_OSS=m
|
||||
CONFIG_SOUND_SB=m
|
||||
CONFIG_SOUND_ADLIB=m
|
||||
CONFIG_SOUND_MPU401=m
|
||||
# Mikro$chaft sound system (kinda useful here ;))
|
||||
CONFIG_SOUND_MSS=m
|
||||
|
||||
The /etc/isapnp.conf file will be:
|
||||
|
||||
<snip below>
|
||||
|
||||
|
||||
(READPORT 0x0203)
|
||||
(ISOLATE PRESERVE)
|
||||
(IDENTIFY *)
|
||||
(VERBOSITY 2)
|
||||
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING
|
||||
(VERIFYLD N)
|
||||
|
||||
|
||||
# WSS
|
||||
|
||||
(CONFIGURE CMI0001/16777472 (LD 0
|
||||
(IO 0 (SIZE 8) (BASE 0x0530))
|
||||
(IO 1 (SIZE 8) (BASE 0x0388))
|
||||
(INT 0 (IRQ 7 (MODE +E)))
|
||||
(DMA 0 (CHANNEL 0))
|
||||
(NAME "CMI0001/16777472[0]{CMI8330/C3D Audio Adapter}")
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
# MPU
|
||||
|
||||
(CONFIGURE CMI0001/16777472 (LD 1
|
||||
(IO 0 (SIZE 2) (BASE 0x0330))
|
||||
(INT 0 (IRQ 11 (MODE +E)))
|
||||
(NAME "CMI0001/16777472[1]{CMI8330/C3D Audio Adapter}")
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
# Joystick
|
||||
|
||||
(CONFIGURE CMI0001/16777472 (LD 2
|
||||
(IO 0 (SIZE 8) (BASE 0x0200))
|
||||
(NAME "CMI0001/16777472[2]{CMI8330/C3D Audio Adapter}")
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
# SoundBlaster
|
||||
|
||||
(CONFIGURE CMI0001/16777472 (LD 3
|
||||
(IO 0 (SIZE 16) (BASE 0x0220))
|
||||
(INT 0 (IRQ 5 (MODE +E)))
|
||||
(DMA 0 (CHANNEL 1))
|
||||
(DMA 1 (CHANNEL 5))
|
||||
(NAME "CMI0001/16777472[3]{CMI8330/C3D Audio Adapter}")
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
|
||||
(WAITFORKEY)
|
||||
|
||||
<end of snip>
|
||||
|
||||
The module sequence is trivial:
|
||||
|
||||
/sbin/insmod soundcore
|
||||
/sbin/insmod sound
|
||||
/sbin/insmod uart401
|
||||
# insert this first
|
||||
/sbin/insmod ad1848 io=0x530 irq=7 dma=0 soundpro=1
|
||||
# The sb module is an alternative to the ad1848 (Microsoft Sound System)
|
||||
# Anyhow, this is full duplex and has MIDI
|
||||
/sbin/insmod sb io=0x220 dma=1 dma16=5 irq=5 mpu_io=0x330
|
||||
|
||||
|
||||
|
||||
Alma Chao <elysian@ethereal.torsion.org> suggests the following in
|
||||
a /etc/modprobe.d/*conf file:
|
||||
|
||||
alias sound ad1848
|
||||
alias synth0 opl3
|
||||
options ad1848 io=0x530 irq=7 dma=0 soundpro=1
|
||||
options opl3 io=0x388
|
34
Documentation/sound/oss/ESS
Normal file
34
Documentation/sound/oss/ESS
Normal file
|
@ -0,0 +1,34 @@
|
|||
Documentation for the ESS AudioDrive chips
|
||||
|
||||
In 2.4 kernels the SoundBlaster driver not only tries to detect an ESS chip, it
|
||||
tries to detect the type of ESS chip too. The correct detection of the chip
|
||||
doesn't always succeed however, so unless you use the kernel isapnp facilities
|
||||
(and you chip is pnp capable) the default behaviour is 2.0 behaviour which
|
||||
means: only detect ES688 and ES1688.
|
||||
|
||||
All ESS chips now have a recording level setting. This is a need-to-have for
|
||||
people who want to use their ESS for recording sound.
|
||||
|
||||
Every chip that's detected as a later-than-es1688 chip has a 6 bits logarithmic
|
||||
master volume control.
|
||||
|
||||
Every chip that's detected as a ES1887 now has Full Duplex support. Made a
|
||||
little testprogram that shows that is works, haven't seen a real program that
|
||||
needs this however.
|
||||
|
||||
For ESS chips an additional parameter "esstype" can be specified. This controls
|
||||
the (auto) detection of the ESS chips. It can have 3 kinds of values:
|
||||
|
||||
-1 Act like 2.0 kernels: only detect ES688 or ES1688.
|
||||
0 Try to auto-detect the chip (may fail for ES1688)
|
||||
688 The chip will be treated as ES688
|
||||
1688 ,, ,, ,, ,, ,, ,, ES1688
|
||||
1868 ,, ,, ,, ,, ,, ,, ES1868
|
||||
1869 ,, ,, ,, ,, ,, ,, ES1869
|
||||
1788 ,, ,, ,, ,, ,, ,, ES1788
|
||||
1887 ,, ,, ,, ,, ,, ,, ES1887
|
||||
1888 ,, ,, ,, ,, ,, ,, ES1888
|
||||
|
||||
Because Full Duplex is supported for ES1887 you can specify a second DMA
|
||||
channel by specifying module parameter dma16. It can be one of: 0, 1, 3 or 5.
|
||||
|
55
Documentation/sound/oss/ESS1868
Normal file
55
Documentation/sound/oss/ESS1868
Normal file
|
@ -0,0 +1,55 @@
|
|||
Documentation for the ESS1868F AudioDrive PnP sound card
|
||||
|
||||
The ESS1868 sound card is a PnP ESS1688-compatible 16-bit sound card.
|
||||
|
||||
It should be automatically detected by the Linux Kernel isapnp support when you
|
||||
load the sb.o module. Otherwise you should take care of:
|
||||
|
||||
* The ESS1868 does not allow use of a 16-bit DMA, thus DMA 0, 1, 2, and 3
|
||||
may only be used.
|
||||
|
||||
* isapnptools version 1.14 does work with ESS1868. Earlier versions might
|
||||
not.
|
||||
|
||||
* Sound support MUST be compiled as MODULES, not statically linked
|
||||
into the kernel.
|
||||
|
||||
|
||||
NOTE: this is only needed when not using the kernel isapnp support!
|
||||
|
||||
For configuring the sound card's I/O addresses, IRQ and DMA, here is a
|
||||
sample copy of the isapnp.conf directives regarding the ESS1868:
|
||||
|
||||
(CONFIGURE ESS1868/-1 (LD 1
|
||||
(IO 0 (BASE 0x0220))
|
||||
(IO 1 (BASE 0x0388))
|
||||
(IO 2 (BASE 0x0330))
|
||||
(DMA 0 (CHANNEL 1))
|
||||
(INT 0 (IRQ 5 (MODE +E)))
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
(for a full working isapnp.conf file, remember the
|
||||
(ISOLATE)
|
||||
(IDENTIFY *)
|
||||
at the beginning and the
|
||||
(WAITFORKEY)
|
||||
at the end.)
|
||||
|
||||
In this setup, the main card I/O is 0x0220, FM synthesizer is 0x0388, and
|
||||
the MPU-401 MIDI port is located at 0x0330. IRQ is IRQ 5, DMA is channel 1.
|
||||
|
||||
After configuring the sound card via isapnp, to use the card you must load
|
||||
the sound modules with the proper I/O information. Here is my setup:
|
||||
|
||||
# ESS1868F AudioDrive initialization
|
||||
|
||||
/sbin/modprobe sound
|
||||
/sbin/insmod uart401
|
||||
/sbin/insmod sb io=0x220 irq=5 dma=1 dma16=-1
|
||||
/sbin/insmod mpu401 io=0x330
|
||||
/sbin/insmod opl3 io=0x388
|
||||
/sbin/insmod v_midi
|
||||
|
||||
opl3 is the FM synthesizer
|
||||
/sbin/insmod opl3 io=0x388
|
459
Documentation/sound/oss/Introduction
Normal file
459
Documentation/sound/oss/Introduction
Normal file
|
@ -0,0 +1,459 @@
|
|||
Introduction Notes on Modular Sound Drivers and Soundcore
|
||||
Wade Hampton
|
||||
2/14/2001
|
||||
|
||||
Purpose:
|
||||
========
|
||||
This document provides some general notes on the modular
|
||||
sound drivers and their configuration, along with the
|
||||
support modules sound.o and soundcore.o.
|
||||
|
||||
Note, some of this probably should be added to the Sound-HOWTO!
|
||||
|
||||
Note, soundlow.o was present with 2.2 kernels but is not
|
||||
required for 2.4.x kernels. References have been removed
|
||||
to this.
|
||||
|
||||
|
||||
Copying:
|
||||
========
|
||||
none
|
||||
|
||||
|
||||
History:
|
||||
========
|
||||
0.1.0 11/20/1998 First version, draft
|
||||
1.0.0 11/1998 Alan Cox changes, incorporation in 2.2.0
|
||||
as Documentation/sound/oss/Introduction
|
||||
1.1.0 6/30/1999 Second version, added notes on making the drivers,
|
||||
added info on multiple sound cards of similar types,]
|
||||
added more diagnostics info, added info about esd.
|
||||
added info on OSS and ALSA.
|
||||
1.1.1 19991031 Added notes on sound-slot- and sound-service.
|
||||
(Alan Cox)
|
||||
1.1.2 20000920 Modified for Kernel 2.4 (Christoph Hellwig)
|
||||
1.1.3 20010214 Minor notes and corrections (Wade Hampton)
|
||||
Added examples of sound-slot-0, etc.
|
||||
|
||||
|
||||
Modular Sound Drivers:
|
||||
======================
|
||||
|
||||
Thanks to the GREAT work by Alan Cox (alan@lxorguk.ukuu.org.uk),
|
||||
|
||||
[And Oleg Drokin, Thomas Sailer, Andrew Veliath and more than a few
|
||||
others - not to mention Hannu's original code being designed well
|
||||
enough to cope with that kind of chopping up](Alan)
|
||||
|
||||
the standard Linux kernels support a modular sound driver. From
|
||||
Alan's comments in linux/drivers/sound/README.FIRST:
|
||||
|
||||
The modular sound driver patches were funded by Red Hat Software
|
||||
(www.redhat.com). The sound driver here is thus a modified version of
|
||||
Hannu's code. Please bear that in mind when considering the appropriate
|
||||
forums for bug reporting.
|
||||
|
||||
The modular sound drivers may be loaded via insmod or modprobe.
|
||||
To support all the various sound modules, there are two general
|
||||
support modules that must be loaded first:
|
||||
|
||||
soundcore.o: Top level handler for the sound system, provides
|
||||
a set of functions for registration of devices
|
||||
by type.
|
||||
|
||||
sound.o: Common sound functions required by all modules.
|
||||
|
||||
For the specific sound modules (e.g., sb.o for the Soundblaster),
|
||||
read the documentation on that module to determine what options
|
||||
are available, for example IRQ, address, DMA.
|
||||
|
||||
Warning, the options for different cards sometime use different names
|
||||
for the same or a similar feature (dma1= versus dma16=). As a last
|
||||
resort, inspect the code (search for module_param).
|
||||
|
||||
Notes:
|
||||
|
||||
1. There is a new OpenSource sound driver called ALSA which is
|
||||
currently under development: http://www.alsa-project.org/
|
||||
The ALSA drivers support some newer hardware that may not
|
||||
be supported by this sound driver and also provide some
|
||||
additional features.
|
||||
|
||||
2. The commercial OSS driver may be obtained from the site:
|
||||
http://www.opensound.com. This may be used for cards that
|
||||
are unsupported by the kernel driver, or may be used
|
||||
by other operating systems.
|
||||
|
||||
3. The enlightenment sound daemon may be used for playing
|
||||
multiple sounds at the same time via a single card, eliminating
|
||||
some of the requirements for multiple sound card systems. For
|
||||
more information, see: http://www.tux.org/~ricdude/EsounD.html
|
||||
The "esd" program may be used with the real-player and mpeg
|
||||
players like mpg123 and x11amp. The newer real-player
|
||||
and some games even include built-in support for ESD!
|
||||
|
||||
|
||||
Building the Modules:
|
||||
=====================
|
||||
|
||||
This document does not provide full details on building the
|
||||
kernel, etc. The notes below apply only to making the kernel
|
||||
sound modules. If this conflicts with the kernel's README,
|
||||
the README takes precedence.
|
||||
|
||||
1. To make the kernel sound modules, cd to your /usr/src/linux
|
||||
directory (typically) and type make config, make menuconfig,
|
||||
or make xconfig (to start the command line, dialog, or x-based
|
||||
configuration tool).
|
||||
|
||||
2. Select the Sound option and a dialog will be displayed.
|
||||
|
||||
3. Select M (module) for "Sound card support".
|
||||
|
||||
4. Select your sound driver(s) as a module. For ProAudio, Sound
|
||||
Blaster, etc., select M (module) for OSS sound modules.
|
||||
[thanks to Marvin Stodolsky <stodolsk@erols.com>]A
|
||||
|
||||
5. Make the kernel (e.g., make bzImage), and install the kernel.
|
||||
|
||||
6. Make the modules and install them (make modules; make modules_install).
|
||||
|
||||
Note, for 2.5.x kernels, make sure you have the newer module-init-tools
|
||||
installed or modules will not be loaded properly. 2.5.x requires an
|
||||
updated module-init-tools.
|
||||
|
||||
|
||||
Plug and Play (PnP:
|
||||
===================
|
||||
|
||||
If the sound card is an ISA PnP card, isapnp may be used
|
||||
to configure the card. See the file isapnp.txt in the
|
||||
directory one level up (e.g., /usr/src/linux/Documentation).
|
||||
|
||||
Also the 2.4.x kernels provide PnP capabilities, see the
|
||||
file NEWS in this directory.
|
||||
|
||||
PCI sound cards are highly recommended, as they are far
|
||||
easier to configure and from what I have read, they use
|
||||
less resources and are more CPU efficient.
|
||||
|
||||
|
||||
INSMOD:
|
||||
=======
|
||||
|
||||
If loading via insmod, the common modules must be loaded in the
|
||||
order below BEFORE loading the other sound modules. The card-specific
|
||||
modules may then be loaded (most require parameters). For example,
|
||||
I use the following via a shell script to load my SoundBlaster:
|
||||
|
||||
SB_BASE=0x240
|
||||
SB_IRQ=9
|
||||
SB_DMA=3
|
||||
SB_DMA2=5
|
||||
SB_MPU=0x300
|
||||
#
|
||||
echo Starting sound
|
||||
/sbin/insmod soundcore
|
||||
/sbin/insmod sound
|
||||
#
|
||||
echo Starting sound blaster....
|
||||
/sbin/insmod uart401
|
||||
/sbin/insmod sb io=$SB_BASE irq=$SB_IRQ dma=$SB_DMA dma16=$SB_DMA2 mpu_io=$SB_MP
|
||||
|
||||
When using sound as a module, I typically put these commands
|
||||
in a file such as /root/soundon.sh.
|
||||
|
||||
|
||||
MODPROBE:
|
||||
=========
|
||||
|
||||
If loading via modprobe, these common files are automatically loaded when
|
||||
requested by modprobe. For example, my /etc/modprobe.d/oss.conf contains:
|
||||
|
||||
alias sound sb
|
||||
options sb io=0x240 irq=9 dma=3 dma16=5 mpu_io=0x300
|
||||
|
||||
All you need to do to load the module is:
|
||||
|
||||
/sbin/modprobe sb
|
||||
|
||||
|
||||
Sound Status:
|
||||
=============
|
||||
|
||||
The status of sound may be read/checked by:
|
||||
cat (anyfile).au >/dev/audio
|
||||
|
||||
[WWH: This may not work properly for SoundBlaster PCI 128 cards
|
||||
such as the es1370/1 (see the es1370/1 files in this directory)
|
||||
as they do not automatically support uLaw on /dev/audio.]
|
||||
|
||||
The status of the modules and which modules depend on
|
||||
which other modules may be checked by:
|
||||
/sbin/lsmod
|
||||
|
||||
/sbin/lsmod should show something like the following:
|
||||
sb 26280 0
|
||||
uart401 5640 0 [sb]
|
||||
sound 57112 0 [sb uart401]
|
||||
soundcore 1968 8 [sb sound]
|
||||
|
||||
|
||||
Removing Sound:
|
||||
===============
|
||||
|
||||
Sound may be removed by using /sbin/rmmod in the reverse order
|
||||
in which you load the modules. Note, if a program has a sound device
|
||||
open (e.g., xmixer), that module (and the modules on which it
|
||||
depends) may not be unloaded.
|
||||
|
||||
For example, I use the following to remove my Soundblaster (rmmod
|
||||
in the reverse order in which I loaded the modules):
|
||||
|
||||
/sbin/rmmod sb
|
||||
/sbin/rmmod uart401
|
||||
/sbin/rmmod sound
|
||||
/sbin/rmmod soundcore
|
||||
|
||||
When using sound as a module, I typically put these commands
|
||||
in a script such as /root/soundoff.sh.
|
||||
|
||||
|
||||
Removing Sound for use with OSS:
|
||||
================================
|
||||
|
||||
If you get really stuck or have a card that the kernel modules
|
||||
will not support, you can get a commercial sound driver from
|
||||
http://www.opensound.com. Before loading the commercial sound
|
||||
driver, you should do the following:
|
||||
|
||||
1. remove sound modules (detailed above)
|
||||
2. remove the sound modules from /etc/modprobe.d/*.conf
|
||||
3. move the sound modules from /lib/modules/<kernel>/misc
|
||||
(for example, I make a /lib/modules/<kernel>/misc/tmp
|
||||
directory and copy the sound module files to that
|
||||
directory).
|
||||
|
||||
|
||||
Multiple Sound Cards:
|
||||
=====================
|
||||
|
||||
The sound drivers will support multiple sound cards and there
|
||||
are some great applications like multitrack that support them.
|
||||
Typically, you need two sound cards of different types. Note, this
|
||||
uses more precious interrupts and DMA channels and sometimes
|
||||
can be a configuration nightmare. I have heard reports of 3-4
|
||||
sound cards (typically I only use 2). You can sometimes use
|
||||
multiple PCI sound cards of the same type.
|
||||
|
||||
On my machine I have two sound cards (cs4232 and Soundblaster Vibra
|
||||
16). By loading sound as modules, I can control which is the first
|
||||
sound device (/dev/dsp, /dev/audio, /dev/mixer) and which is
|
||||
the second. Normally, the cs4232 (Dell sound on the motherboard)
|
||||
would be the first sound device, but I prefer the Soundblaster.
|
||||
All you have to do is to load the one you want as /dev/dsp
|
||||
first (in my case "sb") and then load the other one
|
||||
(in my case "cs4232").
|
||||
|
||||
If you have two cards of the same type that are jumpered
|
||||
cards or different PnP revisions, you may load the same
|
||||
module twice. For example, I have a SoundBlaster vibra 16
|
||||
and an older SoundBlaster 16 (jumpers). To load the module
|
||||
twice, you need to do the following:
|
||||
|
||||
1. Copy the sound modules to a new name. For example
|
||||
sb.o could be copied (or symlinked) to sb1.o for the
|
||||
second SoundBlaster.
|
||||
|
||||
2. Make a second entry in /etc/modprobe.d/*conf, for example,
|
||||
sound1 or sb1. This second entry should refer to the
|
||||
new module names for example sb1, and should include
|
||||
the I/O, etc. for the second sound card.
|
||||
|
||||
3. Update your soundon.sh script, etc.
|
||||
|
||||
Warning: I have never been able to get two PnP sound cards of the
|
||||
same type to load at the same time. I have tried this several times
|
||||
with the Soundblaster Vibra 16 cards. OSS has indicated that this
|
||||
is a PnP problem.... If anyone has any luck doing this, please
|
||||
send me an E-MAIL. PCI sound cards should not have this problem.a
|
||||
Since this was originally release, I have received a couple of
|
||||
mails from people who have accomplished this!
|
||||
|
||||
NOTE: In Linux 2.4 the Sound Blaster driver (and only this one yet)
|
||||
supports multiple cards with one module by default.
|
||||
Read the file 'Soundblaster' in this directory for details.
|
||||
|
||||
|
||||
Sound Problems:
|
||||
===============
|
||||
|
||||
First RTFM (including the troubleshooting section
|
||||
in the Sound-HOWTO).
|
||||
|
||||
1) If you are having problems loading the modules (for
|
||||
example, if you get device conflict errors) try the
|
||||
following:
|
||||
|
||||
A) If you have Win95 or NT on the same computer,
|
||||
write down what addresses, IRQ, and DMA channels
|
||||
those were using for the same hardware. You probably
|
||||
can use these addresses, IRQs, and DMA channels.
|
||||
You should really do this BEFORE attempting to get
|
||||
sound working!
|
||||
|
||||
B) Check (cat) /proc/interrupts, /proc/ioports,
|
||||
and /proc/dma. Are you trying to use an address,
|
||||
IRQ or DMA port that another device is using?
|
||||
|
||||
C) Check (cat) /proc/isapnp
|
||||
|
||||
D) Inspect your /var/log/messages file. Often that will
|
||||
indicate what IRQ or IO port could not be obtained.
|
||||
|
||||
E) Try another port or IRQ. Note this may involve
|
||||
using the PnP tools to move the sound card to
|
||||
another location. Sometimes this is the only way
|
||||
and it is more or less trial and error.
|
||||
|
||||
2) If you get motor-boating (the same sound or part of a
|
||||
sound clip repeated), you probably have either an IRQ
|
||||
or DMA conflict. Move the card to another IRQ or DMA
|
||||
port. This has happened to me when playing long files
|
||||
when I had an IRQ conflict.
|
||||
|
||||
3. If you get dropouts or pauses when playing high sample
|
||||
rate files such as using mpg123 or x11amp/xmms, you may
|
||||
have too slow of a CPU and may have to use the options to
|
||||
play the files at 1/2 speed. For example, you may use
|
||||
the -2 or -4 option on mpg123. You may also get this
|
||||
when trying to play mpeg files stored on a CD-ROM
|
||||
(my Toshiba T8000 PII/366 sometimes has this problem).
|
||||
|
||||
4. If you get "cannot access device" errors, your /dev/dsp
|
||||
files, etc. may be set to owner root, mode 600. You
|
||||
may have to use the command:
|
||||
chmod 666 /dev/dsp /dev/mixer /dev/audio
|
||||
|
||||
5. If you get "device busy" errors, another program has the
|
||||
sound device open. For example, if using the Enlightenment
|
||||
sound daemon "esd", the "esd" program has the sound device.
|
||||
If using "esd", please RTFM the docs on ESD. For example,
|
||||
esddsp <program> may be used to play files via a non-esd
|
||||
aware program.
|
||||
|
||||
6) Ask for help on the sound list or send E-MAIL to the
|
||||
sound driver author/maintainer.
|
||||
|
||||
7) Turn on debug in drivers/sound/sound_config.h (DEB, DDB, MDB).
|
||||
|
||||
8) If the system reports insufficient DMA memory then you may want to
|
||||
load sound with the "dmabufs=1" option. Or in /etc/conf.modules add
|
||||
|
||||
preinstall sound dmabufs=1
|
||||
|
||||
This makes the sound system allocate its buffers and hang onto them.
|
||||
|
||||
You may also set persistent DMA when building a 2.4.x kernel.
|
||||
|
||||
|
||||
Configuring Sound:
|
||||
==================
|
||||
|
||||
There are several ways of configuring your sound:
|
||||
|
||||
1) On the kernel command line (when using the sound driver(s)
|
||||
compiled in the kernel). Check the driver source and
|
||||
documentation for details.
|
||||
|
||||
2) On the command line when using insmod or in a bash script
|
||||
using command line calls to load sound.
|
||||
|
||||
3) In /etc/modprobe.d/*conf when using modprobe.
|
||||
|
||||
4) Via Red Hat's GPL'd /usr/sbin/sndconfig program (text based).
|
||||
|
||||
5) Via the OSS soundconf program (with the commercial version
|
||||
of the OSS driver.
|
||||
|
||||
6) By just loading the module and let isapnp do everything relevant
|
||||
for you. This works only with a few drivers yet and - of course -
|
||||
only with isapnp hardware.
|
||||
|
||||
And I am sure, several other ways.
|
||||
|
||||
Anyone want to write a linuxconf module for configuring sound?
|
||||
|
||||
|
||||
Module Loading:
|
||||
===============
|
||||
|
||||
When a sound card is first referenced and sound is modular, the sound system
|
||||
will ask for the sound devices to be loaded. Initially it requests that
|
||||
the driver for the sound system is loaded. It then will ask for
|
||||
sound-slot-0, where 0 is the first sound card. (sound-slot-1 the second and
|
||||
so on). Thus you can do
|
||||
|
||||
alias sound-slot-0 sb
|
||||
|
||||
To load a soundblaster at this point. If the slot loading does not provide
|
||||
the desired device - for example a soundblaster does not directly provide
|
||||
a midi synth in all cases then it will request "sound-service-0-n" where n
|
||||
is
|
||||
|
||||
0 Mixer
|
||||
|
||||
2 MIDI
|
||||
|
||||
3, 4 DSP audio
|
||||
|
||||
|
||||
For example, I use the following to load my Soundblaster PCI 128
|
||||
(ES 1371) card first, followed by my SoundBlaster Vibra 16 card,
|
||||
then by my TV card:
|
||||
|
||||
# Load the Soundblaster PCI 128 as /dev/dsp, /dev/dsp1, /dev/mixer
|
||||
alias sound-slot-0 es1371
|
||||
|
||||
# Load the Soundblaster Vibra 16 as /dev/dsp2, /dev/mixer1
|
||||
alias sound-slot-1 sb
|
||||
options sb io=0x240 irq=5 dma=1 dma16=5 mpu_io=0x330
|
||||
|
||||
# Load the BTTV (TV card) as /dev/mixer2
|
||||
alias sound-slot-2 bttv
|
||||
alias sound-service-2-0 tvmixer
|
||||
|
||||
pre-install bttv modprobe tuner ; modprobe tvmixer
|
||||
pre-install tvmixer modprobe msp3400; modprobe tvaudio
|
||||
options tuner debug=0 type=8
|
||||
options bttv card=0 radio=0 pll=0
|
||||
|
||||
|
||||
For More Information (RTFM):
|
||||
============================
|
||||
1) Information on kernel modules: manual pages for insmod and modprobe.
|
||||
|
||||
2) Information on PnP, RTFM manual pages for isapnp.
|
||||
|
||||
3) Sound-HOWTO and Sound-Playing-HOWTO.
|
||||
|
||||
4) OSS's WWW site at http://www.opensound.com.
|
||||
|
||||
5) All the files in Documentation/sound.
|
||||
|
||||
6) The comments and code in linux/drivers/sound.
|
||||
|
||||
7) The sndconfig and rhsound documentation from Red Hat.
|
||||
|
||||
8) The Linux-sound mailing list: sound-list@redhat.com.
|
||||
|
||||
9) Enlightenment documentation (for info on esd)
|
||||
http://www.tux.org/~ricdude/EsounD.html.
|
||||
|
||||
10) ALSA home page: http://www.alsa-project.org/
|
||||
|
||||
|
||||
Contact Information:
|
||||
====================
|
||||
Wade Hampton: (whampton@staffnet.com)
|
||||
|
1137
Documentation/sound/oss/MultiSound
Normal file
1137
Documentation/sound/oss/MultiSound
Normal file
File diff suppressed because it is too large
Load diff
6
Documentation/sound/oss/OPL3
Normal file
6
Documentation/sound/oss/OPL3
Normal file
|
@ -0,0 +1,6 @@
|
|||
A pure OPL3 card is nice and easy to configure. Simply do
|
||||
|
||||
insmod opl3 io=0x388
|
||||
|
||||
Change the I/O address in the very unlikely case this card is differently
|
||||
configured
|
218
Documentation/sound/oss/Opti
Normal file
218
Documentation/sound/oss/Opti
Normal file
|
@ -0,0 +1,218 @@
|
|||
Support for the OPTi 82C931 chip
|
||||
--------------------------------
|
||||
Note: parts of this README file apply also to other
|
||||
cards that use the mad16 driver.
|
||||
|
||||
Some items in this README file are based on features
|
||||
added to the sound driver after Linux-2.1.91 was out.
|
||||
By the time of writing this I do not know which official
|
||||
kernel release will include these features.
|
||||
Please do not report inconsistencies on older Linux
|
||||
kernels.
|
||||
|
||||
The OPTi 82C931 is supported in its non-PnP mode.
|
||||
Usually you do not need to set jumpers, etc. The sound driver
|
||||
will check the card status and if it is required it will
|
||||
force the card into a mode in which it can be programmed.
|
||||
|
||||
If you have another OS installed on your computer it is recommended
|
||||
that Linux and the other OS use the same resources.
|
||||
|
||||
Also, it is recommended that resources specified in /etc/modprobe.d/*.conf
|
||||
and resources specified in /etc/isapnp.conf agree.
|
||||
|
||||
Compiling the sound driver
|
||||
--------------------------
|
||||
I highly recommend that you build a modularized sound driver.
|
||||
This document does not cover a sound-driver which is built in
|
||||
the kernel.
|
||||
|
||||
Sound card support should be enabled as a module (chose m).
|
||||
Answer 'm' for these items:
|
||||
Generic OPL2/OPL3 FM synthesizer support (CONFIG_SOUND_ADLIB)
|
||||
Microsoft Sound System support (CONFIG_SOUND_MSS)
|
||||
Support for OPTi MAD16 and/or Mozart based cards (CONFIG_SOUND_MAD16)
|
||||
FM synthesizer (YM3812/OPL-3) support (CONFIG_SOUND_YM3812)
|
||||
|
||||
The configuration menu may ask for addresses, IRQ lines or DMA
|
||||
channels. If the card is used as a module the module loading
|
||||
options will override these values.
|
||||
|
||||
For the OPTi 931 you can answer 'n' to:
|
||||
Support MIDI in older MAD16 based cards (requires SB) (CONFIG_SOUND_MAD16_OLDCARD)
|
||||
If you do need MIDI support in a Mozart or C928 based card you
|
||||
need to answer 'm' to the above question. In that case you will
|
||||
also need to answer 'm' to:
|
||||
'100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support' (CONFIG_SOUND_SB)
|
||||
|
||||
Go on and compile your kernel and modules. Install the modules. Run depmod -a.
|
||||
|
||||
Using isapnptools
|
||||
-----------------
|
||||
In most systems with a PnP BIOS you do not need to use isapnp. The
|
||||
initialization provided by the BIOS is sufficient for the driver
|
||||
to pick up the card and continue initialization.
|
||||
|
||||
If that fails, or if you have other PnP cards, you need to use isapnp
|
||||
to initialize the card.
|
||||
This was tested with isapnptools-1.11 but I recommend that you use
|
||||
isapnptools-1.13 (or newer). Run pnpdump to dump the information
|
||||
about your PnP cards. Then edit the resulting file and select
|
||||
the options of your choice. This file is normally installed as
|
||||
/etc/isapnp.conf.
|
||||
|
||||
The driver has one limitation with respect to I/O port resources:
|
||||
IO3 base must be 0x0E0C. Although isapnp allows other ports, this
|
||||
address is hard-coded into the driver.
|
||||
|
||||
Using kmod and autoloading the sound driver
|
||||
-------------------------------------------
|
||||
Config files in '/etc/modprobe.d/' are used as below:
|
||||
|
||||
alias mixer0 mad16
|
||||
alias audio0 mad16
|
||||
alias midi0 mad16
|
||||
alias synth0 opl3
|
||||
options sb mad16=1
|
||||
options mad16 irq=10 dma=0 dma16=1 io=0x530 joystick=1 cdtype=0
|
||||
options opl3 io=0x388
|
||||
install mad16 /sbin/modprobe -i mad16 && /sbin/ad1848_mixer_reroute 14 8 15 3 16 6
|
||||
|
||||
If you have an MPU daughtercard or onboard MPU you will want to add to the
|
||||
"options mad16" line - eg
|
||||
|
||||
options mad16 irq=5 dma=0 dma16=3 io=0x530 mpu_io=0x330 mpu_irq=9
|
||||
|
||||
To set the I/O and IRQ of the MPU.
|
||||
|
||||
|
||||
Explain:
|
||||
|
||||
alias mixer0 mad16
|
||||
alias audio0 mad16
|
||||
alias midi0 mad16
|
||||
alias synth0 opl3
|
||||
|
||||
When any sound device is opened the kernel requests auto-loading
|
||||
of char-major-14. There is a built-in alias that translates this
|
||||
request to loading the main sound module.
|
||||
|
||||
The sound module in its turn will request loading of a sub-driver
|
||||
for mixer, audio, midi or synthesizer device. The first 3 are
|
||||
supported by the mad16 driver. The synth device is supported
|
||||
by the opl3 driver.
|
||||
|
||||
There is currently no way to autoload the sound device driver
|
||||
if more than one card is installed.
|
||||
|
||||
options sb mad16=1
|
||||
|
||||
This is left for historical reasons. If you enable the
|
||||
config option 'Support MIDI in older MAD16 based cards (requires SB)'
|
||||
or if you use an older mad16 driver it will force loading of the
|
||||
SoundBlaster driver. This option tells the SB driver not to look
|
||||
for a SB card but to wait for the mad16 driver.
|
||||
|
||||
options mad16 irq=10 dma=0 dma16=1 io=0x530 joystick=1 cdtype=0
|
||||
options opl3 io=0x388
|
||||
|
||||
post-install mad16 /sbin/ad1848_mixer_reroute 14 8 15 3 16 6
|
||||
|
||||
This sets resources and options for the mad16 and opl3 drivers.
|
||||
I use two DMA channels (only one is required) to enable full duplex.
|
||||
joystick=1 enables the joystick port. cdtype=0 disables the cd port.
|
||||
You can also set mpu_io and mpu_irq in the mad16 options for the
|
||||
uart401 driver.
|
||||
|
||||
This tells modprobe to run /sbin/ad1848_mixer_reroute after
|
||||
mad16 is successfully loaded and initialized. The source
|
||||
for ad1848_mixer_reroute is appended to the end of this readme
|
||||
file. It is impossible for the sound driver to know the actual
|
||||
connections to the mixer. The 3 inputs intended for cd, synth
|
||||
and line-in are mapped to the generic inputs line1, line2 and
|
||||
line3. This program reroutes these mixer channels to their
|
||||
right names (note the right mapping depends on the actual sound
|
||||
card that you use).
|
||||
The numeric parameters mean:
|
||||
14=line1 8=cd - reroute line1 to the CD input.
|
||||
15=line2 3=synth - reroute line2 to the synthesizer input.
|
||||
16=line3 6=line - reroute line3 to the line input.
|
||||
For reference on other input names look at the file
|
||||
/usr/include/linux/soundcard.h.
|
||||
|
||||
Using a joystick
|
||||
-----------------
|
||||
You must enable a joystick in the mad16 options. (also
|
||||
in /etc/isapnp.conf if you use it).
|
||||
Tested with regular analog joysticks.
|
||||
|
||||
A CDROM drive connected to the sound card
|
||||
-----------------------------------------
|
||||
The 82C931 chip has support only for secondary ATAPI cdrom.
|
||||
(cdtype=8). Loading the mad16 driver resets the C931 chip
|
||||
and if a cdrom was already mounted it may cause a complete
|
||||
system hang. Do not use the sound card if you have an alternative.
|
||||
If you do use the sound card it is important that you load
|
||||
the mad16 driver (use "modprobe mad16" to prevent auto-unloading)
|
||||
before the cdrom is accessed the first time.
|
||||
|
||||
Using the sound driver built-in to the kernel may help here, but...
|
||||
Most new systems have a PnP BIOS and also two IDE controllers.
|
||||
The IDE controller on the sound card may be needed only on older
|
||||
systems (which have only one IDE controller) but these systems
|
||||
also do not have a PnP BIOS - requiring isapnptools and a modularized
|
||||
driver.
|
||||
|
||||
Known problems
|
||||
--------------
|
||||
1. See the section on "A CDROM drive connected to the sound card".
|
||||
|
||||
2. On my system the codec cannot capture companded sound samples.
|
||||
(eg., recording from /dev/audio). When any companded capture is
|
||||
requested I get stereo-16 bit samples instead. Playback of
|
||||
companded samples works well. Apparently this problem is not common
|
||||
to all C931 based cards. I do not know how to identify cards that
|
||||
have this problem.
|
||||
|
||||
Source for ad1848_mixer_reroute.c
|
||||
---------------------------------
|
||||
#include <stdio.h>
|
||||
#include <fcntl.h>
|
||||
#include <linux/soundcard.h>
|
||||
|
||||
static char *mixer_names[SOUND_MIXER_NRDEVICES] =
|
||||
SOUND_DEVICE_LABELS;
|
||||
|
||||
int
|
||||
main(int argc, char **argv) {
|
||||
int val, from, to;
|
||||
int i, fd;
|
||||
|
||||
fd = open("/dev/mixer", O_RDWR);
|
||||
if(fd < 0) {
|
||||
perror("/dev/mixer");
|
||||
return 1;
|
||||
}
|
||||
|
||||
for(i = 2; i < argc; i += 2) {
|
||||
from = atoi(argv[i-1]);
|
||||
to = atoi(argv[i]);
|
||||
|
||||
if(to == SOUND_MIXER_NONE)
|
||||
fprintf(stderr, "%s: turning off mixer %s\n",
|
||||
argv[0], mixer_names[to]);
|
||||
else
|
||||
fprintf(stderr, "%s: rerouting mixer %s to %s\n",
|
||||
argv[0], mixer_names[from], mixer_names[to]);
|
||||
|
||||
val = from << 8 | to;
|
||||
|
||||
if(ioctl(fd, SOUND_MIXER_PRIVATE2, &val)) {
|
||||
perror("AD1848 mixer reroute");
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
162
Documentation/sound/oss/PAS16
Normal file
162
Documentation/sound/oss/PAS16
Normal file
|
@ -0,0 +1,162 @@
|
|||
Pro Audio Spectrum 16 for 2.3.99 and later
|
||||
=========================================
|
||||
by Thomas Molina (tmolina@home.com)
|
||||
last modified 3 Mar 2001
|
||||
Acknowledgement to Axel Boldt (boldt@math.ucsb.edu) for stuff taken
|
||||
from Configure.help, Riccardo Facchetti for stuff from README.OSS,
|
||||
and others whose names I could not find.
|
||||
|
||||
This documentation is relevant for the PAS16 driver (pas2_card.c and
|
||||
friends) under kernel version 2.3.99 and later. If you are
|
||||
unfamiliar with configuring sound under Linux, please read the
|
||||
Sound-HOWTO, Documentation/sound/oss/Introduction and other
|
||||
relevant docs first.
|
||||
|
||||
The following information is relevant information from README.OSS
|
||||
and legacy docs for the Pro Audio Spectrum 16 (PAS16):
|
||||
==================================================================
|
||||
|
||||
The pas2_card.c driver supports the following cards --
|
||||
Pro Audio Spectrum 16 (PAS16) and compatibles:
|
||||
Pro Audio Spectrum 16
|
||||
Pro Audio Studio 16
|
||||
Logitech Sound Man 16
|
||||
NOTE! The original Pro Audio Spectrum as well as the PAS+ are not
|
||||
and will not be supported by the driver.
|
||||
|
||||
The sound driver configuration dialog
|
||||
-------------------------------------
|
||||
|
||||
Sound configuration starts by making some yes/no questions. Be careful
|
||||
when answering to these questions since answering y to a question may
|
||||
prevent some later ones from being asked. For example don't answer y to
|
||||
the question about (PAS16) if you don't really have a PAS16. Sound
|
||||
configuration may also be made modular by answering m to configuration
|
||||
options presented.
|
||||
|
||||
Note also that all questions may not be asked. The configuration program
|
||||
may disable some questions depending on the earlier choices. It may also
|
||||
select some options automatically as well.
|
||||
|
||||
"ProAudioSpectrum 16 support",
|
||||
- Answer 'y'_ONLY_ if you have a Pro Audio Spectrum _16_,
|
||||
Pro Audio Studio 16 or Logitech SoundMan 16 (be sure that
|
||||
you read the above list correctly). Don't answer 'y' if you
|
||||
have some other card made by Media Vision or Logitech since they
|
||||
are not PAS16 compatible.
|
||||
NOTE! Since 3.5-beta10 you need to enable SB support (next question)
|
||||
if you want to use the SB emulation of PAS16. It's also possible to
|
||||
the emulation if you want to use a true SB card together with PAS16
|
||||
(there is another question about this that is asked later).
|
||||
|
||||
"Generic OPL2/OPL3 FM synthesizer support",
|
||||
- Answer 'y' if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4).
|
||||
The PAS16 has an OPL3-compatible FM chip.
|
||||
|
||||
With PAS16 you can use two audio device files at the same time. /dev/dsp (and
|
||||
/dev/audio) is connected to the 8/16 bit native codec and the /dev/dsp1 (and
|
||||
/dev/audio1) is connected to the SB emulation (8 bit mono only).
|
||||
|
||||
|
||||
The new stuff for 2.3.99 and later
|
||||
============================================================================
|
||||
The following configuration options are relevant to configuring the PAS16:
|
||||
|
||||
Sound card support
|
||||
CONFIG_SOUND
|
||||
If you have a sound card in your computer, i.e. if it can say more
|
||||
than an occasional beep, say Y. Be sure to have all the information
|
||||
about your sound card and its configuration down (I/O port,
|
||||
interrupt and DMA channel), because you will be asked for it.
|
||||
|
||||
You want to read the Sound-HOWTO, available from
|
||||
http://www.tldp.org/docs.html#howto . General information
|
||||
about the modular sound system is contained in the files
|
||||
Documentation/sound/oss/Introduction. The file
|
||||
Documentation/sound/oss/README.OSS contains some slightly outdated but
|
||||
still useful information as well.
|
||||
|
||||
OSS sound modules
|
||||
CONFIG_SOUND_OSS
|
||||
OSS is the Open Sound System suite of sound card drivers. They make
|
||||
sound programming easier since they provide a common API. Say Y or M
|
||||
here (the module will be called sound.o) if you haven't found a
|
||||
driver for your sound card above, then pick your driver from the
|
||||
list below.
|
||||
|
||||
Persistent DMA buffers
|
||||
CONFIG_SOUND_DMAP
|
||||
Linux can often have problems allocating DMA buffers for ISA sound
|
||||
cards on machines with more than 16MB of RAM. This is because ISA
|
||||
DMA buffers must exist below the 16MB boundary and it is quite
|
||||
possible that a large enough free block in this region cannot be
|
||||
found after the machine has been running for a while. If you say Y
|
||||
here the DMA buffers (64Kb) will be allocated at boot time and kept
|
||||
until the shutdown. This option is only useful if you said Y to
|
||||
"OSS sound modules", above. If you said M to "OSS sound modules"
|
||||
then you can get the persistent DMA buffer functionality by passing
|
||||
the command-line argument "dmabuf=1" to the sound.o module.
|
||||
|
||||
Say y here for PAS16.
|
||||
|
||||
ProAudioSpectrum 16 support
|
||||
CONFIG_SOUND_PAS
|
||||
Answer Y only if you have a Pro Audio Spectrum 16, ProAudio Studio
|
||||
16 or Logitech SoundMan 16 sound card. Don't answer Y if you have
|
||||
some other card made by Media Vision or Logitech since they are not
|
||||
PAS16 compatible. It is not necessary to enable the separate
|
||||
Sound Blaster support; it is included in the PAS driver.
|
||||
|
||||
If you compile the driver into the kernel, you have to add
|
||||
"pas2=<io>,<irq>,<dma>,<dma2>,<sbio>,<sbirq>,<sbdma>,<sbdma2>
|
||||
to the kernel command line.
|
||||
|
||||
FM Synthesizer (YM3812/OPL-3) support
|
||||
CONFIG_SOUND_YM3812
|
||||
Answer Y if your card has a FM chip made by Yamaha (OPL2/OPL3/OPL4).
|
||||
Answering Y is usually a safe and recommended choice, however some
|
||||
cards may have software (TSR) FM emulation. Enabling FM support with
|
||||
these cards may cause trouble (I don't currently know of any such
|
||||
cards, however).
|
||||
Please read the file Documentation/sound/oss/OPL3 if your card has an
|
||||
OPL3 chip.
|
||||
If you compile the driver into the kernel, you have to add
|
||||
"opl3=<io>" to the kernel command line.
|
||||
|
||||
If you compile your drivers into the kernel, you MUST configure
|
||||
OPL3 support as a module for PAS16 support to work properly.
|
||||
You can then get OPL3 functionality by issuing the command:
|
||||
insmod opl3
|
||||
In addition, you must either add the following line to
|
||||
/etc/modprobe.d/*.conf:
|
||||
options opl3 io=0x388
|
||||
or else add the following line to /etc/lilo.conf:
|
||||
opl3=0x388
|
||||
|
||||
|
||||
EXAMPLES
|
||||
===================================================================
|
||||
To use the PAS16 in my computer I have enabled the following sound
|
||||
configuration options:
|
||||
|
||||
CONFIG_SOUND=y
|
||||
CONFIG_SOUND_OSS=y
|
||||
CONFIG_SOUND_TRACEINIT=y
|
||||
CONFIG_SOUND_DMAP=y
|
||||
CONFIG_SOUND_PAS=y
|
||||
CONFIG_SOUND_SB=n
|
||||
CONFIG_SOUND_YM3812=m
|
||||
|
||||
I have also included the following append line in /etc/lilo.conf:
|
||||
append="pas2=0x388,10,3,-1,0x220,5,1,-1 sb=0x220,5,1,-1 opl3=0x388"
|
||||
|
||||
The io address of 0x388 is default configuration on the PAS16. The
|
||||
irq of 10 and dma of 3 may not match your installation. The above
|
||||
configuration enables PAS16, 8-bit Soundblaster and OPL3
|
||||
functionality. If Soundblaster functionality is not desired, the
|
||||
following line would be appropriate:
|
||||
append="pas2=0x388,10,3,-1,0,-1,-1,-1 opl3=0x388"
|
||||
|
||||
If sound is built totally modular, the above options may be
|
||||
specified in /etc/modprobe.d/*.conf for pas2, sb and opl3
|
||||
respectively.
|
41
Documentation/sound/oss/PSS
Normal file
41
Documentation/sound/oss/PSS
Normal file
|
@ -0,0 +1,41 @@
|
|||
The PSS cards and other ECHO based cards provide an onboard DSP with
|
||||
downloadable programs and also has an AD1848 "Microsoft Sound System"
|
||||
device. The PSS driver enables MSS and MPU401 modes of the card. SB
|
||||
is not enabled since it doesn't work concurrently with MSS.
|
||||
|
||||
If you build this driver as a module then the driver takes the following
|
||||
parameters
|
||||
|
||||
pss_io. The I/O base the PSS card is configured at (normally 0x220
|
||||
or 0x240)
|
||||
|
||||
mss_io The base address of the Microsoft Sound System interface.
|
||||
This is normally 0x530, but may be 0x604 or other addresses.
|
||||
|
||||
mss_irq The interrupt assigned to the Microsoft Sound System
|
||||
emulation. IRQ's 3,5,7,9,10,11 and 12 are available. If you
|
||||
get IRQ errors be sure to check the interrupt is set to
|
||||
"ISA/Legacy" in the BIOS on modern machines.
|
||||
|
||||
mss_dma The DMA channel used by the Microsoft Sound System.
|
||||
This can be 0, 1, or 3. DMA 0 is not available on older
|
||||
machines and will cause a crash on them.
|
||||
|
||||
mpu_io The MPU emulation base address. This sets the base of the
|
||||
synthesizer. It is typically 0x330 but can be altered.
|
||||
|
||||
mpu_irq The interrupt to use for the synthesizer. It must differ
|
||||
from the IRQ used by the Microsoft Sound System port.
|
||||
|
||||
|
||||
The mpu_io/mpu_irq fields are optional. If they are not specified the
|
||||
synthesizer parts are not configured.
|
||||
|
||||
When the module is loaded it looks for a file called
|
||||
/etc/sound/pss_synth. This is the firmware file from the DOS install disks.
|
||||
This fil holds a general MIDI emulation. The file expected is called
|
||||
genmidi.ld on newer DOS driver install disks and synth.ld on older ones.
|
||||
|
||||
You can also load alternative DSP algorithms into the card if you wish. One
|
||||
alternative driver can be found at http://www.mpg123.de/
|
||||
|
88
Documentation/sound/oss/PSS-updates
Normal file
88
Documentation/sound/oss/PSS-updates
Normal file
|
@ -0,0 +1,88 @@
|
|||
This file contains notes for users of PSS sound cards who wish to use the
|
||||
newly added features of the newest version of this driver.
|
||||
|
||||
The major enhancements present in this new revision of this driver is the
|
||||
addition of two new module parameters that allow you to take full advantage of
|
||||
all the features present on your PSS sound card. These features include the
|
||||
ability to enable both the builtin CDROM and joystick ports.
|
||||
|
||||
pss_enable_joystick
|
||||
|
||||
This parameter is basically a flag. A 0 will leave the joystick port
|
||||
disabled, while a non-zero value would enable the joystick port. The default
|
||||
setting is pss_enable_joystick=0 as this keeps this driver fully compatible
|
||||
with systems that were using previous versions of this driver. If you wish to
|
||||
enable the joystick port you will have to add pss_enable_joystick=1 as an
|
||||
argument to the driver. To actually use the joystick port you will then have
|
||||
to load the joystick driver itself. Just remember to load the joystick driver
|
||||
AFTER the pss sound driver.
|
||||
|
||||
pss_cdrom_port
|
||||
|
||||
This parameter takes a port address as its parameter. Any available port
|
||||
address can be specified to enable the CDROM port, except for 0x0 and -1 as
|
||||
these values would leave the port disabled. Like the joystick port, the cdrom
|
||||
port will require that an appropriate CDROM driver be loaded before you can make
|
||||
use of the newly enabled CDROM port. Like the joystick port option above,
|
||||
remember to load the CDROM driver AFTER the pss sound driver. While it may
|
||||
differ on some PSS sound cards, all the PSS sound cards that I have seen have a
|
||||
builtin Wearnes CDROM port. If this is the case with your PSS sound card you
|
||||
should load aztcd with the appropriate port option that matches the port you
|
||||
assigned to the CDROM port when you loaded your pss sound driver. (ex.
|
||||
modprobe pss pss_cdrom_port=0x340 && modprobe aztcd aztcd=0x340) The default
|
||||
setting of this parameter leaves the CDROM port disabled to maintain full
|
||||
compatibility with systems using previous versions of this driver.
|
||||
|
||||
Other options have also been added for the added convenience and utility
|
||||
of the user. These options are only available if this driver is loaded as a
|
||||
module.
|
||||
|
||||
pss_no_sound
|
||||
|
||||
This module parameter is a flag that can be used to tell the driver to
|
||||
just configure non-sound components. 0 configures all components, a non-0
|
||||
value will only attept to configure the CDROM and joystick ports. This
|
||||
parameter can be used by a user who only wished to use the builtin joystick
|
||||
and/or CDROM port(s) of his PSS sound card. If this driver is loaded with this
|
||||
parameter and with the parameter below set to true then a user can safely unload
|
||||
this driver with the following command "rmmod pss && rmmod ad1848 && rmmod
|
||||
mpu401 && rmmod sound && rmmod soundcore" and retain the full functionality of
|
||||
his CDROM and/or joystick port(s) while gaining back the memory previously used
|
||||
by the sound drivers. This default setting of this parameter is 0 to retain
|
||||
full behavioral compatibility with previous versions of this driver.
|
||||
|
||||
pss_keep_settings
|
||||
|
||||
This parameter can be used to specify whether you want the driver to reset
|
||||
all emulations whenever its unloaded. This can be useful for those who are
|
||||
sharing resources (io ports, IRQ's, DMA's) between different ISA cards. This
|
||||
flag can also be useful in that future versions of this driver may reset all
|
||||
emulations by default on the driver's unloading (as it probably should), so
|
||||
specifying it now will ensure that all future versions of this driver will
|
||||
continue to work as expected. The default value of this parameter is 1 to
|
||||
retain full behavioral compatibility with previous versions of this driver.
|
||||
|
||||
pss_firmware
|
||||
|
||||
This parameter can be used to specify the file containing the firmware
|
||||
code so that a user could tell the driver where that file is located instead
|
||||
of having to put it in a predefined location with a predefined name. The
|
||||
default setting of this parameter is "/etc/sound/pss_synth" as this was the
|
||||
path and filename the hardcoded value in the previous versions of this driver.
|
||||
|
||||
Examples:
|
||||
|
||||
# Normal PSS sound card system, loading of drivers.
|
||||
# Should be specified in an rc file (ex. Slackware uses /etc/rc.d/rc.modules).
|
||||
|
||||
/sbin/modprobe pss pss_io=0x220 mpu_io=0x338 mpu_irq=9 mss_io=0x530 mss_irq=10 mss_dma=1 pss_cdrom_port=0x340 pss_enable_joystick=1
|
||||
/sbin/modprobe aztcd aztcd=0x340
|
||||
/sbin/modprobe joystick
|
||||
|
||||
# System using the PSS sound card just for its CDROM and joystick ports.
|
||||
# Should be specified in an rc file (ex. Slackware uses /etc/rc.d/rc.modules).
|
||||
|
||||
/sbin/modprobe pss pss_io=0x220 pss_cdrom_port=0x340 pss_enable_joystick=1 pss_no_sound=1
|
||||
/sbin/rmmod pss && /sbin/rmmod ad1848 && /sbin/rmmod mpu401 && /sbin/rmmod sound && /sbin/rmmod soundcore # This line not needed, but saves memory.
|
||||
/sbin/modprobe aztcd aztcd=0x340
|
||||
/sbin/modprobe joystick
|
1455
Documentation/sound/oss/README.OSS
Normal file
1455
Documentation/sound/oss/README.OSS
Normal file
File diff suppressed because it is too large
Load diff
106
Documentation/sound/oss/README.modules
Normal file
106
Documentation/sound/oss/README.modules
Normal file
|
@ -0,0 +1,106 @@
|
|||
Building a modular sound driver
|
||||
================================
|
||||
|
||||
The following information is current as of linux-2.1.85. Check the other
|
||||
readme files, especially README.OSS, for information not specific to
|
||||
making sound modular.
|
||||
|
||||
First, configure your kernel. This is an idea of what you should be
|
||||
setting in the sound section:
|
||||
|
||||
<M> Sound card support
|
||||
|
||||
<M> 100% Sound Blaster compatibles (SB16/32/64, ESS, Jazz16) support
|
||||
|
||||
I have SoundBlaster. Select your card from the list.
|
||||
|
||||
<M> Generic OPL2/OPL3 FM synthesizer support
|
||||
<M> FM synthesizer (YM3812/OPL-3) support
|
||||
|
||||
If you don't set these, you will probably find you can play .wav files
|
||||
but not .midi. As the help for them says, set them unless you know your
|
||||
card does not use one of these chips for FM support.
|
||||
|
||||
Once you are configured, make zlilo, modules, modules_install; reboot.
|
||||
Note that it is no longer necessary or possible to configure sound in the
|
||||
drivers/sound dir. Now one simply configures and makes one's kernel and
|
||||
modules in the usual way.
|
||||
|
||||
Then, add to your /etc/modprobe.d/oss.conf something like:
|
||||
|
||||
alias char-major-14-* sb
|
||||
install sb /sbin/modprobe -i sb && /sbin/modprobe adlib_card
|
||||
options sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330
|
||||
options adlib_card io=0x388 # FM synthesizer
|
||||
|
||||
Alternatively, if you have compiled in kernel level ISAPnP support:
|
||||
|
||||
alias char-major-14 sb
|
||||
softdep sb post: adlib_card
|
||||
options adlib_card io=0x388
|
||||
|
||||
The effect of this is that the sound driver and all necessary bits and
|
||||
pieces autoload on demand, assuming you use kerneld (a sound choice) and
|
||||
autoclean when not in use. Also, options for the device drivers are
|
||||
set. They will not work without them. Change as appropriate for your card.
|
||||
If you are not yet using the very cool kerneld, you will have to "modprobe
|
||||
-k sb" yourself to get things going. Eventually things may be fixed so
|
||||
that this kludgery is not necessary; for the time being, it seems to work
|
||||
well.
|
||||
|
||||
Replace 'sb' with the driver for your card, and give it the right
|
||||
options. To find the filename of the driver, look in
|
||||
/lib/modules/<kernel-version>/misc. Mine looks like:
|
||||
|
||||
adlib_card.o # This is the generic OPLx driver
|
||||
opl3.o # The OPL3 driver
|
||||
sb.o # <<The SoundBlaster driver. Yours may differ.>>
|
||||
sound.o # The sound driver
|
||||
uart401.o # Used by sb, maybe other cards
|
||||
|
||||
Whichever card you have, try feeding it the options that would be the
|
||||
default if you were making the driver wired, not as modules. You can
|
||||
look at function referred to by module_init() for the card to see what
|
||||
args are expected.
|
||||
|
||||
Note that at present there is no way to configure the io, irq and other
|
||||
parameters for the modular drivers as one does for the wired drivers.. One
|
||||
needs to pass the modules the necessary parameters as arguments, either
|
||||
with /etc/modprobe.d/*.conf or with command-line args to modprobe, e.g.
|
||||
|
||||
modprobe sb io=0x220 irq=7 dma=1 dma16=5 mpu_io=0x330
|
||||
modprobe adlib_card io=0x388
|
||||
|
||||
recommend using /etc/modprobe.d/*.conf.
|
||||
|
||||
Persistent DMA Buffers:
|
||||
|
||||
The sound modules normally allocate DMA buffers during open() and
|
||||
deallocate them during close(). Linux can often have problems allocating
|
||||
DMA buffers for ISA cards on machines with more than 16MB RAM. This is
|
||||
because ISA DMA buffers must exist below the 16MB boundary and it is quite
|
||||
possible that we can't find a large enough free block in this region after
|
||||
the machine has been running for any amount of time. The way to avoid this
|
||||
problem is to allocate the DMA buffers during module load and deallocate
|
||||
them when the module is unloaded. For this to be effective we need to load
|
||||
the sound modules right after the kernel boots, either manually or by an
|
||||
init script, and keep them around until we shut down. This is a little
|
||||
wasteful of RAM, but it guarantees that sound always works.
|
||||
|
||||
To make the sound driver use persistent DMA buffers we need to pass the
|
||||
sound.o module a "dmabuf=1" command-line argument. This is normally done
|
||||
in /etc/modprobe.d/*.conf files like so:
|
||||
|
||||
options sound dmabuf=1
|
||||
|
||||
If you have 16MB or less RAM or a PCI sound card, this is wasteful and
|
||||
unnecessary. It is possible that machine with 16MB or less RAM will find
|
||||
this option useful, but if your machine is so memory-starved that it
|
||||
cannot find a 64K block free, you will be wasting even more RAM by keeping
|
||||
the sound modules loaded and the DMA buffers allocated when they are not
|
||||
needed. The proper solution is to upgrade your RAM. But you do also have
|
||||
this improper solution as well. Use it wisely.
|
||||
|
||||
I'm afraid I know nothing about anything but my setup, being more of a
|
||||
text-mode guy anyway. If you have options for other cards or other helpful
|
||||
hints, send them to me, Jim Bray, jb@as220.org, http://as220.org/jb.
|
107
Documentation/sound/oss/README.ymfsb
Normal file
107
Documentation/sound/oss/README.ymfsb
Normal file
|
@ -0,0 +1,107 @@
|
|||
Legacy audio driver for YMF7xx PCI cards.
|
||||
|
||||
|
||||
FIRST OF ALL
|
||||
============
|
||||
|
||||
This code references YAMAHA's sample codes and data sheets.
|
||||
I respect and thank for all people they made open the information
|
||||
about YMF7xx cards.
|
||||
|
||||
And this codes heavily based on Jeff Garzik <jgarzik@pobox.com>'s
|
||||
old VIA 82Cxxx driver (via82cxxx.c). I also respect him.
|
||||
|
||||
|
||||
DISCLIMER
|
||||
=========
|
||||
|
||||
This driver is currently at early ALPHA stage. It may cause serious
|
||||
damage to your computer when used.
|
||||
PLEASE USE IT AT YOUR OWN RISK.
|
||||
|
||||
|
||||
ABOUT THIS DRIVER
|
||||
=================
|
||||
|
||||
This code enables you to use your YMF724[A-F], YMF740[A-C], YMF744, YMF754
|
||||
cards. When enabled, your card acts as "SoundBlaster Pro" compatible card.
|
||||
It can only play 22.05kHz / 8bit / Stereo samples, control external MIDI
|
||||
port.
|
||||
If you want to use your card as recent "16-bit" card, you should use
|
||||
Alsa or OSS/Linux driver. Of course you can write native PCI driver for
|
||||
your cards :)
|
||||
|
||||
|
||||
USAGE
|
||||
=====
|
||||
|
||||
# modprobe ymfsb (options)
|
||||
|
||||
|
||||
OPTIONS FOR MODULE
|
||||
==================
|
||||
|
||||
io : SB base address (0x220, 0x240, 0x260, 0x280)
|
||||
synth_io : OPL3 base address (0x388, 0x398, 0x3a0, 0x3a8)
|
||||
dma : DMA number (0,1,3)
|
||||
master_volume: AC'97 PCM out Vol (0-100)
|
||||
spdif_out : SPDIF-out flag (0:disable 1:enable)
|
||||
|
||||
These options will change in future...
|
||||
|
||||
|
||||
FREQUENCY
|
||||
=========
|
||||
|
||||
When playing sounds via this driver, you will hear its pitch is slightly
|
||||
lower than original sounds. Since this driver recognizes your card acts
|
||||
with 21.739kHz sample rates rather than 22.050kHz (I think it must be
|
||||
hardware restriction). So many players become tone deafness.
|
||||
To prevent this, you should express some options to your sound player
|
||||
that specify correct sample frequency. For example, to play your MP3 file
|
||||
correctly with mpg123, specify the frequency like following:
|
||||
|
||||
% mpg123 -r 21739 foo.mp3
|
||||
|
||||
|
||||
SPDIF OUT
|
||||
=========
|
||||
|
||||
With installing modules with option 'spdif_out=1', you can enjoy your
|
||||
sounds from SPDIF-out of your card (if it had).
|
||||
Its Fs is fixed to 48kHz (It never means the sample frequency become
|
||||
up to 48kHz. All sounds via SPDIF-out also 22kHz samples). So your
|
||||
digital-in capable components has to be able to handle 48kHz Fs.
|
||||
|
||||
|
||||
COPYING
|
||||
=======
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
|
||||
|
||||
TODO
|
||||
====
|
||||
* support for multiple cards
|
||||
(set the different SB_IO,MPU_IO,OPL_IO for each cards)
|
||||
|
||||
* support for OPL (dmfm) : There will be no requirements... :-<
|
||||
|
||||
|
||||
AUTHOR
|
||||
======
|
||||
|
||||
Daisuke Nagano <breeze.nagano@nifty.ne.jp>
|
||||
|
105
Documentation/sound/oss/SoundPro
Normal file
105
Documentation/sound/oss/SoundPro
Normal file
|
@ -0,0 +1,105 @@
|
|||
Documentation for the SoundPro CMI8330 extensions in the WSS driver (ad1848.o)
|
||||
------------------------------------------------------------------------------
|
||||
|
||||
( Be sure to read Documentation/sound/oss/CMI8330 too )
|
||||
|
||||
Ion Badulescu, ionut@cs.columbia.edu
|
||||
February 24, 1999
|
||||
|
||||
(derived from the OPL3-SA2 documentation by Scott Murray)
|
||||
|
||||
The SoundPro CMI8330 (ISA) is a chip usually found on some Taiwanese
|
||||
motherboards. The official name in the documentation is CMI8330, SoundPro
|
||||
is the nickname and the big inscription on the chip itself.
|
||||
|
||||
The chip emulates a WSS as well as a SB16, but it has certain differences
|
||||
in the mixer section which require separate support. It also emulates an
|
||||
MPU401 and an OPL3 synthesizer, so you probably want to enable support
|
||||
for these, too.
|
||||
|
||||
The chip identifies itself as an AD1848, but its mixer is significantly
|
||||
more advanced than the original AD1848 one. If your system works with
|
||||
either WSS or SB16 and you are having problems with some mixer controls
|
||||
(no CD audio, no line-in, etc), you might want to give this driver a try.
|
||||
Detection should work, but it hasn't been widely tested, so it might still
|
||||
mis-identify the chip. You can still force soundpro=1 in the modprobe
|
||||
parameters for ad1848. Please let me know if it happens to you, so I can
|
||||
adjust the detection routine.
|
||||
|
||||
The chip is capable of doing full-duplex, but since the driver sees it as an
|
||||
AD1848, it cannot take advantage of this. Moreover, the full-duplex mode is
|
||||
not achievable through the WSS interface, b/c it needs a dma16 line which is
|
||||
assigned only to the SB16 subdevice (with isapnp). Windows documentation
|
||||
says the user must use WSS Playback and SB16 Recording for full-duplex, so
|
||||
it might be possible to do the same thing under Linux. You can try loading
|
||||
up both ad1848 and sb then use one for playback and the other for
|
||||
recording. I don't know if this works, b/c I haven't tested it. Anyway, if
|
||||
you try it, be very careful: the SB16 mixer *mostly* works, but certain
|
||||
settings can have unexpected effects. Use the WSS mixer for best results.
|
||||
|
||||
There is also a PCI SoundPro chip. I have not seen this chip, so I have
|
||||
no idea if the driver will work with it. I suspect it won't.
|
||||
|
||||
As with PnP cards, some configuration is required. There are two ways
|
||||
of doing this. The most common is to use the isapnptools package to
|
||||
initialize the card, and use the kernel module form of the sound
|
||||
subsystem and sound drivers. Alternatively, some BIOS's allow manual
|
||||
configuration of installed PnP devices in a BIOS menu, which should
|
||||
allow using the non-modular sound drivers, i.e. built into the kernel.
|
||||
Since in this latter case you cannot use module parameters, you will
|
||||
have to enable support for the SoundPro at compile time.
|
||||
|
||||
The IRQ and DMA values can be any that are considered acceptable for a
|
||||
WSS. Assuming you've got isapnp all happy, then you should be able to
|
||||
do something like the following (which *must* match the isapnp/BIOS
|
||||
configuration):
|
||||
|
||||
modprobe ad1848 io=0x530 irq=11 dma=0 soundpro=1
|
||||
-and maybe-
|
||||
modprobe sb io=0x220 irq=5 dma=1 dma16=5
|
||||
|
||||
-then-
|
||||
modprobe mpu401 io=0x330 irq=9
|
||||
modprobe opl3 io=0x388
|
||||
|
||||
If all goes well and you see no error messages, you should be able to
|
||||
start using the sound capabilities of your system. If you get an
|
||||
error message while trying to insert the module(s), then make
|
||||
sure that the values of the various arguments match what you specified
|
||||
in your isapnp configuration file, and that there is no conflict with
|
||||
another device for an I/O port or interrupt. Checking the contents of
|
||||
/proc/ioports and /proc/interrupts can be useful to see if you're
|
||||
butting heads with another device.
|
||||
|
||||
If you do not see the chipset version message, and none of the other
|
||||
messages present in the system log are helpful, try adding 'debug=1'
|
||||
to the ad1848 parameters, email me the syslog results and I'll do
|
||||
my best to help.
|
||||
|
||||
Lastly, if you're using modules and want to set up automatic module
|
||||
loading with kmod, the kernel module loader, here is the section I
|
||||
currently use in my conf.modules file:
|
||||
|
||||
# Sound
|
||||
post-install sound modprobe -k ad1848; modprobe -k mpu401; modprobe -k opl3
|
||||
options ad1848 io=0x530 irq=11 dma=0
|
||||
options sb io=0x220 irq=5 dma=1 dma16=5
|
||||
options mpu401 io=0x330 irq=9
|
||||
options opl3 io=0x388
|
||||
|
||||
The above ensures that ad1848 will be loaded whenever the sound system
|
||||
is being used.
|
||||
|
||||
Good luck.
|
||||
|
||||
Ion
|
||||
|
||||
NOT REALLY TESTED:
|
||||
- recording
|
||||
- recording device selection
|
||||
- full-duplex
|
||||
|
||||
TODO:
|
||||
- implement mixer support for surround, loud, digital CD switches.
|
||||
- come up with a scheme which allows recording volumes for each subdevice.
|
||||
This is a major OSS API change.
|
53
Documentation/sound/oss/Soundblaster
Normal file
53
Documentation/sound/oss/Soundblaster
Normal file
|
@ -0,0 +1,53 @@
|
|||
modprobe sound
|
||||
insmod uart401
|
||||
insmod sb ...
|
||||
|
||||
This loads the driver for the Sound Blaster and assorted clones. Cards that
|
||||
are covered by other drivers should not be using this driver.
|
||||
|
||||
The Sound Blaster module takes the following arguments
|
||||
|
||||
io I/O address of the Sound Blaster chip (0x220,0x240,0x260,0x280)
|
||||
irq IRQ of the Sound Blaster chip (5,7,9,10)
|
||||
dma 8-bit DMA channel for the Sound Blaster (0,1,3)
|
||||
dma16 16-bit DMA channel for SB16 and equivalent cards (5,6,7)
|
||||
mpu_io I/O for MPU chip if present (0x300,0x330)
|
||||
|
||||
sm_games=1 Set if you have a Logitech soundman games
|
||||
acer=1 Set this to detect cards in some ACER notebooks
|
||||
mwave_bug=1 Set if you are trying to use this driver with mwave (see on)
|
||||
type Use this to specify a specific card type
|
||||
|
||||
The following arguments are taken if ISAPnP support is compiled in
|
||||
|
||||
isapnp=0 Set this to disable ISAPnP detection (use io=0xXXX etc. above)
|
||||
multiple=0 Set to disable detection of multiple Soundblaster cards.
|
||||
Consider it a bug if this option is needed, and send in a
|
||||
report.
|
||||
pnplegacy=1 Set this to be able to use a PnP card(s) along with a single
|
||||
non-PnP (legacy) card. Above options for io, irq, etc. are
|
||||
needed, and will apply only to the legacy card.
|
||||
reverse=1 Reverses the order of the search in the PnP table.
|
||||
uart401=1 Set to enable detection of mpu devices on some clones.
|
||||
isapnpjump=n Jumps to slot n in the driver's PnP table. Use the source,
|
||||
Luke.
|
||||
|
||||
You may well want to load the opl3 driver for synth music on most SB and
|
||||
clone SB devices
|
||||
|
||||
insmod opl3 io=0x388
|
||||
|
||||
Using Mwave
|
||||
|
||||
To make this driver work with Mwave you must set mwave_bug. You also need
|
||||
to warm boot from DOS/Windows with the required firmware loaded under this
|
||||
OS. IBM are being difficult about documenting how to load this firmware.
|
||||
|
||||
Avance Logic ALS007
|
||||
|
||||
This card is supported; see the separate file ALS007 for full details.
|
||||
|
||||
Avance Logic ALS100
|
||||
|
||||
This card is supported; setup should be as for a standard Sound Blaster 16.
|
||||
The driver will identify the audio device as a "Sound Blaster 16 (ALS-100)".
|
26
Documentation/sound/oss/Tropez+
Normal file
26
Documentation/sound/oss/Tropez+
Normal file
|
@ -0,0 +1,26 @@
|
|||
From: Paul Barton-Davis <pbd@op.net>
|
||||
|
||||
Here is the configuration I use with a Tropez+ and my modular
|
||||
driver:
|
||||
|
||||
alias char-major-14 wavefront
|
||||
alias synth0 wavefront
|
||||
alias mixer0 cs4232
|
||||
alias audio0 cs4232
|
||||
pre-install wavefront modprobe "-k" "cs4232"
|
||||
post-install wavefront modprobe "-k" "opl3"
|
||||
options wavefront io=0x200 irq=9
|
||||
options cs4232 synthirq=9 synthio=0x200 io=0x530 irq=5 dma=1 dma2=0
|
||||
options opl3 io=0x388
|
||||
|
||||
Things to note:
|
||||
|
||||
the wavefront options "io" and "irq" ***MUST*** match the "synthio"
|
||||
and "synthirq" cs4232 options.
|
||||
|
||||
you can do without the opl3 module if you don't
|
||||
want to use the OPL/[34] synth on the soundcard
|
||||
|
||||
the opl3 io parameter is conventionally not adjustable.
|
||||
|
||||
Please see drivers/sound/README.wavefront for more details.
|
80
Documentation/sound/oss/VIBRA16
Normal file
80
Documentation/sound/oss/VIBRA16
Normal file
|
@ -0,0 +1,80 @@
|
|||
Sound Blaster 16X Vibra addendum
|
||||
--------------------------------
|
||||
by Marius Ilioaea <mariusi@protv.ro>
|
||||
Stefan Laudat <stefan@asit.ro>
|
||||
|
||||
Sat Mar 6 23:55:27 EET 1999
|
||||
|
||||
Hello again,
|
||||
|
||||
Playing with a SB Vibra 16x soundcard we found it very difficult
|
||||
to setup because the kernel reported a lot of DMA errors and wouldn't
|
||||
simply play any sound.
|
||||
A good starting point is that the vibra16x chip full-duplex facility
|
||||
is neither still exploited by the sb driver found in the linux kernel
|
||||
(tried it with a 2.2.2-ac7), nor in the commercial OSS package (it reports
|
||||
it as half-duplex soundcard). Oh, I almost forgot, the RedHat sndconfig
|
||||
failed detecting it ;)
|
||||
So, the big problem still remains, because the sb module wants a
|
||||
8-bit and a 16-bit dma, which we could not allocate for vibra... it supports
|
||||
only two 8-bit dma channels, the second one will be passed to the module
|
||||
as a 16 bit channel, the kernel will yield about that but everything will
|
||||
be okay, trust us.
|
||||
The only inconvenient you may find is that you will have
|
||||
some sound playing jitters if you have HDD dma support enabled - but this
|
||||
will happen with almost all soundcards...
|
||||
|
||||
A fully working isapnp.conf is just here:
|
||||
|
||||
<snip here>
|
||||
|
||||
(READPORT 0x0203)
|
||||
(ISOLATE PRESERVE)
|
||||
(IDENTIFY *)
|
||||
(VERBOSITY 2)
|
||||
(CONFLICT (IO FATAL)(IRQ FATAL)(DMA FATAL)(MEM FATAL)) # or WARNING
|
||||
# SB 16 and OPL3 devices
|
||||
(CONFIGURE CTL00f0/-1 (LD 0
|
||||
(INT 0 (IRQ 5 (MODE +E)))
|
||||
(DMA 0 (CHANNEL 1))
|
||||
(DMA 1 (CHANNEL 3))
|
||||
(IO 0 (SIZE 16) (BASE 0x0220))
|
||||
(IO 2 (SIZE 4) (BASE 0x0388))
|
||||
(NAME "CTL00f0/-1[0]{Audio }")
|
||||
(ACT Y)
|
||||
))
|
||||
|
||||
# Joystick device - only if you need it :-/
|
||||
|
||||
(CONFIGURE CTL00f0/-1 (LD 1
|
||||
(IO 0 (SIZE 1) (BASE 0x0200))
|
||||
(NAME "CTL00f0/-1[1]{Game }")
|
||||
(ACT Y)
|
||||
))
|
||||
(WAITFORKEY)
|
||||
|
||||
<end of snipping>
|
||||
|
||||
So, after a good kernel modules compilation and a 'depmod -a kernel_ver'
|
||||
you may want to:
|
||||
|
||||
modprobe sb io=0x220 irq=5 dma=1 dma16=3
|
||||
|
||||
Or, take the hard way:
|
||||
|
||||
modprobe soundcore
|
||||
modprobe sound
|
||||
modprobe uart401
|
||||
modprobe sb io=0x220 irq=5 dma=1 dma16=3
|
||||
# do you need MIDI?
|
||||
modprobe opl3=0x388
|
||||
|
||||
Just in case, the kernel sound support should be:
|
||||
|
||||
CONFIG_SOUND=m
|
||||
CONFIG_SOUND_OSS=m
|
||||
CONFIG_SOUND_SB=m
|
||||
|
||||
Enjoy your new noisy Linux box! ;)
|
||||
|
||||
|
170
Documentation/sound/oss/WaveArtist
Normal file
170
Documentation/sound/oss/WaveArtist
Normal file
|
@ -0,0 +1,170 @@
|
|||
|
||||
(the following is from the armlinux CVS)
|
||||
|
||||
WaveArtist mixer and volume levels can be accessed via these commands:
|
||||
|
||||
nn30 read registers nn, where nn = 00 - 09 for mixer settings
|
||||
0a - 13 for channel volumes
|
||||
mm31 write the volume setting in pairs, where mm = (nn - 10) / 2
|
||||
rr32 write the mixer settings in pairs, where rr = nn/2
|
||||
xx33 reset all settings to default
|
||||
0y34 select mono source, y=0 = left, y=1 = right
|
||||
|
||||
bits
|
||||
nn 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
00 | 0 | 0 0 1 1 | left line mixer gain | left aux1 mixer gain |lmute|
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
01 | 0 | 0 1 0 1 | left aux2 mixer gain | right 2 left mic gain |mmute|
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
02 | 0 | 0 1 1 1 | left mic mixer gain | left mic | left mixer gain |dith |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
03 | 0 | 1 0 0 1 | left mixer input select |lrfg | left ADC gain |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
04 | 0 | 1 0 1 1 | right line mixer gain | right aux1 mixer gain |rmute|
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
05 | 0 | 1 1 0 1 | right aux2 mixer gain | left 2 right mic gain |test |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
06 | 0 | 1 1 1 1 | right mic mixer gain | right mic |right mixer gain |rbyps|
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
07 | 1 | 0 0 0 1 | right mixer select |rrfg | right ADC gain |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
08 | 1 | 0 0 1 1 | mono mixer gain |right ADC mux sel|left ADC mux sel |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
09 | 1 | 0 1 0 1 |loopb|left linout|loop|ADCch|TxFch|OffCD|test |loopb|loopb|osamp|
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
0a | 0 | left PCM channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
0b | 0 | right PCM channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
0c | 0 | left FM channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
0d | 0 | right FM channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
0e | 0 | left wavetable channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
0f | 0 | right wavetable channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
10 | 0 | left PCM expansion channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
11 | 0 | right PCM expansion channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
12 | 0 | left FM expansion channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
13 | 0 | right FM expansion channel volume |
|
||||
----+---+------------+-----+-----+-----+----+-----+-----+-----+-----+-----+-----+-----+
|
||||
|
||||
lmute: left mute
|
||||
mmute: mono mute
|
||||
dith: dithds
|
||||
lrfg:
|
||||
rmute: right mute
|
||||
rbyps: right bypass
|
||||
rrfg:
|
||||
ADCch:
|
||||
TxFch:
|
||||
OffCD:
|
||||
osamp:
|
||||
|
||||
And the following diagram is derived from the description in the CVS archive:
|
||||
|
||||
MIC L (mouthpiece)
|
||||
+------+
|
||||
-->PreAmp>-\
|
||||
+--^---+ |
|
||||
| |
|
||||
r2b4-5 | +--------+
|
||||
/----*-------------------------------->5 |
|
||||
| | |
|
||||
| /----------------------------------->4 |
|
||||
| | | |
|
||||
| | /--------------------------------->3 1of5 | +---+
|
||||
| | | | mux >-->AMP>--> ADC L
|
||||
| | | /------------------------------->2 | +-^-+
|
||||
| | | | | | |
|
||||
Line | | | | +----+ +------+ +---+ /---->1 | r3b3-0
|
||||
------------*->mute>--> Gain >--> | | | |
|
||||
L | | | +----+ +------+ | | | *->0 |
|
||||
| | | | | | +---^----+
|
||||
Aux2 | | | +----+ +------+ | | | |
|
||||
----------*--->mute>--> Gain >--> M | | r8b0-2
|
||||
L | | +----+ +------+ | | |
|
||||
| | | | \------\
|
||||
Aux1 | | +----+ +------+ | | |
|
||||
--------*----->mute>--> Gain >--> I | |
|
||||
L | +----+ +------+ | | |
|
||||
| | | |
|
||||
| +----+ +------+ | | +---+ |
|
||||
*------->mute>--> Gain >--> X >-->AMP>--*
|
||||
| +----+ +------+ | | +-^-+ |
|
||||
| | | | |
|
||||
| +----+ +------+ | | r2b1-3 |
|
||||
| /----->mute>--> Gain >--> E | |
|
||||
| | +----+ +------+ | | |
|
||||
| | | | |
|
||||
| | +----+ +------+ | | |
|
||||
| | /--->mute>--> Gain >--> R | |
|
||||
| | | +----+ +------+ | | |
|
||||
| | | | | | r9b8-9
|
||||
| | | +----+ +------+ | | | |
|
||||
| | | /->mute>--> Gain >--> | | +---v---+
|
||||
| | | | +----+ +------+ +---+ /-*->0 |
|
||||
DAC | | | | | | |
|
||||
------------*----------------------------------->? | +----+
|
||||
L | | | | | Mux >-->mute>--> L output
|
||||
| | | | /->? | +--^-+
|
||||
| | | | | | | |
|
||||
| | | /--------->? | r0b0
|
||||
| | | | | | +-------+
|
||||
| | | | | |
|
||||
Mono | | | | | | +-------+
|
||||
----------* | \---> | +----+
|
||||
| | | | | | Mix >-->mute>--> Mono output
|
||||
| | | | *-> | +--^-+
|
||||
| | | | | +-------+ |
|
||||
| | | | | r1b0
|
||||
DAC | | | | | +-------+
|
||||
------------*-------------------------*--------->1 | +----+
|
||||
R | | | | | | Mux >-->mute>--> R output
|
||||
| | | | +----+ +------+ +---+ *->0 | +--^-+
|
||||
| | | \->mute>--> Gain >--> | | +---^---+ |
|
||||
| | | +----+ +------+ | | | | r5b0
|
||||
| | | | | | r6b0
|
||||
| | | +----+ +------+ | | |
|
||||
| | \--->mute>--> Gain >--> M | |
|
||||
| | +----+ +------+ | | |
|
||||
| | | | |
|
||||
| | +----+ +------+ | | |
|
||||
| *----->mute>--> Gain >--> I | |
|
||||
| | +----+ +------+ | | |
|
||||
| | | | |
|
||||
| | +----+ +------+ | | +---+ |
|
||||
\------->mute>--> Gain >--> X >-->AMP>--*
|
||||
| +----+ +------+ | | +-^-+ |
|
||||
/--/ | | | |
|
||||
Aux1 | +----+ +------+ | | r6b1-3 |
|
||||
-------*------>mute>--> Gain >--> E | |
|
||||
R | | +----+ +------+ | | |
|
||||
| | | | |
|
||||
Aux2 | | +----+ +------+ | | /------/
|
||||
---------*---->mute>--> Gain >--> R | |
|
||||
R | | | +----+ +------+ | | |
|
||||
| | | | | | +--------+
|
||||
Line | | | +----+ +------+ | | | *->0 |
|
||||
-----------*-->mute>--> Gain >--> | | | |
|
||||
R | | | | +----+ +------+ +---+ \---->1 |
|
||||
| | | | | |
|
||||
| | | \-------------------------------->2 | +---+
|
||||
| | | | Mux >-->AMP>--> ADC R
|
||||
| | \---------------------------------->3 | +-^-+
|
||||
| | | | |
|
||||
| \------------------------------------>4 | r7b3-0
|
||||
| | |
|
||||
\-----*-------------------------------->5 |
|
||||
| +---^----+
|
||||
r6b4-5 | |
|
||||
| | r8b3-5
|
||||
+--v---+ |
|
||||
-->PreAmp>-/
|
||||
+------+
|
||||
MIC R (electret mic)
|
92
Documentation/sound/oss/btaudio
Normal file
92
Documentation/sound/oss/btaudio
Normal file
|
@ -0,0 +1,92 @@
|
|||
|
||||
Intro
|
||||
=====
|
||||
|
||||
people start bugging me about this with questions, looks like I
|
||||
should write up some documentation for this beast. That way I
|
||||
don't have to answer that much mails I hope. Yes, I'm lazy...
|
||||
|
||||
|
||||
You might have noticed that the bt878 grabber cards have actually
|
||||
_two_ PCI functions:
|
||||
|
||||
$ lspci
|
||||
[ ... ]
|
||||
00:0a.0 Multimedia video controller: Brooktree Corporation Bt878 (rev 02)
|
||||
00:0a.1 Multimedia controller: Brooktree Corporation Bt878 (rev 02)
|
||||
[ ... ]
|
||||
|
||||
The first does video, it is backward compatible to the bt848. The second
|
||||
does audio. btaudio is a driver for the second function. It's a sound
|
||||
driver which can be used for recording sound (and _only_ recording, no
|
||||
playback). As most TV cards come with a short cable which can be plugged
|
||||
into your sound card's line-in you probably don't need this driver if all
|
||||
you want to do is just watching TV...
|
||||
|
||||
|
||||
Driver Status
|
||||
=============
|
||||
|
||||
Still somewhat experimental. The driver should work stable, i.e. it
|
||||
should'nt crash your box. It might not work as expected, have bugs,
|
||||
not being fully OSS API compilant, ...
|
||||
|
||||
Latest versions are available from http://bytesex.org/bttv/, the
|
||||
driver is in the bttv tarball. Kernel patches might be available too,
|
||||
have a look at http://bytesex.org/bttv/listing.html.
|
||||
|
||||
The chip knows two different modes. btaudio registers two dsp
|
||||
devices, one for each mode. They can not be used at the same time.
|
||||
|
||||
|
||||
Digital audio mode
|
||||
==================
|
||||
|
||||
The chip gives you 16 bit stereo sound. The sample rate depends on
|
||||
the external source which feeds the bt878 with digital sound via I2S
|
||||
interface. There is a insmod option (rate) to tell the driver which
|
||||
sample rate the hardware uses (32000 is the default).
|
||||
|
||||
One possible source for digital sound is the msp34xx audio processor
|
||||
chip which provides digital sound via I2S with 32 kHz sample rate. My
|
||||
Hauppauge board works this way.
|
||||
|
||||
The Osprey-200 reportly gives you digital sound with 44100 Hz sample
|
||||
rate. It is also possible that you get no sound at all.
|
||||
|
||||
|
||||
analog mode (A/D)
|
||||
=================
|
||||
|
||||
You can tell the driver to use this mode with the insmod option "analog=1".
|
||||
The chip has three analog inputs. Consequently you'll get a mixer device
|
||||
to control these.
|
||||
|
||||
The analog mode supports mono only. Both 8 + 16 bit. Both are _signed_
|
||||
int, which is uncommon for the 8 bit case. Sample rate range is 119 kHz
|
||||
to 448 kHz. Yes, the number of digits is correct. The driver supports
|
||||
downsampling by powers of two, so you can ask for more usual sample rates
|
||||
like 44 kHz too.
|
||||
|
||||
With my Hauppauge I get noisy sound on the second input (mapped to line2
|
||||
by the mixer device). Others get a useable signal on line1.
|
||||
|
||||
|
||||
some examples
|
||||
=============
|
||||
|
||||
* read audio data from btaudio (dsp2), send to es1730 (dsp,dsp1):
|
||||
$ sox -w -r 32000 -t ossdsp /dev/dsp2 -t ossdsp /dev/dsp
|
||||
|
||||
* read audio data from btaudio, send to esound daemon (which might be
|
||||
running on another host):
|
||||
$ sox -c 2 -w -r 32000 -t ossdsp /dev/dsp2 -t sw - | esdcat -r 32000
|
||||
$ sox -c 1 -w -r 32000 -t ossdsp /dev/dsp2 -t sw - | esdcat -m -r 32000
|
||||
|
||||
|
||||
Have fun,
|
||||
|
||||
Gerd
|
||||
|
||||
--
|
||||
Gerd Knorr <kraxel@bytesex.org>
|
185
Documentation/sound/oss/mwave
Normal file
185
Documentation/sound/oss/mwave
Normal file
|
@ -0,0 +1,185 @@
|
|||
How to try to survive an IBM Mwave under Linux SB drivers
|
||||
|
||||
|
||||
+ IBM have now released documentation of sorts and Torsten is busy
|
||||
trying to make the Mwave work. This is not however a trivial task.
|
||||
|
||||
----------------------------------------------------------------------------
|
||||
|
||||
OK, first thing - the IRQ problem IS a problem, whether the test is bypassed or
|
||||
not. It is NOT a Linux problem, but an MWAVE problem that is fixed with the
|
||||
latest MWAVE patches. So, in other words, don't bypass the test for MWAVES!
|
||||
|
||||
I have Windows 95 on /dev/hda1, swap on /dev/hda2, and Red Hat 5 on /dev/hda3.
|
||||
|
||||
The steps, then:
|
||||
|
||||
Boot to Linux.
|
||||
Mount Windows 95 file system (assume mount point = /dos95).
|
||||
mkdir /dos95/linux
|
||||
mkdir /dos95/linux/boot
|
||||
mkdir /dos95/linux/boot/parms
|
||||
|
||||
Copy the kernel, any initrd image, and loadlin to /dos95/linux/boot/.
|
||||
|
||||
Reboot to Windows 95.
|
||||
|
||||
Edit C:/msdos.sys and add or change the following:
|
||||
|
||||
Logo=0
|
||||
BootGUI=0
|
||||
|
||||
Note that msdos.sys is a text file but it needs to be made 'unhidden',
|
||||
readable and writable before it can be edited. This can be done with
|
||||
DOS' "attrib" command.
|
||||
|
||||
Edit config.sys to have multiple config menus. I have one for windows 95 and
|
||||
five for Linux, like this:
|
||||
------------
|
||||
[menu]
|
||||
menuitem=W95, Windows 95
|
||||
menuitem=LINTP, Linux - ThinkPad
|
||||
menuitem=LINTP3, Linux - ThinkPad Console
|
||||
menuitem=LINDOC, Linux - Docked
|
||||
menuitem=LINDOC3, Linux - Docked Console
|
||||
menuitem=LIN1, Linux - Single User Mode
|
||||
REM menudefault=W95,10
|
||||
|
||||
[W95]
|
||||
|
||||
[LINTP]
|
||||
|
||||
[LINDOC]
|
||||
|
||||
[LINTP3]
|
||||
|
||||
[LINDOC3]
|
||||
|
||||
[LIN1]
|
||||
|
||||
[COMMON]
|
||||
FILES=30
|
||||
REM Please read README.TXT in C:\MWW subdirectory before changing the DOS= statement.
|
||||
DOS=HIGH,UMB
|
||||
DEVICE=C:\MWW\MANAGER\MWD50430.EXE
|
||||
SHELL=c:\command.com /e:2048
|
||||
-------------------
|
||||
|
||||
The important things are the SHELL and DEVICE statements.
|
||||
|
||||
Then change autoexec.bat. Basically everything in there originally should be
|
||||
done ONLY when Windows 95 is booted. Then you add new things specifically
|
||||
for Linux. Mine is as follows
|
||||
|
||||
---------------
|
||||
@ECHO OFF
|
||||
if "%CONFIG%" == "W95" goto W95
|
||||
|
||||
REM
|
||||
REM Linux stuff
|
||||
REM
|
||||
SET MWPATH=C:\MWW\DLL;C:\MWW\MWGAMES;C:\MWW\DSP
|
||||
SET BLASTER=A220 I5 D1
|
||||
SET MWROOT=C:\MWW
|
||||
SET LIBPATH=C:\MWW\DLL
|
||||
SET PATH=C:\WINDOWS;C:\MWW\DLL;
|
||||
CALL MWAVE START NOSHOW
|
||||
c:\linux\boot\loadlin.exe @c:\linux\boot\parms\%CONFIG%.par
|
||||
|
||||
:W95
|
||||
REM
|
||||
REM Windows 95 stuff
|
||||
REM
|
||||
c:\toolkit\guard
|
||||
SET MSINPUT=C:\MSINPUT
|
||||
SET MWPATH=C:\MWW\DLL;C:\MWW\MWGAMES;C:\MWW\DSP
|
||||
REM The following is used by DOS games to recognize Sound Blaster hardware.
|
||||
REM If hardware settings are changed, please change this line as well.
|
||||
REM See the Mwave README file for instructions.
|
||||
SET BLASTER=A220 I5 D1
|
||||
SET MWROOT=C:\MWW
|
||||
SET LIBPATH=C:\MWW\DLL
|
||||
SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND;E:\ORAWIN95\BIN;f:\msdev\bin;e:\v30\bin.dbg;v:\devt\v30\bin;c:\JavaSDK\Bin;C:\MWW\DLL;
|
||||
SET INCLUDE=f:\MSDEV\INCLUDE;F:\MSDEV\MFC\INCLUDE
|
||||
SET LIB=F:\MSDEV\LIB;F:\MSDEV\MFC\LIB
|
||||
win
|
||||
|
||||
------------------------
|
||||
|
||||
Now build a file in c:\linux\boot\parms for each Linux config that you have.
|
||||
|
||||
For example, my LINDOC3 config is for a docked Thinkpad at runlevel 3 with no
|
||||
initrd image, and has a parameter file named LINDOC3.PAR in c:\linux\boot\parms:
|
||||
|
||||
-----------------------
|
||||
# LOADLIN @param_file image=other_image root=/dev/other
|
||||
#
|
||||
# Linux Console in docking station
|
||||
#
|
||||
c:\linux\boot\zImage.krn # First value must be filename of Linux kernel.
|
||||
root=/dev/hda3 # device which gets mounted as root FS
|
||||
ro # Other kernel arguments go here.
|
||||
apm=off
|
||||
doc=yes
|
||||
3
|
||||
-----------------------
|
||||
|
||||
The doc=yes parameter is an environment variable used by my init scripts, not
|
||||
a kernel argument.
|
||||
|
||||
However, the apm=off parameter IS a kernel argument! APM, at least in my setup,
|
||||
causes the kernel to crash when loaded via loadlin (but NOT when loaded via
|
||||
LILO). The APM stuff COULD be forced out of the kernel via the kernel compile
|
||||
options. Instead, I got an unofficial patch to the APM drivers that allows them
|
||||
to be dynamically deactivated via kernel arguments. Whatever you chose to
|
||||
document, APM, it seems, MUST be off for setups like mine.
|
||||
|
||||
Now make sure C:\MWW\MWCONFIG.REF looks like this:
|
||||
|
||||
----------------------
|
||||
[NativeDOS]
|
||||
Default=SB1.5
|
||||
SBInputSource=CD
|
||||
SYNTH=FM
|
||||
QSound=OFF
|
||||
Reverb=OFF
|
||||
Chorus=OFF
|
||||
ReverbDepth=5
|
||||
ChorusDepth=5
|
||||
SBInputVolume=5
|
||||
SBMainVolume=10
|
||||
SBWaveVolume=10
|
||||
SBSynthVolume=10
|
||||
WaveTableVolume=10
|
||||
AudioPowerDriver=ON
|
||||
|
||||
[FastCFG]
|
||||
Show=No
|
||||
HideOption=Off
|
||||
-----------------------------
|
||||
|
||||
OR the Default= line COULD be
|
||||
|
||||
Default=SBPRO
|
||||
|
||||
Reboot to Windows 95 and choose Linux. When booted, use sndconfig to configure
|
||||
the sound modules and voilà - ThinkPad sound with Linux.
|
||||
|
||||
Now the gotchas - you can either have CD sound OR Mixers but not both. That's a
|
||||
problem with the SB1.5 (CD sound) or SBPRO (Mixers) settings. No one knows why
|
||||
this is!
|
||||
|
||||
For some reason MPEG3 files, when played through mpg123, sound like they
|
||||
are playing at 1/8th speed - not very useful! If you have ANY insight
|
||||
on why this second thing might be happening, I would be grateful.
|
||||
|
||||
===========================================================
|
||||
_/ _/_/_/_/
|
||||
_/_/ _/_/ _/
|
||||
_/ _/_/ _/_/_/_/ Martin John Bartlett
|
||||
_/ _/ _/ _/ (martin@nitram.demon.co.uk)
|
||||
_/ _/_/_/_/
|
||||
_/
|
||||
_/ _/
|
||||
_/_/
|
||||
===========================================================
|
51
Documentation/sound/oss/oss-parameters.txt
Normal file
51
Documentation/sound/oss/oss-parameters.txt
Normal file
|
@ -0,0 +1,51 @@
|
|||
OSS Kernel Parameters
|
||||
~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
See Documentation/kernel-parameters.txt for general information on
|
||||
specifying module parameters.
|
||||
|
||||
This document may not be entirely up to date and comprehensive. The command
|
||||
"modinfo -p ${modulename}" shows a current list of all parameters of a loadable
|
||||
module. Loadable modules, after being loaded into the running kernel, also
|
||||
reveal their parameters in /sys/module/${modulename}/parameters/. Some of these
|
||||
parameters may be changed at runtime by the command
|
||||
"echo -n ${value} > /sys/module/${modulename}/parameters/${parm}".
|
||||
|
||||
|
||||
ad1848= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>,<type>
|
||||
|
||||
aedsp16= [HW,OSS] Audio Excel DSP 16
|
||||
Format: <io>,<irq>,<dma>,<mss_io>,<mpu_io>,<mpu_irq>
|
||||
See also header of sound/oss/aedsp16.c.
|
||||
|
||||
dmasound= [HW,OSS] Sound subsystem buffers
|
||||
|
||||
mpu401= [HW,OSS]
|
||||
Format: <io>,<irq>
|
||||
|
||||
opl3= [HW,OSS]
|
||||
Format: <io>
|
||||
|
||||
pas2= [HW,OSS] Format:
|
||||
<io>,<irq>,<dma>,<dma16>,<sb_io>,<sb_irq>,<sb_dma>,<sb_dma16>
|
||||
|
||||
pss= [HW,OSS] Personal Sound System (ECHO ESC614)
|
||||
Format:
|
||||
<io>,<mss_io>,<mss_irq>,<mss_dma>,<mpu_io>,<mpu_irq>
|
||||
|
||||
sscape= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<mpu_io>,<mpu_irq>
|
||||
|
||||
trix= [HW,OSS] MediaTrix AudioTrix Pro
|
||||
Format:
|
||||
<io>,<irq>,<dma>,<dma2>,<sb_io>,<sb_irq>,<sb_dma>,<mpu_io>,<mpu_irq>
|
||||
|
||||
uart401= [HW,OSS]
|
||||
Format: <io>,<irq>
|
||||
|
||||
uart6850= [HW,OSS]
|
||||
Format: <io>,<irq>
|
||||
|
||||
waveartist= [HW,OSS]
|
||||
Format: <io>,<irq>,<dma>,<dma2>
|
30
Documentation/sound/oss/ultrasound
Normal file
30
Documentation/sound/oss/ultrasound
Normal file
|
@ -0,0 +1,30 @@
|
|||
modprobe sound
|
||||
insmod ad1848
|
||||
insmod gus io=* irq=* dma=* ...
|
||||
|
||||
This loads the driver for the Gravis Ultrasound family of sound cards.
|
||||
|
||||
The gus module takes the following arguments
|
||||
|
||||
io I/O address of the Ultrasound card (eg. io=0x220)
|
||||
irq IRQ of the Sound Blaster card
|
||||
dma DMA channel for the Sound Blaster
|
||||
dma16 2nd DMA channel, only needed for full duplex operation
|
||||
type 1 for PnP card
|
||||
gus16 1 for using 16 bit sampling daughter board
|
||||
no_wave_dma Set to disable DMA usage for wavetable (see note)
|
||||
db16 ???
|
||||
|
||||
|
||||
no_wave_dma option
|
||||
|
||||
This option defaults to a value of 0, which allows the Ultrasound wavetable
|
||||
DSP to use DMA for playback and downloading samples. This is the same
|
||||
as the old behaviour. If set to 1, no DMA is needed for downloading samples,
|
||||
and allows owners of a GUS MAX to make use of simultaneous digital audio
|
||||
(/dev/dsp), MIDI, and wavetable playback.
|
||||
|
||||
|
||||
If you have problems in recording with GUS MAX, you could try to use
|
||||
just one 8 bit DMA channel. Recording will not work with one DMA
|
||||
channel if it's a 16 bit one.
|
Loading…
Add table
Add a link
Reference in a new issue