123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306 |
- 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.
|