11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * OSS compatible sequencer driver 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de> 51da177e4SLinus Torvalds * 61da177e4SLinus Torvalds * This program is free software; you can redistribute it and/or modify 71da177e4SLinus Torvalds * it under the terms of the GNU General Public License as published by 81da177e4SLinus Torvalds * the Free Software Foundation; either version 2 of the License, or 91da177e4SLinus Torvalds * (at your option) any later version. 101da177e4SLinus Torvalds * 111da177e4SLinus Torvalds * This program is distributed in the hope that it will be useful, 121da177e4SLinus Torvalds * but WITHOUT ANY WARRANTY; without even the implied warranty of 131da177e4SLinus Torvalds * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 141da177e4SLinus Torvalds * GNU General Public License for more details. 151da177e4SLinus Torvalds * 161da177e4SLinus Torvalds * You should have received a copy of the GNU General Public License 171da177e4SLinus Torvalds * along with this program; if not, write to the Free Software 181da177e4SLinus Torvalds * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 191da177e4SLinus Torvalds */ 201da177e4SLinus Torvalds 211da177e4SLinus Torvalds #ifndef __SEQ_OSS_DEVICE_H 221da177e4SLinus Torvalds #define __SEQ_OSS_DEVICE_H 231da177e4SLinus Torvalds 241da177e4SLinus Torvalds #include <linux/time.h> 251da177e4SLinus Torvalds #include <linux/wait.h> 261da177e4SLinus Torvalds #include <linux/slab.h> 27174cd4b1SIngo Molnar #include <linux/sched/signal.h> 281da177e4SLinus Torvalds #include <sound/core.h> 291da177e4SLinus Torvalds #include <sound/seq_oss.h> 301da177e4SLinus Torvalds #include <sound/rawmidi.h> 311da177e4SLinus Torvalds #include <sound/seq_kernel.h> 321da177e4SLinus Torvalds #include <sound/info.h> 336b580f52STakashi Iwai #include "../seq_clientmgr.h" 341da177e4SLinus Torvalds 351da177e4SLinus Torvalds /* max. applications */ 361da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAX_CLIENTS 16 371da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAX_SYNTH_DEVS 16 381da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAX_MIDI_DEVS 32 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds /* version */ 411da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MAJOR_VERSION 0 421da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_MINOR_VERSION 1 431da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_TINY_VERSION 8 441da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_VERSION_STR "0.1.8" 451da177e4SLinus Torvalds 461da177e4SLinus Torvalds /* device and proc interface name */ 471da177e4SLinus Torvalds #define SNDRV_SEQ_OSS_PROCNAME "oss" 481da177e4SLinus Torvalds 491da177e4SLinus Torvalds 501da177e4SLinus Torvalds /* 511da177e4SLinus Torvalds * type definitions 521da177e4SLinus Torvalds */ 531da177e4SLinus Torvalds 541da177e4SLinus Torvalds typedef unsigned int reltime_t; 551da177e4SLinus Torvalds typedef unsigned int abstime_t; 561da177e4SLinus Torvalds 571da177e4SLinus Torvalds 581da177e4SLinus Torvalds /* 591da177e4SLinus Torvalds * synthesizer channel information 601da177e4SLinus Torvalds */ 61080dece3STakashi Iwai struct seq_oss_chinfo { 621da177e4SLinus Torvalds int note, vel; 631da177e4SLinus Torvalds }; 641da177e4SLinus Torvalds 651da177e4SLinus Torvalds /* 661da177e4SLinus Torvalds * synthesizer information 671da177e4SLinus Torvalds */ 68080dece3STakashi Iwai struct seq_oss_synthinfo { 69080dece3STakashi Iwai struct snd_seq_oss_arg arg; 70080dece3STakashi Iwai struct seq_oss_chinfo *ch; 71080dece3STakashi Iwai struct seq_oss_synth_sysex *sysex; 721da177e4SLinus Torvalds int nr_voices; 731da177e4SLinus Torvalds int opened; 741da177e4SLinus Torvalds int is_midi; 751da177e4SLinus Torvalds int midi_mapped; 761da177e4SLinus Torvalds }; 771da177e4SLinus Torvalds 781da177e4SLinus Torvalds 791da177e4SLinus Torvalds /* 801da177e4SLinus Torvalds * sequencer client information 811da177e4SLinus Torvalds */ 821da177e4SLinus Torvalds 83080dece3STakashi Iwai struct seq_oss_devinfo { 841da177e4SLinus Torvalds 851da177e4SLinus Torvalds int index; /* application index */ 861da177e4SLinus Torvalds int cseq; /* sequencer client number */ 871da177e4SLinus Torvalds int port; /* sequencer port number */ 881da177e4SLinus Torvalds int queue; /* sequencer queue number */ 891da177e4SLinus Torvalds 90080dece3STakashi Iwai struct snd_seq_addr addr; /* address of this device */ 911da177e4SLinus Torvalds 921da177e4SLinus Torvalds int seq_mode; /* sequencer mode */ 931da177e4SLinus Torvalds int file_mode; /* file access */ 941da177e4SLinus Torvalds 951da177e4SLinus Torvalds /* midi device table */ 961da177e4SLinus Torvalds int max_mididev; 971da177e4SLinus Torvalds 981da177e4SLinus Torvalds /* synth device table */ 991da177e4SLinus Torvalds int max_synthdev; 100080dece3STakashi Iwai struct seq_oss_synthinfo synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS]; 1011da177e4SLinus Torvalds int synth_opened; 1021da177e4SLinus Torvalds 1031da177e4SLinus Torvalds /* output queue */ 104080dece3STakashi Iwai struct seq_oss_writeq *writeq; 1051da177e4SLinus Torvalds 1061da177e4SLinus Torvalds /* midi input queue */ 107080dece3STakashi Iwai struct seq_oss_readq *readq; 1081da177e4SLinus Torvalds 1091da177e4SLinus Torvalds /* timer */ 110080dece3STakashi Iwai struct seq_oss_timer *timer; 1111da177e4SLinus Torvalds }; 1121da177e4SLinus Torvalds 1131da177e4SLinus Torvalds 1141da177e4SLinus Torvalds /* 1151da177e4SLinus Torvalds * function prototypes 1161da177e4SLinus Torvalds */ 1171da177e4SLinus Torvalds 1181da177e4SLinus Torvalds /* create/delete OSS sequencer client */ 1191da177e4SLinus Torvalds int snd_seq_oss_create_client(void); 1201da177e4SLinus Torvalds int snd_seq_oss_delete_client(void); 1211da177e4SLinus Torvalds 1221da177e4SLinus Torvalds /* device file interface */ 1231da177e4SLinus Torvalds int snd_seq_oss_open(struct file *file, int level); 124080dece3STakashi Iwai void snd_seq_oss_release(struct seq_oss_devinfo *dp); 125080dece3STakashi Iwai int snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long arg); 126080dece3STakashi Iwai int snd_seq_oss_read(struct seq_oss_devinfo *dev, char __user *buf, int count); 127080dece3STakashi Iwai int snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt); 128680ef72aSAl Viro __poll_t snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait); 1291da177e4SLinus Torvalds 130080dece3STakashi Iwai void snd_seq_oss_reset(struct seq_oss_devinfo *dp); 1311da177e4SLinus Torvalds 1321da177e4SLinus Torvalds /* */ 133080dece3STakashi Iwai void snd_seq_oss_process_queue(struct seq_oss_devinfo *dp, abstime_t time); 1341da177e4SLinus Torvalds 1351da177e4SLinus Torvalds 1361da177e4SLinus Torvalds /* proc interface */ 137080dece3STakashi Iwai void snd_seq_oss_system_info_read(struct snd_info_buffer *buf); 138080dece3STakashi Iwai void snd_seq_oss_midi_info_read(struct snd_info_buffer *buf); 139080dece3STakashi Iwai void snd_seq_oss_synth_info_read(struct snd_info_buffer *buf); 140080dece3STakashi Iwai void snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf); 1411da177e4SLinus Torvalds 1421da177e4SLinus Torvalds /* file mode macros */ 1431da177e4SLinus Torvalds #define is_read_mode(mode) ((mode) & SNDRV_SEQ_OSS_FILE_READ) 1441da177e4SLinus Torvalds #define is_write_mode(mode) ((mode) & SNDRV_SEQ_OSS_FILE_WRITE) 1451da177e4SLinus Torvalds #define is_nonblock_mode(mode) ((mode) & SNDRV_SEQ_OSS_FILE_NONBLOCK) 1461da177e4SLinus Torvalds 1471da177e4SLinus Torvalds /* dispatch event */ 14877933d72SJesper Juhl static inline int 149080dece3STakashi Iwai snd_seq_oss_dispatch(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int atomic, int hop) 1501da177e4SLinus Torvalds { 1511da177e4SLinus Torvalds return snd_seq_kernel_client_dispatch(dp->cseq, ev, atomic, hop); 1521da177e4SLinus Torvalds } 1531da177e4SLinus Torvalds 1546b580f52STakashi Iwai /* ioctl for writeq */ 15577933d72SJesper Juhl static inline int 156080dece3STakashi Iwai snd_seq_oss_control(struct seq_oss_devinfo *dp, unsigned int type, void *arg) 1571da177e4SLinus Torvalds { 1586b580f52STakashi Iwai int err; 1596b580f52STakashi Iwai 1606b580f52STakashi Iwai snd_seq_client_ioctl_lock(dp->cseq); 1616b580f52STakashi Iwai err = snd_seq_kernel_client_ctl(dp->cseq, type, arg); 1626b580f52STakashi Iwai snd_seq_client_ioctl_unlock(dp->cseq); 1636b580f52STakashi Iwai return err; 1641da177e4SLinus Torvalds } 1651da177e4SLinus Torvalds 1661da177e4SLinus Torvalds /* fill the addresses in header */ 16777933d72SJesper Juhl static inline void 168080dece3STakashi Iwai snd_seq_oss_fill_addr(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, 1691da177e4SLinus Torvalds int dest_client, int dest_port) 1701da177e4SLinus Torvalds { 1711da177e4SLinus Torvalds ev->queue = dp->queue; 1721da177e4SLinus Torvalds ev->source = dp->addr; 1731da177e4SLinus Torvalds ev->dest.client = dest_client; 1741da177e4SLinus Torvalds ev->dest.port = dest_port; 1751da177e4SLinus Torvalds } 1761da177e4SLinus Torvalds 1771da177e4SLinus Torvalds 1781da177e4SLinus Torvalds /* misc. functions for proc interface */ 1791da177e4SLinus Torvalds char *enabled_str(int bool); 1801da177e4SLinus Torvalds 1811da177e4SLinus Torvalds #endif /* __SEQ_OSS_DEVICE_H */ 182