1*4882a593Smuzhiyun=============================== 2*4882a593SmuzhiyunOSS Sequencer Emulation on ALSA 3*4882a593Smuzhiyun=============================== 4*4882a593Smuzhiyun 5*4882a593SmuzhiyunCopyright (c) 1998,1999 by Takashi Iwai 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunver.0.1.8; Nov. 16, 1999 8*4882a593Smuzhiyun 9*4882a593SmuzhiyunDescription 10*4882a593Smuzhiyun=========== 11*4882a593Smuzhiyun 12*4882a593SmuzhiyunThis directory contains the OSS sequencer emulation driver on ALSA. Note 13*4882a593Smuzhiyunthat this program is still in the development state. 14*4882a593Smuzhiyun 15*4882a593SmuzhiyunWhat this does - it provides the emulation of the OSS sequencer, access 16*4882a593Smuzhiyunvia ``/dev/sequencer`` and ``/dev/music`` devices. 17*4882a593SmuzhiyunThe most of applications using OSS can run if the appropriate ALSA 18*4882a593Smuzhiyunsequencer is prepared. 19*4882a593Smuzhiyun 20*4882a593SmuzhiyunThe following features are emulated by this driver: 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun* Normal sequencer and MIDI events: 23*4882a593Smuzhiyun 24*4882a593Smuzhiyun They are converted to the ALSA sequencer events, and sent to the 25*4882a593Smuzhiyun corresponding port. 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun* Timer events: 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun The timer is not selectable by ioctl. The control rate is fixed to 30*4882a593Smuzhiyun 100 regardless of HZ. That is, even on Alpha system, a tick is always 31*4882a593Smuzhiyun 1/100 second. The base rate and tempo can be changed in ``/dev/music``. 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun* Patch loading: 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun It purely depends on the synth drivers whether it's supported since 36*4882a593Smuzhiyun the patch loading is realized by callback to the synth driver. 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun* I/O controls: 39*4882a593Smuzhiyun 40*4882a593Smuzhiyun Most of controls are accepted. Some controls 41*4882a593Smuzhiyun are dependent on the synth driver, as well as even on original OSS. 42*4882a593Smuzhiyun 43*4882a593SmuzhiyunFurthermore, you can find the following advanced features: 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun* Better queue mechanism: 46*4882a593Smuzhiyun 47*4882a593Smuzhiyun The events are queued before processing them. 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun* Multiple applications: 50*4882a593Smuzhiyun 51*4882a593Smuzhiyun You can run two or more applications simultaneously (even for OSS 52*4882a593Smuzhiyun sequencer)! 53*4882a593Smuzhiyun However, each MIDI device is exclusive - that is, if a MIDI device 54*4882a593Smuzhiyun is opened once by some application, other applications can't use 55*4882a593Smuzhiyun it. No such a restriction in synth devices. 56*4882a593Smuzhiyun 57*4882a593Smuzhiyun* Real-time event processing: 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun The events can be processed in real time without using out of bound 60*4882a593Smuzhiyun ioctl. To switch to real-time mode, send ABSTIME 0 event. The followed 61*4882a593Smuzhiyun events will be processed in real-time without queued. To switch off the 62*4882a593Smuzhiyun real-time mode, send RELTIME 0 event. 63*4882a593Smuzhiyun 64*4882a593Smuzhiyun* ``/proc`` interface: 65*4882a593Smuzhiyun 66*4882a593Smuzhiyun The status of applications and devices can be shown via 67*4882a593Smuzhiyun ``/proc/asound/seq/oss`` at any time. In the later version, 68*4882a593Smuzhiyun configuration will be changed via ``/proc`` interface, too. 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun 71*4882a593SmuzhiyunInstallation 72*4882a593Smuzhiyun============ 73*4882a593Smuzhiyun 74*4882a593SmuzhiyunRun configure script with both sequencer support (``--with-sequencer=yes``) 75*4882a593Smuzhiyunand OSS emulation (``--with-oss=yes``) options. A module ``snd-seq-oss.o`` 76*4882a593Smuzhiyunwill be created. If the synth module of your sound card supports for OSS 77*4882a593Smuzhiyunemulation (so far, only Emu8000 driver), this module will be loaded 78*4882a593Smuzhiyunautomatically. 79*4882a593SmuzhiyunOtherwise, you need to load this module manually. 80*4882a593Smuzhiyun 81*4882a593SmuzhiyunAt beginning, this module probes all the MIDI ports which have been 82*4882a593Smuzhiyunalready connected to the sequencer. Once after that, the creation and deletion 83*4882a593Smuzhiyunof ports are watched by announcement mechanism of ALSA sequencer. 84*4882a593Smuzhiyun 85*4882a593SmuzhiyunThe available synth and MIDI devices can be found in proc interface. 86*4882a593SmuzhiyunRun ``cat /proc/asound/seq/oss``, and check the devices. For example, 87*4882a593Smuzhiyunif you use an AWE64 card, you'll see like the following: 88*4882a593Smuzhiyun:: 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun OSS sequencer emulation version 0.1.8 91*4882a593Smuzhiyun ALSA client number 63 92*4882a593Smuzhiyun ALSA receiver port 0 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun Number of applications: 0 95*4882a593Smuzhiyun 96*4882a593Smuzhiyun Number of synth devices: 1 97*4882a593Smuzhiyun synth 0: [EMU8000] 98*4882a593Smuzhiyun type 0x1 : subtype 0x20 : voices 32 99*4882a593Smuzhiyun capabilties : ioctl enabled / load_patch enabled 100*4882a593Smuzhiyun 101*4882a593Smuzhiyun Number of MIDI devices: 3 102*4882a593Smuzhiyun midi 0: [Emu8000 Port-0] ALSA port 65:0 103*4882a593Smuzhiyun capability write / opened none 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun midi 1: [Emu8000 Port-1] ALSA port 65:1 106*4882a593Smuzhiyun capability write / opened none 107*4882a593Smuzhiyun 108*4882a593Smuzhiyun midi 2: [0: MPU-401 (UART)] ALSA port 64:0 109*4882a593Smuzhiyun capability read/write / opened none 110*4882a593Smuzhiyun 111*4882a593SmuzhiyunNote that the device number may be different from the information of 112*4882a593Smuzhiyun``/proc/asound/oss-devices`` or ones of the original OSS driver. 113*4882a593SmuzhiyunUse the device number listed in ``/proc/asound/seq/oss`` 114*4882a593Smuzhiyunto play via OSS sequencer emulation. 115*4882a593Smuzhiyun 116*4882a593SmuzhiyunUsing Synthesizer Devices 117*4882a593Smuzhiyun========================= 118*4882a593Smuzhiyun 119*4882a593SmuzhiyunRun your favorite program. I've tested playmidi-2.4, awemidi-0.4.3, gmod-3.1 120*4882a593Smuzhiyunand xmp-1.1.5. You can load samples via ``/dev/sequencer`` like sfxload, 121*4882a593Smuzhiyuntoo. 122*4882a593Smuzhiyun 123*4882a593SmuzhiyunIf the lowlevel driver supports multiple access to synth devices (like 124*4882a593SmuzhiyunEmu8000 driver), two or more applications are allowed to run at the same 125*4882a593Smuzhiyuntime. 126*4882a593Smuzhiyun 127*4882a593SmuzhiyunUsing MIDI Devices 128*4882a593Smuzhiyun================== 129*4882a593Smuzhiyun 130*4882a593SmuzhiyunSo far, only MIDI output was tested. MIDI input was not checked at all, 131*4882a593Smuzhiyunbut hopefully it will work. Use the device number listed in 132*4882a593Smuzhiyun``/proc/asound/seq/oss``. 133*4882a593SmuzhiyunBe aware that these numbers are mostly different from the list in 134*4882a593Smuzhiyun``/proc/asound/oss-devices``. 135*4882a593Smuzhiyun 136*4882a593SmuzhiyunModule Options 137*4882a593Smuzhiyun============== 138*4882a593Smuzhiyun 139*4882a593SmuzhiyunThe following module options are available: 140*4882a593Smuzhiyun 141*4882a593Smuzhiyunmaxqlen 142*4882a593Smuzhiyun specifies the maximum read/write queue length. This queue is private 143*4882a593Smuzhiyun for OSS sequencer, so that it is independent from the queue length of ALSA 144*4882a593Smuzhiyun sequencer. Default value is 1024. 145*4882a593Smuzhiyun 146*4882a593Smuzhiyunseq_oss_debug 147*4882a593Smuzhiyun specifies the debug level and accepts zero (= no debug message) or 148*4882a593Smuzhiyun positive integer. Default value is 0. 149*4882a593Smuzhiyun 150*4882a593SmuzhiyunQueue Mechanism 151*4882a593Smuzhiyun=============== 152*4882a593Smuzhiyun 153*4882a593SmuzhiyunOSS sequencer emulation uses an ALSA priority queue. The 154*4882a593Smuzhiyunevents from ``/dev/sequencer`` are processed and put onto the queue 155*4882a593Smuzhiyunspecified by module option. 156*4882a593Smuzhiyun 157*4882a593SmuzhiyunAll the events from ``/dev/sequencer`` are parsed at beginning. 158*4882a593SmuzhiyunThe timing events are also parsed at this moment, so that the events may 159*4882a593Smuzhiyunbe processed in real-time. Sending an event ABSTIME 0 switches the operation 160*4882a593Smuzhiyunmode to real-time mode, and sending an event RELTIME 0 switches it off. 161*4882a593SmuzhiyunIn the real-time mode, all events are dispatched immediately. 162*4882a593Smuzhiyun 163*4882a593SmuzhiyunThe queued events are dispatched to the corresponding ALSA sequencer 164*4882a593Smuzhiyunports after scheduled time by ALSA sequencer dispatcher. 165*4882a593Smuzhiyun 166*4882a593SmuzhiyunIf the write-queue is full, the application sleeps until a certain amount 167*4882a593Smuzhiyun(as default one half) becomes empty in blocking mode. The synchronization 168*4882a593Smuzhiyunto write timing was implemented, too. 169*4882a593Smuzhiyun 170*4882a593SmuzhiyunThe input from MIDI devices or echo-back events are stored on read FIFO 171*4882a593Smuzhiyunqueue. If application reads ``/dev/sequencer`` in blocking mode, the 172*4882a593Smuzhiyunprocess will be awaked. 173*4882a593Smuzhiyun 174*4882a593SmuzhiyunInterface to Synthesizer Device 175*4882a593Smuzhiyun=============================== 176*4882a593Smuzhiyun 177*4882a593SmuzhiyunRegistration 178*4882a593Smuzhiyun------------ 179*4882a593Smuzhiyun 180*4882a593SmuzhiyunTo register an OSS synthesizer device, use snd_seq_oss_synth_register() 181*4882a593Smuzhiyunfunction: 182*4882a593Smuzhiyun:: 183*4882a593Smuzhiyun 184*4882a593Smuzhiyun int snd_seq_oss_synth_register(char *name, int type, int subtype, int nvoices, 185*4882a593Smuzhiyun snd_seq_oss_callback_t *oper, void *private_data) 186*4882a593Smuzhiyun 187*4882a593SmuzhiyunThe arguments ``name``, ``type``, ``subtype`` and ``nvoices`` 188*4882a593Smuzhiyunare used for making the appropriate synth_info structure for ioctl. The 189*4882a593Smuzhiyunreturn value is an index number of this device. This index must be remembered 190*4882a593Smuzhiyunfor unregister. If registration is failed, -errno will be returned. 191*4882a593Smuzhiyun 192*4882a593SmuzhiyunTo release this device, call snd_seq_oss_synth_unregister() function: 193*4882a593Smuzhiyun:: 194*4882a593Smuzhiyun 195*4882a593Smuzhiyun int snd_seq_oss_synth_unregister(int index) 196*4882a593Smuzhiyun 197*4882a593Smuzhiyunwhere the ``index`` is the index number returned by register function. 198*4882a593Smuzhiyun 199*4882a593SmuzhiyunCallbacks 200*4882a593Smuzhiyun--------- 201*4882a593Smuzhiyun 202*4882a593SmuzhiyunOSS synthesizer devices have capability for sample downloading and ioctls 203*4882a593Smuzhiyunlike sample reset. In OSS emulation, these special features are realized 204*4882a593Smuzhiyunby using callbacks. The registration argument oper is used to specify these 205*4882a593Smuzhiyuncallbacks. The following callback functions must be defined: 206*4882a593Smuzhiyun:: 207*4882a593Smuzhiyun 208*4882a593Smuzhiyun snd_seq_oss_callback_t: 209*4882a593Smuzhiyun int (*open)(snd_seq_oss_arg_t *p, void *closure); 210*4882a593Smuzhiyun int (*close)(snd_seq_oss_arg_t *p); 211*4882a593Smuzhiyun int (*ioctl)(snd_seq_oss_arg_t *p, unsigned int cmd, unsigned long arg); 212*4882a593Smuzhiyun int (*load_patch)(snd_seq_oss_arg_t *p, int format, const char *buf, int offs, int count); 213*4882a593Smuzhiyun int (*reset)(snd_seq_oss_arg_t *p); 214*4882a593Smuzhiyun 215*4882a593SmuzhiyunExcept for ``open`` and ``close`` callbacks, they are allowed to be NULL. 216*4882a593Smuzhiyun 217*4882a593SmuzhiyunEach callback function takes the argument type ``snd_seq_oss_arg_t`` as the 218*4882a593Smuzhiyunfirst argument. 219*4882a593Smuzhiyun:: 220*4882a593Smuzhiyun 221*4882a593Smuzhiyun struct snd_seq_oss_arg_t { 222*4882a593Smuzhiyun int app_index; 223*4882a593Smuzhiyun int file_mode; 224*4882a593Smuzhiyun int seq_mode; 225*4882a593Smuzhiyun snd_seq_addr_t addr; 226*4882a593Smuzhiyun void *private_data; 227*4882a593Smuzhiyun int event_passing; 228*4882a593Smuzhiyun }; 229*4882a593Smuzhiyun 230*4882a593SmuzhiyunThe first three fields, ``app_index``, ``file_mode`` and ``seq_mode`` 231*4882a593Smuzhiyunare initialized by OSS sequencer. The ``app_index`` is the application 232*4882a593Smuzhiyunindex which is unique to each application opening OSS sequencer. The 233*4882a593Smuzhiyun``file_mode`` is bit-flags indicating the file operation mode. See 234*4882a593Smuzhiyun``seq_oss.h`` for its meaning. The ``seq_mode`` is sequencer operation 235*4882a593Smuzhiyunmode. In the current version, only ``SND_OSSSEQ_MODE_SYNTH`` is used. 236*4882a593Smuzhiyun 237*4882a593SmuzhiyunThe next two fields, ``addr`` and ``private_data``, must be 238*4882a593Smuzhiyunfilled by the synth driver at open callback. The ``addr`` contains 239*4882a593Smuzhiyunthe address of ALSA sequencer port which is assigned to this device. If 240*4882a593Smuzhiyunthe driver allocates memory for ``private_data``, it must be released 241*4882a593Smuzhiyunin close callback by itself. 242*4882a593Smuzhiyun 243*4882a593SmuzhiyunThe last field, ``event_passing``, indicates how to translate note-on 244*4882a593Smuzhiyun/ off events. In ``PROCESS_EVENTS`` mode, the note 255 is regarded 245*4882a593Smuzhiyunas velocity change, and key pressure event is passed to the port. In 246*4882a593Smuzhiyun``PASS_EVENTS`` mode, all note on/off events are passed to the port 247*4882a593Smuzhiyunwithout modified. ``PROCESS_KEYPRESS`` mode checks the note above 128 248*4882a593Smuzhiyunand regards it as key pressure event (mainly for Emu8000 driver). 249*4882a593Smuzhiyun 250*4882a593SmuzhiyunOpen Callback 251*4882a593Smuzhiyun------------- 252*4882a593Smuzhiyun 253*4882a593SmuzhiyunThe ``open`` is called at each time this device is opened by an application 254*4882a593Smuzhiyunusing OSS sequencer. This must not be NULL. Typically, the open callback 255*4882a593Smuzhiyundoes the following procedure: 256*4882a593Smuzhiyun 257*4882a593Smuzhiyun#. Allocate private data record. 258*4882a593Smuzhiyun#. Create an ALSA sequencer port. 259*4882a593Smuzhiyun#. Set the new port address on ``arg->addr``. 260*4882a593Smuzhiyun#. Set the private data record pointer on ``arg->private_data``. 261*4882a593Smuzhiyun 262*4882a593SmuzhiyunNote that the type bit-flags in port_info of this synth port must NOT contain 263*4882a593Smuzhiyun``TYPE_MIDI_GENERIC`` 264*4882a593Smuzhiyunbit. Instead, ``TYPE_SPECIFIC`` should be used. Also, ``CAP_SUBSCRIPTION`` 265*4882a593Smuzhiyunbit should NOT be included, too. This is necessary to tell it from other 266*4882a593Smuzhiyunnormal MIDI devices. If the open procedure succeeded, return zero. Otherwise, 267*4882a593Smuzhiyunreturn -errno. 268*4882a593Smuzhiyun 269*4882a593SmuzhiyunIoctl Callback 270*4882a593Smuzhiyun-------------- 271*4882a593Smuzhiyun 272*4882a593SmuzhiyunThe ``ioctl`` callback is called when the sequencer receives device-specific 273*4882a593Smuzhiyunioctls. The following two ioctls should be processed by this callback: 274*4882a593Smuzhiyun 275*4882a593SmuzhiyunIOCTL_SEQ_RESET_SAMPLES 276*4882a593Smuzhiyun reset all samples on memory -- return 0 277*4882a593Smuzhiyun 278*4882a593SmuzhiyunIOCTL_SYNTH_MEMAVL 279*4882a593Smuzhiyun return the available memory size 280*4882a593Smuzhiyun 281*4882a593SmuzhiyunFM_4OP_ENABLE 282*4882a593Smuzhiyun can be ignored usually 283*4882a593Smuzhiyun 284*4882a593SmuzhiyunThe other ioctls are processed inside the sequencer without passing to 285*4882a593Smuzhiyunthe lowlevel driver. 286*4882a593Smuzhiyun 287*4882a593SmuzhiyunLoad_Patch Callback 288*4882a593Smuzhiyun------------------- 289*4882a593Smuzhiyun 290*4882a593SmuzhiyunThe ``load_patch`` callback is used for sample-downloading. This callback 291*4882a593Smuzhiyunmust read the data on user-space and transfer to each device. Return 0 292*4882a593Smuzhiyunif succeeded, and -errno if failed. The format argument is the patch key 293*4882a593Smuzhiyunin patch_info record. The buf is user-space pointer where patch_info record 294*4882a593Smuzhiyunis stored. The offs can be ignored. The count is total data size of this 295*4882a593Smuzhiyunsample data. 296*4882a593Smuzhiyun 297*4882a593SmuzhiyunClose Callback 298*4882a593Smuzhiyun-------------- 299*4882a593Smuzhiyun 300*4882a593SmuzhiyunThe ``close`` callback is called when this device is closed by the 301*4882a593Smuzhiyunapplication. If any private data was allocated in open callback, it must 302*4882a593Smuzhiyunbe released in the close callback. The deletion of ALSA port should be 303*4882a593Smuzhiyundone here, too. This callback must not be NULL. 304*4882a593Smuzhiyun 305*4882a593SmuzhiyunReset Callback 306*4882a593Smuzhiyun-------------- 307*4882a593Smuzhiyun 308*4882a593SmuzhiyunThe ``reset`` callback is called when sequencer device is reset or 309*4882a593Smuzhiyunclosed by applications. The callback should turn off the sounds on the 310*4882a593Smuzhiyunrelevant port immediately, and initialize the status of the port. If this 311*4882a593Smuzhiyuncallback is undefined, OSS seq sends a ``HEARTBEAT`` event to the 312*4882a593Smuzhiyunport. 313*4882a593Smuzhiyun 314*4882a593SmuzhiyunEvents 315*4882a593Smuzhiyun====== 316*4882a593Smuzhiyun 317*4882a593SmuzhiyunMost of the events are processed by sequencer and translated to the adequate 318*4882a593SmuzhiyunALSA sequencer events, so that each synth device can receive by input_event 319*4882a593Smuzhiyuncallback of ALSA sequencer port. The following ALSA events should be 320*4882a593Smuzhiyunimplemented by the driver: 321*4882a593Smuzhiyun 322*4882a593Smuzhiyun============= =================== 323*4882a593SmuzhiyunALSA event Original OSS events 324*4882a593Smuzhiyun============= =================== 325*4882a593SmuzhiyunNOTEON SEQ_NOTEON, MIDI_NOTEON 326*4882a593SmuzhiyunNOTE SEQ_NOTEOFF, MIDI_NOTEOFF 327*4882a593SmuzhiyunKEYPRESS MIDI_KEY_PRESSURE 328*4882a593SmuzhiyunCHANPRESS SEQ_AFTERTOUCH, MIDI_CHN_PRESSURE 329*4882a593SmuzhiyunPGMCHANGE SEQ_PGMCHANGE, MIDI_PGM_CHANGE 330*4882a593SmuzhiyunPITCHBEND SEQ_CONTROLLER(CTRL_PITCH_BENDER), 331*4882a593Smuzhiyun MIDI_PITCH_BEND 332*4882a593SmuzhiyunCONTROLLER MIDI_CTL_CHANGE, 333*4882a593Smuzhiyun SEQ_BALANCE (with CTL_PAN) 334*4882a593SmuzhiyunCONTROL14 SEQ_CONTROLLER 335*4882a593SmuzhiyunREGPARAM SEQ_CONTROLLER(CTRL_PITCH_BENDER_RANGE) 336*4882a593SmuzhiyunSYSEX SEQ_SYSEX 337*4882a593Smuzhiyun============= =================== 338*4882a593Smuzhiyun 339*4882a593SmuzhiyunThe most of these behavior can be realized by MIDI emulation driver 340*4882a593Smuzhiyunincluded in the Emu8000 lowlevel driver. In the future release, this module 341*4882a593Smuzhiyunwill be independent. 342*4882a593Smuzhiyun 343*4882a593SmuzhiyunSome OSS events (``SEQ_PRIVATE`` and ``SEQ_VOLUME`` events) are passed as event 344*4882a593Smuzhiyuntype SND_SEQ_OSS_PRIVATE. The OSS sequencer passes these event 8 byte 345*4882a593Smuzhiyunpackets without any modification. The lowlevel driver should process these 346*4882a593Smuzhiyunevents appropriately. 347*4882a593Smuzhiyun 348*4882a593SmuzhiyunInterface to MIDI Device 349*4882a593Smuzhiyun======================== 350*4882a593Smuzhiyun 351*4882a593SmuzhiyunSince the OSS emulation probes the creation and deletion of ALSA MIDI 352*4882a593Smuzhiyunsequencer ports automatically by receiving announcement from ALSA 353*4882a593Smuzhiyunsequencer, the MIDI devices don't need to be registered explicitly 354*4882a593Smuzhiyunlike synth devices. 355*4882a593SmuzhiyunHowever, the MIDI port_info registered to ALSA sequencer must include 356*4882a593Smuzhiyuna group name ``SND_SEQ_GROUP_DEVICE`` and a capability-bit 357*4882a593Smuzhiyun``CAP_READ`` or ``CAP_WRITE``. Also, subscription capabilities, 358*4882a593Smuzhiyun``CAP_SUBS_READ`` or ``CAP_SUBS_WRITE``, must be defined, too. If 359*4882a593Smuzhiyunthese conditions are not satisfied, the port is not registered as OSS 360*4882a593Smuzhiyunsequencer MIDI device. 361*4882a593Smuzhiyun 362*4882a593SmuzhiyunThe events via MIDI devices are parsed in OSS sequencer and converted 363*4882a593Smuzhiyunto the corresponding ALSA sequencer events. The input from MIDI sequencer 364*4882a593Smuzhiyunis also converted to MIDI byte events by OSS sequencer. This works just 365*4882a593Smuzhiyuna reverse way of seq_midi module. 366*4882a593Smuzhiyun 367*4882a593SmuzhiyunKnown Problems / TODO's 368*4882a593Smuzhiyun======================= 369*4882a593Smuzhiyun 370*4882a593Smuzhiyun* Patch loading via ALSA instrument layer is not implemented yet. 371*4882a593Smuzhiyun 372