2019-05-27 08:55:05 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-04-16 15:20:36 -07:00
# ifndef __SOUND_RAWMIDI_H
# define __SOUND_RAWMIDI_H
/*
* Abstract layer for MIDI v1 .0 stream
2007-10-15 09:50:19 +02:00
* Copyright ( c ) by Jaroslav Kysela < perex @ perex . cz >
2005-04-16 15:20:36 -07:00
*/
# include <sound/asound.h>
# include <linux/interrupt.h>
# include <linux/spinlock.h>
# include <linux/wait.h>
2006-01-16 16:29:08 +01:00
# include <linux/mutex.h>
2011-06-14 14:37:06 +02:00
# include <linux/workqueue.h>
2015-01-29 17:55:52 +01:00
# include <linux/device.h>
2005-04-16 15:20:36 -07:00
2017-05-12 11:44:03 +02:00
# if IS_ENABLED(CONFIG_SND_SEQUENCER)
2012-10-02 18:01:25 +01:00
# include <sound/seq_device.h>
2005-04-16 15:20:36 -07: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 13:56:51 +01:00
struct snd_rawmidi ;
struct snd_rawmidi_substream ;
2006-05-02 16:22:12 +02:00
struct snd_seq_port_info ;
2009-11-10 10:14:04 +01:00
struct pid ;
2005-04-16 15:20:36 -07:00
2005-11-17 13:56:51 +01: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-16 15:20:36 -07:00
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_global_ops {
int ( * dev_register ) ( struct snd_rawmidi * rmidi ) ;
int ( * dev_unregister ) ( struct snd_rawmidi * rmidi ) ;
2006-05-02 16:22:12 +02:00
void ( * get_port_info ) ( struct snd_rawmidi * rmidi , int number ,
struct snd_seq_port_info * info ) ;
2005-11-17 13:56:51 +01:00
} ;
2005-04-16 15:20:36 -07:00
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_runtime {
2011-06-14 14:37:06 +02:00
struct snd_rawmidi_substream * substream ;
2005-04-16 15:20:36 -07: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 */
2020-05-07 13:44:56 +02:00
int buffer_ref ; /* buffer reference count */
2005-04-16 15:20:36 -07:00
/* misc */
spinlock_t lock ;
wait_queue_head_t sleep ;
/* event handler (new bytes, input only) */
2005-11-17 13:56:51 +01:00
void ( * event ) ( struct snd_rawmidi_substream * substream ) ;
2005-04-16 15:20:36 -07:00
/* defers calls to event [input] or ops->trigger [output] */
2011-06-14 14:37:06 +02:00
struct work_struct event_work ;
2005-04-16 15:20:36 -07:00
/* private data */
void * private_data ;
2005-11-17 13:56:51 +01:00
void ( * private_free ) ( struct snd_rawmidi_substream * substream ) ;
2005-04-16 15:20:36 -07:00
} ;
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_substream {
2005-04-16 15:20:36 -07:00
struct list_head list ; /* list of all substream for given stream */
int stream ; /* direction */
int number ; /* substream number */
2020-02-14 12:13:16 +01:00
bool opened ; /* open flag */
bool append ; /* append flag (merge more streams) */
bool active_sensing ; /* send active sensing when close */
2021-05-15 09:15:33 +02:00
unsigned int framing ; /* whether to frame input data */
unsigned int clock_type ; /* clock source to use for input framing */
2005-04-16 15:20:36 -07:00
int use_count ; /* use counter (for output) */
size_t bytes ;
2005-11-17 13:56:51 +01:00
struct snd_rawmidi * rmidi ;
struct snd_rawmidi_str * pstr ;
2005-04-16 15:20:36 -07:00
char name [ 32 ] ;
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_runtime * runtime ;
2009-11-10 10:14:04 +01:00
struct pid * pid ;
2005-04-16 15:20:36 -07:00
/* hardware layer */
2017-01-05 17:01:14 +01:00
const struct snd_rawmidi_ops * ops ;
2005-04-16 15:20:36 -07:00
} ;
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_file {
struct snd_rawmidi * rmidi ;
struct snd_rawmidi_substream * input ;
struct snd_rawmidi_substream * output ;
2021-09-20 19:18:50 +02:00
unsigned int user_pversion ; /* supported protocol version */
2005-11-17 13:56:51 +01:00
} ;
2005-04-16 15:20:36 -07:00
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_str {
2005-04-16 15:20:36 -07:00
unsigned int substream_count ;
unsigned int substream_opened ;
struct list_head substreams ;
} ;
2005-11-17 13:56:51 +01:00
struct snd_rawmidi {
struct snd_card * card ;
2005-11-20 14:06:59 +01:00
struct list_head list ;
2005-04-16 15:20:36 -07: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
2015-11-22 08:55:07 +01:00
const struct snd_rawmidi_global_ops * ops ;
2005-04-16 15:20:36 -07:00
2005-11-17 13:56:51 +01:00
struct snd_rawmidi_str streams [ 2 ] ;
2005-04-16 15:20:36 -07:00
void * private_data ;
2005-11-17 13:56:51 +01:00
void ( * private_free ) ( struct snd_rawmidi * rmidi ) ;
2005-04-16 15:20:36 -07:00
2006-01-16 16:29:08 +01:00
struct mutex open_mutex ;
2005-04-16 15:20:36 -07:00
wait_queue_head_t open_wait ;
2015-01-29 17:55:52 +01:00
struct device dev ;
2005-11-17 13:56:51 +01:00
struct snd_info_entry * proc_entry ;
2005-04-16 15:20:36 -07:00
2017-05-12 11:44:03 +02:00
# if IS_ENABLED(CONFIG_SND_SEQUENCER)
2005-11-17 13:56:51 +01:00
struct snd_seq_device * seq_dev ;
2005-04-16 15:20:36 -07:00
# endif
} ;
/* main rawmidi functions */
2005-11-17 13:56:51 +01:00
int snd_rawmidi_new ( struct snd_card * card , char * id , int device ,
2005-04-16 15:20:36 -07:00
int output_count , int input_count ,
2005-11-17 13:56:51 +01:00
struct snd_rawmidi * * rmidi ) ;
void snd_rawmidi_set_ops ( struct snd_rawmidi * rmidi , int stream ,
2017-01-05 17:01:14 +01:00
const struct snd_rawmidi_ops * ops ) ;
2005-04-16 15:20:36 -07:00
/* callbacks */
2005-11-17 13:56:51 +01:00
int snd_rawmidi_receive ( struct snd_rawmidi_substream * substream ,
const unsigned char * buffer , int count ) ;
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 ) ;
2016-01-31 11:57:41 +01:00
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 ) ;
2018-09-13 08:20:43 +02:00
int snd_rawmidi_proceed ( struct snd_rawmidi_substream * substream ) ;
2005-04-16 15:20:36 -07:00
/* main midi functions */
2005-11-17 13:56:51 +01:00
int snd_rawmidi_info_select ( struct snd_card * card , struct snd_rawmidi_info * info ) ;
2005-11-20 14:06:59 +01:00
int snd_rawmidi_kernel_open ( struct snd_card * card , int device , int subdevice ,
int mode , struct snd_rawmidi_file * rfile ) ;
2005-11-17 13:56:51 +01: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-16 15:20:36 -07:00
# endif /* __SOUND_RAWMIDI_H */