11a59d1b8SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-or-later */
21da177e4SLinus Torvalds /*
31da177e4SLinus Torvalds  * OSS compatible sequencer driver
41da177e4SLinus Torvalds  *
51da177e4SLinus Torvalds  * Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>
61da177e4SLinus Torvalds  */
71da177e4SLinus Torvalds 
81da177e4SLinus Torvalds #ifndef __SEQ_OSS_DEVICE_H
91da177e4SLinus Torvalds #define __SEQ_OSS_DEVICE_H
101da177e4SLinus Torvalds 
111da177e4SLinus Torvalds #include <linux/time.h>
121da177e4SLinus Torvalds #include <linux/wait.h>
131da177e4SLinus Torvalds #include <linux/slab.h>
14174cd4b1SIngo Molnar #include <linux/sched/signal.h>
151da177e4SLinus Torvalds #include <sound/core.h>
161da177e4SLinus Torvalds #include <sound/seq_oss.h>
171da177e4SLinus Torvalds #include <sound/rawmidi.h>
181da177e4SLinus Torvalds #include <sound/seq_kernel.h>
191da177e4SLinus Torvalds #include <sound/info.h>
206b580f52STakashi Iwai #include "../seq_clientmgr.h"
211da177e4SLinus Torvalds 
221da177e4SLinus Torvalds /* max. applications */
231da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAX_CLIENTS	16
241da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAX_SYNTH_DEVS	16
251da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAX_MIDI_DEVS	32
261da177e4SLinus Torvalds 
271da177e4SLinus Torvalds /* version */
281da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAJOR_VERSION	0
291da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MINOR_VERSION	1
301da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_TINY_VERSION	8
311da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_VERSION_STR	"0.1.8"
321da177e4SLinus Torvalds 
331da177e4SLinus Torvalds /* device and proc interface name */
341da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_PROCNAME		"oss"
351da177e4SLinus Torvalds 
361da177e4SLinus Torvalds 
371da177e4SLinus Torvalds /*
381da177e4SLinus Torvalds  * type definitions
391da177e4SLinus Torvalds  */
401da177e4SLinus Torvalds 
411da177e4SLinus Torvalds typedef unsigned int reltime_t;
421da177e4SLinus Torvalds typedef unsigned int abstime_t;
431da177e4SLinus Torvalds 
441da177e4SLinus Torvalds 
451da177e4SLinus Torvalds /*
461da177e4SLinus Torvalds  * synthesizer channel information
471da177e4SLinus Torvalds  */
48080dece3STakashi Iwai struct seq_oss_chinfo {
491da177e4SLinus Torvalds 	int note, vel;
501da177e4SLinus Torvalds };
511da177e4SLinus Torvalds 
521da177e4SLinus Torvalds /*
531da177e4SLinus Torvalds  * synthesizer information
541da177e4SLinus Torvalds  */
55080dece3STakashi Iwai struct seq_oss_synthinfo {
56080dece3STakashi Iwai 	struct snd_seq_oss_arg arg;
57080dece3STakashi Iwai 	struct seq_oss_chinfo *ch;
58080dece3STakashi Iwai 	struct seq_oss_synth_sysex *sysex;
591da177e4SLinus Torvalds 	int nr_voices;
601da177e4SLinus Torvalds 	int opened;
611da177e4SLinus Torvalds 	int is_midi;
621da177e4SLinus Torvalds 	int midi_mapped;
631da177e4SLinus Torvalds };
641da177e4SLinus Torvalds 
651da177e4SLinus Torvalds 
661da177e4SLinus Torvalds /*
671da177e4SLinus Torvalds  * sequencer client information
681da177e4SLinus Torvalds  */
691da177e4SLinus Torvalds 
70080dece3STakashi Iwai struct seq_oss_devinfo {
711da177e4SLinus Torvalds 
721da177e4SLinus Torvalds 	int index;	/* application index */
731da177e4SLinus Torvalds 	int cseq;	/* sequencer client number */
741da177e4SLinus Torvalds 	int port;	/* sequencer port number */
751da177e4SLinus Torvalds 	int queue;	/* sequencer queue number */
761da177e4SLinus Torvalds 
77080dece3STakashi Iwai 	struct snd_seq_addr addr;	/* address of this device */
781da177e4SLinus Torvalds 
791da177e4SLinus Torvalds 	int seq_mode;	/* sequencer mode */
801da177e4SLinus Torvalds 	int file_mode;	/* file access */
811da177e4SLinus Torvalds 
821da177e4SLinus Torvalds 	/* midi device table */
831da177e4SLinus Torvalds 	int max_mididev;
841da177e4SLinus Torvalds 
851da177e4SLinus Torvalds 	/* synth device table */
861da177e4SLinus Torvalds 	int max_synthdev;
87080dece3STakashi Iwai 	struct seq_oss_synthinfo synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS];
881da177e4SLinus Torvalds 	int synth_opened;
891da177e4SLinus Torvalds 
901da177e4SLinus Torvalds 	/* output queue */
91080dece3STakashi Iwai 	struct seq_oss_writeq *writeq;
921da177e4SLinus Torvalds 
931da177e4SLinus Torvalds 	/* midi input queue */
94080dece3STakashi Iwai 	struct seq_oss_readq *readq;
951da177e4SLinus Torvalds 
961da177e4SLinus Torvalds 	/* timer */
97080dece3STakashi Iwai 	struct seq_oss_timer *timer;
981da177e4SLinus Torvalds };
991da177e4SLinus Torvalds 
1001da177e4SLinus Torvalds 
1011da177e4SLinus Torvalds /*
1021da177e4SLinus Torvalds  * function prototypes
1031da177e4SLinus Torvalds  */
1041da177e4SLinus Torvalds 
1051da177e4SLinus Torvalds /* create/delete OSS sequencer client */
1061da177e4SLinus Torvalds int snd_seq_oss_create_client(void);
1071da177e4SLinus Torvalds int snd_seq_oss_delete_client(void);
1081da177e4SLinus Torvalds 
1091da177e4SLinus Torvalds /* device file interface */
1101da177e4SLinus Torvalds int snd_seq_oss_open(struct file *file, int level);
111080dece3STakashi Iwai void snd_seq_oss_release(struct seq_oss_devinfo *dp);
112080dece3STakashi Iwai int snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long arg);
113080dece3STakashi Iwai int snd_seq_oss_read(struct seq_oss_devinfo *dev, char __user *buf, int count);
114080dece3STakashi Iwai int snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt);
115680ef72aSAl Viro __poll_t snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait);
1161da177e4SLinus Torvalds 
117080dece3STakashi Iwai void snd_seq_oss_reset(struct seq_oss_devinfo *dp);
1181da177e4SLinus Torvalds 
1191da177e4SLinus Torvalds /* */
120080dece3STakashi Iwai void snd_seq_oss_process_queue(struct seq_oss_devinfo *dp, abstime_t time);
1211da177e4SLinus Torvalds 
1221da177e4SLinus Torvalds 
1231da177e4SLinus Torvalds /* proc interface */
124080dece3STakashi Iwai void snd_seq_oss_system_info_read(struct snd_info_buffer *buf);
125080dece3STakashi Iwai void snd_seq_oss_midi_info_read(struct snd_info_buffer *buf);
126080dece3STakashi Iwai void snd_seq_oss_synth_info_read(struct snd_info_buffer *buf);
127080dece3STakashi Iwai void snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf);
1281da177e4SLinus Torvalds 
1291da177e4SLinus Torvalds /* file mode macros */
1301da177e4SLinus Torvalds #define is_read_mode(mode)	((mode) & SNDRV_SEQ_OSS_FILE_READ)
1311da177e4SLinus Torvalds #define is_write_mode(mode)	((mode) & SNDRV_SEQ_OSS_FILE_WRITE)
1321da177e4SLinus Torvalds #define is_nonblock_mode(mode)	((mode) & SNDRV_SEQ_OSS_FILE_NONBLOCK)
1331da177e4SLinus Torvalds 
1341da177e4SLinus Torvalds /* dispatch event */
13577933d72SJesper Juhl static inline int
snd_seq_oss_dispatch(struct seq_oss_devinfo * dp,struct snd_seq_event * ev,int atomic,int hop)136080dece3STakashi Iwai snd_seq_oss_dispatch(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int atomic, int hop)
1371da177e4SLinus Torvalds {
1381da177e4SLinus Torvalds 	return snd_seq_kernel_client_dispatch(dp->cseq, ev, atomic, hop);
1391da177e4SLinus Torvalds }
1401da177e4SLinus Torvalds 
1416b580f52STakashi Iwai /* ioctl for writeq */
14277933d72SJesper Juhl static inline int
snd_seq_oss_control(struct seq_oss_devinfo * dp,unsigned int type,void * arg)143080dece3STakashi Iwai snd_seq_oss_control(struct seq_oss_devinfo *dp, unsigned int type, void *arg)
1441da177e4SLinus Torvalds {
1456b580f52STakashi Iwai 	int err;
1466b580f52STakashi Iwai 
1476b580f52STakashi Iwai 	snd_seq_client_ioctl_lock(dp->cseq);
1486b580f52STakashi Iwai 	err = snd_seq_kernel_client_ctl(dp->cseq, type, arg);
1496b580f52STakashi Iwai 	snd_seq_client_ioctl_unlock(dp->cseq);
1506b580f52STakashi Iwai 	return err;
1511da177e4SLinus Torvalds }
1521da177e4SLinus Torvalds 
1531da177e4SLinus Torvalds /* fill the addresses in header */
15477933d72SJesper Juhl static inline void
snd_seq_oss_fill_addr(struct seq_oss_devinfo * dp,struct snd_seq_event * ev,int dest_client,int dest_port)155080dece3STakashi Iwai snd_seq_oss_fill_addr(struct seq_oss_devinfo *dp, struct snd_seq_event *ev,
1561da177e4SLinus Torvalds 		     int dest_client, int dest_port)
1571da177e4SLinus Torvalds {
1581da177e4SLinus Torvalds 	ev->queue = dp->queue;
1591da177e4SLinus Torvalds 	ev->source = dp->addr;
1601da177e4SLinus Torvalds 	ev->dest.client = dest_client;
1611da177e4SLinus Torvalds 	ev->dest.port = dest_port;
1621da177e4SLinus Torvalds }
1631da177e4SLinus Torvalds 
1641da177e4SLinus Torvalds 
1651da177e4SLinus Torvalds /* misc. functions for proc interface */
1661da177e4SLinus Torvalds char *enabled_str(int bool);
1671da177e4SLinus Torvalds 
1681da177e4SLinus Torvalds #endif /* __SEQ_OSS_DEVICE_H */
169