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