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