xref: /haiku/src/add-ons/kernel/drivers/audio/emuxki/emuxki.h (revision 47c05920fde47c2618efccd24bd82f1e79cdf05a)
1 /*
2  * Emuxki BeOS Driver for Creative Labs SBLive!/Audigy series
3  *
4  * Copyright (c) 2002, Jerome Duval (jerome.duval@free.fr)
5  *
6  * Authors:
7  *		Alexander Coers		Alexander.Coers@gmx.de
8  *		Fredrik Modéen 		fredrik@modeen.se
9  *
10  * Copyright (c) 2001 The NetBSD Foundation, Inc.
11  * All rights reserved.
12  *
13  * This code is derived from software contributed to The NetBSD Foundation
14  * by Yannick Montulet.
15  *
16  * Redistribution and use in source and binary forms, with or without
17  * modification, are permitted provided that the following conditions
18  * are met:
19  * 1. Redistributions of source code must retain the above copyright
20  *    notice, this list of conditions and the following disclaimer.
21  * 2. Redistributions in binary form must reproduce the above copyright
22  *    notice, this list of conditions and the following disclaimer in the
23  *    documentation and/or other materials provided with the distribution.
24  * 3. All advertising materials mentioning features or use of this software
25  *    must display the following acknowledgement:
26  *	This product includes software developed by the NetBSD
27  *	Foundation, Inc. and its contributors.
28  * 4. Neither the name of The NetBSD Foundation nor the names of its
29  *    contributors may be used to endorse or promote products derived
30  *    from this software without specific prior written permission.
31  *
32  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
33  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
34  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
35  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
36  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
37  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
38  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
39  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
40  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
41  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
42  * POSSIBILITY OF SUCH DAMAGE.
43  */
44 #if !defined(_EMUXKI_H)
45 #define _EMUXKI_H
46 
47 #include <Drivers.h>
48 #include <SupportDefs.h>
49 #include <OS.h>
50 #include "emuxkireg.h"
51 #include "config.h"
52 #include "queue.h"
53 #include "hmulti_audio.h"
54 #include "multi.h"
55 #include "joystick_driver.h"
56 
57 
58 #define CREATIVELABS_VENDOR_ID	0x1102	/* Creative Labs */
59 #define CREATIVELABS_SBLIVE_DEVICE_ID	0x0002	/* Creative Labs SoundBlaster Live */
60 #define CREATIVELABS_AUDIGY_DEVICE_ID	0x0004	/* Creative Labs Audigy and Audigy 2 */
61 #define CREATIVELABS_AUDIGY2_VALUE_DEVICE_ID	0x0008	/* Creative Labs Audigy 2 Value */
62 
63 #define AUDIGY 1	// Audigy seems to work
64 #ifdef __HAIKU__
65 	#define MIDI	1
66 #else
67 	#define MIDI	0	// disabled MIDI for the time being on R5
68 #endif
69 
70 #define VERSION "Version alpha 7, Copyright (c) 2002,2003 Jérôme Duval, compiled on " __DATE__ " " __TIME__
71 #define DRIVER_NAME "emuxki"
72 #define FRIENDLY_NAME "Emuxki"
73 #define FRIENDLY_NAME_LIVE FRIENDLY_NAME" SB Live"
74 #define FRIENDLY_NAME_LIVE_5_1 FRIENDLY_NAME_LIVE" 5.1"
75 #define FRIENDLY_NAME_AUDIGY FRIENDLY_NAME" Audigy"
76 #define FRIENDLY_NAME_AUDIGY2 FRIENDLY_NAME_AUDIGY" 2"
77 #define FRIENDLY_NAME_AUDIGY2_VALUE FRIENDLY_NAME_AUDIGY2" Value"
78 #define AUTHOR "Jérôme Duval"
79 
80 /*
81  * Emuxki settings
82  */
83 
84 typedef struct {
85 	uint8   channels;
86 	uint8   bitsPerSample;
87 	uint32  sample_rate;
88 	uint32  buffer_frames;
89 	int32   buffer_count;
90 } emuxki_settings;
91 
92 extern emuxki_settings current_settings;
93 
94 /*
95  * Gameport stuff
96  */
97 
98 #define HCFG					0x14			/* Hardware Configuration Register of SB-Live */
99 #define HCFG_JOYENABLE			0x00000200		/* Mask for enabling Joystick */
100 
101 extern generic_gameport_module * gameport;
102 
103 typedef struct _joy_dev
104 {
105 	void *		driver;
106 	char		name1[64];
107 } joy_dev;
108 /* End Gameport stuff*/
109 
110 /*
111  * Emu10k1 midi
112  */
113 
114 typedef struct _midi_dev {
115 	struct _emuxki_dev *
116 				card;
117 	void *		driver;
118 	void *		cookie;
119 	int32		count;
120 	char		name[64];
121 } midi_dev;
122 
123 
124 /*
125  * Emu10k1 hardware limits
126  */
127 
128 #define	EMU_PTESIZE		4096
129 #define	EMU_MAXPTE ((EMU_CHAN_PSST_LOOPSTARTADDR_MASK + 1) /	\
130 			EMU_PTESIZE)
131 #define EMU_NUMCHAN		64
132 #define EMU_NUMRECSRCS	3
133 
134 #define	EMU_DMA_ALIGN	4096
135 #define	EMU_DMAMEM_NSEG	1
136 
137 /*
138  * Emu10k1 memory managment
139  */
140 
141 typedef struct _emuxki_mem {
142 	LIST_ENTRY(_emuxki_mem) next;
143 	uint16	       ptbidx;
144 	void	*log_base;
145 	phys_addr_t phy_base;
146 	area_id area;
147 	size_t	size;
148 #define	EMU_RMEM		0xffff		/* recording memory */
149 } emuxki_mem;
150 
151 /*
152  * Emu10k1 play channel params
153  */
154 
155 typedef struct _emuxki_chanparms_fxsend {
156 	struct {
157 		uint8        level, dest;
158 	}               a, b, c, d, e, f, g, h;
159 } emuxki_chanparms_fxsend;
160 
161 typedef struct _emuxki_chanparms_pitch {
162 	uint16       intial;	/* 4 bits of octave, 12 bits of fractional
163 				 * octave */
164 	uint16       current;/* 0x4000 == unity pitch shift */
165 	uint16       target;	/* 0x4000 == unity pitch shift */
166 	uint8        envelope_amount;	/* Signed 2's complement, +/-
167 						 * one octave peak extremes */
168 } emuxki_chanparms_pitch;
169 
170 typedef struct _emuxki_chanparms_envelope {
171 	uint16       current_state;	/* 0x8000-n == 666*n usec delay */
172 	uint8        hold_time;	/* 127-n == n*(volume ? 88.2 :
173 					 * 42)msec */
174 	uint8        attack_time;	/* 0 = infinite, 1 = (volume ? 11 :
175 					 * 10.9) msec, 0x7f = 5.5msec */
176 	uint8        sustain_level;	/* 127 = full, 0 = off, 0.75dB
177 					 * increments */
178 	uint8        decay_time;	/* 0 = 43.7msec, 1 = 21.8msec, 0x7f =
179 					 * 22msec */
180 } emuxki_chanparms_envelope;
181 
182 typedef struct _emuxki_chanparms_volume {
183 	uint16       current;
184 	uint16       target;
185 	emuxki_chanparms_envelope envelope;
186 } emuxki_chanparms_volume;
187 
188 typedef struct _emuxki_chanparms_filter {
189 	uint16       initial_cutoff_frequency;
190 	/*
191 	 * 6 most  significant bits are semitones, 2 least significant bits
192 	 * are fractions
193 	 */
194 	uint16       current_cutoff_frequency;
195 	uint16       target_cutoff_frequency;
196 	uint8        lowpass_resonance_height;
197 	uint8        interpolation_ROM;	/* 1 = full band, 7 = low
198 						 * pass */
199 	uint8        envelope_amount;	/* Signed 2's complement, +/-
200 						 * six octaves peak extremes */
201 	uint8        LFO_modulation_depth;	/* Signed 2's complement, +/-
202 						 * three octave extremes */
203 } emuxki_chanparms_filter;
204 
205 typedef struct _emuxki_chanparms_loop {
206 	uint32       start;	/* index in the PTB (in samples) */
207 	uint32       end;	/* index in the PTB (in samples) */
208 } emuxki_chanparms_loop;
209 
210 typedef struct _emuxki_chanparms_modulation {
211 	emuxki_chanparms_envelope envelope;
212 	uint16       LFO_state;	/* 0x8000-n = 666*n usec delay */
213 } emuxki_chanparms_modulation;
214 
215 typedef struct _emuxki_chanparms_vibrato_LFO {
216 	uint16       state;	/* 0x8000-n == 666*n usec delay */
217 	uint8        modulation_depth;	/* Signed 2's complement, +/-
218 						 * one octave extremes */
219 	uint8        vibrato_depth;	/* Signed 2's complement, +/- one
220 					 * octave extremes */
221 	uint8        frequency;	/* 0.039Hz steps, maximum of 9.85 Hz */
222 } emuxki_chanparms_vibrato_LFO;
223 
224 typedef struct _emuxki_channel {
225 	uint8        num;	/* voice number */
226 	struct _emuxki_voice *voice;
227 	emuxki_chanparms_fxsend fxsend;
228 	emuxki_chanparms_pitch pitch;
229 	uint16       initial_attenuation;	/* 0.375dB steps */
230 	emuxki_chanparms_volume volume;
231 	emuxki_chanparms_filter filter;
232 	emuxki_chanparms_loop loop;
233 	emuxki_chanparms_modulation modulation;
234 	emuxki_chanparms_vibrato_LFO vibrato_LFO;
235 	uint8        tremolo_depth;
236 } emuxki_channel;
237 
238 typedef struct _emuxki_recparams {
239 	uint32		efx_voices[2];
240 } emuxki_recparams;
241 
242 
243 /*
244  * Voices
245  */
246 
247 typedef enum {
248 	EMU_RECSRC_MIC = 0,
249 	EMU_RECSRC_ADC,
250 	EMU_RECSRC_FX,
251 	EMU_RECSRC_NOTSET
252 } emuxki_recsrc_t;
253 
254 #define	EMU_USE_PLAY		(1 << 0)
255 #define	EMU_USE_RECORD	(1 << 1)
256 #define EMU_STATE_STARTED	(1 << 0)
257 #define	EMU_STEREO_NOTSET	0xFF
258 
259 typedef struct _emuxki_voice {
260 	struct _emuxki_stream 	 *stream;
261 	uint8        use;
262 	uint8  		 voicenum;
263 	uint8        state;
264 	uint8        stereo;
265 	uint8        b16;
266 	uint32       sample_rate;
267 	union {
268 		emuxki_channel *chan[2];
269 		emuxki_recsrc_t source;
270 	}  			 dataloc;
271 	emuxki_recparams recparams;
272 	emuxki_mem *buffer;
273 	uint16       blksize;/* in samples */
274 	uint16       trigblk;/* blk on which to trigger inth */
275 	uint16       blkmod;	/* Modulo value to wrap trigblk */
276 	uint16       timerate;
277 
278 	LIST_ENTRY(_emuxki_voice) next;
279 
280 } emuxki_voice;
281 
282 /*
283  * Streams
284  */
285 
286 typedef struct _emuxki_stream {
287 	struct _emuxki_dev 	*card;
288 	uint8        		use;
289 	uint8        		state;
290 	uint8        		stereo;
291 	uint8        		b16;
292 	uint32       		sample_rate;
293 	uint8				nmono;
294 	uint8				nstereo;
295 	uint32 				bufframes;
296 	uint8 				bufcount;
297 	LIST_HEAD(, _emuxki_voice) voices;
298 	emuxki_voice		*first_voice;
299 
300 	LIST_ENTRY(_emuxki_stream)	next;
301 
302 	void            	(*inth) (void *);
303 	void           		*inthparam;
304 
305 	/* multi_audio */
306 	volatile int64	frames_count;	// for play or record
307 	volatile bigtime_t real_time;	// for play or record
308 	volatile int32	buffer_cycle;	// for play or record
309 	int32 first_channel;
310 	bool update_needed;
311 } emuxki_stream;
312 
313 /*
314  * Mixer controls gpr
315  */
316 #define EMU_GPR_FIRST_MIX 16
317 
318 typedef enum {
319 	EMU_MIX_GAIN = 1 << 0,
320 	EMU_MIX_MONO = 1 << 1,
321 	EMU_MIX_STEREO = 1 << 2,
322 	EMU_MIX_TMP = 1 << 3,
323 	EMU_MIX_MUTE = 1 << 4,
324 	EMU_MIX_PLAYBACK = 1 << 5,
325 	EMU_MIX_RECORD = 1 << 6
326 } emuxki_gpr_type;
327 
328 typedef struct _emuxki_gpr {
329 	char name[32];
330 	emuxki_gpr_type  type;
331 	uint16	gpr;
332 	float	default_value;
333 	float	min_gain;
334 	float	max_gain;
335 	float	granularity;
336 	float 	current[2];
337 	bool	mute;
338 } emuxki_gpr;
339 
340 typedef enum {
341 	EMU_DIGITAL_MODE = 1 << 0,
342 	EMU_AUDIO_MODE = 1 << 1
343 } emuxki_parameter_type;
344 
345 
346 /*
347  * Devices
348  */
349 
350 typedef struct _emuxki_dev {
351 	char		name[DEVNAME];	/* used for resources */
352 	pci_info	info;
353 	device_config config;
354 
355 	void	*ptb_log_base;
356 	phys_addr_t ptb_phy_base;
357 	area_id ptb_area;
358 	void	*silentpage_log_base;
359 	phys_addr_t silentpage_phy_base;
360 	area_id silentpage_area;
361 
362 	emuxki_channel	*channel[EMU_NUMCHAN];
363 	emuxki_voice	*recsrc[EMU_NUMRECSRCS];
364 
365 	LIST_HEAD(, _emuxki_mem) mem;
366 
367 	LIST_HEAD(, _emuxki_stream) streams;
368 
369 	uint8	timerstate;
370 	uint16	timerate;
371 #define	EMU_TIMER_STATE_ENABLED	1
372 	uint8	play_mode; // number of channels to be played : 2, 4, 6
373 	bool	digital_enabled;	// if digital is enabled and analog is disabled
374 
375 	emuxki_stream	*pstream;
376 	emuxki_stream	*pstream2;
377 	emuxki_stream	*rstream;
378 	emuxki_stream	*rstream2;
379 
380 	sem_id buffer_ready_sem;
381 
382 	joy_dev		joy;
383 	midi_dev	midi;
384 
385 	/* mixer controls */
386 	emuxki_gpr	gpr[256];
387 	uint32 gpr_count;
388 
389 	/* multi_audio */
390 	multi_dev	multi;
391 } emuxki_dev;
392 
393 extern int32 num_cards;
394 extern emuxki_dev cards[NUM_CARDS];
395 
396 void emuxki_mem_free(emuxki_dev *card, void *ptr);
397 void * emuxki_pmem_alloc(emuxki_dev *card, size_t size);
398 void * emuxki_rmem_alloc(emuxki_dev *card, size_t size);
399 status_t emuxki_voice_commit_parms(emuxki_voice *voice);
400 status_t emuxki_voice_set_audioparms(emuxki_voice *voice, uint8 stereo,
401 			     uint8 b16, uint32 srate);
402 status_t emuxki_voice_set_recparms(emuxki_voice *voice, emuxki_recsrc_t recsrc,
403 			     	emuxki_recparams *recparams);
404 status_t emuxki_voice_set_bufparms(emuxki_voice *voice, void *ptr,
405 			   uint32 bufsize, uint16 blksize);
406 void emuxki_voice_start(emuxki_voice *voice);
407 void emuxki_voice_halt(emuxki_voice *voice);
408 emuxki_voice *emuxki_voice_new(emuxki_stream *stream, uint8 use, uint8 voicenum);
409 void emuxki_voice_delete(emuxki_voice *voice);
410 
411 status_t emuxki_stream_set_audioparms(emuxki_stream *stream, bool stereo, uint8 channels,
412 			     uint8 b16, uint32 sample_rate);
413 status_t emuxki_stream_set_recparms(emuxki_stream *stream, emuxki_recsrc_t recsrc,
414 			     	emuxki_recparams *recparams);
415 status_t emuxki_stream_commit_parms(emuxki_stream *stream);
416 status_t emuxki_stream_get_nth_buffer(emuxki_stream *stream, uint8 chan, uint8 buf,
417 					char** buffer, size_t *stride);
418 void emuxki_stream_start(emuxki_stream *stream, void (*inth) (void *), void *inthparam);
419 void emuxki_stream_halt(emuxki_stream *stream);
420 emuxki_stream *emuxki_stream_new(emuxki_dev *card, uint8 use, uint32 bufframes, uint8 bufcount);
421 void emuxki_stream_delete(emuxki_stream *stream);
422 
423 void emuxki_dump_fx(emuxki_dev * card);
424 void emuxki_gpr_dump(emuxki_dev * card, uint16 count);
425 void emuxki_gpr_set(emuxki_dev *card, emuxki_gpr *gpr, int32 type, float *values);
426 void emuxki_gpr_get(emuxki_dev *card, emuxki_gpr *gpr, int32 type, float *values);
427 
428 void emuxki_parameter_set(emuxki_dev *card, const void*, int32 type, int32 *value);
429 void emuxki_parameter_get(emuxki_dev *card, const void*, int32 type, int32 *value);
430 
431 extern void midi_interrupt_op(int32 op, void * data);
432 extern bool midi_interrupt(emuxki_dev *card);
433 
434 #endif
435 
436