2005-04-17 02:20:36 +04:00
# ifndef __SOUND_RAWMIDI_H
# define __SOUND_RAWMIDI_H
/*
* Abstract layer for MIDI v1 .0 stream
2007-10-15 11:50:19 +04:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-17 02:20:36 +04:00
*
*
* 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 <sound/asound.h>
# include <linux/interrupt.h>
# include <linux/spinlock.h>
# include <linux/wait.h>
2006-01-16 18:29:08 +03:00
# include <linux/mutex.h>
2011-06-14 16:37:06 +04:00
# include <linux/workqueue.h>
2005-04-17 02:20:36 +04:00
# if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
2012-10-02 21:01:25 +04:00
# include <sound/seq_device.h>
2005-04-17 02:20:36 +04:00
# endif
/*
* Raw MIDI interface
*/
# define SNDRV_RAWMIDI_DEVICES 8
# define SNDRV_RAWMIDI_LFLG_OUTPUT (1<<0)
# define SNDRV_RAWMIDI_LFLG_INPUT (1<<1)
# define SNDRV_RAWMIDI_LFLG_OPEN (3<<0)
# define SNDRV_RAWMIDI_LFLG_APPEND (1<<2)
2005-11-17 15:56:51 +03:00
struct snd_rawmidi ;
struct snd_rawmidi_substream ;
2006-05-02 18:22:12 +04:00
struct snd_seq_port_info ;
2009-11-10 12:14:04 +03:00
struct pid ;
2005-04-17 02:20:36 +04:00
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_ops {
int ( * open ) ( struct snd_rawmidi_substream * substream ) ;
int ( * close ) ( struct snd_rawmidi_substream * substream ) ;
void ( * trigger ) ( struct snd_rawmidi_substream * substream , int up ) ;
void ( * drain ) ( struct snd_rawmidi_substream * substream ) ;
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_global_ops {
int ( * dev_register ) ( struct snd_rawmidi * rmidi ) ;
int ( * dev_unregister ) ( struct snd_rawmidi * rmidi ) ;
2006-05-02 18:22:12 +04:00
void ( * get_port_info ) ( struct snd_rawmidi * rmidi , int number ,
struct snd_seq_port_info * info ) ;
2005-11-17 15:56:51 +03:00
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_runtime {
2011-06-14 16:37:06 +04:00
struct snd_rawmidi_substream * substream ;
2005-04-17 02:20:36 +04:00
unsigned int drain : 1 , /* drain stage */
oss : 1 ; /* OSS compatible mode */
/* midi stream buffer */
unsigned char * buffer ; /* buffer for MIDI data */
size_t buffer_size ; /* size of buffer */
size_t appl_ptr ; /* application pointer */
size_t hw_ptr ; /* hardware pointer */
size_t avail_min ; /* min avail for wakeup */
size_t avail ; /* max used buffer for wakeup */
size_t xruns ; /* over/underruns counter */
/* misc */
spinlock_t lock ;
wait_queue_head_t sleep ;
/* event handler (new bytes, input only) */
2005-11-17 15:56:51 +03:00
void ( * event ) ( struct snd_rawmidi_substream * substream ) ;
2005-04-17 02:20:36 +04:00
/* defers calls to event [input] or ops->trigger [output] */
2011-06-14 16:37:06 +04:00
struct work_struct event_work ;
2005-04-17 02:20:36 +04:00
/* private data */
void * private_data ;
2005-11-17 15:56:51 +03:00
void ( * private_free ) ( struct snd_rawmidi_substream * substream ) ;
2005-04-17 02:20:36 +04:00
} ;
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_substream {
2005-04-17 02:20:36 +04:00
struct list_head list ; /* list of all substream for given stream */
int stream ; /* direction */
int number ; /* substream number */
unsigned int opened : 1 , /* open flag */
append : 1 , /* append flag (merge more streams) */
active_sensing : 1 ; /* send active sensing when close */
int use_count ; /* use counter (for output) */
size_t bytes ;
2005-11-17 15:56:51 +03:00
struct snd_rawmidi * rmidi ;
struct snd_rawmidi_str * pstr ;
2005-04-17 02:20:36 +04:00
char name [ 32 ] ;
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_runtime * runtime ;
2009-11-10 12:14:04 +03:00
struct pid * pid ;
2005-04-17 02:20:36 +04:00
/* hardware layer */
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_ops * ops ;
2005-04-17 02:20:36 +04:00
} ;
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_file {
struct snd_rawmidi * rmidi ;
struct snd_rawmidi_substream * input ;
struct snd_rawmidi_substream * output ;
} ;
2005-04-17 02:20:36 +04:00
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_str {
2005-04-17 02:20:36 +04:00
unsigned int substream_count ;
unsigned int substream_opened ;
struct list_head substreams ;
} ;
2005-11-17 15:56:51 +03:00
struct snd_rawmidi {
struct snd_card * card ;
2005-11-20 16:06:59 +03:00
struct list_head list ;
2005-04-17 02:20:36 +04:00
unsigned int device ; /* device number */
unsigned int info_flags ; /* SNDRV_RAWMIDI_INFO_XXXX */
char id [ 64 ] ;
char name [ 80 ] ;
# ifdef CONFIG_SND_OSSEMUL
int ossreg ;
# endif
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_global_ops * ops ;
2005-04-17 02:20:36 +04:00
2005-11-17 15:56:51 +03:00
struct snd_rawmidi_str streams [ 2 ] ;
2005-04-17 02:20:36 +04:00
void * private_data ;
2005-11-17 15:56:51 +03:00
void ( * private_free ) ( struct snd_rawmidi * rmidi ) ;
2005-04-17 02:20:36 +04:00
2006-01-16 18:29:08 +03:00
struct mutex open_mutex ;
2005-04-17 02:20:36 +04:00
wait_queue_head_t open_wait ;
2005-11-17 15:56:51 +03:00
struct snd_info_entry * dev ;
struct snd_info_entry * proc_entry ;
2005-04-17 02:20:36 +04:00
# if defined(CONFIG_SND_SEQUENCER) || defined(CONFIG_SND_SEQUENCER_MODULE)
2005-11-17 15:56:51 +03:00
struct snd_seq_device * seq_dev ;
2005-04-17 02:20:36 +04:00
# endif
} ;
/* main rawmidi functions */
2005-11-17 15:56:51 +03:00
int snd_rawmidi_new ( struct snd_card * card , char * id , int device ,
2005-04-17 02:20:36 +04:00
int output_count , int input_count ,
2005-11-17 15:56:51 +03:00
struct snd_rawmidi * * rmidi ) ;
void snd_rawmidi_set_ops ( struct snd_rawmidi * rmidi , int stream ,
struct snd_rawmidi_ops * ops ) ;
2005-04-17 02:20:36 +04:00
/* callbacks */
2005-11-17 15:56:51 +03:00
void snd_rawmidi_receive_reset ( struct snd_rawmidi_substream * substream ) ;
int snd_rawmidi_receive ( struct snd_rawmidi_substream * substream ,
const unsigned char * buffer , int count ) ;
void snd_rawmidi_transmit_reset ( struct snd_rawmidi_substream * substream ) ;
int snd_rawmidi_transmit_empty ( struct snd_rawmidi_substream * substream ) ;
int snd_rawmidi_transmit_peek ( struct snd_rawmidi_substream * substream ,
unsigned char * buffer , int count ) ;
int snd_rawmidi_transmit_ack ( struct snd_rawmidi_substream * substream , int count ) ;
int snd_rawmidi_transmit ( struct snd_rawmidi_substream * substream ,
unsigned char * buffer , int count ) ;
2005-04-17 02:20:36 +04:00
/* main midi functions */
2005-11-17 15:56:51 +03:00
int snd_rawmidi_info_select ( struct snd_card * card , struct snd_rawmidi_info * info ) ;
2005-11-20 16:06:59 +03:00
int snd_rawmidi_kernel_open ( struct snd_card * card , int device , int subdevice ,
int mode , struct snd_rawmidi_file * rfile ) ;
2005-11-17 15:56:51 +03:00
int snd_rawmidi_kernel_release ( struct snd_rawmidi_file * rfile ) ;
int snd_rawmidi_output_params ( struct snd_rawmidi_substream * substream ,
struct snd_rawmidi_params * params ) ;
int snd_rawmidi_input_params ( struct snd_rawmidi_substream * substream ,
struct snd_rawmidi_params * params ) ;
int snd_rawmidi_drop_output ( struct snd_rawmidi_substream * substream ) ;
int snd_rawmidi_drain_output ( struct snd_rawmidi_substream * substream ) ;
int snd_rawmidi_drain_input ( struct snd_rawmidi_substream * substream ) ;
long snd_rawmidi_kernel_read ( struct snd_rawmidi_substream * substream ,
unsigned char * buf , long count ) ;
long snd_rawmidi_kernel_write ( struct snd_rawmidi_substream * substream ,
const unsigned char * buf , long count ) ;
2005-04-17 02:20:36 +04:00
# endif /* __SOUND_RAWMIDI_H */