| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 1 | NOTES ON KERNEL OSS-EMULATION | 
|  | 2 | ============================= | 
|  | 3 |  | 
|  | 4 | Jan. 22, 2004  Takashi Iwai <tiwai@suse.de> | 
|  | 5 |  | 
|  | 6 |  | 
|  | 7 | Modules | 
|  | 8 | ======= | 
|  | 9 |  | 
|  | 10 | ALSA provides a powerful OSS emulation on the kernel. | 
|  | 11 | The OSS emulation for PCM, mixer and sequencer devices is implemented | 
|  | 12 | as add-on kernel modules, snd-pcm-oss, snd-mixer-oss and snd-seq-oss. | 
|  | 13 | When you need to access the OSS PCM, mixer or sequencer devices, the | 
|  | 14 | corresponding module has to be loaded. | 
|  | 15 |  | 
|  | 16 | These modules are loaded automatically when the corresponding service | 
|  | 17 | is called.  The alias is defined sound-service-x-y, where x and y are | 
|  | 18 | the card number and the minor unit number.  Usually you don't have to | 
|  | 19 | define these aliases by yourself. | 
|  | 20 |  | 
|  | 21 | Only necessary step for auto-loading of OSS modules is to define the | 
|  | 22 | card alias in /etc/modprobe.conf, such as | 
|  | 23 |  | 
|  | 24 | alias sound-slot-0 snd-emu10k1 | 
|  | 25 |  | 
|  | 26 | As the second card, define sound-slot-1 as well. | 
|  | 27 | Note 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 | 
|  | 29 | modutils). | 
|  | 30 |  | 
|  | 31 | The 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. | 
|  | 34 | On ALSA, you can symlink /dev/sndstat to this proc file. | 
|  | 35 |  | 
|  | 36 | Please note that the devices listed in this proc file appear only | 
|  | 37 | after the corresponding OSS-emulation module is loaded.  Don't worry | 
|  | 38 | even if "NOT ENABLED IN CONFIG" is shown in it. | 
|  | 39 |  | 
|  | 40 |  | 
|  | 41 | Device Mapping | 
|  | 42 | ============== | 
|  | 43 |  | 
|  | 44 | ALSA 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 |  | 
|  | 61 | where 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 |  | 
|  | 67 | Unlike the real OSS, ALSA cannot use the device files more than the | 
|  | 68 | assigned ones.  For example, the first card cannot use /dev/dsp1 or | 
|  | 69 | /dev/dsp2, but only /dev/dsp0 and /dev/adsp0. | 
|  | 70 |  | 
|  | 71 | As seen above, PCM and MIDI may have two devices.  Usually, the first | 
|  | 72 | PCM device (hw:0,0 in ALSA) is mapped to /dev/dsp and the secondary | 
|  | 73 | device (hw:0,1) to /dev/adsp (if available).  For MIDI, /dev/midi and | 
|  | 74 | /dev/amidi, respectively. | 
|  | 75 |  | 
|  | 76 | You can change this device mapping via the module options of | 
|  | 77 | snd-pcm-oss and snd-rawmidi.  In the case of PCM, the following | 
|  | 78 | options 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 |  | 
|  | 85 | For example, to map the third PCM device (hw:0,2) to /dev/adsp0, | 
|  | 86 | define like this: | 
|  | 87 |  | 
|  | 88 | options snd-pcm-oss adsp_map=2 | 
|  | 89 |  | 
|  | 90 | The options take arrays.  For configuring the second card, specify | 
|  | 91 | two entries separated by comma.  For example, to map the third PCM | 
|  | 92 | device on the second card to /dev/adsp1, define like below: | 
|  | 93 |  | 
|  | 94 | options snd-pcm-oss adsp_map=0,2 | 
|  | 95 |  | 
|  | 96 | To change the mapping of MIDI devices, the following options are | 
|  | 97 | available 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 |  | 
|  | 104 | For 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 |  | 
|  | 110 | PCM Mode | 
|  | 111 | ======== | 
|  | 112 |  | 
|  | 113 | As default, ALSA emulates the OSS PCM with so-called plugin layer, | 
|  | 114 | i.e. tries to convert the sample format, rate or channels | 
|  | 115 | automatically when the card doesn't support it natively. | 
|  | 116 | This will lead to some problems for some applications like quake or | 
|  | 117 | wine, especially if they use the card only in the MMAP mode. | 
|  | 118 |  | 
|  | 119 | In such a case, you can change the behavior of PCM per application by | 
|  | 120 | writing a command to the proc file.  There is a proc file for each PCM | 
|  | 121 | stream, /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 | 
|  | 123 | playback and 'c' for capture, respectively.  Note that this proc file | 
|  | 124 | exists only after snd-pcm-oss module is loaded. | 
|  | 125 |  | 
|  | 126 | The command sequence has the following syntax: | 
|  | 127 |  | 
|  | 128 | app_name fragments fragment_size [options] | 
|  | 129 |  | 
|  | 130 | app_name is the name of application with (higher priority) or without | 
|  | 131 | path. | 
|  | 132 | fragments specifies the number of fragments or zero if no specific | 
|  | 133 | number is given. | 
|  | 134 | fragment_size is the size of fragment in bytes or zero if not given. | 
|  | 135 | options is the optional parameters.  The following options are | 
|  | 136 | available: | 
|  | 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 |  | 
|  | 146 | The disable option is useful when one stream direction (playback or | 
|  | 147 | capture) is not handled correctly by the application although the | 
|  | 148 | hardware itself does support both directions. | 
|  | 149 | The direct option is used, as mentioned above, to bypass the automatic | 
|  | 150 | conversion and useful for MMAP-applications. | 
|  | 151 | For example, to playback the first PCM device without plugins for | 
|  | 152 | quake, send a command via echo like the following: | 
|  | 153 |  | 
|  | 154 | % echo "quake 0 0 direct" > /proc/asound/card0/pcm0p/oss | 
|  | 155 |  | 
|  | 156 | While quake wants only playback, you may append the second command | 
|  | 157 | to notify driver that only this direction is about to be allocated: | 
|  | 158 |  | 
|  | 159 | % echo "quake 0 0 disable" > /proc/asound/card0/pcm0c/oss | 
|  | 160 |  | 
|  | 161 | The permission of proc files depend on the module options of snd. | 
|  | 162 | As default it's set as root, so you'll likely need to be superuser for | 
|  | 163 | sending the command above. | 
|  | 164 |  | 
|  | 165 | The block and non-block options are used to change the behavior of | 
|  | 166 | opening the device file. | 
|  | 167 |  | 
|  | 168 | As default, ALSA behaves as original OSS drivers, i.e. does not block | 
|  | 169 | the file when it's busy. The -EBUSY error is returned in this case. | 
|  | 170 |  | 
|  | 171 | This blocking behavior can be changed globally via nonblock_open | 
|  | 172 | module option of snd-pcm-oss.  For using the blocking mode as default | 
|  | 173 | for OSS devices, define like the following: | 
|  | 174 |  | 
|  | 175 | options snd-pcm-oss nonblock_open=0 | 
|  | 176 |  | 
|  | 177 | The partial-frag and no-silence commands have been added recently. | 
|  | 178 | Both commands are for optimization use only.  The former command | 
|  | 179 | specifies to invoke the write transfer only when the whole fragment is | 
|  | 180 | filled.  The latter stops writing the silence data ahead | 
|  | 181 | automatically.  Both are disabled as default. | 
|  | 182 |  | 
|  | 183 | You can check the currently defined configuration by reading the proc | 
|  | 184 | file.  The read image can be sent to the proc file again, hence you | 
|  | 185 | can save the current configuration | 
|  | 186 |  | 
|  | 187 | % cat /proc/asound/card0/pcm0p/oss > /somewhere/oss-cfg | 
|  | 188 |  | 
|  | 189 | and restore it like | 
|  | 190 |  | 
|  | 191 | % cat /somewhere/oss-cfg > /proc/asound/card0/pcm0p/oss | 
|  | 192 |  | 
|  | 193 | Also, for clearing all the current configuration, send "erase" command | 
|  | 194 | as below: | 
|  | 195 |  | 
|  | 196 | % echo "erase" > /proc/asound/card0/pcm0p/oss | 
|  | 197 |  | 
|  | 198 |  | 
|  | 199 | Mixer Elements | 
|  | 200 | ============== | 
|  | 201 |  | 
|  | 202 | Since ALSA has completely different mixer interface, the emulation of | 
|  | 203 | OSS mixer is relatively complicated.  ALSA builds up a mixer element | 
|  | 204 | from several different ALSA (mixer) controls based on the name | 
|  | 205 | string.  For example, the volume element SOUND_MIXER_PCM is composed | 
|  | 206 | from "PCM Playback Volume" and "PCM Playback Switch" controls for the | 
|  | 207 | playback direction and from "PCM Capture Volume" and "PCM Capture | 
|  | 208 | Switch" for the capture directory (if exists).  When the PCM volume of | 
|  | 209 | OSS is changed, all the volume and switch controls above are adjusted | 
|  | 210 | automatically. | 
|  | 211 |  | 
|  | 212 | As 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 |  | 
|  | 242 | The second column is the base-string of the corresponding ALSA | 
|  | 243 | control.  In fact, the controls with "XXX [Playback|Capture] | 
|  | 244 | [Volume|Switch]" will be checked in addition. | 
|  | 245 |  | 
|  | 246 | The current assignment of these mixer elements is listed in the proc | 
|  | 247 | file, /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 |  | 
|  | 256 | where the first column is the OSS volume element, the second column | 
|  | 257 | the base-string of the corresponding ALSA control, and the third the | 
|  | 258 | control index.  When the string is empty, it means that the | 
|  | 259 | corresponding OSS control is not available. | 
|  | 260 |  | 
|  | 261 | For changing the assignment, you can write the configuration to this | 
|  | 262 | proc file.  For example, to map "Wave Playback" to the PCM volume, | 
|  | 263 | send the command like the following: | 
|  | 264 |  | 
|  | 265 | % echo 'VOLUME "Wave Playback" 0' > /proc/asound/card0/oss_mixer | 
|  | 266 |  | 
|  | 267 | The command is exactly as same as listed in the proc file.  You can | 
|  | 268 | change one or more elements, one volume per line.  In the last | 
|  | 269 | example, both "Wave Playback Volume" and "Wave Playback Switch" will | 
|  | 270 | be affected when PCM volume is changed. | 
|  | 271 |  | 
|  | 272 | Like the case of PCM proc file, the permission of proc files depend on | 
|  | 273 | the module options of snd.  you'll likely need to be superuser for | 
|  | 274 | sending the command above. | 
|  | 275 |  | 
|  | 276 | As well as in the case of PCM proc file, you can save and restore the | 
|  | 277 | current mixer configuration by reading and writing the whole file | 
|  | 278 | image. | 
|  | 279 |  | 
|  | 280 |  | 
| Alan Horstmann | 1919de0 | 2007-06-04 23:11:23 +0200 | [diff] [blame] | 281 | Duplex Streams | 
|  | 282 | ============== | 
|  | 283 |  | 
|  | 284 | Note that when attempting to use a single device file for playback and | 
|  | 285 | capture, the OSS API provides no way to set the format, sample rate or | 
|  | 286 | number of channels different in each direction.  Thus | 
|  | 287 | io_handle = open("device", O_RDWR) | 
|  | 288 | will only function correctly if the values are the same in each direction. | 
|  | 289 |  | 
|  | 290 | To use different values in the two directions, use both | 
|  | 291 | input_handle = open("device", O_RDONLY) | 
|  | 292 | output_handle = open("device", O_WRONLY) | 
|  | 293 | and set the values for the corresponding handle. | 
|  | 294 |  | 
|  | 295 |  | 
| Linus Torvalds | 1da177e | 2005-04-16 15:20:36 -0700 | [diff] [blame] | 296 | Unsupported Features | 
|  | 297 | ==================== | 
|  | 298 |  | 
|  | 299 | MMAP on ICE1712 driver | 
|  | 300 | ---------------------- | 
|  | 301 | ICE1712 supports only the unconventional format, interleaved | 
|  | 302 | 10-channels 24bit (packed in 32bit) format.  Therefore you cannot mmap | 
|  | 303 | the buffer as the conventional (mono or 2-channels, 8 or 16bit) format | 
|  | 304 | on OSS. | 
|  | 305 |  |