|
|
1.1 root 1: /*
2: * UAE - The Un*x Amiga Emulator
3: *
4: * Support for Amiga audio.device sound
5: *
6: * Copyright 1996, 1997 Samuel Devulder
7: */
8:
9: struct pOS_Locale;
10: struct pOS_Library;
11: struct pOS_ExecBase;
12: struct pOS_DosBase;
13: struct pOS_Method;
14: struct pOS_Resource;
15: struct pOS_RawDoFmtData;
16: struct pOS_AsciiDoFmtData;
17: struct pOS_AsciiFmtData;
18: struct pOS_ClassGrp;
19: struct pOS_DosDevPathInfo;
20: struct pOS_ShellScript;
21: struct pOS_SegmentInfo;
22: struct IClass;
23: struct Isrvstr;
24: struct TagItem;
25: struct MemHeader;
26: struct SemaphoreMessage;
27: struct StackSwapStruct;
28: struct Interrupt;
29: struct StandardPacket;
30: struct InfoData;
31: struct WBStartup;
32:
33: #define _SIZE_T /* to avoid interference with <sys/types.h> */
34: #include <pExec/Types.h>
35: #include <pDOS/ArgTags.h>
36: #include <pDOS/DosSig.h>
37: #include <pDOS/DosErrors.h>
38: #include <pAudio/Audio.h>
39: #include <pAudio/AudioTags.h>
40: #include <pAudio/InfoData.h>
41: #include <pAudio/StdAMap.h>
42: #include <pAudio/AudioLib.h>
43:
44: #include <pInline/pExec2.h>
45:
46: extern struct pOS_ExecBase *gb_ExecBase;
47: extern struct pOS_ExecLibFunction *gb_ExecLib;
48: extern struct pOS_DosBase *gb_DosBase;
49:
50: extern struct pOS_AudioIO *AudioIO;
51: extern struct pOS_Std8AudioMap AudioMap;
52:
53: extern unsigned char *buffers[2];
54: extern uae_u16 *sndbuffer, *sndbufpt;
55: extern int bufidx, devopen;
56: extern int sndbufsize;
57:
58: extern int have_sound;
59:
60: extern FILE *AUDIO_FILE;
61:
62: static __inline__ void flush_sound_buffer(void)
63: {
64: if(AUDIO_FILE) {
65: fwrite(buffers[bufidx], sndbufsize, 1, AUDIO_FILE);
66: } else {
67: static char IOSent = 0;
68:
69: AudioMap.bam_Sample = (SBYTE *)buffers[bufidx];
70:
71: AudioIO->aio_Command = CMD_WRITE;
72: AudioIO->aio_Flags = IOREQF_Quick;
73: AudioIO->aio_U.aio_Map.amio_Volume = 0xFFFF;
74: AudioIO->aio_U.aio_Map.amio_Cycles = 1;
75: AudioIO->aio_U.aio_Map.amio_Frequency = currprefs.sound_freq;
76: AudioIO->aio_U.aio_Map.amio_Length = sndbufsize;
77:
78: if(IOSent) pOS_WaitIO((void*)AudioIO); else IOSent=1;
79: pOS_BeginIO((void*)AudioIO);
80:
81: /* double buffering */
82: bufidx = 1 - bufidx;
83: sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx];
84: }
85: }
86:
87: static __inline__ void check_sound_buffers (void)
88: {
89: if ((char *)sndbufpt - (char *)sndbuffer >= sndbufsize) {
90: flush_sound_buffer();
91: }
92: }
93:
94: #define PUT_SOUND_BYTE(b) do { *(uae_u8 *)sndbufpt = b; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 1); } while (0)
95: #define PUT_SOUND_WORD(b) do { *(uae_u16 *)sndbufpt = b; sndbufpt = (uae_u16 *)(((uae_u8 *)sndbufpt) + 2); } while (0)
96: #define SOUND16_BASE_VAL 0
97: #define SOUND8_BASE_VAL 0
98:
99: #define DEFAULT_SOUND_MAXB 8192
100: #define DEFAULT_SOUND_MINB 8192
101: #define DEFAULT_SOUND_BITS 8
102: #define DEFAULT_SOUND_FREQ 11025
103:
104: #define UNSUPPORTED_OPTION_b
105:
106: #undef DONT_WANT_SOUND
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.