seq_oss_device.h 4.53 KB
Newer Older
Linus Torvalds's avatar
Linus Torvalds committed
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26
/*
 * OSS compatible sequencer driver
 *
 * Copyright (C) 1998,99 Takashi Iwai <tiwai@suse.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
 */

#ifndef __SEQ_OSS_DEVICE_H
#define __SEQ_OSS_DEVICE_H

#include <linux/time.h>
#include <linux/wait.h>
#include <linux/slab.h>
27
#include <linux/sched/signal.h>
Linus Torvalds's avatar
Linus Torvalds committed
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
#include <sound/core.h>
#include <sound/seq_oss.h>
#include <sound/rawmidi.h>
#include <sound/seq_kernel.h>
#include <sound/info.h>

/* max. applications */
#define SNDRV_SEQ_OSS_MAX_CLIENTS	16
#define SNDRV_SEQ_OSS_MAX_SYNTH_DEVS	16
#define SNDRV_SEQ_OSS_MAX_MIDI_DEVS	32

/* version */
#define SNDRV_SEQ_OSS_MAJOR_VERSION	0
#define SNDRV_SEQ_OSS_MINOR_VERSION	1
#define SNDRV_SEQ_OSS_TINY_VERSION	8
#define SNDRV_SEQ_OSS_VERSION_STR	"0.1.8"

/* device and proc interface name */
#define SNDRV_SEQ_OSS_PROCNAME		"oss"


/*
 * type definitions
 */

typedef unsigned int reltime_t;
typedef unsigned int abstime_t;


/*
 * synthesizer channel information
 */
60
struct seq_oss_chinfo {
Linus Torvalds's avatar
Linus Torvalds committed
61 62 63 64 65 66
	int note, vel;
};

/*
 * synthesizer information
 */
67 68 69 70
struct seq_oss_synthinfo {
	struct snd_seq_oss_arg arg;
	struct seq_oss_chinfo *ch;
	struct seq_oss_synth_sysex *sysex;
Linus Torvalds's avatar
Linus Torvalds committed
71 72 73 74 75 76 77 78 79 80 81
	int nr_voices;
	int opened;
	int is_midi;
	int midi_mapped;
};


/*
 * sequencer client information
 */

82
struct seq_oss_devinfo {
Linus Torvalds's avatar
Linus Torvalds committed
83 84 85 86 87 88

	int index;	/* application index */
	int cseq;	/* sequencer client number */
	int port;	/* sequencer port number */
	int queue;	/* sequencer queue number */

89
	struct snd_seq_addr addr;	/* address of this device */
Linus Torvalds's avatar
Linus Torvalds committed
90 91 92 93 94 95 96 97 98

	int seq_mode;	/* sequencer mode */
	int file_mode;	/* file access */

	/* midi device table */
	int max_mididev;

	/* synth device table */
	int max_synthdev;
99
	struct seq_oss_synthinfo synths[SNDRV_SEQ_OSS_MAX_SYNTH_DEVS];
Linus Torvalds's avatar
Linus Torvalds committed
100 101 102
	int synth_opened;

	/* output queue */
103
	struct seq_oss_writeq *writeq;
Linus Torvalds's avatar
Linus Torvalds committed
104 105

	/* midi input queue */
106
	struct seq_oss_readq *readq;
Linus Torvalds's avatar
Linus Torvalds committed
107 108

	/* timer */
109
	struct seq_oss_timer *timer;
Linus Torvalds's avatar
Linus Torvalds committed
110 111 112 113 114 115 116 117 118 119 120 121 122
};


/*
 * function prototypes
 */

/* create/delete OSS sequencer client */
int snd_seq_oss_create_client(void);
int snd_seq_oss_delete_client(void);

/* device file interface */
int snd_seq_oss_open(struct file *file, int level);
123 124 125 126
void snd_seq_oss_release(struct seq_oss_devinfo *dp);
int snd_seq_oss_ioctl(struct seq_oss_devinfo *dp, unsigned int cmd, unsigned long arg);
int snd_seq_oss_read(struct seq_oss_devinfo *dev, char __user *buf, int count);
int snd_seq_oss_write(struct seq_oss_devinfo *dp, const char __user *buf, int count, struct file *opt);
127
__poll_t snd_seq_oss_poll(struct seq_oss_devinfo *dp, struct file *file, poll_table * wait);
Linus Torvalds's avatar
Linus Torvalds committed
128

129
void snd_seq_oss_reset(struct seq_oss_devinfo *dp);
Linus Torvalds's avatar
Linus Torvalds committed
130 131

/* */
132
void snd_seq_oss_process_queue(struct seq_oss_devinfo *dp, abstime_t time);
Linus Torvalds's avatar
Linus Torvalds committed
133 134 135


/* proc interface */
136 137 138 139
void snd_seq_oss_system_info_read(struct snd_info_buffer *buf);
void snd_seq_oss_midi_info_read(struct snd_info_buffer *buf);
void snd_seq_oss_synth_info_read(struct snd_info_buffer *buf);
void snd_seq_oss_readq_info_read(struct seq_oss_readq *q, struct snd_info_buffer *buf);
Linus Torvalds's avatar
Linus Torvalds committed
140 141 142 143 144 145 146

/* file mode macros */
#define is_read_mode(mode)	((mode) & SNDRV_SEQ_OSS_FILE_READ)
#define is_write_mode(mode)	((mode) & SNDRV_SEQ_OSS_FILE_WRITE)
#define is_nonblock_mode(mode)	((mode) & SNDRV_SEQ_OSS_FILE_NONBLOCK)

/* dispatch event */
147
static inline int
148
snd_seq_oss_dispatch(struct seq_oss_devinfo *dp, struct snd_seq_event *ev, int atomic, int hop)
Linus Torvalds's avatar
Linus Torvalds committed
149 150 151 152 153
{
	return snd_seq_kernel_client_dispatch(dp->cseq, ev, atomic, hop);
}

/* ioctl */
154
static inline int
155
snd_seq_oss_control(struct seq_oss_devinfo *dp, unsigned int type, void *arg)
Linus Torvalds's avatar
Linus Torvalds committed
156 157 158 159 160
{
	return snd_seq_kernel_client_ctl(dp->cseq, type, arg);
}

/* fill the addresses in header */
161
static inline void
162
snd_seq_oss_fill_addr(struct seq_oss_devinfo *dp, struct snd_seq_event *ev,
Linus Torvalds's avatar
Linus Torvalds committed
163 164 165 166 167 168 169 170 171 172 173 174 175
		     int dest_client, int dest_port)
{
	ev->queue = dp->queue;
	ev->source = dp->addr;
	ev->dest.client = dest_client;
	ev->dest.port = dest_port;
}


/* misc. functions for proc interface */
char *enabled_str(int bool);

#endif /* __SEQ_OSS_DEVICE_H */