diff options
author | Takashi Iwai <tiwai@suse.de> | 2007-10-30 06:49:22 -0400 |
---|---|---|
committer | Jaroslav Kysela <perex@perex.cz> | 2008-01-31 11:29:13 -0500 |
commit | 224a033252bba46c5c8b5df625f5e781ca138f48 (patch) | |
tree | 11bb0ad9a3bab736091c73bb46b79d42ee0ff34d /include/sound | |
parent | ceac4bf34e14d9040d16b35fd97a92d6e951ccf4 (diff) |
[ALSA] opl3 - Use hwdep for patch loading
Use the hwdep device for loading OPL2/3 patch data instead of the
messy sequencer instrument layer.
Due to this change, the sbiload program should be updated, too.
Signed-off-by: Takashi Iwai <tiwai@suse.de>
Signed-off-by: Jaroslav Kysela <perex@perex.cz>
Diffstat (limited to 'include/sound')
-rw-r--r-- | include/sound/asound_fm.h | 19 | ||||
-rw-r--r-- | include/sound/opl3.h | 58 |
2 files changed, 74 insertions, 3 deletions
diff --git a/include/sound/asound_fm.h b/include/sound/asound_fm.h index 8fbcab7cc73b..c2a4b967d5be 100644 --- a/include/sound/asound_fm.h +++ b/include/sound/asound_fm.h | |||
@@ -104,6 +104,8 @@ struct snd_dm_fm_params { | |||
104 | #define SNDRV_DM_FM_IOCTL_SET_MODE _IOW('H', 0x25, int) | 104 | #define SNDRV_DM_FM_IOCTL_SET_MODE _IOW('H', 0x25, int) |
105 | /* for OPL3 only */ | 105 | /* for OPL3 only */ |
106 | #define SNDRV_DM_FM_IOCTL_SET_CONNECTION _IOW('H', 0x26, int) | 106 | #define SNDRV_DM_FM_IOCTL_SET_CONNECTION _IOW('H', 0x26, int) |
107 | /* SBI patch management */ | ||
108 | #define SNDRV_DM_FM_IOCTL_CLEAR_PATCHES _IO ('H', 0x40) | ||
107 | 109 | ||
108 | #define SNDRV_DM_FM_OSS_IOCTL_RESET 0x20 | 110 | #define SNDRV_DM_FM_OSS_IOCTL_RESET 0x20 |
109 | #define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE 0x21 | 111 | #define SNDRV_DM_FM_OSS_IOCTL_PLAY_NOTE 0x21 |
@@ -112,4 +114,21 @@ struct snd_dm_fm_params { | |||
112 | #define SNDRV_DM_FM_OSS_IOCTL_SET_MODE 0x24 | 114 | #define SNDRV_DM_FM_OSS_IOCTL_SET_MODE 0x24 |
113 | #define SNDRV_DM_FM_OSS_IOCTL_SET_OPL 0x25 | 115 | #define SNDRV_DM_FM_OSS_IOCTL_SET_OPL 0x25 |
114 | 116 | ||
117 | /* | ||
118 | * Patch Record - fixed size for write | ||
119 | */ | ||
120 | |||
121 | #define FM_KEY_SBI "SBI\032" | ||
122 | #define FM_KEY_2OP "2OP\032" | ||
123 | #define FM_KEY_4OP "4OP\032" | ||
124 | |||
125 | struct sbi_patch { | ||
126 | unsigned char prog; | ||
127 | unsigned char bank; | ||
128 | char key[4]; | ||
129 | char name[25]; | ||
130 | char extension[7]; | ||
131 | unsigned char data[32]; | ||
132 | }; | ||
133 | |||
115 | #endif /* __SOUND_ASOUND_FM_H */ | 134 | #endif /* __SOUND_ASOUND_FM_H */ |
diff --git a/include/sound/opl3.h b/include/sound/opl3.h index 1d14b3f82393..7ee865d6236f 100644 --- a/include/sound/opl3.h +++ b/include/sound/opl3.h | |||
@@ -63,7 +63,7 @@ | |||
63 | #include "seq_oss_legacy.h" | 63 | #include "seq_oss_legacy.h" |
64 | #endif | 64 | #endif |
65 | #include "seq_device.h" | 65 | #include "seq_device.h" |
66 | #include "ainstr_fm.h" | 66 | #include "asound_fm.h" |
67 | 67 | ||
68 | /* | 68 | /* |
69 | * Register numbers for the global registers | 69 | * Register numbers for the global registers |
@@ -240,6 +240,47 @@ | |||
240 | struct snd_opl3; | 240 | struct snd_opl3; |
241 | 241 | ||
242 | /* | 242 | /* |
243 | * Instrument record, aka "Patch" | ||
244 | */ | ||
245 | |||
246 | /* FM operator */ | ||
247 | struct fm_operator { | ||
248 | unsigned char am_vib; | ||
249 | unsigned char ksl_level; | ||
250 | unsigned char attack_decay; | ||
251 | unsigned char sustain_release; | ||
252 | unsigned char wave_select; | ||
253 | } __attribute__((packed)); | ||
254 | |||
255 | /* Instrument data */ | ||
256 | struct fm_instrument { | ||
257 | struct fm_operator op[4]; | ||
258 | unsigned char feedback_connection[2]; | ||
259 | unsigned char echo_delay; | ||
260 | unsigned char echo_atten; | ||
261 | unsigned char chorus_spread; | ||
262 | unsigned char trnsps; | ||
263 | unsigned char fix_dur; | ||
264 | unsigned char modes; | ||
265 | unsigned char fix_key; | ||
266 | }; | ||
267 | |||
268 | /* type */ | ||
269 | #define FM_PATCH_OPL2 0x01 /* OPL2 2 operators FM instrument */ | ||
270 | #define FM_PATCH_OPL3 0x02 /* OPL3 4 operators FM instrument */ | ||
271 | |||
272 | /* Instrument record */ | ||
273 | struct fm_patch { | ||
274 | unsigned char prog; | ||
275 | unsigned char bank; | ||
276 | unsigned char type; | ||
277 | struct fm_instrument inst; | ||
278 | char name[24]; | ||
279 | struct fm_patch *next; | ||
280 | }; | ||
281 | |||
282 | |||
283 | /* | ||
243 | * A structure to keep track of each hardware voice | 284 | * A structure to keep track of each hardware voice |
244 | */ | 285 | */ |
245 | struct snd_opl3_voice { | 286 | struct snd_opl3_voice { |
@@ -297,8 +338,8 @@ struct snd_opl3 { | |||
297 | struct snd_midi_channel_set * oss_chset; | 338 | struct snd_midi_channel_set * oss_chset; |
298 | #endif | 339 | #endif |
299 | 340 | ||
300 | struct snd_seq_kinstr_ops fm_ops; | 341 | #define OPL3_PATCH_HASH_SIZE 32 |
301 | struct snd_seq_kinstr_list *ilist; | 342 | struct fm_patch *patch_table[OPL3_PATCH_HASH_SIZE]; |
302 | 343 | ||
303 | struct snd_opl3_voice voices[MAX_OPL3_VOICES]; /* Voices (OPL3 'channel') */ | 344 | struct snd_opl3_voice voices[MAX_OPL3_VOICES]; /* Voices (OPL3 'channel') */ |
304 | int use_time; /* allocation counter */ | 345 | int use_time; /* allocation counter */ |
@@ -333,8 +374,19 @@ int snd_opl3_hwdep_new(struct snd_opl3 * opl3, int device, int seq_device, | |||
333 | int snd_opl3_open(struct snd_hwdep * hw, struct file *file); | 374 | int snd_opl3_open(struct snd_hwdep * hw, struct file *file); |
334 | int snd_opl3_ioctl(struct snd_hwdep * hw, struct file *file, | 375 | int snd_opl3_ioctl(struct snd_hwdep * hw, struct file *file, |
335 | unsigned int cmd, unsigned long arg); | 376 | unsigned int cmd, unsigned long arg); |
377 | long snd_opl3_write(struct snd_hwdep *hw, const char __user *buf, long count, | ||
378 | loff_t *offset); | ||
336 | int snd_opl3_release(struct snd_hwdep * hw, struct file *file); | 379 | int snd_opl3_release(struct snd_hwdep * hw, struct file *file); |
337 | 380 | ||
338 | void snd_opl3_reset(struct snd_opl3 * opl3); | 381 | void snd_opl3_reset(struct snd_opl3 * opl3); |
339 | 382 | ||
383 | int snd_opl3_load_patch(struct snd_opl3 *opl3, | ||
384 | int prog, int bank, int type, | ||
385 | const char *name, | ||
386 | const unsigned char *ext, | ||
387 | const unsigned char *data); | ||
388 | struct fm_patch *snd_opl3_find_patch(struct snd_opl3 *opl3, int prog, int bank, | ||
389 | int create_patch); | ||
390 | void snd_opl3_clear_patches(struct snd_opl3 *opl3); | ||
391 | |||
340 | #endif /* __SOUND_OPL3_H */ | 392 | #endif /* __SOUND_OPL3_H */ |