Merge branch 'for-2.6.25' of master.kernel.org:/pub/scm/linux/kernel/git/jwboyer...
[sfrench/cifs-2.6.git] / include / sound / opl3.h
index 82fdb09307203d318bf50b66548480cfacf0b538..6ba670707831dcca41c2b48f742ff7fef85c1edb 100644 (file)
@@ -4,7 +4,7 @@
 /*
  * Definitions of the OPL-3 registers.
  *
- * Copyright (c) by Jaroslav Kysela <perex@suse.cz>,
+ * Copyright (c) by Jaroslav Kysela <perex@perex.cz>,
  *                  Hannu Savolainen 1993-1996
  *
  *
  *
  */
 
-#include "driver.h"
-#include <linux/time.h>
-#include <linux/mutex.h>
-#include "core.h"
-#include "hwdep.h"
-#include "timer.h"
-#include "seq_midi_emul.h"
+#include <sound/core.h>
+#include <sound/hwdep.h>
+#include <sound/timer.h>
+#include <sound/seq_midi_emul.h>
 #ifdef CONFIG_SND_SEQUENCER_OSS
-#include "seq_oss.h"
-#include "seq_oss_legacy.h"
+#include <sound/seq_oss.h>
+#include <sound/seq_oss_legacy.h>
 #endif
-#include "seq_device.h"
-#include "ainstr_fm.h"
+#include <sound/seq_device.h>
+#include <sound/asound_fm.h>
 
 /*
  *    Register numbers for the global registers
 
 struct snd_opl3;
 
+/*
+ * Instrument record, aka "Patch"
+ */
+
+/* FM operator */
+struct fm_operator {
+       unsigned char am_vib;
+       unsigned char ksl_level;
+       unsigned char attack_decay;
+       unsigned char sustain_release;
+       unsigned char wave_select;
+} __attribute__((packed));
+
+/* Instrument data */
+struct fm_instrument {
+       struct fm_operator op[4];
+       unsigned char feedback_connection[2];
+       unsigned char echo_delay;
+       unsigned char echo_atten;
+       unsigned char chorus_spread;
+       unsigned char trnsps;
+       unsigned char fix_dur;
+       unsigned char modes;
+       unsigned char fix_key;
+};
+
+/* type */
+#define FM_PATCH_OPL2  0x01            /* OPL2 2 operators FM instrument */
+#define FM_PATCH_OPL3  0x02            /* OPL3 4 operators FM instrument */
+
+/* Instrument record */
+struct fm_patch {
+       unsigned char prog;
+       unsigned char bank;
+       unsigned char type;
+       struct fm_instrument inst;
+       char name[24];
+       struct fm_patch *next;
+};
+
+
 /*
  * A structure to keep track of each hardware voice
  */
@@ -277,9 +315,9 @@ struct snd_opl3 {
        void *private_data;
        void (*private_free)(struct snd_opl3 *);
 
+       struct snd_hwdep *hwdep;
        spinlock_t reg_lock;
        struct snd_card *card;          /* The card that this belongs to */
-       int used;                       /* usage flag - exclusive */
        unsigned char fm_mode;          /* OPL mode, see SNDRV_DM_FM_MODE_XXX */
        unsigned char rhythm;           /* percussion mode flag */
        unsigned char max_voices;       /* max number of voices */
@@ -297,8 +335,8 @@ struct snd_opl3 {
        struct snd_midi_channel_set * oss_chset;
 #endif
  
-       struct snd_seq_kinstr_ops fm_ops;
-       struct snd_seq_kinstr_list *ilist;
+#define OPL3_PATCH_HASH_SIZE   32
+       struct fm_patch *patch_table[OPL3_PATCH_HASH_SIZE];
 
        struct snd_opl3_voice voices[MAX_OPL3_VOICES]; /* Voices (OPL3 'channel') */
        int use_time;                   /* allocation counter */
@@ -312,7 +350,6 @@ struct snd_opl3 {
        int sys_timer_status;           /* system timer run status */
        spinlock_t sys_timer_lock;      /* Lock for system timer access */
 #endif
-       struct mutex access_mutex;      /* locking */
 };
 
 /* opl3.c */
@@ -337,4 +374,20 @@ int snd_opl3_release(struct snd_hwdep * hw, struct file *file);
 
 void snd_opl3_reset(struct snd_opl3 * opl3);
 
+#if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
+long snd_opl3_write(struct snd_hwdep *hw, const char __user *buf, long count,
+                   loff_t *offset);
+int snd_opl3_load_patch(struct snd_opl3 *opl3,
+                       int prog, int bank, int type,
+                       const char *name,
+                       const unsigned char *ext,
+                       const unsigned char *data);
+struct fm_patch *snd_opl3_find_patch(struct snd_opl3 *opl3, int prog, int bank,
+                                    int create_patch);
+void snd_opl3_clear_patches(struct snd_opl3 *opl3);
+#else
+#define snd_opl3_write NULL
+static inline void snd_opl3_clear_patches(struct snd_opl3 *opl3) {}
+#endif
+
 #endif /* __SOUND_OPL3_H */