home *** CD-ROM | disk | FTP | other *** search
/ PC Welt 2006 November (DVD) / PCWELT_11_2006.ISO / casper / filesystem.squashfs / usr / src / linux-headers-2.6.17-6 / include / sound / rawmidi.h < prev    next >
Encoding:
C/C++ Source or Header  |  2006-08-11  |  6.1 KB  |  187 lines

  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 <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.  
  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.  
  31. #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
  32. #include "seq_device.h"
  33. #endif
  34.  
  35. /*
  36.  *  Raw MIDI interface
  37.  */
  38.  
  39. #define SNDRV_RAWMIDI_DEVICES        8
  40.  
  41. #define SNDRV_RAWMIDI_LFLG_OUTPUT    (1<<0)
  42. #define SNDRV_RAWMIDI_LFLG_INPUT    (1<<1)
  43. #define SNDRV_RAWMIDI_LFLG_OPEN        (3<<0)
  44. #define SNDRV_RAWMIDI_LFLG_APPEND    (1<<2)
  45. #define    SNDRV_RAWMIDI_LFLG_NOOPENLOCK    (1<<3)
  46.  
  47. struct snd_rawmidi;
  48. struct snd_rawmidi_substream;
  49. struct snd_seq_port_info;
  50.  
  51. struct snd_rawmidi_ops {
  52.     int (*open) (struct snd_rawmidi_substream * substream);
  53.     int (*close) (struct snd_rawmidi_substream * substream);
  54.     void (*trigger) (struct snd_rawmidi_substream * substream, int up);
  55.     void (*drain) (struct snd_rawmidi_substream * substream);
  56. };
  57.  
  58. struct snd_rawmidi_global_ops {
  59.     int (*dev_register) (struct snd_rawmidi * rmidi);
  60.     int (*dev_unregister) (struct snd_rawmidi * rmidi);
  61.     void (*get_port_info)(struct snd_rawmidi *rmidi, int number,
  62.                   struct snd_seq_port_info *info);
  63. };
  64.  
  65. struct snd_rawmidi_runtime {
  66.     unsigned int drain: 1,    /* drain stage */
  67.              oss: 1;    /* OSS compatible mode */
  68.     /* midi stream buffer */
  69.     unsigned char *buffer;    /* buffer for MIDI data */
  70.     size_t buffer_size;    /* size of buffer */
  71.     size_t appl_ptr;    /* application pointer */
  72.     size_t hw_ptr;        /* hardware pointer */
  73.     size_t avail_min;    /* min avail for wakeup */
  74.     size_t avail;        /* max used buffer for wakeup */
  75.     size_t xruns;        /* over/underruns counter */
  76.     /* misc */
  77.     spinlock_t lock;
  78.     wait_queue_head_t sleep;
  79.     /* event handler (new bytes, input only) */
  80.     void (*event)(struct snd_rawmidi_substream *substream);
  81.     /* defers calls to event [input] or ops->trigger [output] */
  82.     struct tasklet_struct tasklet;
  83.     /* private data */
  84.     void *private_data;
  85.     void (*private_free)(struct snd_rawmidi_substream *substream);
  86. };
  87.  
  88. struct snd_rawmidi_substream {
  89.     struct list_head list;        /* list of all substream for given stream */
  90.     int stream;            /* direction */
  91.     int number;            /* substream number */
  92.     unsigned int opened: 1,        /* open flag */
  93.              append: 1,        /* append flag (merge more streams) */
  94.              active_sensing: 1; /* send active sensing when close */
  95.     int use_count;            /* use counter (for output) */
  96.     size_t bytes;
  97.     struct snd_rawmidi *rmidi;
  98.     struct snd_rawmidi_str *pstr;
  99.     char name[32];
  100.     struct snd_rawmidi_runtime *runtime;
  101.     /* hardware layer */
  102.     struct snd_rawmidi_ops *ops;
  103. };
  104.  
  105. struct snd_rawmidi_file {
  106.     struct snd_rawmidi *rmidi;
  107.     struct snd_rawmidi_substream *input;
  108.     struct snd_rawmidi_substream *output;
  109. };
  110.  
  111. struct snd_rawmidi_str {
  112.     unsigned int substream_count;
  113.     unsigned int substream_opened;
  114.     struct list_head substreams;
  115. };
  116.  
  117. struct snd_rawmidi {
  118.     struct snd_card *card;
  119.     struct list_head list;
  120.     unsigned int device;        /* device number */
  121.     unsigned int info_flags;    /* SNDRV_RAWMIDI_INFO_XXXX */
  122.     char id[64];
  123.     char name[80];
  124.  
  125. #ifdef CONFIG_SND_OSSEMUL
  126.     int ossreg;
  127. #endif
  128.  
  129.     struct snd_rawmidi_global_ops *ops;
  130.  
  131.     struct snd_rawmidi_str streams[2];
  132.  
  133.     void *private_data;
  134.     void (*private_free) (struct snd_rawmidi *rmidi);
  135.  
  136.     struct mutex open_mutex;
  137.     wait_queue_head_t open_wait;
  138.  
  139.     struct snd_info_entry *dev;
  140.     struct snd_info_entry *proc_entry;
  141.  
  142. #if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
  143.     struct snd_seq_device *seq_dev;
  144. #endif
  145. };
  146.  
  147. /* main rawmidi functions */
  148.  
  149. int snd_rawmidi_new(struct snd_card *card, char *id, int device,
  150.             int output_count, int input_count,
  151.             struct snd_rawmidi **rmidi);
  152. void snd_rawmidi_set_ops(struct snd_rawmidi *rmidi, int stream,
  153.              struct snd_rawmidi_ops *ops);
  154.  
  155. /* callbacks */
  156.  
  157. void snd_rawmidi_receive_reset(struct snd_rawmidi_substream *substream);
  158. int snd_rawmidi_receive(struct snd_rawmidi_substream *substream,
  159.             const unsigned char *buffer, int count);
  160. void snd_rawmidi_transmit_reset(struct snd_rawmidi_substream *substream);
  161. int snd_rawmidi_transmit_empty(struct snd_rawmidi_substream *substream);
  162. int snd_rawmidi_transmit_peek(struct snd_rawmidi_substream *substream,
  163.                   unsigned char *buffer, int count);
  164. int snd_rawmidi_transmit_ack(struct snd_rawmidi_substream *substream, int count);
  165. int snd_rawmidi_transmit(struct snd_rawmidi_substream *substream,
  166.              unsigned char *buffer, int count);
  167.  
  168. /* main midi functions */
  169.  
  170. int snd_rawmidi_info_select(struct snd_card *card, struct snd_rawmidi_info *info);
  171. int snd_rawmidi_kernel_open(struct snd_card *card, int device, int subdevice,
  172.                 int mode, struct snd_rawmidi_file *rfile);
  173. int snd_rawmidi_kernel_release(struct snd_rawmidi_file *rfile);
  174. int snd_rawmidi_output_params(struct snd_rawmidi_substream *substream,
  175.                   struct snd_rawmidi_params *params);
  176. int snd_rawmidi_input_params(struct snd_rawmidi_substream *substream,
  177.                  struct snd_rawmidi_params *params);
  178. int snd_rawmidi_drop_output(struct snd_rawmidi_substream *substream);
  179. int snd_rawmidi_drain_output(struct snd_rawmidi_substream *substream);
  180. int snd_rawmidi_drain_input(struct snd_rawmidi_substream *substream);
  181. long snd_rawmidi_kernel_read(struct snd_rawmidi_substream *substream,
  182.                  unsigned char *buf, long count);
  183. long snd_rawmidi_kernel_write(struct snd_rawmidi_substream *substream,
  184.                   const unsigned char *buf, long count);
  185.  
  186. #endif /* __SOUND_RAWMIDI_H */
  187.