1  /*
2   * UAE - The Un*x Amiga Emulator
3   *
4   * Support for Amiga audio.device and AHI.device sound.
5   *
6   * Copyright 1996, 1997, 1998 Samuel Devulder, Holger Jakob (AHI)
7   */
8 
9 #define SOUNDSTUFF 1
10 
11 #include <exec/memory_uae.h>
12 #include <exec/devices.h>
13 #include <exec/io.h>
14 
15 #include <graphics/gfxbase.h>
16 #include <devices/timer.h>
17 #include <devices/ahi.h>
18 
19 #include <proto/exec.h>
20 #include <proto/dos.h>
21 #include <clib/alib_protos.h>
22 
23 extern struct AHIRequest *AHIio[];
24 extern struct AHIRequest *linkio;
25 
26 extern unsigned char *buffers[2];
27 extern uae_u16 *paula_sndbuffer, *paula_sndbufpt;
28 extern int bufidx;
29 extern int paula_sndbufsize;
30 
flush_sound_buffer(void)31 STATIC_INLINE void flush_sound_buffer (void)
32 {
33 	void *tmp;
34 
35 	AHIio[bufidx]->ahir_Std.io_Message.mn_Node.ln_Pri = 0;
36 	AHIio[bufidx]->ahir_Std.io_Command  = CMD_WRITE;
37 	AHIio[bufidx]->ahir_Std.io_Data     = buffers[bufidx];
38 	AHIio[bufidx]->ahir_Std.io_Length   = paula_sndbufsize;
39 	AHIio[bufidx]->ahir_Std.io_Offset   = 0;
40 	AHIio[bufidx]->ahir_Frequency       = currprefs.sound_freq;
41 	if (currprefs.sound_stereo)
42 		AHIio[bufidx]->ahir_Type    = AHIST_S16S;
43 	else
44 		AHIio[bufidx]->ahir_Type    = AHIST_M16S;
45 	AHIio[bufidx]->ahir_Volume          = 0x10000;          /* Full volume */
46 	AHIio[bufidx]->ahir_Position        = 0x8000;           /* Centered */
47 	AHIio[bufidx]->ahir_Link            = linkio;
48 	SendIO ((struct IORequest *) AHIio[bufidx]);
49 
50 	if (linkio)
51 	    WaitIO ((struct IORequest *) linkio);
52 	linkio = AHIio[bufidx];
53 	/* double buffering */
54 	bufidx = 1 - bufidx;
55 	paula_sndbuffer = paula_sndbufpt = (uae_u16*) buffers[bufidx];
56 }
57 
check_sound_buffers(void)58 STATIC_INLINE void check_sound_buffers (void)
59 {
60     if ((char *)paula_sndbufpt - (char *)paula_sndbuffer >= paula_sndbufsize) {
61 	flush_sound_buffer ();
62     }
63 }
64 
65 #define AUDIO_NAME "amiga"
66 
67 #define PUT_SOUND_BYTE(b) do { *(uae_u8 *) paula_sndbufpt = b; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 1); } while (0)
68 #define PUT_SOUND_WORD(b) do { *(uae_u16 *)paula_sndbufpt = b; paula_sndbufpt = (uae_u16 *)(((uae_u8 *)paula_sndbufpt) + 2); } while (0)
69 
70 #define PUT_SOUND_WORD_MONO(b) PUT_SOUND_WORD(b)
71 #define PUT_SOUND_BYTE_LEFT(b) PUT_SOUND_BYTE(b)
72 #define PUT_SOUND_WORD_LEFT(b) PUT_SOUND_WORD(b)
73 #define PUT_SOUND_BYTE_RIGHT(b) PUT_SOUND_BYTE(b)
74 #define PUT_SOUND_WORD_RIGHT(b) PUT_SOUND_WORD(b)
75 
76 #define SOUND16_BASE_VAL 0
77 #define DEFAULT_SOUND_FREQ 11025
78 #define DEFAULT_SOUND_LATENCY 100
79 #define HAVE_STEREO_SUPPORT
80