2019-05-27 08:55:05 +02:00
/* SPDX-License-Identifier: GPL-2.0-or-later */
2005-04-16 15:20:36 -07:00
/*
* ALSA sequencer Queue handling
* Copyright ( c ) 1998 - 1999 by Frank van de Pol < fvdpol @ coil . demon . nl >
*/
# ifndef __SND_SEQ_QUEUE_H
# define __SND_SEQ_QUEUE_H
# include "seq_memory.h"
# include "seq_prioq.h"
# include "seq_timer.h"
# include "seq_lock.h"
# include <linux/interrupt.h>
# include <linux/list.h>
# include <linux/bitops.h>
# define SEQ_QUEUE_NO_OWNER (-1)
2005-11-17 14:04:02 +01:00
struct snd_seq_queue {
2005-04-16 15:20:36 -07:00
int queue ; /* queue number */
char name [ 64 ] ; /* name of this queue */
2005-11-17 14:04:02 +01:00
struct snd_seq_prioq * tickq ; /* midi tick event queue */
struct snd_seq_prioq * timeq ; /* real-time event queue */
2005-04-16 15:20:36 -07:00
2005-11-17 14:04:02 +01:00
struct snd_seq_timer * timer ; /* time keeper for this queue */
2005-04-16 15:20:36 -07:00
int owner ; /* client that 'owns' the timer */
2020-12-06 09:34:56 +01:00
bool locked ; /* timer is only accesibble by owner if set */
bool klocked ; /* kernel lock (after START) */
bool check_again ; /* concurrent access happened during check */
bool check_blocked ; /* queue being checked */
2005-04-16 15:20:36 -07:00
unsigned int flags ; /* status flags */
unsigned int info_flags ; /* info for sync */
spinlock_t owner_lock ;
spinlock_t check_lock ;
/* clients which uses this queue (bitmap) */
DECLARE_BITMAP ( clients_bitmap , SNDRV_SEQ_MAX_CLIENTS ) ;
unsigned int clients ; /* users of this queue */
2006-01-16 16:29:08 +01:00
struct mutex timer_mutex ;
2005-04-16 15:20:36 -07:00
snd_use_lock_t use_lock ;
} ;
/* get the number of current queues */
int snd_seq_queue_get_cur_queues ( void ) ;
/* delete queues */
void snd_seq_queues_delete ( void ) ;
/* create new queue (constructor) */
2017-08-14 14:46:01 -07:00
struct snd_seq_queue * snd_seq_queue_alloc ( int client , int locked , unsigned int flags ) ;
2005-04-16 15:20:36 -07:00
/* delete queue (destructor) */
int snd_seq_queue_delete ( int client , int queueid ) ;
/* final stage */
void snd_seq_queue_client_leave ( int client ) ;
/* enqueue a event received from one the clients */
2005-11-17 14:04:02 +01:00
int snd_seq_enqueue_event ( struct snd_seq_event_cell * cell , int atomic , int hop ) ;
2005-04-16 15:20:36 -07:00
/* Remove events */
void snd_seq_queue_client_leave_cells ( int client ) ;
2005-11-17 14:04:02 +01:00
void snd_seq_queue_remove_cells ( int client , struct snd_seq_remove_events * info ) ;
2005-04-16 15:20:36 -07:00
/* return pointer to queue structure for specified id */
2005-11-17 14:04:02 +01:00
struct snd_seq_queue * queueptr ( int queueid ) ;
2005-04-16 15:20:36 -07:00
/* unlock */
# define queuefree(q) snd_use_lock_free(&(q)->use_lock)
/* return the (first) queue matching with the specified name */
2005-11-17 14:04:02 +01:00
struct snd_seq_queue * snd_seq_queue_find_name ( char * name ) ;
2005-04-16 15:20:36 -07:00
/* check single queue and dispatch events */
2005-11-17 14:04:02 +01:00
void snd_seq_check_queue ( struct snd_seq_queue * q , int atomic , int hop ) ;
2005-04-16 15:20:36 -07:00
/* access to queue's parameters */
int snd_seq_queue_check_access ( int queueid , int client ) ;
2005-11-17 14:04:02 +01:00
int snd_seq_queue_timer_set_tempo ( int queueid , int client , struct snd_seq_queue_tempo * info ) ;
2005-04-16 15:20:36 -07:00
int snd_seq_queue_set_owner ( int queueid , int client , int locked ) ;
int snd_seq_queue_set_locked ( int queueid , int client , int locked ) ;
int snd_seq_queue_timer_open ( int queueid ) ;
int snd_seq_queue_timer_close ( int queueid ) ;
int snd_seq_queue_use ( int queueid , int client , int use ) ;
int snd_seq_queue_is_used ( int queueid , int client ) ;
2005-11-17 14:04:02 +01:00
int snd_seq_control_queue ( struct snd_seq_event * ev , int atomic , int hop ) ;
2005-04-16 15:20:36 -07:00
# endif