2005-04-17 02:20:36 +04:00
# ifndef __SOUND_SOUNDFONT_H
# define __SOUND_SOUNDFONT_H
/*
* Soundfont defines and definitions .
*
* Copyright ( C ) 1999 Steve Ratcliffe
* Copyright ( c ) 1999 - 2000 Takashi iwai < tiwai @ suse . de >
*
* This program is free software ; you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation ; either version 2 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program ; if not , write to the Free Software
* Foundation , Inc . , 59 Temple Place , Suite 330 , Boston , MA 02111 - 1307 USA
*/
# include "sfnt_info.h"
# include "util_mem.h"
# define SF_MAX_INSTRUMENTS 128 /* maximum instrument number */
# define SF_MAX_PRESETS 256 /* drums are mapped from 128 to 256 */
# define SF_IS_DRUM_BANK(z) ((z) == 128)
2005-11-17 16:24:47 +03:00
struct snd_sf_zone {
2005-04-17 02:20:36 +04:00
struct snd_sf_zone * next ; /* Link to next */
unsigned char bank ; /* Midi bank for this zone */
unsigned char instr ; /* Midi program for this zone */
unsigned char mapped ; /* True if mapped to something else */
2005-11-17 16:24:47 +03:00
struct soundfont_voice_info v ; /* All the soundfont parameters */
2005-04-17 02:20:36 +04:00
int counter ;
struct snd_sf_sample * sample ; /* Link to sample */
/* The following deals with preset numbers (programs) */
struct snd_sf_zone * next_instr ; /* Next zone of this instrument */
struct snd_sf_zone * next_zone ; /* Next zone in play list */
2005-11-17 16:24:47 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:24:47 +03:00
struct snd_sf_sample {
struct soundfont_sample_info v ;
2005-04-17 02:20:36 +04:00
int counter ;
2005-11-17 16:24:47 +03:00
struct snd_util_memblk * block ; /* allocated data block */
2005-04-17 02:20:36 +04:00
struct snd_sf_sample * next ;
2005-11-17 16:24:47 +03:00
} ;
2005-04-17 02:20:36 +04:00
/*
* This represents all the information relating to a soundfont .
*/
2005-11-17 16:24:47 +03:00
struct snd_soundfont {
2005-04-17 02:20:36 +04:00
struct snd_soundfont * next ; /* Link to next */
/*struct snd_soundfont *prev;*/ /* Link to previous */
short id ; /* file id */
short type ; /* font type */
unsigned char name [ SNDRV_SFNT_PATCH_NAME_LEN ] ; /* identifier */
2005-11-17 16:24:47 +03:00
struct snd_sf_zone * zones ; /* Font information */
struct snd_sf_sample * samples ; /* The sample headers */
} ;
2005-04-17 02:20:36 +04:00
/*
* Type of the sample access callback
*/
2005-11-17 16:24:47 +03:00
struct snd_sf_callback {
2005-04-17 02:20:36 +04:00
void * private_data ;
2005-11-17 16:24:47 +03:00
int ( * sample_new ) ( void * private_data , struct snd_sf_sample * sp ,
struct snd_util_memhdr * hdr ,
const void __user * buf , long count ) ;
int ( * sample_free ) ( void * private_data , struct snd_sf_sample * sp ,
struct snd_util_memhdr * hdr ) ;
void ( * sample_reset ) ( void * private ) ;
} ;
2005-04-17 02:20:36 +04:00
/*
* List of soundfonts .
*/
2005-11-17 16:24:47 +03:00
struct snd_sf_list {
struct snd_soundfont * currsf ; /* The currently open soundfont */
2005-04-17 02:20:36 +04:00
int open_client ; /* client pointer for lock */
int mem_used ; /* used memory size */
2005-11-17 16:24:47 +03:00
struct snd_sf_zone * presets [ SF_MAX_PRESETS ] ;
struct snd_soundfont * fonts ; /* The list of soundfonts */
2005-04-17 02:20:36 +04:00
int fonts_size ; /* number of fonts allocated */
int zone_counter ; /* last allocated time for zone */
int sample_counter ; /* last allocated time for sample */
int zone_locked ; /* locked time for zone */
int sample_locked ; /* locked time for sample */
2005-11-17 16:24:47 +03:00
struct snd_sf_callback callback ; /* callback functions */
2005-04-17 02:20:36 +04:00
int presets_locked ;
2006-01-16 18:31:42 +03:00
struct mutex presets_mutex ;
2005-04-17 02:20:36 +04:00
spinlock_t lock ;
2005-11-17 16:24:47 +03:00
struct snd_util_memhdr * memhdr ;
} ;
2005-04-17 02:20:36 +04:00
/* Prototypes for soundfont.c */
2005-11-17 16:24:47 +03:00
int snd_soundfont_load ( struct snd_sf_list * sflist , const void __user * data ,
long count , int client ) ;
int snd_soundfont_load_guspatch ( struct snd_sf_list * sflist , const char __user * data ,
2005-04-17 02:20:36 +04:00
long count , int client ) ;
2005-11-17 16:24:47 +03:00
int snd_soundfont_close_check ( struct snd_sf_list * sflist , int client ) ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:24:47 +03:00
struct snd_sf_list * snd_sf_new ( struct snd_sf_callback * callback ,
struct snd_util_memhdr * hdr ) ;
void snd_sf_free ( struct snd_sf_list * sflist ) ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:24:47 +03:00
int snd_soundfont_remove_samples ( struct snd_sf_list * sflist ) ;
int snd_soundfont_remove_unlocked ( struct snd_sf_list * sflist ) ;
2005-04-17 02:20:36 +04:00
2005-11-17 16:24:47 +03:00
int snd_soundfont_search_zone ( struct snd_sf_list * sflist , int * notep , int vel ,
2005-04-17 02:20:36 +04:00
int preset , int bank ,
int def_preset , int def_bank ,
2005-11-17 16:24:47 +03:00
struct snd_sf_zone * * table , int max_layers ) ;
2005-04-17 02:20:36 +04:00
/* Parameter conversions */
int snd_sf_calc_parm_hold ( int msec ) ;
int snd_sf_calc_parm_attack ( int msec ) ;
int snd_sf_calc_parm_decay ( int msec ) ;
# define snd_sf_calc_parm_delay(msec) (0x8000 - (msec) * 1000 / 725);
extern int snd_sf_vol_table [ 128 ] ;
int snd_sf_linear_to_log ( unsigned int amount , int offset , int ratio ) ;
# endif /* __SOUND_SOUNDFONT_H */