Home | History | Annotate | Download | only in alsa
      1 /**
      2  * \file include/instr.h
      3  * \brief Application interface library for the ALSA driver
      4  * \author Jaroslav Kysela <perex (at) perex.cz>
      5  * \author Abramo Bagnara <abramo (at) alsa-project.org>
      6  * \author Takashi Iwai <tiwai (at) suse.de>
      7  * \date 1998-2001
      8  *
      9  * Application interface library for the ALSA driver
     10  */
     11 /*
     12  *   This library is free software; you can redistribute it and/or modify
     13  *   it under the terms of the GNU Lesser General Public License as
     14  *   published by the Free Software Foundation; either version 2.1 of
     15  *   the License, or (at your option) any later version.
     16  *
     17  *   This program is distributed in the hope that it will be useful,
     18  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
     19  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
     20  *   GNU Lesser General Public License for more details.
     21  *
     22  *   You should have received a copy of the GNU Lesser General Public
     23  *   License along with this library; if not, write to the Free Software
     24  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
     25  *
     26  */
     27 
     28 #ifndef __ALSA_INSTR_H
     29 #define __ALSA_INSTR_H
     30 
     31 #ifdef __cplusplus
     32 extern "C" {
     33 #endif
     34 
     35 /**
     36  *  \defgroup Instrument Instrument Interface
     37  *  The Instrument Interface.
     38  *  \{
     39  */
     40 
     41 /* instrument get/put */
     42 
     43 /** container for sequencer instrument header */
     44 typedef struct _snd_instr_header snd_instr_header_t;
     45 
     46 size_t snd_instr_header_sizeof(void);
     47 #define snd_instr_header_alloca(ptr) \
     48 do {\
     49 	assert(ptr);\
     50 	*ptr = (snd_instr_header_t *)alloca(snd_instr_header_sizeof());\
     51 	memset(*ptr, 0, snd_instr_header_sizeof());\
     52 } while (0) /**< allocate instrument header on stack */
     53 int snd_instr_header_malloc(snd_instr_header_t **ptr, size_t len);
     54 void snd_instr_header_free(snd_instr_header_t *ptr);
     55 void snd_instr_header_copy(snd_instr_header_t *dst, const snd_instr_header_t *src);
     56 
     57 const snd_seq_instr_t *snd_instr_header_get_id(const snd_instr_header_t *info);
     58 snd_seq_instr_cluster_t snd_instr_header_get_cluster(const snd_instr_header_t *info);
     59 unsigned int snd_instr_header_get_cmd(const snd_instr_header_t *info);
     60 size_t snd_instr_header_get_len(const snd_instr_header_t *info);
     61 const char *snd_instr_header_get_name(const snd_instr_header_t *info);
     62 int snd_instr_header_get_type(const snd_instr_header_t *info);
     63 const char *snd_instr_header_get_format(const snd_instr_header_t *info);
     64 const snd_seq_instr_t *snd_instr_header_get_alias(const snd_instr_header_t *info);
     65 void *snd_instr_header_get_data(const snd_instr_header_t *info);
     66 int snd_instr_header_get_follow_alias(const snd_instr_header_t *info);
     67 
     68 void snd_instr_header_set_id(snd_instr_header_t *info, const snd_seq_instr_t *id);
     69 void snd_instr_header_set_cluster(snd_instr_header_t *info, snd_seq_instr_cluster_t cluster);
     70 void snd_instr_header_set_cmd(snd_instr_header_t *info, unsigned int cmd);
     71 void snd_instr_header_set_len(snd_instr_header_t *info, size_t len);
     72 void snd_instr_header_set_name(snd_instr_header_t *info, const char *name);
     73 void snd_instr_header_set_type(snd_instr_header_t *info, int type);
     74 void snd_instr_header_set_format(snd_instr_header_t *info, const char *format);
     75 void snd_instr_header_set_alias(snd_instr_header_t *info, const snd_seq_instr_t *instr);
     76 void snd_instr_header_set_follow_alias(snd_instr_header_t *info, int val);
     77 
     78 /**
     79  *  Instrument abstraction layer
     80  *     - based on events
     81  */
     82 
     83 /** instrument types */
     84 #define SND_SEQ_INSTR_ATYPE_DATA	0	/**< instrument data */
     85 #define SND_SEQ_INSTR_ATYPE_ALIAS	1	/**< instrument alias */
     86 
     87 /** instrument ASCII identifiers */
     88 #define SND_SEQ_INSTR_ID_DLS1		"DLS1"		/**< DLS1 */
     89 #define SND_SEQ_INSTR_ID_DLS2		"DLS2"		/**< DLS2 */
     90 #define SND_SEQ_INSTR_ID_SIMPLE		"Simple Wave"	/**< Simple Wave */
     91 #define SND_SEQ_INSTR_ID_SOUNDFONT	"SoundFont"	/**< SoundFont */
     92 #define SND_SEQ_INSTR_ID_GUS_PATCH	"GUS Patch"	/**< Gravis Patch */
     93 #define SND_SEQ_INSTR_ID_INTERWAVE	"Interwave FFFF" /**< InterWave FFFF */
     94 #define SND_SEQ_INSTR_ID_OPL2_3		"OPL2/3 FM"	/**< OPL2/3 FM */
     95 #define SND_SEQ_INSTR_ID_OPL4		"OPL4"		/**< OPL4 */
     96 
     97 /** instrument types */
     98 #define SND_SEQ_INSTR_TYPE0_DLS1	(1<<0)		/**< MIDI DLS v1 */
     99 #define SND_SEQ_INSTR_TYPE0_DLS2	(1<<1)		/**< MIDI DLS v2 */
    100 #define SND_SEQ_INSTR_TYPE1_SIMPLE	(1<<0)		/**< Simple Wave */
    101 #define SND_SEQ_INSTR_TYPE1_SOUNDFONT	(1<<1)		/**< EMU SoundFont */
    102 #define SND_SEQ_INSTR_TYPE1_GUS_PATCH	(1<<2)		/**< Gravis UltraSound Patch */
    103 #define SND_SEQ_INSTR_TYPE1_INTERWAVE	(1<<3)		/**< InterWave FFFF */
    104 #define SND_SEQ_INSTR_TYPE2_OPL2_3	(1<<0)		/**< Yamaha OPL2/3 FM */
    105 #define SND_SEQ_INSTR_TYPE2_OPL4	(1<<1)		/**< Yamaha OPL4 */
    106 
    107 /** put commands */
    108 #define SND_SEQ_INSTR_PUT_CMD_CREATE	0	/**< create a new layer */
    109 #define SND_SEQ_INSTR_PUT_CMD_REPLACE	1	/**< replace the old layer with new one */
    110 #define SND_SEQ_INSTR_PUT_CMD_MODIFY	2	/**< modify the existing layer */
    111 #define SND_SEQ_INSTR_PUT_CMD_ADD	3	/**< add one to the existing layer */
    112 #define SND_SEQ_INSTR_PUT_CMD_REMOVE	4	/**< remove the layer */
    113 
    114 /** get commands */
    115 #define SND_SEQ_INSTR_GET_CMD_FULL	0	/**< get the full data stream */
    116 #define SND_SEQ_INSTR_GET_CMD_PARTIAL	1	/**< get the partial data stream */
    117 
    118 /* query flags */
    119 #define SND_SEQ_INSTR_QUERY_FOLLOW_ALIAS (1<<0)	/**< follow alias to get the instrument data */
    120 
    121 /** free commands */
    122 #define SND_SEQ_INSTR_FREE_CMD_ALL	0	/**< remove all matching instruments */
    123 #define SND_SEQ_INSTR_FREE_CMD_PRIVATE	1	/**< remove only private instruments */
    124 #define SND_SEQ_INSTR_FREE_CMD_CLUSTER	2	/**< remove only cluster instruments */
    125 #define SND_SEQ_INSTR_FREE_CMD_SINGLE	3	/**< remove single instrument */
    126 
    127 
    128 /**
    129  * FM instrument support
    130  */
    131 
    132 /** FM instrument data structure */
    133 typedef void snd_instr_fm_t;
    134 
    135 int snd_instr_fm_convert_to_stream(snd_instr_fm_t *fm, const char *name, snd_instr_header_t **put, size_t *size);
    136 int snd_instr_fm_convert_from_stream(snd_instr_header_t *data, size_t size, snd_instr_fm_t **fm);
    137 int snd_instr_fm_free(snd_instr_fm_t *fm);
    138 
    139 
    140 /**
    141  * Simple Wave support
    142  */
    143 
    144 /** simple instrument data structure */
    145 typedef void snd_instr_simple_t;
    146 
    147 int snd_instr_simple_convert_to_stream(snd_instr_simple_t *simple, const char *name, snd_instr_header_t **put, size_t *size);
    148 int snd_instr_simple_convert_from_stream(snd_instr_header_t *data, size_t size, snd_instr_simple_t **simple);
    149 int snd_instr_simple_free(snd_instr_simple_t *simple);
    150 
    151 
    152 /**
    153  * InterWave FFFF support
    154  */
    155 
    156 /** IW FFFF instrument data structure */
    157 typedef void snd_instr_iwffff_t;
    158 /** IW FFFF handler */
    159 typedef struct _snd_iwffff_handle snd_iwffff_handle_t;
    160 
    161 int snd_instr_iwffff_open(snd_iwffff_handle_t **handle, const char *name_fff, const char *name_dta);
    162 int snd_instr_iwffff_open_rom(snd_iwffff_handle_t **handle, int card, int bank, int file);
    163 int snd_instr_iwffff_open_rom_file(snd_iwffff_handle_t **handle, const char *name, int bank, int file);
    164 int snd_instr_iwffff_close(snd_iwffff_handle_t *handle);
    165 int snd_instr_iwffff_load(snd_iwffff_handle_t *handle, int bank, int prg, snd_instr_iwffff_t **iwffff);
    166 int snd_instr_iwffff_convert_to_stream(snd_instr_iwffff_t *iwffff, const char *name, snd_instr_header_t **data, size_t *size);
    167 int snd_instr_iwffff_convert_from_stream(snd_instr_header_t *data, size_t size, snd_instr_iwffff_t **iwffff);
    168 int snd_instr_iwffff_free(snd_instr_iwffff_t *iwffff);
    169 
    170 /** \} */
    171 
    172 #ifdef __cplusplus
    173 }
    174 #endif
    175 
    176 #endif /* __ALSA_INSTR_H */
    177 
    178