blob: f2db03bfd74e59c1329d1c6691438177439f8f9f [file] [log] [blame]
Linus Torvalds1da177e2005-04-16 15:20:36 -07001#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@suse.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 */
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010027struct snd_seq_kcluster {
Linus Torvalds1da177e2005-04-16 15:20:36 -070028 snd_seq_instr_cluster_t cluster;
29 char name[32];
30 int priority;
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010031 struct snd_seq_kcluster *next;
32};
Linus Torvalds1da177e2005-04-16 15:20:36 -070033
34/* return pointer to private data */
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010035#define KINSTR_DATA(kinstr) (void *)(((char *)kinstr) + sizeof(struct snd_seq_kinstr))
Linus Torvalds1da177e2005-04-16 15:20:36 -070036
37/* Instrument structure */
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010038struct snd_seq_kinstr {
39 struct snd_seq_instr instr;
Linus Torvalds1da177e2005-04-16 15:20:36 -070040 char name[32];
41 int type; /* instrument type */
42 int use; /* use count */
43 int busy; /* not useable */
44 int add_len; /* additional length */
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010045 struct snd_seq_kinstr_ops *ops; /* operations */
46 struct snd_seq_kinstr *next;
47};
Linus Torvalds1da177e2005-04-16 15:20:36 -070048
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 */
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010055struct snd_seq_kinstr_list {
56 struct snd_seq_kinstr *hash[SNDRV_SEQ_INSTR_HASH_SIZE];
Linus Torvalds1da177e2005-04-16 15:20:36 -070057 int count; /* count of all instruments */
58
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010059 struct snd_seq_kcluster *chash[SNDRV_SEQ_INSTR_HASH_SIZE];
Linus Torvalds1da177e2005-04-16 15:20:36 -070060 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;
Ingo Molnar1a60d4c2006-01-16 16:29:08 +010067 struct mutex ops_mutex;
Linus Torvalds1da177e2005-04-16 15:20:36 -070068 unsigned long ops_flags;
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010069};
Linus Torvalds1da177e2005-04-16 15:20:36 -070070
71#define SNDRV_SEQ_INSTR_NOTIFY_REMOVE 0
72#define SNDRV_SEQ_INSTR_NOTIFY_CHANGE 1
73
74struct 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);
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010079 int (*put)(void *private_data, struct snd_seq_kinstr *kinstr,
Linus Torvalds1da177e2005-04-16 15:20:36 -070080 char __user *instr_data, long len, int atomic, int cmd);
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010081 int (*get)(void *private_data, struct snd_seq_kinstr *kinstr,
Linus Torvalds1da177e2005-04-16 15:20:36 -070082 char __user *instr_data, long len, int atomic, int cmd);
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010083 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);
Linus Torvalds1da177e2005-04-16 15:20:36 -070086 struct snd_seq_kinstr_ops *next;
87};
88
89
90/* instrument operations */
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010091struct snd_seq_kinstr_list *snd_seq_instr_list_new(void);
92void snd_seq_instr_list_free(struct snd_seq_kinstr_list **list);
93int snd_seq_instr_list_free_cond(struct snd_seq_kinstr_list *list,
94 struct snd_seq_instr_header *ifree,
Linus Torvalds1da177e2005-04-16 15:20:36 -070095 int client,
96 int atomic);
Takashi Iwaic7e0b5b2005-11-17 14:04:02 +010097struct 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);
101void snd_seq_instr_free_use(struct snd_seq_kinstr_list *list,
102 struct snd_seq_kinstr *instr);
103int snd_seq_instr_event(struct snd_seq_kinstr_ops *ops,
104 struct snd_seq_kinstr_list *list,
105 struct snd_seq_event *ev,
Linus Torvalds1da177e2005-04-16 15:20:36 -0700106 int client,
107 int atomic,
108 int hop);
109
110#endif /* __SOUND_SEQ_INSTR_H */