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)31STATIC_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)58STATIC_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