1 #ifndef __SOUND_SEQ_INSTR_H 2 #define __SOUND_SEQ_INSTR_H 3 4 /* 5 * Main kernel header file for the ALSA sequencer 6 * Copyright (c) 1999 by Jaroslav Kysela <perex (at) perex.cz> 7 * 8 * 9 * This program is free software; you can redistribute it and/or modify 10 * it under the terms of the GNU General Public License as published by 11 * the Free Software Foundation; either version 2 of the License, or 12 * (at your option) any later version. 13 * 14 * This program is distributed in the hope that it will be useful, 15 * but WITHOUT ANY WARRANTY; without even the implied warranty of 16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 * GNU General Public License for more details. 18 * 19 * You should have received a copy of the GNU General Public License 20 * along with this program; if not, write to the Free Software 21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 22 * 23 */ 24 #include "seq_kernel.h" 25 26 /* Instrument cluster */ 27 struct snd_seq_kcluster { 28 snd_seq_instr_cluster_t cluster; 29 char name[32]; 30 int priority; 31 struct snd_seq_kcluster *next; 32 }; 33 34 /* return pointer to private data */ 35 #define KINSTR_DATA(kinstr) (void *)(((char *)kinstr) + sizeof(struct snd_seq_kinstr)) 36 37 /* Instrument structure */ 38 struct snd_seq_kinstr { 39 struct snd_seq_instr instr; 40 char name[32]; 41 int type; /* instrument type */ 42 int use; /* use count */ 43 int busy; /* not useable */ 44 int add_len; /* additional length */ 45 struct snd_seq_kinstr_ops *ops; /* operations */ 46 struct snd_seq_kinstr *next; 47 }; 48 49 #define SNDRV_SEQ_INSTR_HASH_SIZE 32 50 51 /* Instrument flags */ 52 #define SNDRV_SEQ_INSTR_FLG_DIRECT (1<<0) /* accept only direct events */ 53 54 /* List of all instruments */ 55 struct snd_seq_kinstr_list { 56 struct snd_seq_kinstr *hash[SNDRV_SEQ_INSTR_HASH_SIZE]; 57 int count; /* count of all instruments */ 58 59 struct snd_seq_kcluster *chash[SNDRV_SEQ_INSTR_HASH_SIZE]; 60 int ccount; /* count of all clusters */ 61 62 int owner; /* current owner of the instrument list */ 63 unsigned int flags; 64 65 spinlock_t lock; 66 spinlock_t ops_lock; 67 struct mutex ops_mutex; 68 unsigned long ops_flags; 69 }; 70 71 #define SNDRV_SEQ_INSTR_NOTIFY_REMOVE 0 72 #define SNDRV_SEQ_INSTR_NOTIFY_CHANGE 1 73 74 struct snd_seq_kinstr_ops { 75 void *private_data; 76 long add_len; /* additional length */ 77 char *instr_type; 78 int (*info)(void *private_data, char *info_data, long len); 79 int (*put)(void *private_data, struct snd_seq_kinstr *kinstr, 80 char __user *instr_data, long len, int atomic, int cmd); 81 int (*get)(void *private_data, struct snd_seq_kinstr *kinstr, 82 char __user *instr_data, long len, int atomic, int cmd); 83 int (*get_size)(void *private_data, struct snd_seq_kinstr *kinstr, long *size); 84 int (*remove)(void *private_data, struct snd_seq_kinstr *kinstr, int atomic); 85 void (*notify)(void *private_data, struct snd_seq_kinstr *kinstr, int what); 86 struct snd_seq_kinstr_ops *next; 87 }; 88 89 90 /* instrument operations */ 91 struct snd_seq_kinstr_list *snd_seq_instr_list_new(void); 92 void snd_seq_instr_list_free(struct snd_seq_kinstr_list **list); 93 int snd_seq_instr_list_free_cond(struct snd_seq_kinstr_list *list, 94 struct snd_seq_instr_header *ifree, 95 int client, 96 int atomic); 97 struct snd_seq_kinstr *snd_seq_instr_find(struct snd_seq_kinstr_list *list, 98 struct snd_seq_instr *instr, 99 int exact, 100 int follow_alias); 101 void snd_seq_instr_free_use(struct snd_seq_kinstr_list *list, 102 struct snd_seq_kinstr *instr); 103 int snd_seq_instr_event(struct snd_seq_kinstr_ops *ops, 104 struct snd_seq_kinstr_list *list, 105 struct snd_seq_event *ev, 106 int client, 107 int atomic, 108 int hop); 109 110 #endif /* __SOUND_SEQ_INSTR_H */ 111