| 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.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. | |
| 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. | |
| USB devices | |
| ----------- | |
| Some USB devices support only 24bit format packed in 3bytes. This | |
| format is not supported by OSS and no conversion is provided by kernel | |
| OSS emulation. You can use the user-space OSS emulation via libaoss | |
| instead. | |