cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

seq-oss.rst (13153B)


      1===============================
      2OSS Sequencer Emulation on ALSA
      3===============================
      4
      5Copyright (c) 1998,1999 by Takashi Iwai
      6
      7ver.0.1.8; Nov. 16, 1999
      8
      9Description
     10===========
     11
     12This directory contains the OSS sequencer emulation driver on ALSA. Note
     13that this program is still in the development state.
     14
     15What this does - it provides the emulation of the OSS sequencer, access
     16via ``/dev/sequencer`` and ``/dev/music`` devices.
     17The most of applications using OSS can run if the appropriate ALSA
     18sequencer is prepared.
     19
     20The following features are emulated by this driver:
     21
     22* Normal sequencer and MIDI events:
     23
     24    They are converted to the ALSA sequencer events, and sent to the
     25    corresponding port.
     26
     27* Timer events:
     28
     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``.
     32
     33* Patch loading:
     34
     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.
     37
     38* I/O controls:
     39
     40    Most of controls are accepted. Some controls
     41    are dependent on the synth driver, as well as even on original OSS.
     42
     43Furthermore, you can find the following advanced features:
     44
     45* Better queue mechanism:
     46
     47    The events are queued before processing them.
     48
     49* Multiple applications:
     50
     51    You can run two or more applications simultaneously (even for OSS
     52    sequencer)!
     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.
     56
     57* Real-time event processing:
     58
     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.
     63
     64* ``/proc`` interface:
     65
     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.
     69
     70
     71Installation
     72============
     73
     74Run configure script with both sequencer support (``--with-sequencer=yes``)
     75and OSS emulation (``--with-oss=yes``) options. A module ``snd-seq-oss.o``
     76will be created. If the synth module of your sound card supports for OSS
     77emulation (so far, only Emu8000 driver), this module will be loaded
     78automatically.
     79Otherwise, you need to load this module manually.
     80
     81At beginning, this module probes all the MIDI ports which have been
     82already connected to the sequencer. Once after that, the creation and deletion
     83of ports are watched by announcement mechanism of ALSA sequencer.
     84
     85The available synth and MIDI devices can be found in proc interface.
     86Run ``cat /proc/asound/seq/oss``, and check the devices. For example,
     87if you use an AWE64 card, you'll see like the following:
     88::
     89
     90    OSS sequencer emulation version 0.1.8
     91    ALSA client number 63
     92    ALSA receiver port 0
     93
     94    Number of applications: 0
     95
     96    Number of synth devices: 1
     97    synth 0: [EMU8000]
     98      type 0x1 : subtype 0x20 : voices 32
     99      capabilties : ioctl enabled / load_patch enabled
    100
    101    Number of MIDI devices: 3
    102    midi 0: [Emu8000 Port-0] ALSA port 65:0
    103      capability write / opened none
    104
    105    midi 1: [Emu8000 Port-1] ALSA port 65:1
    106      capability write / opened none
    107
    108    midi 2: [0: MPU-401 (UART)] ALSA port 64:0
    109      capability read/write / opened none
    110
    111Note that the device number may be different from the information of
    112``/proc/asound/oss-devices`` or ones of the original OSS driver.
    113Use the device number listed in ``/proc/asound/seq/oss``
    114to play via OSS sequencer emulation.
    115
    116Using Synthesizer Devices
    117=========================
    118
    119Run your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1
    120and xmp-1.1.5. You can load samples via ``/dev/sequencer`` like sfxload,
    121too.
    122
    123If the lowlevel driver supports multiple access to synth devices (like
    124Emu8000 driver), two or more applications are allowed to run at the same
    125time.
    126
    127Using MIDI Devices
    128==================
    129
    130So far, only MIDI output was tested. MIDI input was not checked at all,
    131but hopefully it will work. Use the device number listed in
    132``/proc/asound/seq/oss``.
    133Be aware that these numbers are mostly different from the list in
    134``/proc/asound/oss-devices``.
    135
    136Module Options
    137==============
    138
    139The following module options are available:
    140
    141maxqlen
    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.
    145
    146seq_oss_debug
    147  specifies the debug level and accepts zero (= no debug message) or
    148  positive integer. Default value is 0.
    149
    150Queue Mechanism
    151===============
    152
    153OSS sequencer emulation uses an ALSA priority queue. The
    154events from ``/dev/sequencer`` are processed and put onto the queue
    155specified by module option.
    156
    157All the events from ``/dev/sequencer`` are parsed at beginning.
    158The timing events are also parsed at this moment, so that the events may
    159be processed in real-time. Sending an event ABSTIME 0 switches the operation
    160mode to real-time mode, and sending an event RELTIME 0 switches it off.
    161In the real-time mode, all events are dispatched immediately.
    162
    163The queued events are dispatched to the corresponding ALSA sequencer
    164ports after scheduled time by ALSA sequencer dispatcher.
    165
    166If the write-queue is full, the application sleeps until a certain amount
    167(as default one half) becomes empty in blocking mode. The synchronization
    168to write timing was implemented, too.
    169
    170The input from MIDI devices or echo-back events are stored on read FIFO
    171queue. If application reads ``/dev/sequencer`` in blocking mode, the
    172process will be awaked.
    173
    174Interface to Synthesizer Device
    175===============================
    176
    177Registration
    178------------
    179
    180To register an OSS synthesizer device, use snd_seq_oss_synth_register()
    181function:
    182::
    183
    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)
    186
    187The arguments ``name``, ``type``, ``subtype`` and ``nvoices``
    188are used for making the appropriate synth_info structure for ioctl. The
    189return value is an index number of this device. This index must be remembered
    190for unregister. If registration is failed, -errno will be returned.
    191
    192To release this device, call snd_seq_oss_synth_unregister() function:
    193::
    194
    195  int snd_seq_oss_synth_unregister(int index)
    196
    197where the ``index`` is the index number returned by register function.
    198
    199Callbacks
    200---------
    201
    202OSS synthesizer devices have capability for sample downloading and ioctls
    203like sample reset. In OSS emulation, these special features are realized
    204by using callbacks. The registration argument oper is used to specify these
    205callbacks. The following callback functions must be defined:
    206::
    207
    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);
    214
    215Except for ``open`` and ``close`` callbacks, they are allowed to be NULL.
    216
    217Each callback function takes the argument type ``snd_seq_oss_arg_t`` as the
    218first argument.
    219::
    220
    221  struct snd_seq_oss_arg_t {
    222      int app_index;
    223      int file_mode;
    224      int seq_mode;
    225      snd_seq_addr_t addr;
    226      void *private_data;
    227      int event_passing;
    228  };
    229
    230The first three fields, ``app_index``, ``file_mode`` and ``seq_mode``
    231are initialized by OSS sequencer. The ``app_index`` is the application
    232index 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
    235mode. In the current version, only ``SND_OSSSEQ_MODE_SYNTH`` is used.
    236
    237The next two fields, ``addr`` and ``private_data``, must be
    238filled by the synth driver at open callback. The ``addr`` contains
    239the address of ALSA sequencer port which is assigned to this device. If
    240the driver allocates memory for ``private_data``, it must be released
    241in close callback by itself.
    242
    243The last field, ``event_passing``, indicates how to translate note-on
    244/ off events. In ``PROCESS_EVENTS`` mode, the note 255 is regarded
    245as 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
    247without modified. ``PROCESS_KEYPRESS`` mode checks the note above 128
    248and regards it as key pressure event (mainly for Emu8000 driver).
    249
    250Open Callback
    251-------------
    252
    253The ``open`` is called at each time this device is opened by an application
    254using OSS sequencer. This must not be NULL. Typically, the open callback
    255does the following procedure:
    256
    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``.
    261
    262Note that the type bit-flags in port_info of this synth port must NOT contain
    263``TYPE_MIDI_GENERIC``
    264bit. Instead, ``TYPE_SPECIFIC`` should be used. Also, ``CAP_SUBSCRIPTION``
    265bit should NOT be included, too. This is necessary to tell it from other
    266normal MIDI devices. If the open procedure succeeded, return zero. Otherwise,
    267return -errno.
    268
    269Ioctl Callback
    270--------------
    271
    272The ``ioctl`` callback is called when the sequencer receives device-specific
    273ioctls. The following two ioctls should be processed by this callback:
    274
    275IOCTL_SEQ_RESET_SAMPLES
    276    reset all samples on memory -- return 0
    277
    278IOCTL_SYNTH_MEMAVL
    279    return the available memory size
    280
    281FM_4OP_ENABLE
    282    can be ignored usually
    283
    284The other ioctls are processed inside the sequencer without passing to
    285the lowlevel driver.
    286
    287Load_Patch Callback
    288-------------------
    289
    290The ``load_patch`` callback is used for sample-downloading. This callback
    291must read the data on user-space and transfer to each device. Return 0
    292if succeeded, and -errno if failed. The format argument is the patch key
    293in patch_info record. The buf is user-space pointer where patch_info record
    294is stored. The offs can be ignored. The count is total data size of this
    295sample data.
    296
    297Close Callback
    298--------------
    299
    300The ``close`` callback is called when this device is closed by the
    301application. If any private data was allocated in open callback, it must
    302be released in the close callback. The deletion of ALSA port should be
    303done here, too. This callback must not be NULL.
    304
    305Reset Callback
    306--------------
    307
    308The ``reset`` callback is called when sequencer device is reset or
    309closed by applications. The callback should turn off the sounds on the
    310relevant port immediately, and initialize the status of the port. If this
    311callback is undefined, OSS seq sends a ``HEARTBEAT`` event to the
    312port.
    313
    314Events
    315======
    316
    317Most of the events are processed by sequencer and translated to the adequate
    318ALSA sequencer events, so that each synth device can receive by input_event
    319callback of ALSA sequencer port. The following ALSA events should be
    320implemented by the driver:
    321
    322=============	===================
    323ALSA event	Original OSS events
    324=============	===================
    325NOTEON		SEQ_NOTEON, MIDI_NOTEON
    326NOTE		SEQ_NOTEOFF, MIDI_NOTEOFF
    327KEYPRESS	MIDI_KEY_PRESSURE
    328CHANPRESS	SEQ_AFTERTOUCH, MIDI_CHN_PRESSURE
    329PGMCHANGE	SEQ_PGMCHANGE, MIDI_PGM_CHANGE
    330PITCHBEND	SEQ_CONTROLLER(CTRL_PITCH_BENDER),
    331		MIDI_PITCH_BEND
    332CONTROLLER	MIDI_CTL_CHANGE,
    333		SEQ_BALANCE (with CTL_PAN)
    334CONTROL14	SEQ_CONTROLLER
    335REGPARAM	SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE)
    336SYSEX		SEQ_SYSEX
    337=============	===================
    338
    339The most of these behavior can be realized by MIDI emulation driver
    340included in the Emu8000 lowlevel driver. In the future release, this module
    341will be independent.
    342
    343Some OSS events (``SEQ_PRIVATE`` and ``SEQ_VOLUME`` events) are passed as event
    344type SND_SEQ_OSS_PRIVATE.  The OSS sequencer passes these event 8 byte
    345packets without any modification. The lowlevel driver should process these
    346events appropriately.
    347
    348Interface to MIDI Device
    349========================
    350
    351Since the OSS emulation probes the creation and deletion of ALSA MIDI
    352sequencer ports automatically by receiving announcement from ALSA
    353sequencer, the MIDI devices don't need to be registered explicitly
    354like synth devices.
    355However, the MIDI port_info registered to ALSA sequencer must include
    356a 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
    359these conditions are not satisfied, the port is not registered as OSS
    360sequencer MIDI device.
    361
    362The events via MIDI devices are parsed in OSS sequencer and converted
    363to the corresponding ALSA sequencer events. The input from MIDI sequencer
    364is also converted to MIDI byte events by OSS sequencer. This works just
    365a reverse way of seq_midi module.
    366
    367Known Problems / TODO's
    368=======================
    369
    370* Patch loading via ALSA instrument layer is not implemented yet.
    371