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 #define SNDCARD_SB16 6
54
55
56
57
58
59 #ifndef _IOWR
60
61
62
63
64
65
66
67
68
69 #define IOCPARM_MASK 0x7f
70 #define IOC_VOID 0x20000000
71 #define IOC_OUT 0x40000000
72 #define IOC_IN 0x80000000
73 #define IOC_INOUT (IOC_IN|IOC_OUT)
74
75 #define _IO(x,y) ((int)(IOC_VOID|(x<<8)|y))
76 #define _IOR(x,y,t) ((int)(IOC_OUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
77 #define _IOW(x,y,t) ((int)(IOC_IN|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
78
79 #define _IOWR(x,y,t) ((int)(IOC_INOUT|((sizeof(t)&IOCPARM_MASK)<<16)|(x<<8)|y))
80 #endif
81
82 #define SNDCTL_SEQ_RESET _IO ('Q', 0)
83 #define SNDCTL_SEQ_SYNC _IO ('Q', 1)
84 #define SNDCTL_SYNTH_INFO _IOWR('Q', 2, struct synth_info)
85 #define SNDCTL_SEQ_CTRLRATE _IOWR('Q', 3, int)
86 #define SNDCTL_SEQ_GETOUTCOUNT _IOR ('Q', 4, int)
87 #define SNDCTL_SEQ_GETINCOUNT _IOR ('Q', 5, int)
88 #define SNDCTL_SEQ_PERCMODE _IOW ('Q', 6, int)
89 #define SNDCTL_FM_LOAD_INSTR _IOW ('Q', 7, struct sbi_instrument)
90 #define SNDCTL_SEQ_TESTMIDI _IOW ('Q', 8, int)
91 #define SNDCTL_SEQ_RESETSAMPLES _IOW ('Q', 9, int)
92 #define SNDCTL_SEQ_NRSYNTHS _IOR ('Q',10, int)
93 #define SNDCTL_SEQ_NRMIDIS _IOR ('Q',11, int)
94 #define SNDCTL_MIDI_INFO _IOWR('Q',12, struct midi_info)
95 #define SNDCTL_SEQ_TRESHOLD _IOW ('Q',13, int)
96 #define SNDCTL_SYNTH_MEMAVL _IOWR('Q',14, int)
97 #define SNDCTL_FM_4OP_ENABLE _IOW ('Q',15, int)
98 #define SNDCTL_PMGR_ACCESS _IOWR('Q',16, struct patmgr_info)
99
100
101
102
103
104
105
106
107 struct patch_info {
108 short key;
109 #define GUS_PATCH 0x04fd
110 #define OBSOLETE_GUS_PATCH 0x02fd
111 short device_no;
112 short instr_no;
113
114 unsigned long mode;
115
116
117
118
119 #define WAVE_16_BITS 0x01
120 #define WAVE_UNSIGNED 0x02
121 #define WAVE_LOOPING 0x04
122 #define WAVE_BIDIR_LOOP 0x08
123 #define WAVE_LOOP_BACK 0x10
124 #define WAVE_SUSTAIN_ON 0x20
125 #define WAVE_ENVELOPES 0x40
126
127
128 #define WAVE_VIBRATO 0x00010000
129 #define WAVE_TREMOLO 0x00020000
130 #define WAVE_SCALE 0x00040000
131
132
133 long len;
134 long loop_start, loop_end;
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152 unsigned int base_freq;
153 unsigned long base_note;
154 unsigned long high_note;
155 unsigned long low_note;
156 int panning;
157 int detuning;
158
159
160
161
162 unsigned char env_rate[ 6 ];
163 unsigned char env_offset[ 6 ];
164
165
166
167
168
169
170
171 unsigned char tremolo_sweep;
172 unsigned char tremolo_rate;
173 unsigned char tremolo_depth;
174
175 unsigned char vibrato_sweep;
176 unsigned char vibrato_rate;
177 unsigned char vibrato_depth;
178
179 int scale_frequency;
180 unsigned int scale_factor;
181
182 int volume;
183 int spare[4];
184 char data[1];
185 };
186
187
188
189
190
191
192
193
194 #define PS_NO_PATCHES 0
195 #define PS_MGR_NOT_OK 1
196 #define PS_MGR_OK 2
197 #define PS_MANAGED 3
198
199 #define SNDCTL_PMGR_IFACE _IOWR('P', 1, struct patmgr_info)
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214 struct patmgr_info {
215 unsigned long key;
216
217 #define PM_K_EVENT 1
218 #define PM_K_COMMAND 2
219 #define PM_K_RESPONSE 3
220 #define PM_ERROR 4
221 int device;
222 int command;
223
224
225
226
227 #define PM_GET_DEVTYPE 1
228 #define PMTYPE_FM2 1
229 #define PMTYPE_FM4 2
230 #define PMTYPE_WAVE 3
231 #define PM_GET_NRPGM 2
232 #define PM_GET_PGMMAP 3
233 #define PM_GET_PGM_PATCHES 4
234 #define PM_GET_PATCH 5
235 #define PM_SET_PATCH 6
236 #define PM_READ_PATCH 7
237 #define PM_WRITE_PATCH 8
238
239
240
241
242
243 #define _PM_LOAD_PATCH 0x100
244
245
246
247
248
249 long parm1;
250 long parm2;
251 long parm3;
252
253 union {
254 unsigned char data8[4000];
255 unsigned short data16[2000];
256 unsigned long data32[1000];
257 struct patch_info patch;
258 } data;
259 };
260
261
262
263
264
265
266
267 #define PM_E_OPENED 1
268 #define PM_E_CLOSED 2
269 #define PM_E_PATCH_RESET 3
270 #define PM_E_PATCH_LOADED 4
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292 #define SEQ_NOTEOFF 0
293 #define SEQ_FMNOTEOFF SEQ_NOTEOFF
294 #define SEQ_NOTEON 1
295 #define SEQ_FMNOTEON SEQ_NOTEON
296 #define SEQ_WAIT 2
297 #define SEQ_PGMCHANGE 3
298 #define SEQ_FMPGMCHANGE SEQ_PGMCHANGE
299 #define SEQ_SYNCTIMER 4
300 #define SEQ_MIDIPUTC 5
301 #define SEQ_DRUMON 6
302 #define SEQ_DRUMOFF 7
303 #define SEQ_ECHO 8
304 #define SEQ_AFTERTOUCH 9
305 #define SEQ_CONTROLLER 10
306 #define CTRL_PITCH_BENDER 255
307 #define CTRL_PITCH_BENDER_RANGE 254
308 #define CTRL_EXPRESSION 253
309 #define CTRL_MAIN_VOLUME 252
310 #define SEQ_BALANCE 11
311
312
313
314
315
316
317
318
319
320
321 #define SEQ_FULLSIZE 0xfd
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342 #define SEQ_PRIVATE 0xfe
343 #define SEQ_EXTENDED 0xff
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368 typedef unsigned char sbi_instr_data[32];
369
370 struct sbi_instrument {
371 unsigned short key;
372 #define FM_PATCH 0x01fd
373 #define OPL3_PATCH 0x03fd
374 short device;
375 int channel;
376 sbi_instr_data operators;
377 };
378
379 struct synth_info {
380 char name[30];
381 int device;
382 int synth_type;
383 #define SYNTH_TYPE_FM 0
384 #define SYNTH_TYPE_SAMPLE 1
385
386 int synth_subtype;
387 #define FM_TYPE_ADLIB 0x00
388 #define FM_TYPE_OPL3 0x01
389
390 #define SAMPLE_TYPE_GUS 0x10
391
392 int perc_mode;
393 int nr_voices;
394 int nr_drums;
395 int instr_bank_size;
396 unsigned long capabilities;
397 #define SYNTH_CAP_PERCMODE 0x00000001
398 #define SYNTH_CAP_OPL3 0x00000002
399 int dummies[19];
400 };
401
402 struct midi_info {
403 char name[30];
404 int device;
405 unsigned long capabilities;
406 int dev_type;
407 int dummies[18];
408 };
409
410
411
412
413
414 #define SNDCTL_DSP_RESET _IO ('P', 0)
415 #define SNDCTL_DSP_SYNC _IO ('P', 1)
416 #define SNDCTL_DSP_SPEED _IOWR('P', 2, int)
417 #define SNDCTL_DSP_STEREO _IOWR('P', 3, int)
418 #define SNDCTL_DSP_GETBLKSIZE _IOWR('P', 4, int)
419 #define SNDCTL_DSP_SAMPLESIZE _IOWR('P', 5, int)
420 #define SOUND_PCM_WRITE_CHANNELS _IOWR('P', 6, int)
421 #define SOUND_PCM_WRITE_FILTER _IOWR('P', 7, int)
422 #define SNDCTL_DSP_POST _IO ('P', 8)
423 #define SNDCTL_DSP_SUBDIVIDE _IOWR('P', 9, int)
424
425 #define SOUND_PCM_READ_RATE _IOR ('P', 2, int)
426 #define SOUND_PCM_READ_CHANNELS _IOR ('P', 6, int)
427 #define SOUND_PCM_READ_BITS _IOR ('P', 5, int)
428 #define SOUND_PCM_READ_FILTER _IOR ('P', 7, int)
429
430
431 #define SOUND_PCM_WRITE_BITS SNDCTL_DSP_SAMPLESIZE
432 #define SOUND_PCM_WRITE_RATE SNDCTL_DSP_SPEED
433 #define SOUND_PCM_POST SNDCTL_DSP_POST
434 #define SOUND_PCM_RESET SNDCTL_DSP_RESET
435 #define SOUND_PCM_SYNC SNDCTL_DSP_SYNC
436 #define SOUND_PCM_SUBDIVIDE SNDCTL_DSP_SUBDIVIDE
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451 #define SOUND_MIXER_NRDEVICES 12
452 #define SOUND_MIXER_VOLUME 0
453 #define SOUND_MIXER_BASS 1
454 #define SOUND_MIXER_TREBLE 2
455 #define SOUND_MIXER_SYNTH 3
456 #define SOUND_MIXER_PCM 4
457 #define SOUND_MIXER_SPEAKER 5
458 #define SOUND_MIXER_LINE 6
459 #define SOUND_MIXER_MIC 7
460 #define SOUND_MIXER_CD 8
461 #define SOUND_MIXER_IMIX 9
462 #define SOUND_MIXER_ALTPCM 10
463 #define SOUND_MIXER_RECLEV 11
464
465
466
467 #define SOUND_ONOFF_MIN 28
468 #define SOUND_ONOFF_MAX 30
469 #define SOUND_MIXER_MUTE 28
470 #define SOUND_MIXER_ENHANCE 29
471 #define SOUND_MIXER_LOUD 30
472
473
474
475 #define SOUND_DEVICE_LABELS {"Vol ", "Bass ", "Trebl", "Synth", "Pcm ", "Spkr ", "Line ", \
476 "Mic ", "CD ", "Mix ", "Pcm2 ", "rec"}
477
478 #define SOUND_DEVICE_NAMES {"vol", "bass", "treble", "synth", "pcm", "speaker", "line", \
479 "mic", "cd", "mix", "pcm2", "rec"}
480
481
482
483 #define SOUND_MIXER_RECSRC 0xff
484 #define SOUND_MIXER_DEVMASK 0xfe
485 #define SOUND_MIXER_RECMASK 0xfd
486 #define SOUND_MIXER_CAPS 0xfc
487 #define SOUND_CAP_EXCL_INPUT 0x00000001
488 #define SOUND_MIXER_STEREODEVS 0xfb
489
490
491
492 #define SOUND_MASK_VOLUME (1 << SOUND_MIXER_VOLUME)
493 #define SOUND_MASK_BASS (1 << SOUND_MIXER_BASS)
494 #define SOUND_MASK_TREBLE (1 << SOUND_MIXER_TREBLE)
495 #define SOUND_MASK_SYNTH (1 << SOUND_MIXER_SYNTH)
496 #define SOUND_MASK_PCM (1 << SOUND_MIXER_PCM)
497 #define SOUND_MASK_SPEAKER (1 << SOUND_MIXER_SPEAKER)
498 #define SOUND_MASK_LINE (1 << SOUND_MIXER_LINE)
499 #define SOUND_MASK_MIC (1 << SOUND_MIXER_MIC)
500 #define SOUND_MASK_CD (1 << SOUND_MIXER_CD)
501 #define SOUND_MASK_IMIX (1 << SOUND_MIXER_IMIX)
502 #define SOUND_MASK_ALTPCM (1 << SOUND_MIXER_ALTPCM)
503 #define SOUND_MASK_RECLEV (1 << SOUND_MIXER_RECLEV)
504
505 #define SOUND_MASK_MUTE (1 << SOUND_MIXER_MUTE)
506 #define SOUND_MASK_ENHANCE (1 << SOUND_MIXER_ENHANCE)
507 #define SOUND_MASK_LOUD (1 << SOUND_MIXER_LOUD)
508
509 #define MIXER_READ(dev) _IOR('M', dev, int)
510 #define SOUND_MIXER_READ_VOLUME MIXER_READ(SOUND_MIXER_VOLUME)
511 #define SOUND_MIXER_READ_BASS MIXER_READ(SOUND_MIXER_BASS)
512 #define SOUND_MIXER_READ_TREBLE MIXER_READ(SOUND_MIXER_TREBLE)
513 #define SOUND_MIXER_READ_SYNTH MIXER_READ(SOUND_MIXER_SYNTH)
514 #define SOUND_MIXER_READ_PCM MIXER_READ(SOUND_MIXER_PCM)
515 #define SOUND_MIXER_READ_SPEAKER MIXER_READ(SOUND_MIXER_SPEAKER)
516 #define SOUND_MIXER_READ_LINE MIXER_READ(SOUND_MIXER_LINE)
517 #define SOUND_MIXER_READ_MIC MIXER_READ(SOUND_MIXER_MIC)
518 #define SOUND_MIXER_READ_CD MIXER_READ(SOUND_MIXER_CD)
519 #define SOUND_MIXER_READ_IMIX MIXER_READ(SOUND_MIXER_IMIX)
520 #define SOUND_MIXER_READ_ALTPCM MIXER_READ(SOUND_MIXER_ALTPCM)
521 #define SOUND_MIXER_READ_RECLEV MIXER_READ(SOUND_MIXER_RECLEV)
522 #define SOUND_MIXER_READ_MUTE MIXER_READ(SOUND_MIXER_MUTE)
523 #define SOUND_MIXER_READ_ENHANCE MIXER_READ(SOUND_MIXER_ENHANCE)
524 #define SOUND_MIXER_READ_LOUD MIXER_READ(SOUND_MIXER_LOUD)
525
526 #define SOUND_MIXER_READ_RECSRC MIXER_READ(SOUND_MIXER_RECSRC)
527 #define SOUND_MIXER_READ_DEVMASK MIXER_READ(SOUND_MIXER_DEVMASK)
528 #define SOUND_MIXER_READ_RECMASK MIXER_READ(SOUND_MIXER_RECMASK)
529 #define SOUND_MIXER_READ_STEREODEVS MIXER_READ(SOUND_MIXER_STEREODEVS)
530 #define SOUND_MIXER_READ_CAPS MIXER_READ(SOUND_MIXER_CAPS)
531
532 #define MIXER_WRITE(dev) _IOWR('M', dev, int)
533 #define SOUND_MIXER_WRITE_VOLUME MIXER_WRITE(SOUND_MIXER_VOLUME)
534 #define SOUND_MIXER_WRITE_BASS MIXER_WRITE(SOUND_MIXER_BASS)
535 #define SOUND_MIXER_WRITE_TREBLE MIXER_WRITE(SOUND_MIXER_TREBLE)
536 #define SOUND_MIXER_WRITE_SYNTH MIXER_WRITE(SOUND_MIXER_SYNTH)
537 #define SOUND_MIXER_WRITE_PCM MIXER_WRITE(SOUND_MIXER_PCM)
538 #define SOUND_MIXER_WRITE_SPEAKER MIXER_WRITE(SOUND_MIXER_SPEAKER)
539 #define SOUND_MIXER_WRITE_LINE MIXER_WRITE(SOUND_MIXER_LINE)
540 #define SOUND_MIXER_WRITE_MIC MIXER_WRITE(SOUND_MIXER_MIC)
541 #define SOUND_MIXER_WRITE_CD MIXER_WRITE(SOUND_MIXER_CD)
542 #define SOUND_MIXER_WRITE_IMIX MIXER_WRITE(SOUND_MIXER_IMIX)
543 #define SOUND_MIXER_WRITE_ALTPCM MIXER_WRITE(SOUND_MIXER_ALTPCM)
544 #define SOUND_MIXER_WRITE_RECLEV MIXER_WRITE(SOUND_MIXER_RECLEV)
545 #define SOUND_MIXER_WRITE_MUTE MIXER_WRITE(SOUND_MIXER_MUTE)
546 #define SOUND_MIXER_WRITE_ENHANCE MIXER_WRITE(SOUND_MIXER_ENHANCE)
547 #define SOUND_MIXER_WRITE_LOUD MIXER_WRITE(SOUND_MIXER_LOUD)
548
549 #define SOUND_MIXER_WRITE_RECSRC MIXER_WRITE(SOUND_MIXER_RECSRC)
550
551
552
553
554
555
556
557
558
559 typedef unsigned char S_BYTE;
560 typedef unsigned char S_FLAG;
561 struct stereo_vol
562 {
563 S_BYTE l;
564 S_BYTE r;
565 };
566
567 #define MIXER_IOCTL_SET_LEVELS _IOW ('s', 20, struct sb_mixer_levels)
568 #define MIXER_IOCTL_SET_PARAMS _IOW ('s', 21, struct sb_mixer_params)
569 #define MIXER_IOCTL_READ_LEVELS _IOR ('s', 22, struct sb_mixer_levels)
570 #define MIXER_IOCTL_READ_PARAMS _IOR ('s', 23, struct sb_mixer_params)
571 #define MIXER_IOCTL_RESET _IO ('s', 24)
572
573
574
575
576 struct sb_mixer_levels
577 {
578 struct stereo_vol master;
579 struct stereo_vol voc;
580 struct stereo_vol fm;
581 struct stereo_vol line;
582 struct stereo_vol cd;
583 S_BYTE mic;
584 };
585
586
587
588
589 struct sb_mixer_params
590 {
591 S_BYTE record_source;
592 S_FLAG hifreq_filter;
593 S_FLAG filter_input;
594 S_FLAG filter_output;
595 S_FLAG dsp_stereo;
596 };
597
598 #define SRC_MIC 1
599 #define SRC_CD 3
600 #define SRC_LINE 7
601
602 #if !defined(KERNEL) && !defined(INKERNEL)
603
604
605
606
607
608
609
610 void seqbuf_dump(void);
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631 #define SEQ_DEFINEBUF(len) unsigned char _seqbuf[len]; int _seqbuflen = len, _seqbufptr = 0
632 #define SEQ_PM_DEFINES struct patmgr_info _pm_info
633 #define _SEQ_NEEDBUF(len) if ((_seqbufptr+(len)) > _seqbuflen) seqbuf_dump()
634 #define _SEQ_ADVBUF(len) _seqbufptr += len
635 #define SEQ_DUMPBUF seqbuf_dump
636 #define PM_LOAD_PATCH(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \
637 _pm_info.device=dev, _pm_info.data.data8[0]=pgm, \
638 _pm_info.parm1 = bank, _pm_info.parm2 = 1, \
639 ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))
640 #define PM_LOAD_PATCHES(dev, bank, pgm) (SEQ_DUMPBUF(), _pm_info.command = _PM_LOAD_PATCH, \
641 _pm_info.device=dev, memcpy(_pm_info.data.data8, pgm, 128), \
642 _pm_info.parm1 = bank, _pm_info.parm2 = 128, \
643 ioctl(seqfd, SNDCTL_PMGR_ACCESS, &_pm_info))
644
645 #define SEQ_START_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\
646 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
647 _seqbuf[_seqbufptr+1] = SEQ_NOTEON;\
648 _seqbuf[_seqbufptr+2] = (dev);\
649 _seqbuf[_seqbufptr+3] = (voice);\
650 _seqbuf[_seqbufptr+4] = (note);\
651 _seqbuf[_seqbufptr+5] = (vol);\
652 _seqbuf[_seqbufptr+6] = 0;\
653 _seqbuf[_seqbufptr+7] = 0;\
654 _SEQ_ADVBUF(8);}
655
656 #define SEQ_STOP_NOTE(dev, voice, note, vol) {_SEQ_NEEDBUF(8);\
657 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
658 _seqbuf[_seqbufptr+1] = SEQ_NOTEOFF;\
659 _seqbuf[_seqbufptr+2] = (dev);\
660 _seqbuf[_seqbufptr+3] = (voice);\
661 _seqbuf[_seqbufptr+4] = (note);\
662 _seqbuf[_seqbufptr+5] = (vol);\
663 _seqbuf[_seqbufptr+6] = 0;\
664 _seqbuf[_seqbufptr+7] = 0;\
665 _SEQ_ADVBUF(8);}
666
667 #define SEQ_CHN_PRESSURE(dev, voice, pressure) {_SEQ_NEEDBUF(8);\
668 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
669 _seqbuf[_seqbufptr+1] = SEQ_AFTERTOUCH;\
670 _seqbuf[_seqbufptr+2] = (dev);\
671 _seqbuf[_seqbufptr+3] = (voice);\
672 _seqbuf[_seqbufptr+4] = (pressure);\
673 _seqbuf[_seqbufptr+5] = 0;\
674 _seqbuf[_seqbufptr+6] = 0;\
675 _seqbuf[_seqbufptr+7] = 0;\
676 _SEQ_ADVBUF(8);}
677
678 #define SEQ_PANNING(dev, voice, pos) {_SEQ_NEEDBUF(8);\
679 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
680 _seqbuf[_seqbufptr+1] = SEQ_BALANCE;\
681 _seqbuf[_seqbufptr+2] = (dev);\
682 _seqbuf[_seqbufptr+3] = (voice);\
683 (char)_seqbuf[_seqbufptr+4] = (pos);\
684 _seqbuf[_seqbufptr+5] = 0;\
685 _seqbuf[_seqbufptr+6] = 0;\
686 _seqbuf[_seqbufptr+7] = 0;\
687 _SEQ_ADVBUF(8);}
688
689 #define SEQ_CONTROL(dev, voice, controller, value) {_SEQ_NEEDBUF(8);\
690 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
691 _seqbuf[_seqbufptr+1] = SEQ_CONTROLLER;\
692 _seqbuf[_seqbufptr+2] = (dev);\
693 _seqbuf[_seqbufptr+3] = (voice);\
694 _seqbuf[_seqbufptr+4] = (controller);\
695 *(short *)&_seqbuf[_seqbufptr+5] = (value);\
696 _seqbuf[_seqbufptr+7] = 0;\
697 _SEQ_ADVBUF(8);}
698
699 #define SEQ_PITCHBEND(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER, value)
700 #define SEQ_BENDER_RANGE(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_PITCH_BENDER_RANGE, value)
701 #define SEQ_EXPRESSION(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_EXPRESSION, value)
702 #define SEQ_MAIN_VOLUME(dev, voice, value) SEQ_CONTROL(dev, voice, CTRL_MAIN_VOLUME, value)
703
704 #define SEQ_START_TIMER() {_SEQ_NEEDBUF(4);\
705 _seqbuf[_seqbufptr] = SEQ_SYNCTIMER;\
706 _seqbuf[_seqbufptr+1] = 0;\
707 _seqbuf[_seqbufptr+2] = 0;\
708 _seqbuf[_seqbufptr+3] = 0;\
709 _SEQ_ADVBUF(4);}
710 #define SEQ_SET_PATCH(dev, voice, patch) {_SEQ_NEEDBUF(8);\
711 _seqbuf[_seqbufptr] = SEQ_EXTENDED;\
712 _seqbuf[_seqbufptr+1] = SEQ_PGMCHANGE;\
713 _seqbuf[_seqbufptr+2] = (dev);\
714 _seqbuf[_seqbufptr+3] = (voice);\
715 _seqbuf[_seqbufptr+4] = (patch);\
716 _seqbuf[_seqbufptr+5] = 0;\
717 _seqbuf[_seqbufptr+6] = 0;\
718 _seqbuf[_seqbufptr+7] = 0;\
719 _SEQ_ADVBUF(8);}
720
721 #define SEQ_WAIT_TIME(ticks) {_SEQ_NEEDBUF(4);\
722 *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_WAIT | ((ticks) << 8);\
723 _SEQ_ADVBUF(4);}
724
725 #define SEQ_ECHO_BACK(key) {_SEQ_NEEDBUF(4);\
726 *(unsigned long *)&_seqbuf[_seqbufptr] = SEQ_ECHO | ((key) << 8);\
727 _SEQ_ADVBUF(4);}
728
729 #define SEQ_MIDIOUT(device, byte) {_SEQ_NEEDBUF(4);\
730 _seqbuf[_seqbufptr] = SEQ_MIDIPUTC;\
731 _seqbuf[_seqbufptr+1] = (byte);\
732 _seqbuf[_seqbufptr+2] = (device);\
733 _seqbuf[_seqbufptr+3] = 0;\
734 _SEQ_ADVBUF(4);}
735 #define SEQ_WRPATCH(patch, len) {if (_seqbufptr) seqbuf_dump();\
736 if (write(seqfd, (char*)(patch), len)==-1) \
737 perror("Write patch: /dev/sequencer");}
738
739 #endif
740 long soundcard_init(long mem_start);
741 #endif