5eead12e58ae55ca43b274d06a3838fcb02bb890
[linux-2.6.git] / include / sound / ainstr_simple.h
1 /*
2  *  Advanced Linux Sound Architecture
3  *
4  *  Simple (MOD player) Instrument Format
5  *  Copyright (c) 1994-99 by Jaroslav Kysela <perex@suse.cz>
6  *
7  *
8  *   This program is free software; you can redistribute it and/or modify
9  *   it under the terms of the GNU General Public License as published by
10  *   the Free Software Foundation; either version 2 of the License, or
11  *   (at your option) any later version.
12  *
13  *   This program is distributed in the hope that it will be useful,
14  *   but WITHOUT ANY WARRANTY; without even the implied warranty of
15  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16  *   GNU General Public License for more details.
17  *
18  *   You should have received a copy of the GNU General Public License
19  *   along with this program; if not, write to the Free Software
20  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
21  *
22  */
23
24 #ifndef __SOUND_AINSTR_SIMPLE_H
25 #define __SOUND_AINSTR_SIMPLE_H
26
27 #ifndef __KERNEL__
28 #include <asm/types.h>
29 #include <asm/byteorder.h>
30 #endif
31
32 /*
33  *  share types (share ID 1)
34  */
35
36 #define SIMPLE_SHARE_FILE               0
37
38 /*
39  *  wave formats
40  */
41
42 #define SIMPLE_WAVE_16BIT               0x0001  /* 16-bit wave */
43 #define SIMPLE_WAVE_UNSIGNED            0x0002  /* unsigned wave */
44 #define SIMPLE_WAVE_INVERT              0x0002  /* same as unsigned wave */
45 #define SIMPLE_WAVE_BACKWARD            0x0004  /* backward mode (maybe used for reverb or ping-ping loop) */
46 #define SIMPLE_WAVE_LOOP                0x0008  /* loop mode */
47 #define SIMPLE_WAVE_BIDIR               0x0010  /* bidirectional mode */
48 #define SIMPLE_WAVE_STEREO              0x0100  /* stereo wave */
49 #define SIMPLE_WAVE_ULAW                0x0200  /* uLaw compression mode */
50
51 /*
52  *  instrument effects
53  */
54
55 #define SIMPLE_EFFECT_NONE              0
56 #define SIMPLE_EFFECT_REVERB            1
57 #define SIMPLE_EFFECT_CHORUS            2
58 #define SIMPLE_EFFECT_ECHO              3
59
60 /*
61  *  instrument info
62  */
63
64 struct simple_instrument_info {
65         unsigned int format;            /* supported format bits */
66         unsigned int effects;           /* supported effects (1 << SIMPLE_EFFECT_*) */
67         unsigned int max8_len;          /* maximum 8-bit wave length */
68         unsigned int max16_len;         /* maximum 16-bit wave length */
69 };
70
71 /*
72  *  Instrument
73  */
74
75 struct simple_instrument {
76         unsigned int share_id[4];       /* share id - zero = no sharing */
77         unsigned int format;            /* wave format */
78
79         struct {
80                 unsigned int number;    /* some other ID for this instrument */
81                 unsigned int memory;    /* begin of waveform in onboard memory */
82                 unsigned char *ptr;     /* pointer to waveform in system memory */
83         } address;
84
85         unsigned int size;              /* size of waveform in samples */
86         unsigned int start;             /* start offset in samples * 16 (lowest 4 bits - fraction) */
87         unsigned int loop_start;        /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
88         unsigned int loop_end;          /* loop end offset in samples * 16 (lowest 4 bits - fraction) */
89         unsigned short loop_repeat;     /* loop repeat - 0 = forever */
90
91         unsigned char effect1;          /* effect 1 */
92         unsigned char effect1_depth;    /* 0-127 */
93         unsigned char effect2;          /* effect 2 */
94         unsigned char effect2_depth;    /* 0-127 */
95 };
96
97 /*
98  *
99  *    Kernel <-> user space
100  *    Hardware (CPU) independent section
101  *
102  *    * = zero or more
103  *    + = one or more
104  *
105  *    simple_xinstrument        SIMPLE_STRU_INSTR
106  *
107  */
108
109 #define SIMPLE_STRU_INSTR       __cpu_to_be32(('I'<<24)|('N'<<16)|('S'<<8)|'T')
110
111 /*
112  *  Instrument
113  */
114
115 struct simple_xinstrument {
116         __u32 stype;
117
118         __u32 share_id[4];              /* share id - zero = no sharing */
119         __u32 format;                   /* wave format */
120
121         __u32 size;                     /* size of waveform in samples */
122         __u32 start;                    /* start offset in samples * 16 (lowest 4 bits - fraction) */
123         __u32 loop_start;               /* bits loop start offset in samples * 16 (lowest 4 bits - fraction) */
124         __u32 loop_end;                 /* loop start offset in samples * 16 (lowest 4 bits - fraction) */
125         __u16 loop_repeat;              /* loop repeat - 0 = forever */
126         
127         __u8 effect1;                   /* effect 1 */
128         __u8 effect1_depth;             /* 0-127 */
129         __u8 effect2;                   /* effect 2 */
130         __u8 effect2_depth;             /* 0-127 */
131 };
132
133 #ifdef __KERNEL__
134
135 #include "seq_instr.h"
136
137 struct snd_simple_ops {
138         void *private_data;
139         int (*info)(void *private_data, struct simple_instrument_info *info);
140         int (*put_sample)(void *private_data, struct simple_instrument *instr,
141                           char __user *data, long len, int atomic);
142         int (*get_sample)(void *private_data, struct simple_instrument *instr,
143                           char __user *data, long len, int atomic);
144         int (*remove_sample)(void *private_data, struct simple_instrument *instr,
145                              int atomic);
146         void (*notify)(void *private_data, struct snd_seq_kinstr *instr, int what);
147         struct snd_seq_kinstr_ops kops;
148 };
149
150 int snd_seq_simple_init(struct snd_simple_ops *ops,
151                         void *private_data,
152                         struct snd_seq_kinstr_ops *next);
153
154 #endif
155
156 /* typedefs for compatibility to user-space */
157 typedef struct simple_xinstrument simple_xinstrument_t;
158
159 #endif /* __SOUND_AINSTR_SIMPLE_H */