1 #ifndef SOUNDCARD_H
2 #define SOUNDCARD_H
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 #define SOUND_VERSION 200
41
42 #include <sys/ioctl.h>
43
44
45
46
47
48 #define SNDCARD_ADLIB 1
49 #define SNDCARD_SB 2
50 #define SNDCARD_PAS 3
51 #define SNDCARD_GUS 4
52 #define SNDCARD_MPU401 5
53
54
55
56
57
58 #ifndef _IOWR
59
60
61
62
63
64
65
66
67
68 #define IOCPARM_MASK 0x7f
69 #define IOC_VOID 0x20000000
70 #define IOC_OUT 0x40000000
71 #define IOC_IN 0x80000000
72 #define IOC_INOUT (IOC_IN|IOC_OUT)
73
74 #define _IO(x,y) ((int)(IOC_VOID|(x<<8)|y))
75 #define _IOR(x,y,t) ((int)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
76 #define _IOW(x,y,t) ((int)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
77
78 #define _IOWR(x,y,t) ((int)(IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
79 #endif
80
81 #define SNDCTL_SEQ_RESET _IO ('Q', 0)
82 #define SNDCTL_SEQ_SYNC _IO ('Q', 1)
83 #define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info)
84 #define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int)
85 #define SNDCTL_SEQ_GETOUTCOUNT _IOR ('Q', 4, int)
86 #define SNDCTL_SEQ_GETINCOUNT _IOR ('Q', 5, int)
87 #define SNDCTL_SEQ_PERCMODE _IOW ('Q', 6, int)
88 #define SNDCTL_FM_LOAD_INSTR _IOW ('Q', 7, struct sbi_instrument)
89 #define SNDCTL_SEQ_TESTMIDI _IOW ('Q', 8, int)
90 #define SNDCTL_SEQ_RESETSAMPLES _IOW ('Q', 9, int)
91 #define SNDCTL_SEQ_NRSYNTHS _IOR ('Q',10, int)
92 #define SNDCTL_SEQ_NRMIDIS _IOR ('Q',11, int)
93 #define SNDCTL_MIDI_INFO _IOWR('Q',12, struct midi_info)
94 #define SNDCTL_SEQ_TRESHOLD _IOW ('Q',13, int)
95 #define SNDCTL_SYNTH_MEMAVL _IOWR('Q',14, int)
96 #define SNDCTL_FM_4OP_ENABLE _IOW ('Q',15, int)
97 #define SNDCTL_PMGR_ACCESS _IOWR('Q',16, struct patmgr_info)
98
99
100
101
102
103
104
105
106 struct patch_info {
107 short key;
108 #define GUS_PATCH 0x04fd
109 #define OBSOLETE_GUS_PATCH 0x02fd
110 short device_no;
111 short instr_no;
112
113 unsigned long mode;
114
115
116
117
118 #define WAVE_16_BITS 0x01
119 #define WAVE_UNSIGNED 0x02
120 #define WAVE_LOOPING 0x04
121 #define WAVE_BIDIR_LOOP 0x08
122 #define WAVE_LOOP_BACK 0x10
123 #define WAVE_SUSTAIN_ON 0x20
124 #define WAVE_ENVELOPES 0x40
125
126
127 #define WAVE_VIBRATO 0x00010000
128 #define WAVE_TREMOLO 0x00020000
129 #define WAVE_SCALE 0x00040000
130
131
132 long len;
133 long loop_start, loop_end;
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151 unsigned int base_freq;
152 unsigned long base_note;
153 unsigned long high_note;
154 unsigned long low_note;
155 int panning;
156 int detuning;
157
158
159
160
161 unsigned char env_rate[ 6 ];
162 unsigned char env_offset[ 6 ];
163
164
165
166
167
168
169
170 unsigned char tremolo_sweep;
171 unsigned char tremolo_rate;
172 unsigned char tremolo_depth;
173
174 unsigned char vibrato_sweep;
175 unsigned char vibrato_rate;
176 unsigned char vibrato_depth;
177
178 int scale_frequency;
179 unsigned int scale_factor;
180
181 int volume;
182 int spare[4];
183 char data[1];
184 };
185
186
187
188
189
190
191
192
193 #define PS_NO_PATCHES 0
194 #define PS_MGR_NOT_OK 1
195 #define PS_MGR_OK 2
196 #define PS_MANAGED 3
197
198 #define SNDCTL_PMGR_IFACE _IOWR('P', 1, struct patmgr_info)
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213 struct patmgr_info {
214 unsigned long key;
215
216 #define PM_K_EVENT 1
217 #define PM_K_COMMAND 2
218 #define PM_K_RESPONSE 3
219 #define PM_ERROR 4
220 int device;
221 int command;
222
223
224
225
226 #define PM_GET_DEVTYPE 1
227 #define PMTYPE_FM2 1
228 #define PMTYPE_FM4 2
229 #define PMTYPE_WAVE 3
230 #define PM_GET_NRPGM 2
231 #define PM_GET_PGMMAP 3
232 #define PM_GET_PGM_PATCHES 4
233 #define PM_GET_PATCH 5
234 #define PM_SET_PATCH 6
235 #define PM_READ_PATCH 7
236 #define PM_WRITE_PATCH 8
237
238
239
240
241
242 #define _PM_LOAD_PATCH 0x100
243
244
245
246
247
248 long parm1;
249 long parm2;
250 long parm3;
251
252 union {
253 unsigned char data8[4000];
254 unsigned short data16[2000];
255 unsigned long data32[1000];
256 struct patch_info patch;
257 } data;
258 };
259
260
261
262
263
264
265
266 #define PM_E_OPENED 1
267 #define PM_E_CLOSED 2
268 #define PM_E_PATCH_RESET 3
269 #define PM_E_PATCH_LOADED 4
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291 #define SEQ_NOTEOFF 0
292 #define SEQ_FMNOTEOFF SEQ_NOTEOFF
293 #define SEQ_NOTEON 1
294 #define SEQ_FMNOTEON SEQ_NOTEON
295 #define SEQ_WAIT 2
296 #define SEQ_PGMCHANGE 3
297 #define SEQ_FMPGMCHANGE SEQ_PGMCHANGE
298 #define SEQ_SYNCTIMER 4
299 #define SEQ_MIDIPUTC 5
300 #define SEQ_DRUMON 6
301 #define SEQ_DRUMOFF 7
302 #define SEQ_ECHO 8
303 #define SEQ_AFTERTOUCH 9
304 #define SEQ_CONTROLLER 10
305 #define CTRL_PITCH_BENDER 255
306 #define CTRL_PITCH_BENDER_RANGE 254
307 #define CTRL_EXPRESSION 253
308 #define CTRL_MAIN_VOLUME 252
309 #define SEQ_BALANCE 11
310
311
312
313
314
315
316
317
318
319
320 #define SEQ_FULLSIZE 0xfd
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341 #define SEQ_PRIVATE 0xfe
342 #define SEQ_EXTENDED 0xff
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367 typedef unsigned char sbi_instr_data[32];
368
369 struct sbi_instrument {
370 unsigned short key;
371 #define FM_PATCH 0x01fd
372 #define OPL3_PATCH 0x03fd
373 short device;
374 int channel;
375 sbi_instr_data operators;
376 };
377
378 struct synth_info {
379 char name[30];
380 int device;
381 int synth_type;
382 #define SYNTH_TYPE_FM 0
383 #define SYNTH_TYPE_SAMPLE 1
384
385 int synth_subtype;
386 #define FM_TYPE_ADLIB 0x00
387 #define FM_TYPE_OPL3 0x01
388
389 #define SAMPLE_TYPE_GUS 0x10
390
391 int perc_mode;
392 int nr_voices;
393 int nr_drums;
394 int instr_bank_size;
395 unsigned long capabilities;
396 #define SYNTH_CAP_PERCMODE 0x00000001
397 #define SYNTH_CAP_OPL3 0x00000002
398 int dummies[19];
399 };
400
401 struct midi_info {
402 char name[30];
403 int device;
404 unsigned long capabilities;
405 int dummies[19];
406 };
407
408
409
410
411
412 #define SNDCTL_DSP_RESET _IO ('P', 0)
413 #define SNDCTL_DSP_SYNC _IO ('P', 1)
414 #define SNDCTL_DSP_SPEED _IOWR('P', 2, int)
415 #define SNDCTL_DSP_STEREO _IOWR('P', 3, int)
416 #define SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int)
417 #define SNDCTL_DSP_SAMPLESIZE _IOWR('P', 5, int)
418 #define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int)
419 #define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int)
420 #define SNDCTL_DSP_POST _IO ('P', 8)
421
422 #define SOUND_PCM_READ_RATE _IOR ('P', 2, int)
423 #define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int)
424 #define SOUND_PCM_READ_BITS _IOR ('P', 5, int)
425 #define SOUND_PCM_READ_FILTER _IOR ('P', 7, int)
426
427
428 #define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SAMPLESIZE
429 #define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED
430 #define SOUND_PCM_POST SNDCTL_DSP_POST
431 #define SOUND_PCM_RESET SNDCTL_DSP_RESET
432 #define SOUND_PCM_SYNC SNDCTL_DSP_SYNC
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447 #define SOUND_MIXER_NRDEVICES 12
448 #define SOUND_MIXER_VOLUME 0
449 #define SOUND_MIXER_BASS 1
450 #define SOUND_MIXER_TREBLE 2
451 #define SOUND_MIXER_SYNTH 3
452 #define SOUND_MIXER_PCM 4
453 #define SOUND_MIXER_SPEAKER 5
454 #define SOUND_MIXER_LINE 6
455 #define SOUND_MIXER_MIC 7
456 #define SOUND_MIXER_CD 8
457 #define SOUND_MIXER_IMIX 9
458 #define SOUND_MIXER_ALTPCM 10
459 #define SOUND_MIXER_RECLEV 11
460
461
462
463 #define SOUND_ONOFF_MIN 28
464 #define SOUND_ONOFF_MAX 30
465 #define SOUND_MIXER_MUTE 28
466 #define SOUND_MIXER_ENHANCE 29
467 #define SOUND_MIXER_LOUD 30
468
469
470
471 #define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \
472 "Mic ", "CD ", "Mix ", "Pcm2 ", "rec"}
473
474 #define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
475 "mic", "cd", "mix", "pcm2", "rec"}
476
477
478
479 #define SOUND_MIXER_RECSRC 0xff
480 #define SOUND_MIXER_DEVMASK 0xfe
481 #define SOUND_MIXER_RECMASK 0xfd
482 #define SOUND_MIXER_CAPS 0xfc
483 #define SOUND_CAP_EXCL_INPUT 0x00000001
484 #define SOUND_MIXER_STEREODEVS 0xfb
485
486
487
488 #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
489 #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
490 #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
491 #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
492 #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
493 #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
494 #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
495 #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
496 #define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
497 #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
498 #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
499 #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
500
501 #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
502 #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
503 #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
504
505 #define MIXER_READ(dev) _IOR('M', dev, int)
506 #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
507 #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
508 #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
509 #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
510 #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
511 #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
512 #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
513 #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
514 #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
515 #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
516 #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
517 #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
518 #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)
519 #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)
520 #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)
521
522 #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
523 #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
524 #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
525 #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
526 #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
527
528 #define MIXER_WRITE(dev) _IOWR('M', dev, int)
529 #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
530 #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
531 #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
532 #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
533 #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
534 #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
535 #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
536 #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
537 #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
538 #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
539 #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
540 #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
541 #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)
542 #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)
543 #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)
544
545 #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
546
547
548
549
550
551
552
553
554
555 typedef unsigned char S_BYTE;
556 typedef unsigned char S_FLAG;
557 struct stereo_vol
558 {
559 S_BYTE l;
560 S_BYTE r;
561 };
562
563 #define MIXER_IOCTL_SET_LEVELS _IOW ('s', 20, struct sb_mixer_levels)
564 #define MIXER_IOCTL_SET_PARAMS _IOW ('s', 21, struct sb_mixer_params)
565 #define MIXER_IOCTL_READ_LEVELS _IOR ('s', 22, struct sb_mixer_levels)
566 #define MIXER_IOCTL_READ_PARAMS _IOR ('s', 23, struct sb_mixer_params)
567 #define MIXER_IOCTL_RESET _IO ('s', 24)
568
569
570
571
572 struct sb_mixer_levels
573 {
574 struct stereo_vol master;
575 struct stereo_vol voc;
576 struct stereo_vol fm;
577 struct stereo_vol line;
578 struct stereo_vol cd;
579 S_BYTE mic;
580 };
581
582
583
584
585 struct sb_mixer_params
586 {
587 S_BYTE record_source;
588 S_FLAG hifreq_filter;
589 S_FLAG filter_input;
590 S_FLAG filter_output;
591 S_FLAG dsp_stereo;
592 };
593
594 #define SRC_MIC 1
595 #define SRC_CD 3
596 #define SRC_LINE 7
597
598 #if !defined(KERNEL) && !defined(INKERNEL)
599
600
601
602
603
604
605
606 void seqbuf_dump(void);
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627 #define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len, _seqbufptr = 0
628 #define SEQ_PM_DEFINES struct patmgr_info _pm_info
629 #define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
630 #define _SEQ_ADVBUF(len) _seqbufptr += len
631 #define SEQ_DUMPBUF seqbuf_dump
632 #define PM_LOAD_PATCH(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \
633 _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \
634 _pm_info.parm1 = bank, _pm_info.parm2 = 1, \
635 ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))
636 #define PM_LOAD_PATCHES(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \
637 _pm_info.device=dev, memcpy(_pm_info.data.data8, pgm, 128), \
638 _pm_info.parm1 = bank, _pm_info.parm2 = 128, \
639 ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))
640
641 #define SEQ_START_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\
642 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
643 _seqbuf[_seqbufptr+1] = SEQ_NOTEON;\
644 _seqbuf[_seqbufptr+2] = (dev);\
645 _seqbuf[_seqbufptr+3] = (voice);\
646 _seqbuf[_seqbufptr+4] = (note);\
647 _seqbuf[_seqbufptr+5] = (vol);\
648 _seqbuf[_seqbufptr+6] = 0;\
649 _seqbuf[_seqbufptr+7] = 0;\
650 _SEQ_ADVBUF(8);}
651
652 #define SEQ_STOP_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\
653 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
654 _seqbuf[_seqbufptr+1] = SEQ_NOTEOFF;\
655 _seqbuf[_seqbufptr+2] = (dev);\
656 _seqbuf[_seqbufptr+3] = (voice);\
657 _seqbuf[_seqbufptr+4] = (note);\
658 _seqbuf[_seqbufptr+5] = (vol);\
659 _seqbuf[_seqbufptr+6] = 0;\
660 _seqbuf[_seqbufptr+7] = 0;\
661 _SEQ_ADVBUF(8);}
662
663 #define SEQ_CHN_PRESSURE(dev, voice, pressure) {_SEQ_NEEDBUF(8);\
664 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
665 _seqbuf[_seqbufptr+1] = SEQ_AFTERTOUCH;\
666 _seqbuf[_seqbufptr+2] = (dev);\
667 _seqbuf[_seqbufptr+3] = (voice);\
668 _seqbuf[_seqbufptr+4] = (pressure);\
669 _seqbuf[_seqbufptr+5] = 0;\
670 _seqbuf[_seqbufptr+6] = 0;\
671 _seqbuf[_seqbufptr+7] = 0;\
672 _SEQ_ADVBUF(8);}
673
674 #define SEQ_PANNING(dev, voice, pos) {_SEQ_NEEDBUF(8);\
675 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
676 _seqbuf[_seqbufptr+1] = SEQ_BALANCE;\
677 _seqbuf[_seqbufptr+2] = (dev);\
678 _seqbuf[_seqbufptr+3] = (voice);\
679 (char)_seqbuf[_seqbufptr+4] = (pos);\
680 _seqbuf[_seqbufptr+5] = 0;\
681 _seqbuf[_seqbufptr+6] = 0;\
682 _seqbuf[_seqbufptr+7] = 0;\
683 _SEQ_ADVBUF(8);}
684
685 #define SEQ_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\
686 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
687 _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
688 _seqbuf[_seqbufptr+2] = (dev);\
689 _seqbuf[_seqbufptr+3] = (voice);\
690 _seqbuf[_seqbufptr+4] = (controller);\
691 *(short *)&_seqbuf[_seqbufptr+5] = (value);\
692 _seqbuf[_seqbufptr+7] = 0;\
693 _SEQ_ADVBUF(8);}
694
695 #define SEQ_PITCHBEND(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
696 #define SEQ_BENDER_RANGE(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
697 #define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_EXPRESSION, value)
698 #define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_MAIN_VOLUME, value)
699
700 #define SEQ_START_TIMER() {_SEQ_NEEDBUF(4);\
701 _seqbuf[_seqbufptr] = SEQ_SYNCTIMER;\
702 _seqbuf[_seqbufptr+1] = 0;\
703 _seqbuf[_seqbufptr+2] = 0;\
704 _seqbuf[_seqbufptr+3] = 0;\
705 _SEQ_ADVBUF(4);}
706 #define SEQ_SET_PATCH(dev, voice, patch) {_SEQ_NEEDBUF(8);\
707 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
708 _seqbuf[_seqbufptr+1] = SEQ_PGMCHANGE;\
709 _seqbuf[_seqbufptr+2] = (dev);\
710 _seqbuf[_seqbufptr+3] = (voice);\
711 _seqbuf[_seqbufptr+4] = (patch);\
712 _seqbuf[_seqbufptr+5] = 0;\
713 _seqbuf[_seqbufptr+6] = 0;\
714 _seqbuf[_seqbufptr+7] = 0;\
715 _SEQ_ADVBUF(8);}
716
717 #define SEQ_WAIT_TIME(ticks) {_SEQ_NEEDBUF(4);\
718 *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_WAIT | ((ticks) << 8);\
719 _SEQ_ADVBUF(4);}
720
721 #define SEQ_ECHO_BACK(key) {_SEQ_NEEDBUF(4);\
722 *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_ECHO | ((key) << 8);\
723 _SEQ_ADVBUF(4);}
724
725 #define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\
726 _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\
727 _seqbuf[_seqbufptr+1] = (byte);\
728 _seqbuf[_seqbufptr+2] = (device);\
729 _seqbuf[_seqbufptr+3] = 0;\
730 _SEQ_ADVBUF(4);}
731 #define SEQ_WRPATCH(patch, len) {if (_seqbufptr) seqbuf_dump();\
732 if (write(seqfd, (char*)(patch), len)==-1) \
733 perror("Write patch: /dev/sequencer");}
734
735 #endif
736 long soundcard_init(long mem_start);
737 #endif
738 #ifndef SOUNDCARD_H
739 #define SOUNDCARD_H
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777 #define SOUND_VERSION 200
778
779 #include <sys/ioctl.h>
780
781
782
783
784
785 #define SNDCARD_ADLIB 1
786 #define SNDCARD_SB 2
787 #define SNDCARD_PAS 3
788 #define SNDCARD_GUS 4
789 #define SNDCARD_MPU401 5
790
791
792
793
794
795 #ifndef _IOWR
796
797
798
799
800
801
802
803
804
805 #define IOCPARM_MASK 0x7f
806 #define IOC_VOID 0x20000000
807 #define IOC_OUT 0x40000000
808 #define IOC_IN 0x80000000
809 #define IOC_INOUT (IOC_IN|IOC_OUT)
810
811 #define _IO(x,y) ((int)(IOC_VOID|(x<<8)|y))
812 #define _IOR(x,y,t) ((int)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
813 #define _IOW(x,y,t) ((int)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
814
815 #define _IOWR(x,y,t) ((int)(IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
816 #endif
817
818 #define SNDCTL_SEQ_RESET _IO ('Q', 0)
819 #define SNDCTL_SEQ_SYNC _IO ('Q', 1)
820 #define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info)
821 #define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int)
822 #define SNDCTL_SEQ_GETOUTCOUNT _IOR ('Q', 4, int)
823 #define SNDCTL_SEQ_GETINCOUNT _IOR ('Q', 5, int)
824 #define SNDCTL_SEQ_PERCMODE _IOW ('Q', 6, int)
825 #define SNDCTL_FM_LOAD_INSTR _IOW ('Q', 7, struct sbi_instrument)
826 #define SNDCTL_SEQ_TESTMIDI _IOW ('Q', 8, int)
827 #define SNDCTL_SEQ_RESETSAMPLES _IOW ('Q', 9, int)
828 #define SNDCTL_SEQ_NRSYNTHS _IOR ('Q',10, int)
829 #define SNDCTL_SEQ_NRMIDIS _IOR ('Q',11, int)
830 #define SNDCTL_MIDI_INFO _IOWR('Q',12, struct midi_info)
831 #define SNDCTL_SEQ_TRESHOLD _IOW ('Q',13, int)
832 #define SNDCTL_SYNTH_MEMAVL _IOWR('Q',14, int)
833 #define SNDCTL_FM_4OP_ENABLE _IOW ('Q',15, int)
834 #define SNDCTL_PMGR_ACCESS _IOWR('Q',16, struct patmgr_info)
835
836
837
838
839
840
841
842
843 struct patch_info {
844 short key;
845 #define GUS_PATCH 0x04fd
846 #define OBSOLETE_GUS_PATCH 0x02fd
847 short device_no;
848 short instr_no;
849
850 unsigned long mode;
851
852
853
854
855 #define WAVE_16_BITS 0x01
856 #define WAVE_UNSIGNED 0x02
857 #define WAVE_LOOPING 0x04
858 #define WAVE_BIDIR_LOOP 0x08
859 #define WAVE_LOOP_BACK 0x10
860 #define WAVE_SUSTAIN_ON 0x20
861 #define WAVE_ENVELOPES 0x40
862
863
864 #define WAVE_VIBRATO 0x00010000
865 #define WAVE_TREMOLO 0x00020000
866 #define WAVE_SCALE 0x00040000
867
868
869 long len;
870 long loop_start, loop_end;
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888 unsigned int base_freq;
889 unsigned long base_note;
890 unsigned long high_note;
891 unsigned long low_note;
892 int panning;
893 int detuning;
894
895
896
897
898 unsigned char env_rate[ 6 ];
899 unsigned char env_offset[ 6 ];
900
901
902
903
904
905
906
907 unsigned char tremolo_sweep;
908 unsigned char tremolo_rate;
909 unsigned char tremolo_depth;
910
911 unsigned char vibrato_sweep;
912 unsigned char vibrato_rate;
913 unsigned char vibrato_depth;
914
915 int scale_frequency;
916 unsigned int scale_factor;
917
918 int volume;
919 int spare[4];
920 char data[0];
921 };
922
923
924
925
926
927
928
929
930 #define PS_NO_PATCHES 0
931 #define PS_MGR_NOT_OK 1
932 #define PS_MGR_OK 2
933 #define PS_MANAGED 3
934
935 #define SNDCTL_PMGR_IFACE _IOWR('P', 1, struct patmgr_info)
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950 struct patmgr_info {
951 unsigned long key;
952
953 #define PM_K_EVENT 1
954 #define PM_K_COMMAND 2
955 #define PM_K_RESPONSE 3
956 #define PM_ERROR 4
957 int device;
958 int command;
959
960
961
962
963 #define PM_GET_DEVTYPE 1
964 #define PMTYPE_FM2 1
965 #define PMTYPE_FM4 2
966 #define PMTYPE_WAVE 3
967 #define PM_GET_NRPGM 2
968 #define PM_GET_PGMMAP 3
969 #define PM_GET_PGM_PATCHES 4
970 #define PM_GET_PATCH 5
971 #define PM_SET_PATCH 6
972 #define PM_READ_PATCH 7
973 #define PM_WRITE_PATCH 8
974
975
976
977
978
979 #define _PM_LOAD_PATCH 0x100
980
981
982
983
984
985 long parm1;
986 long parm2;
987 long parm3;
988
989 union {
990 unsigned char data8[4000];
991 unsigned short data16[2000];
992 unsigned long data32[1000];
993 struct patch_info patch;
994 } data;
995 };
996
997
998
999
1000
1001
1002
1003 #define PM_E_OPENED 1
1004 #define PM_E_CLOSED 2
1005 #define PM_E_PATCH_RESET 3
1006 #define PM_E_PATCH_LOADED 4
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028 #define SEQ_NOTEOFF 0
1029 #define SEQ_FMNOTEOFF SEQ_NOTEOFF
1030 #define SEQ_NOTEON 1
1031 #define SEQ_FMNOTEON SEQ_NOTEON
1032 #define SEQ_WAIT 2
1033 #define SEQ_PGMCHANGE 3
1034 #define SEQ_FMPGMCHANGE SEQ_PGMCHANGE
1035 #define SEQ_SYNCTIMER 4
1036 #define SEQ_MIDIPUTC 5
1037 #define SEQ_DRUMON 6
1038 #define SEQ_DRUMOFF 7
1039 #define SEQ_ECHO 8
1040 #define SEQ_AFTERTOUCH 9
1041 #define SEQ_CONTROLLER 10
1042 #define CTRL_PITCH_BENDER 255
1043 #define CTRL_PITCH_BENDER_RANGE 254
1044 #define CTRL_EXPRESSION 253
1045 #define CTRL_MAIN_VOLUME 252
1046 #define SEQ_BALANCE 11
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057 #define SEQ_FULLSIZE 0xfd
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078 #define SEQ_PRIVATE 0xfe
1079 #define SEQ_EXTENDED 0xff
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104 typedef unsigned char sbi_instr_data[32];
1105
1106 struct sbi_instrument {
1107 unsigned short key;
1108 #define FM_PATCH 0x01fd
1109 #define OPL3_PATCH 0x03fd
1110 short device;
1111 int channel;
1112 sbi_instr_data operators;
1113 };
1114
1115 struct synth_info {
1116 char name[30];
1117 int device;
1118 int synth_type;
1119 #define SYNTH_TYPE_FM 0
1120 #define SYNTH_TYPE_SAMPLE 1
1121
1122 int synth_subtype;
1123 #define FM_TYPE_ADLIB 0x00
1124 #define FM_TYPE_OPL3 0x01
1125
1126 #define SAMPLE_TYPE_GUS 0x10
1127
1128 int perc_mode;
1129 int nr_voices;
1130 int nr_drums;
1131 int instr_bank_size;
1132 unsigned long capabilities;
1133 #define SYNTH_CAP_PERCMODE 0x00000001
1134 #define SYNTH_CAP_OPL3 0x00000002
1135 int dummies[19];
1136 };
1137
1138 struct midi_info {
1139 char name[30];
1140 int device;
1141 unsigned long capabilities;
1142 int dummies[19];
1143 };
1144
1145
1146
1147
1148
1149 #define SNDCTL_DSP_RESET _IO ('P', 0)
1150 #define SNDCTL_DSP_SYNC _IO ('P', 1)
1151 #define SNDCTL_DSP_SPEED _IOWR('P', 2, int)
1152 #define SNDCTL_DSP_STEREO _IOWR('P', 3, int)
1153 #define SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int)
1154 #define SNDCTL_DSP_SAMPLESIZE _IOWR('P', 5, int)
1155 #define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int)
1156 #define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int)
1157 #define SNDCTL_DSP_POST _IO ('P', 8)
1158
1159 #define SOUND_PCM_READ_RATE _IOR ('P', 2, int)
1160 #define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int)
1161 #define SOUND_PCM_READ_BITS _IOR ('P', 5, int)
1162 #define SOUND_PCM_READ_FILTER _IOR ('P', 7, int)
1163
1164
1165 #define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SAMPLESIZE
1166 #define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED
1167 #define SOUND_PCM_POST SNDCTL_DSP_POST
1168 #define SOUND_PCM_RESET SNDCTL_DSP_RESET
1169 #define SOUND_PCM_SYNC SNDCTL_DSP_SYNC
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184 #define SOUND_MIXER_NRDEVICES 12
1185 #define SOUND_MIXER_VOLUME 0
1186 #define SOUND_MIXER_BASS 1
1187 #define SOUND_MIXER_TREBLE 2
1188 #define SOUND_MIXER_SYNTH 3
1189 #define SOUND_MIXER_PCM 4
1190 #define SOUND_MIXER_SPEAKER 5
1191 #define SOUND_MIXER_LINE 6
1192 #define SOUND_MIXER_MIC 7
1193 #define SOUND_MIXER_CD 8
1194 #define SOUND_MIXER_IMIX 9
1195 #define SOUND_MIXER_ALTPCM 10
1196 #define SOUND_MIXER_RECLEV 11
1197
1198
1199
1200 #define SOUND_ONOFF_MIN 28
1201 #define SOUND_ONOFF_MAX 30
1202 #define SOUND_MIXER_MUTE 28
1203 #define SOUND_MIXER_ENHANCE 29
1204 #define SOUND_MIXER_LOUD 30
1205
1206
1207
1208 #define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \
1209 "Mic ", "CD ", "Mix ", "Pcm2 ", "rec"}
1210
1211 #define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
1212 "mic", "cd", "mix", "pcm2", "rec"}
1213
1214
1215
1216 #define SOUND_MIXER_RECSRC 0xff
1217 #define SOUND_MIXER_DEVMASK 0xfe
1218 #define SOUND_MIXER_RECMASK 0xfd
1219 #define SOUND_MIXER_CAPS 0xfc
1220 #define SOUND_CAP_EXCL_INPUT 0x00000001
1221 #define SOUND_MIXER_STEREODEVS 0xfb
1222
1223
1224
1225 #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
1226 #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
1227 #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
1228 #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
1229 #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
1230 #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
1231 #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
1232 #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
1233 #define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
1234 #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
1235 #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
1236 #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
1237
1238 #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
1239 #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
1240 #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
1241
1242 #define MIXER_READ(dev) _IOR('M', dev, int)
1243 #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
1244 #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
1245 #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
1246 #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
1247 #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
1248 #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
1249 #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
1250 #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
1251 #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
1252 #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
1253 #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
1254 #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
1255 #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)
1256 #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)
1257 #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)
1258
1259 #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
1260 #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
1261 #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
1262 #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
1263 #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
1264
1265 #define MIXER_WRITE(dev) _IOWR('M', dev, int)
1266 #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
1267 #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
1268 #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
1269 #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
1270 #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
1271 #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
1272 #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
1273 #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
1274 #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
1275 #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
1276 #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
1277 #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
1278 #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)
1279 #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)
1280 #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)
1281
1282 #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
1283
1284
1285
1286
1287
1288
1289
1290
1291
1292 typedef unsigned char S_BYTE;
1293 typedef unsigned char S_FLAG;
1294 struct stereo_vol
1295 {
1296 S_BYTE l;
1297 S_BYTE r;
1298 };
1299
1300 #define MIXER_IOCTL_SET_LEVELS _IOW ('s', 20, struct sb_mixer_levels)
1301 #define MIXER_IOCTL_SET_PARAMS _IOW ('s', 21, struct sb_mixer_params)
1302 #define MIXER_IOCTL_READ_LEVELS _IOR ('s', 22, struct sb_mixer_levels)
1303 #define MIXER_IOCTL_READ_PARAMS _IOR ('s', 23, struct sb_mixer_params)
1304 #define MIXER_IOCTL_RESET _IO ('s', 24)
1305
1306
1307
1308
1309 struct sb_mixer_levels
1310 {
1311 struct stereo_vol master;
1312 struct stereo_vol voc;
1313 struct stereo_vol fm;
1314 struct stereo_vol line;
1315 struct stereo_vol cd;
1316 S_BYTE mic;
1317 };
1318
1319
1320
1321
1322 struct sb_mixer_params
1323 {
1324 S_BYTE record_source;
1325 S_FLAG hifreq_filter;
1326 S_FLAG filter_input;
1327 S_FLAG filter_output;
1328 S_FLAG dsp_stereo;
1329 };
1330
1331 #define SRC_MIC 1
1332 #define SRC_CD 3
1333 #define SRC_LINE 7
1334
1335 #if !defined(KERNEL) && !defined(INKERNEL)
1336
1337
1338
1339
1340
1341
1342
1343 void seqbuf_dump(void);
1344
1345
1346
1347
1348
1349
1350
1351
1352
1353
1354
1355
1356
1357
1358
1359
1360
1361
1362
1363
1364 #define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len, _seqbufptr = 0
1365 #define SEQ_PM_DEFINES struct patmgr_info _pm_info
1366 #define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
1367 #define _SEQ_ADVBUF(len) _seqbufptr += len
1368 #define SEQ_DUMPBUF seqbuf_dump
1369 #define PM_LOAD_PATCH(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \
1370 _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \
1371 _pm_info.parm1 = bank, _pm_info.parm2 = 1, \
1372 ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))
1373 #define PM_LOAD_PATCHES(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \
1374 _pm_info.device=dev, memcpy(_pm_info.data.data8, pgm, 128), \
1375 _pm_info.parm1 = bank, _pm_info.parm2 = 128, \
1376 ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))
1377
1378 #define SEQ_START_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\
1379 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
1380 _seqbuf[_seqbufptr+1] = SEQ_NOTEON;\
1381 _seqbuf[_seqbufptr+2] = (dev);\
1382 _seqbuf[_seqbufptr+3] = (voice);\
1383 _seqbuf[_seqbufptr+4] = (note);\
1384 _seqbuf[_seqbufptr+5] = (vol);\
1385 _seqbuf[_seqbufptr+6] = 0;\
1386 _seqbuf[_seqbufptr+7] = 0;\
1387 _SEQ_ADVBUF(8);}
1388
1389 #define SEQ_STOP_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\
1390 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
1391 _seqbuf[_seqbufptr+1] = SEQ_NOTEOFF;\
1392 _seqbuf[_seqbufptr+2] = (dev);\
1393 _seqbuf[_seqbufptr+3] = (voice);\
1394 _seqbuf[_seqbufptr+4] = (note);\
1395 _seqbuf[_seqbufptr+5] = (vol);\
1396 _seqbuf[_seqbufptr+6] = 0;\
1397 _seqbuf[_seqbufptr+7] = 0;\
1398 _SEQ_ADVBUF(8);}
1399
1400 #define SEQ_CHN_PRESSURE(dev, voice, pressure) {_SEQ_NEEDBUF(8);\
1401 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
1402 _seqbuf[_seqbufptr+1] = SEQ_AFTERTOUCH;\
1403 _seqbuf[_seqbufptr+2] = (dev);\
1404 _seqbuf[_seqbufptr+3] = (voice);\
1405 _seqbuf[_seqbufptr+4] = (pressure);\
1406 _seqbuf[_seqbufptr+5] = 0;\
1407 _seqbuf[_seqbufptr+6] = 0;\
1408 _seqbuf[_seqbufptr+7] = 0;\
1409 _SEQ_ADVBUF(8);}
1410
1411 #define SEQ_PANNING(dev, voice, pos) {_SEQ_NEEDBUF(8);\
1412 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
1413 _seqbuf[_seqbufptr+1] = SEQ_BALANCE;\
1414 _seqbuf[_seqbufptr+2] = (dev);\
1415 _seqbuf[_seqbufptr+3] = (voice);\
1416 (char)_seqbuf[_seqbufptr+4] = (pos);\
1417 _seqbuf[_seqbufptr+5] = 0;\
1418 _seqbuf[_seqbufptr+6] = 0;\
1419 _seqbuf[_seqbufptr+7] = 0;\
1420 _SEQ_ADVBUF(8);}
1421
1422 #define SEQ_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\
1423 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
1424 _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
1425 _seqbuf[_seqbufptr+2] = (dev);\
1426 _seqbuf[_seqbufptr+3] = (voice);\
1427 _seqbuf[_seqbufptr+4] = (controller);\
1428 *(short *)&_seqbuf[_seqbufptr+5] = (value);\
1429 _seqbuf[_seqbufptr+7] = 0;\
1430 _SEQ_ADVBUF(8);}
1431
1432 #define SEQ_PITCHBEND(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
1433 #define SEQ_BENDER_RANGE(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
1434 #define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_EXPRESSION, value)
1435 #define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_MAIN_VOLUME, value)
1436
1437 #define SEQ_START_TIMER() {_SEQ_NEEDBUF(4);\
1438 _seqbuf[_seqbufptr] = SEQ_SYNCTIMER;\
1439 _seqbuf[_seqbufptr+1] = 0;\
1440 _seqbuf[_seqbufptr+2] = 0;\
1441 _seqbuf[_seqbufptr+3] = 0;\
1442 _SEQ_ADVBUF(4);}
1443 #define SEQ_SET_PATCH(dev, voice, patch) {_SEQ_NEEDBUF(8);\
1444 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
1445 _seqbuf[_seqbufptr+1] = SEQ_PGMCHANGE;\
1446 _seqbuf[_seqbufptr+2] = (dev);\
1447 _seqbuf[_seqbufptr+3] = (voice);\
1448 _seqbuf[_seqbufptr+4] = (patch);\
1449 _seqbuf[_seqbufptr+5] = 0;\
1450 _seqbuf[_seqbufptr+6] = 0;\
1451 _seqbuf[_seqbufptr+7] = 0;\
1452 _SEQ_ADVBUF(8);}
1453
1454 #define SEQ_WAIT_TIME(ticks) {_SEQ_NEEDBUF(4);\
1455 *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_WAIT | ((ticks) << 8);\
1456 _SEQ_ADVBUF(4);}
1457
1458 #define SEQ_ECHO_BACK(key) {_SEQ_NEEDBUF(4);\
1459 *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_ECHO | ((key) << 8);\
1460 _SEQ_ADVBUF(4);}
1461
1462 #define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\
1463 _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\
1464 _seqbuf[_seqbufptr+1] = (byte);\
1465 _seqbuf[_seqbufptr+2] = (device);\
1466 _seqbuf[_seqbufptr+3] = 0;\
1467 _SEQ_ADVBUF(4);}
1468 #define SEQ_WRPATCH(patch, len) {if (_seqbufptr) seqbuf_dump();\
1469 if (write(seqfd, (char*)(patch), len)==-1) \
1470 perror("Write patch: /dev/sequencer");}
1471
1472 #endif
1473 long soundcard_init(long mem_start);
1474 #endif