Linux Kernel  3.7.1
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
rawmidi.h
Go to the documentation of this file.
1 #ifndef __SOUND_RAWMIDI_H
2 #define __SOUND_RAWMIDI_H
3 
4 /*
5  * Abstract layer for MIDI v1.0 stream
6  * Copyright (c) by Jaroslav Kysela <[email protected]>
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 
25 #include <sound/asound.h>
26 #include <linux/interrupt.h>
27 #include <linux/spinlock.h>
28 #include <linux/wait.h>
29 #include <linux/mutex.h>
30 #include <linux/workqueue.h>
31 
32 #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
33 #include <sound/seq_device.h>
34 #endif
35 
36 /*
37  * Raw MIDI interface
38  */
39 
40 #define SNDRV_RAWMIDI_DEVICES 8
41 
42 #define SNDRV_RAWMIDI_LFLG_OUTPUT (1<<0)
43 #define SNDRV_RAWMIDI_LFLG_INPUT (1<<1)
44 #define SNDRV_RAWMIDI_LFLG_OPEN (3<<0)
45 #define SNDRV_RAWMIDI_LFLG_APPEND (1<<2)
46 
47 struct snd_rawmidi;
49 struct snd_seq_port_info;
50 struct pid;
51 
53  int (*open) (struct snd_rawmidi_substream * substream);
54  int (*close) (struct snd_rawmidi_substream * substream);
55  void (*trigger) (struct snd_rawmidi_substream * substream, int up);
56  void (*drain) (struct snd_rawmidi_substream * substream);
57 };
58 
60  int (*dev_register) (struct snd_rawmidi * rmidi);
61  int (*dev_unregister) (struct snd_rawmidi * rmidi);
62  void (*get_port_info)(struct snd_rawmidi *rmidi, int number,
63  struct snd_seq_port_info *info);
64 };
65 
68  unsigned int drain: 1, /* drain stage */
69  oss: 1; /* OSS compatible mode */
70  /* midi stream buffer */
71  unsigned char *buffer; /* buffer for MIDI data */
72  size_t buffer_size; /* size of buffer */
73  size_t appl_ptr; /* application pointer */
74  size_t hw_ptr; /* hardware pointer */
75  size_t avail_min; /* min avail for wakeup */
76  size_t avail; /* max used buffer for wakeup */
77  size_t xruns; /* over/underruns counter */
78  /* misc */
81  /* event handler (new bytes, input only) */
83  /* defers calls to event [input] or ops->trigger [output] */
85  /* private data */
86  void *private_data;
88 };
89 
91  struct list_head list; /* list of all substream for given stream */
92  int stream; /* direction */
93  int number; /* substream number */
94  unsigned int opened: 1, /* open flag */
95  append: 1, /* append flag (merge more streams) */
96  active_sensing: 1; /* send active sensing when close */
97  int use_count; /* use counter (for output) */
98  size_t bytes;
99  struct snd_rawmidi *rmidi;
101  char name[32];
103  struct pid *pid;
104  /* hardware layer */
106 };
107 
112 };
113 
115  unsigned int substream_count;
116  unsigned int substream_opened;
118 };
119 
120 struct snd_rawmidi {
121  struct snd_card *card;
122  struct list_head list;
123  unsigned int device; /* device number */
124  unsigned int info_flags; /* SNDRV_RAWMIDI_INFO_XXXX */
125  char id[64];
126  char name[80];
127 
128 #ifdef CONFIG_SND_OSSEMUL
129  int ossreg;
130 #endif
131 
133 
135 
137  void (*private_free) (struct snd_rawmidi *rmidi);
138 
141 
144 
145 #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
146  struct snd_seq_device *seq_dev;
147 #endif
148 };
149 
150 /* main rawmidi functions */
151 
152 int snd_rawmidi_new(struct snd_card *card, char *id, int device,
153  int output_count, int input_count,
154  struct snd_rawmidi **rmidi);
155 void snd_rawmidi_set_ops(struct snd_rawmidi *rmidi, int stream,
156  struct snd_rawmidi_ops *ops);
157 
158 /* callbacks */
159 
160 void snd_rawmidi_receive_reset(struct snd_rawmidi_substream *substream);
161 int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
162  const unsigned char *buffer, int count);
163 void snd_rawmidi_transmit_reset(struct snd_rawmidi_substream *substream);
166  unsigned char *buffer, int count);
167 int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count);
168 int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
169  unsigned char *buffer, int count);
170 
171 /* main midi functions */
172 
175  int mode, struct snd_rawmidi_file *rfile);
178  struct snd_rawmidi_params *params);
179 int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream,
180  struct snd_rawmidi_params *params);
181 int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream);
182 int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream);
183 int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream);
184 long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
185  unsigned char *buf, long count);
186 long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
187  const unsigned char *buf, long count);
188 
189 #endif /* __SOUND_RAWMIDI_H */