1 NOTES ON KERNEL OSS-EMULATION 2 ============================= 3 4 Jan. 22, 2004 Takashi Iwai <tiwai@suse.de> 5 6 7Modules 8======= 9 10ALSA provides a powerful OSS emulation on the kernel. 11The OSS emulation for PCM, mixer and sequencer devices is implemented 12as add-on kernel modules, snd-pcm-oss, snd-mixer-oss and snd-seq-oss. 13When you need to access the OSS PCM, mixer or sequencer devices, the 14corresponding module has to be loaded. 15 16These modules are loaded automatically when the corresponding service 17is called. The alias is defined sound-service-x-y, where x and y are 18the card number and the minor unit number. Usually you don't have to 19define these aliases by yourself. 20 21Only necessary step for auto-loading of OSS modules is to define the 22card alias in /etc/modprobe.d/alsa.conf, such as 23 24 alias sound-slot-0 snd-emu10k1 25 26As the second card, define sound-slot-1 as well. 27Note that you can't use the aliased name as the target name (i.e. 28"alias sound-slot-0 snd-card-0" doesn't work any more like the old 29modutils). 30 31The currently available OSS configuration is shown in 32/proc/asound/oss/sndstat. This shows in the same syntax of 33/dev/sndstat, which is available on the commercial OSS driver. 34On ALSA, you can symlink /dev/sndstat to this proc file. 35 36Please note that the devices listed in this proc file appear only 37after the corresponding OSS-emulation module is loaded. Don't worry 38even if "NOT ENABLED IN CONFIG" is shown in it. 39 40 41Device Mapping 42============== 43 44ALSA supports the following OSS device files: 45 46 PCM: 47 /dev/dspX 48 /dev/adspX 49 50 Mixer: 51 /dev/mixerX 52 53 MIDI: 54 /dev/midi0X 55 /dev/amidi0X 56 57 Sequencer: 58 /dev/sequencer 59 /dev/sequencer2 (aka /dev/music) 60 61where X is the card number from 0 to 7. 62 63(NOTE: Some distributions have the device files like /dev/midi0 and 64 /dev/midi1. They are NOT for OSS but for tclmidi, which is 65 a totally different thing.) 66 67Unlike the real OSS, ALSA cannot use the device files more than the 68assigned ones. For example, the first card cannot use /dev/dsp1 or 69/dev/dsp2, but only /dev/dsp0 and /dev/adsp0. 70 71As seen above, PCM and MIDI may have two devices. Usually, the first 72PCM device (hw:0,0 in ALSA) is mapped to /dev/dsp and the secondary 73device (hw:0,1) to /dev/adsp (if available). For MIDI, /dev/midi and 74/dev/amidi, respectively. 75 76You can change this device mapping via the module options of 77snd-pcm-oss and snd-rawmidi. In the case of PCM, the following 78options are available for snd-pcm-oss: 79 80 dsp_map PCM device number assigned to /dev/dspX 81 (default = 0) 82 adsp_map PCM device number assigned to /dev/adspX 83 (default = 1) 84 85For example, to map the third PCM device (hw:0,2) to /dev/adsp0, 86define like this: 87 88 options snd-pcm-oss adsp_map=2 89 90The options take arrays. For configuring the second card, specify 91two entries separated by comma. For example, to map the third PCM 92device on the second card to /dev/adsp1, define like below: 93 94 options snd-pcm-oss adsp_map=0,2 95 96To change the mapping of MIDI devices, the following options are 97available for snd-rawmidi: 98 99 midi_map MIDI device number assigned to /dev/midi0X 100 (default = 0) 101 amidi_map MIDI device number assigned to /dev/amidi0X 102 (default = 1) 103 104For example, to assign the third MIDI device on the first card to 105/dev/midi00, define as follows: 106 107 options snd-rawmidi midi_map=2 108 109 110PCM Mode 111======== 112 113As default, ALSA emulates the OSS PCM with so-called plugin layer, 114i.e. tries to convert the sample format, rate or channels 115automatically when the card doesn't support it natively. 116This will lead to some problems for some applications like quake or 117wine, especially if they use the card only in the MMAP mode. 118 119In such a case, you can change the behavior of PCM per application by 120writing a command to the proc file. There is a proc file for each PCM 121stream, /proc/asound/cardX/pcmY[cp]/oss, where X is the card number 122(zero-based), Y the PCM device number (zero-based), and 'p' is for 123playback and 'c' for capture, respectively. Note that this proc file 124exists only after snd-pcm-oss module is loaded. 125 126The command sequence has the following syntax: 127 128 app_name fragments fragment_size [options] 129 130app_name is the name of application with (higher priority) or without 131path. 132fragments specifies the number of fragments or zero if no specific 133number is given. 134fragment_size is the size of fragment in bytes or zero if not given. 135options is the optional parameters. The following options are 136available: 137 138 disable the application tries to open a pcm device for 139 this channel but does not want to use it. 140 direct don't use plugins 141 block force block open mode 142 non-block force non-block open mode 143 partial-frag write also partial fragments (affects playback only) 144 no-silence do not fill silence ahead to avoid clicks 145 146The disable option is useful when one stream direction (playback or 147capture) is not handled correctly by the application although the 148hardware itself does support both directions. 149The direct option is used, as mentioned above, to bypass the automatic 150conversion and useful for MMAP-applications. 151For example, to playback the first PCM device without plugins for 152quake, send a command via echo like the following: 153 154 % echo "quake 0 0 direct" > /proc/asound/card0/pcm0p/oss 155 156While quake wants only playback, you may append the second command 157to notify driver that only this direction is about to be allocated: 158 159 % echo "quake 0 0 disable" > /proc/asound/card0/pcm0c/oss 160 161The permission of proc files depend on the module options of snd. 162As default it's set as root, so you'll likely need to be superuser for 163sending the command above. 164 165The block and non-block options are used to change the behavior of 166opening the device file. 167 168As default, ALSA behaves as original OSS drivers, i.e. does not block 169the file when it's busy. The -EBUSY error is returned in this case. 170 171This blocking behavior can be changed globally via nonblock_open 172module option of snd-pcm-oss. For using the blocking mode as default 173for OSS devices, define like the following: 174 175 options snd-pcm-oss nonblock_open=0 176 177The partial-frag and no-silence commands have been added recently. 178Both commands are for optimization use only. The former command 179specifies to invoke the write transfer only when the whole fragment is 180filled. The latter stops writing the silence data ahead 181automatically. Both are disabled as default. 182 183You can check the currently defined configuration by reading the proc 184file. The read image can be sent to the proc file again, hence you 185can save the current configuration 186 187 % cat /proc/asound/card0/pcm0p/oss > /somewhere/oss-cfg 188 189and restore it like 190 191 % cat /somewhere/oss-cfg > /proc/asound/card0/pcm0p/oss 192 193Also, for clearing all the current configuration, send "erase" command 194as below: 195 196 % echo "erase" > /proc/asound/card0/pcm0p/oss 197 198 199Mixer Elements 200============== 201 202Since ALSA has completely different mixer interface, the emulation of 203OSS mixer is relatively complicated. ALSA builds up a mixer element 204from several different ALSA (mixer) controls based on the name 205string. For example, the volume element SOUND_MIXER_PCM is composed 206from "PCM Playback Volume" and "PCM Playback Switch" controls for the 207playback direction and from "PCM Capture Volume" and "PCM Capture 208Switch" for the capture directory (if exists). When the PCM volume of 209OSS is changed, all the volume and switch controls above are adjusted 210automatically. 211 212As default, ALSA uses the following control for OSS volumes: 213 214 OSS volume ALSA control Index 215 ----------------------------------------------------- 216 SOUND_MIXER_VOLUME Master 0 217 SOUND_MIXER_BASS Tone Control - Bass 0 218 SOUND_MIXER_TREBLE Tone Control - Treble 0 219 SOUND_MIXER_SYNTH Synth 0 220 SOUND_MIXER_PCM PCM 0 221 SOUND_MIXER_SPEAKER PC Speaker 0 222 SOUND_MIXER_LINE Line 0 223 SOUND_MIXER_MIC Mic 0 224 SOUND_MIXER_CD CD 0 225 SOUND_MIXER_IMIX Monitor Mix 0 226 SOUND_MIXER_ALTPCM PCM 1 227 SOUND_MIXER_RECLEV (not assigned) 228 SOUND_MIXER_IGAIN Capture 0 229 SOUND_MIXER_OGAIN Playback 0 230 SOUND_MIXER_LINE1 Aux 0 231 SOUND_MIXER_LINE2 Aux 1 232 SOUND_MIXER_LINE3 Aux 2 233 SOUND_MIXER_DIGITAL1 Digital 0 234 SOUND_MIXER_DIGITAL2 Digital 1 235 SOUND_MIXER_DIGITAL3 Digital 2 236 SOUND_MIXER_PHONEIN Phone 0 237 SOUND_MIXER_PHONEOUT Phone 1 238 SOUND_MIXER_VIDEO Video 0 239 SOUND_MIXER_RADIO Radio 0 240 SOUND_MIXER_MONITOR Monitor 0 241 242The second column is the base-string of the corresponding ALSA 243control. In fact, the controls with "XXX [Playback|Capture] 244[Volume|Switch]" will be checked in addition. 245 246The current assignment of these mixer elements is listed in the proc 247file, /proc/asound/cardX/oss_mixer, which will be like the following 248 249 VOLUME "Master" 0 250 BASS "" 0 251 TREBLE "" 0 252 SYNTH "" 0 253 PCM "PCM" 0 254 ... 255 256where the first column is the OSS volume element, the second column 257the base-string of the corresponding ALSA control, and the third the 258control index. When the string is empty, it means that the 259corresponding OSS control is not available. 260 261For changing the assignment, you can write the configuration to this 262proc file. For example, to map "Wave Playback" to the PCM volume, 263send the command like the following: 264 265 % echo 'VOLUME "Wave Playback" 0' > /proc/asound/card0/oss_mixer 266 267The command is exactly as same as listed in the proc file. You can 268change one or more elements, one volume per line. In the last 269example, both "Wave Playback Volume" and "Wave Playback Switch" will 270be affected when PCM volume is changed. 271 272Like the case of PCM proc file, the permission of proc files depend on 273the module options of snd. you'll likely need to be superuser for 274sending the command above. 275 276As well as in the case of PCM proc file, you can save and restore the 277current mixer configuration by reading and writing the whole file 278image. 279 280 281Duplex Streams 282============== 283 284Note that when attempting to use a single device file for playback and 285capture, the OSS API provides no way to set the format, sample rate or 286number of channels different in each direction. Thus 287 io_handle = open("device", O_RDWR) 288will only function correctly if the values are the same in each direction. 289 290To use different values in the two directions, use both 291 input_handle = open("device", O_RDONLY) 292 output_handle = open("device", O_WRONLY) 293and set the values for the corresponding handle. 294 295 296Unsupported Features 297==================== 298 299MMAP on ICE1712 driver 300---------------------- 301ICE1712 supports only the unconventional format, interleaved 30210-channels 24bit (packed in 32bit) format. Therefore you cannot mmap 303the buffer as the conventional (mono or 2-channels, 8 or 16bit) format 304on OSS. 305 306