1 ===============================
2 OSS Sequencer Emulation on ALSA
3 ===============================
5 Copyright (c) 1998,1999 by Takashi Iwai
7 ver.0.1.8; Nov. 16, 1999
12 This directory contains the OSS sequencer emulation driver on ALSA. Note
13 that this program is still in the development state.
15 What this does - it provides the emulation of the OSS sequencer, access
16 via ``/dev/sequencer`` and ``/dev/music`` devices.
17 The most of applications using OSS can run if the appropriate ALSA
18 sequencer is prepared.
20 The following features are emulated by this driver:
22 * Normal sequencer and MIDI events:
24 They are converted to the ALSA sequencer events, and sent to the
29 The timer is not selectable by ioctl. The control rate is fixed to
30 100 regardless of HZ. That is, even on Alpha system, a tick is always
31 1/100 second. The base rate and tempo can be changed in ``/dev/music``.
35 It purely depends on the synth drivers whether it's supported since
36 the patch loading is realized by callback to the synth driver.
40 Most of controls are accepted. Some controls
41 are dependent on the synth driver, as well as even on original OSS.
43 Furthermore, you can find the following advanced features:
45 * Better queue mechanism:
47 The events are queued before processing them.
49 * Multiple applications:
51 You can run two or more applications simultaneously (even for OSS
53 However, each MIDI device is exclusive - that is, if a MIDI device
54 is opened once by some application, other applications can't use
55 it. No such a restriction in synth devices.
57 * Real-time event processing:
59 The events can be processed in real time without using out of bound
60 ioctl. To switch to real-time mode, send ABSTIME 0 event. The followed
61 events will be processed in real-time without queued. To switch off the
62 real-time mode, send RELTIME 0 event.
64 * ``/proc`` interface:
66 The status of applications and devices can be shown via
67 ``/proc/asound/seq/oss`` at any time. In the later version,
68 configuration will be changed via ``/proc`` interface, too.
74 Run configure script with both sequencer support (``--with-sequencer=yes``)
75 and OSS emulation (``--with-oss=yes``) options. A module ``snd-seq-oss.o``
76 will be created. If the synth module of your sound card supports for OSS
77 emulation (so far, only Emu8000 driver), this module will be loaded
79 Otherwise, you need to load this module manually.
81 At beginning, this module probes all the MIDI ports which have been
82 already connected to the sequencer. Once after that, the creation and deletion
83 of ports are watched by announcement mechanism of ALSA sequencer.
85 The available synth and MIDI devices can be found in proc interface.
86 Run ``cat /proc/asound/seq/oss``, and check the devices. For example,
87 if you use an AWE64 card, you'll see like the following:
90 OSS sequencer emulation version 0.1.8
94 Number of applications: 0
96 Number of synth devices: 1
98 type 0x1 : subtype 0x20 : voices 32
99 capabilties : ioctl enabled / load_patch enabled
101 Number of MIDI devices: 3
102 midi 0: [Emu8000 Port-0] ALSA port 65:0
103 capability write / opened none
105 midi 1: [Emu8000 Port-1] ALSA port 65:1
106 capability write / opened none
108 midi 2: [0: MPU-401 (UART)] ALSA port 64:0
109 capability read/write / opened none
111 Note that the device number may be different from the information of
112 ``/proc/asound/oss-devices`` or ones of the original OSS driver.
113 Use the device number listed in ``/proc/asound/seq/oss``
114 to play via OSS sequencer emulation.
116 Using Synthesizer Devices
117 =========================
119 Run your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1
120 and xmp-1.1.5. You can load samples via ``/dev/sequencer`` like sfxload,
123 If the lowlevel driver supports multiple access to synth devices (like
124 Emu8000 driver), two or more applications are allowed to run at the same
130 So far, only MIDI output was tested. MIDI input was not checked at all,
131 but hopefully it will work. Use the device number listed in
132 ``/proc/asound/seq/oss``.
133 Be aware that these numbers are mostly different from the list in
134 ``/proc/asound/oss-devices``.
139 The following module options are available:
142 specifies the maximum read/write queue length. This queue is private
143 for OSS sequencer, so that it is independent from the queue length of ALSA
144 sequencer. Default value is 1024.
147 specifies the debug level and accepts zero (= no debug message) or
148 positive integer. Default value is 0.
153 OSS sequencer emulation uses an ALSA priority queue. The
154 events from ``/dev/sequencer`` are processed and put onto the queue
155 specified by module option.
157 All the events from ``/dev/sequencer`` are parsed at beginning.
158 The timing events are also parsed at this moment, so that the events may
159 be processed in real-time. Sending an event ABSTIME 0 switches the operation
160 mode to real-time mode, and sending an event RELTIME 0 switches it off.
161 In the real-time mode, all events are dispatched immediately.
163 The queued events are dispatched to the corresponding ALSA sequencer
164 ports after scheduled time by ALSA sequencer dispatcher.
166 If the write-queue is full, the application sleeps until a certain amount
167 (as default one half) becomes empty in blocking mode. The synchronization
168 to write timing was implemented, too.
170 The input from MIDI devices or echo-back events are stored on read FIFO
171 queue. If application reads ``/dev/sequencer`` in blocking mode, the
172 process will be awaked.
174 Interface to Synthesizer Device
175 ===============================
180 To register an OSS synthesizer device, use snd_seq_oss_synth_register()
184 int snd_seq_oss_synth_register(char *name, int type, int subtype, int nvoices,
185 snd_seq_oss_callback_t *oper, void *private_data)
187 The arguments ``name``, ``type``, ``subtype`` and ``nvoices``
188 are used for making the appropriate synth_info structure for ioctl. The
189 return value is an index number of this device. This index must be remembered
190 for unregister. If registration is failed, -errno will be returned.
192 To release this device, call snd_seq_oss_synth_unregister() function:
195 int snd_seq_oss_synth_unregister(int index)
197 where the ``index`` is the index number returned by register function.
202 OSS synthesizer devices have capability for sample downloading and ioctls
203 like sample reset. In OSS emulation, these special features are realized
204 by using callbacks. The registration argument oper is used to specify these
205 callbacks. The following callback functions must be defined:
208 snd_seq_oss_callback_t:
209 int (*open)(snd_seq_oss_arg_t *p, void *closure);
210 int (*close)(snd_seq_oss_arg_t *p);
211 int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg);
212 int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char *buf, int offs, int count);
213 int (*reset)(snd_seq_oss_arg_t *p);
215 Except for ``open`` and ``close`` callbacks, they are allowed to be NULL.
217 Each callback function takes the argument type ``snd_seq_oss_arg_t`` as the
221 struct snd_seq_oss_arg_t {
230 The first three fields, ``app_index``, ``file_mode`` and ``seq_mode``
231 are initialized by OSS sequencer. The ``app_index`` is the application
232 index which is unique to each application opening OSS sequencer. The
233 ``file_mode`` is bit-flags indicating the file operation mode. See
234 ``seq_oss.h`` for its meaning. The ``seq_mode`` is sequencer operation
235 mode. In the current version, only ``SND_OSSSEQ_MODE_SYNTH`` is used.
237 The next two fields, ``addr`` and ``private_data``, must be
238 filled by the synth driver at open callback. The ``addr`` contains
239 the address of ALSA sequencer port which is assigned to this device. If
240 the driver allocates memory for ``private_data``, it must be released
241 in close callback by itself.
243 The last field, ``event_passing``, indicates how to translate note-on
244 / off events. In ``PROCESS_EVENTS`` mode, the note 255 is regarded
245 as velocity change, and key pressure event is passed to the port. In
246 ``PASS_EVENTS`` mode, all note on/off events are passed to the port
247 without modified. ``PROCESS_KEYPRESS`` mode checks the note above 128
248 and regards it as key pressure event (mainly for Emu8000 driver).
253 The ``open`` is called at each time this device is opened by an application
254 using OSS sequencer. This must not be NULL. Typically, the open callback
255 does the following procedure:
257 #. Allocate private data record.
258 #. Create an ALSA sequencer port.
259 #. Set the new port address on ``arg->addr``.
260 #. Set the private data record pointer on ``arg->private_data``.
262 Note that the type bit-flags in port_info of this synth port must NOT contain
263 ``TYPE_MIDI_GENERIC``
264 bit. Instead, ``TYPE_SPECIFIC`` should be used. Also, ``CAP_SUBSCRIPTION``
265 bit should NOT be included, too. This is necessary to tell it from other
266 normal MIDI devices. If the open procedure succeeded, return zero. Otherwise,
272 The ``ioctl`` callback is called when the sequencer receives device-specific
273 ioctls. The following two ioctls should be processed by this callback:
275 IOCTL_SEQ_RESET_SAMPLES
276 reset all samples on memory -- return 0
279 return the available memory size
282 can be ignored usually
284 The other ioctls are processed inside the sequencer without passing to
290 The ``load_patch`` callback is used for sample-downloading. This callback
291 must read the data on user-space and transfer to each device. Return 0
292 if succeeded, and -errno if failed. The format argument is the patch key
293 in patch_info record. The buf is user-space pointer where patch_info record
294 is stored. The offs can be ignored. The count is total data size of this
300 The ``close`` callback is called when this device is closed by the
301 application. If any private data was allocated in open callback, it must
302 be released in the close callback. The deletion of ALSA port should be
303 done here, too. This callback must not be NULL.
308 The ``reset`` callback is called when sequencer device is reset or
309 closed by applications. The callback should turn off the sounds on the
310 relevant port immediately, and initialize the status of the port. If this
311 callback is undefined, OSS seq sends a ``HEARTBEAT`` event to the
317 Most of the events are processed by sequencer and translated to the adequate
318 ALSA sequencer events, so that each synth device can receive by input_event
319 callback of ALSA sequencer port. The following ALSA events should be
320 implemented by the driver:
322 ============= ===================
323 ALSA event Original OSS events
324 ============= ===================
325 NOTEON SEQ_NOTEON, MIDI_NOTEON
326 NOTE SEQ_NOTEOFF, MIDI_NOTEOFF
327 KEYPRESS MIDI_KEY_PRESSURE
328 CHANPRESS SEQ_AFTERTOUCH, MIDI_CHN_PRESSURE
329 PGMCHANGE SEQ_PGMCHANGE, MIDI_PGM_CHANGE
330 PITCHBEND SEQ_CONTROLLER(CTRL_PITCH_BENDER),
332 CONTROLLER MIDI_CTL_CHANGE,
333 SEQ_BALANCE (with CTL_PAN)
334 CONTROL14 SEQ_CONTROLLER
335 REGPARAM SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE)
337 ============= ===================
339 The most of these behavior can be realized by MIDI emulation driver
340 included in the Emu8000 lowlevel driver. In the future release, this module
343 Some OSS events (``SEQ_PRIVATE`` and ``SEQ_VOLUME`` events) are passed as event
344 type SND_SEQ_OSS_PRIVATE. The OSS sequencer passes these event 8 byte
345 packets without any modification. The lowlevel driver should process these
346 events appropriately.
348 Interface to MIDI Device
349 ========================
351 Since the OSS emulation probes the creation and deletion of ALSA MIDI
352 sequencer ports automatically by receiving announcement from ALSA
353 sequencer, the MIDI devices don't need to be registered explicitly
355 However, the MIDI port_info registered to ALSA sequencer must include
356 a group name ``SND_SEQ_GROUP_DEVICE`` and a capability-bit
357 ``CAP_READ`` or ``CAP_WRITE``. Also, subscription capabilities,
358 ``CAP_SUBS_READ`` or ``CAP_SUBS_WRITE``, must be defined, too. If
359 these conditions are not satisfied, the port is not registered as OSS
360 sequencer MIDI device.
362 The events via MIDI devices are parsed in OSS sequencer and converted
363 to the corresponding ALSA sequencer events. The input from MIDI sequencer
364 is also converted to MIDI byte events by OSS sequencer. This works just
365 a reverse way of seq_midi module.
367 Known Problems / TODO's
368 =======================
370 * Patch loading via ALSA instrument layer is not implemented yet.