xref: /openbmc/linux/sound/core/seq/seq_queue.h (revision cdd38c5f1ce4398ec58fec95904b75824daab7b5)
11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  *   ALSA sequencer Queue handling
41da177e4SLinus Torvalds  *   Copyright (c) 1998-1999 by Frank van de Pol <fvdpol@coil.demon.nl>
51da177e4SLinus Torvalds  */
61da177e4SLinus Torvalds #ifndef __SND_SEQ_QUEUE_H
71da177e4SLinus Torvalds #define __SND_SEQ_QUEUE_H
81da177e4SLinus Torvalds 
91da177e4SLinus Torvalds #include "seq_memory.h"
101da177e4SLinus Torvalds #include "seq_prioq.h"
111da177e4SLinus Torvalds #include "seq_timer.h"
121da177e4SLinus Torvalds #include "seq_lock.h"
131da177e4SLinus Torvalds #include <linux/interrupt.h>
141da177e4SLinus Torvalds #include <linux/list.h>
151da177e4SLinus Torvalds #include <linux/bitops.h>
161da177e4SLinus Torvalds 
171da177e4SLinus Torvalds #define SEQ_QUEUE_NO_OWNER (-1)
181da177e4SLinus Torvalds 
19c7e0b5bfSTakashi Iwai struct snd_seq_queue {
201da177e4SLinus Torvalds 	int queue;		/* queue number */
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds 	char name[64];		/* name of this queue */
231da177e4SLinus Torvalds 
24c7e0b5bfSTakashi Iwai 	struct snd_seq_prioq	*tickq;		/* midi tick event queue */
25c7e0b5bfSTakashi Iwai 	struct snd_seq_prioq	*timeq;		/* real-time event queue */
261da177e4SLinus Torvalds 
27c7e0b5bfSTakashi Iwai 	struct snd_seq_timer *timer;	/* time keeper for this queue */
281da177e4SLinus Torvalds 	int	owner;		/* client that 'owns' the timer */
29*4ebd4703STakashi Iwai 	bool	locked;		/* timer is only accesibble by owner if set */
30*4ebd4703STakashi Iwai 	bool	klocked;	/* kernel lock (after START) */
31*4ebd4703STakashi Iwai 	bool	check_again;	/* concurrent access happened during check */
32*4ebd4703STakashi Iwai 	bool	check_blocked;	/* queue being checked */
331da177e4SLinus Torvalds 
341da177e4SLinus Torvalds 	unsigned int flags;		/* status flags */
351da177e4SLinus Torvalds 	unsigned int info_flags;	/* info for sync */
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds 	spinlock_t owner_lock;
381da177e4SLinus Torvalds 	spinlock_t check_lock;
391da177e4SLinus Torvalds 
401da177e4SLinus Torvalds 	/* clients which uses this queue (bitmap) */
411da177e4SLinus Torvalds 	DECLARE_BITMAP(clients_bitmap, SNDRV_SEQ_MAX_CLIENTS);
421da177e4SLinus Torvalds 	unsigned int clients;	/* users of this queue */
431a60d4c5SIngo Molnar 	struct mutex timer_mutex;
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds 	snd_use_lock_t use_lock;
461da177e4SLinus Torvalds };
471da177e4SLinus Torvalds 
481da177e4SLinus Torvalds 
491da177e4SLinus Torvalds /* get the number of current queues */
501da177e4SLinus Torvalds int snd_seq_queue_get_cur_queues(void);
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds /* delete queues */
531da177e4SLinus Torvalds void snd_seq_queues_delete(void);
541da177e4SLinus Torvalds 
551da177e4SLinus Torvalds 
561da177e4SLinus Torvalds /* create new queue (constructor) */
577e1d90f6SDaniel Mentz struct snd_seq_queue *snd_seq_queue_alloc(int client, int locked, unsigned int flags);
581da177e4SLinus Torvalds 
591da177e4SLinus Torvalds /* delete queue (destructor) */
601da177e4SLinus Torvalds int snd_seq_queue_delete(int client, int queueid);
611da177e4SLinus Torvalds 
621da177e4SLinus Torvalds /* final stage */
631da177e4SLinus Torvalds void snd_seq_queue_client_leave(int client);
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds /* enqueue a event received from one the clients */
66c7e0b5bfSTakashi Iwai int snd_seq_enqueue_event(struct snd_seq_event_cell *cell, int atomic, int hop);
671da177e4SLinus Torvalds 
681da177e4SLinus Torvalds /* Remove events */
691da177e4SLinus Torvalds void snd_seq_queue_client_leave_cells(int client);
70c7e0b5bfSTakashi Iwai void snd_seq_queue_remove_cells(int client, struct snd_seq_remove_events *info);
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds /* return pointer to queue structure for specified id */
73c7e0b5bfSTakashi Iwai struct snd_seq_queue *queueptr(int queueid);
741da177e4SLinus Torvalds /* unlock */
751da177e4SLinus Torvalds #define queuefree(q) snd_use_lock_free(&(q)->use_lock)
761da177e4SLinus Torvalds 
771da177e4SLinus Torvalds /* return the (first) queue matching with the specified name */
78c7e0b5bfSTakashi Iwai struct snd_seq_queue *snd_seq_queue_find_name(char *name);
791da177e4SLinus Torvalds 
801da177e4SLinus Torvalds /* check single queue and dispatch events */
81c7e0b5bfSTakashi Iwai void snd_seq_check_queue(struct snd_seq_queue *q, int atomic, int hop);
821da177e4SLinus Torvalds 
831da177e4SLinus Torvalds /* access to queue's parameters */
841da177e4SLinus Torvalds int snd_seq_queue_check_access(int queueid, int client);
85c7e0b5bfSTakashi Iwai int snd_seq_queue_timer_set_tempo(int queueid, int client, struct snd_seq_queue_tempo *info);
861da177e4SLinus Torvalds int snd_seq_queue_set_owner(int queueid, int client, int locked);
871da177e4SLinus Torvalds int snd_seq_queue_set_locked(int queueid, int client, int locked);
881da177e4SLinus Torvalds int snd_seq_queue_timer_open(int queueid);
891da177e4SLinus Torvalds int snd_seq_queue_timer_close(int queueid);
901da177e4SLinus Torvalds int snd_seq_queue_use(int queueid, int client, int use);
911da177e4SLinus Torvalds int snd_seq_queue_is_used(int queueid, int client);
921da177e4SLinus Torvalds 
93c7e0b5bfSTakashi Iwai int snd_seq_control_queue(struct snd_seq_event *ev, int atomic, int hop);
941da177e4SLinus Torvalds 
951da177e4SLinus Torvalds #endif
96