|
|
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: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "config.h"
13: #include "options.h"
14: #include "memory.h"
15: #include "custom.h"
16: #include "audio.h"
17: #include "gensound.h"
18: #include "sounddep/sound.h"
19:
20: #include <pDOS/Lock.h>
21: #include <pDOS/Files.h>
22: #include <pDOS/DosSig.h>
23: #include <pDOS/DosErrors.h>
24: #include <pInline/pDos2.h>
25:
26: extern struct pOS_DosBase *gb_DosBase;
27:
28: static struct pOS_MsgPort AudioMP;
29: struct pOS_AudioIO *AudioIO;
30: struct pOS_Std8AudioMap AudioMap;
31:
32: unsigned char *buffers[2];
33: uae_u16 *sndbuffer;
34: uae_u16 *sndbufpt;
35: int sndbufsize;
36: int bufidx;
37: static int port_created, devopen, channel_allocated;
38:
39: int have_sound;
40:
41: FILE *AUDIO_FILE;
42:
43: static FILE *TST_AUDIO_FILE(char *buff, char *name, int rate, int bsize)
44: {
45: struct pOS_FileLock *lock;
46:
47: if(!name) return 0;
48: sprintf(buff,name,rate,bsize);
49: lock = pOS_LockObject(NULL, buff, FILELKACC_Exclusive|FILELKACC_NoReq);
50: if(lock) {
51: pOS_UnlockObject(lock);
52: return fopen(buff,"wb");
53: }
54: return NULL;
55: }
56:
57: int setup_sound(void)
58: {
59: sound_available = 1;
60: return 1;
61: }
62:
63: int init_sound (void)
64: {
65: int rate;
66: char buff[256],*devname = NULL;
67:
68: atexit(close_sound); /* if only amiga os had resource tracking */
69:
70: sndbufsize = (currprefs.sound_maxbsiz + 1)&~1;
71:
72: /* check freq */
73: if (!currprefs.sound_freq) currprefs.sound_freq = 11025;
74: rate = currprefs.sound_freq;
75:
76: /* check for $AUDIONAME or AUD: or AUDIO: device */
77: devname = buff;
78: AUDIO_FILE = TST_AUDIO_FILE(buff, getenv("AUDIONAME"),
79: rate, sndbufsize);
80: if(!AUDIO_FILE) /* AHI */
81: AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY=%d/BUFFER=%d",
82: rate, sndbufsize);
83: if(!AUDIO_FILE) /* AUD: */
84: AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY%d/BUFFER%d",
85: rate, sndbufsize);
86: if(!AUDIO_FILE)
87: AUDIO_FILE = TST_AUDIO_FILE(buff, "AUD:FREQUENCY%d/BUFFER%d",
88: rate, sndbufsize);
89:
90: /* else use audio.device */
91: if(!AUDIO_FILE) {
92: if(!pOS_ConstructMsgPort(&AudioMP)) goto fail;
93: port_created = 1;
94: AudioIO = (void*)pOS_CreateIORequest(&AudioMP,
95: sizeof(struct pOS_AudioIO));
96: if(!AudioIO) goto fail;
97:
98: if(pOS_OpenDevice(devname = "pAudio.device", 0, (void*)AudioIO, 0,0))
99: goto fail;
100: devopen = 1;
101:
102: AudioIO->aio_Command = AUDIOCMD_AllocChannel;
103: AudioIO->aio_U.aio_AllocCh.alio_Tags = NULL;
104: if(pOS_DoIO((struct pOS_IORequest*)AudioIO)) goto fail;
105: channel_allocated = 1;
106: }
107:
108: /* get the buffers */
109: if(AUDIO_FILE) {
110: buffers[0] = malloc(sndbufsize);
111: buffers[1] = NULL;
112: if(!buffers[0]) goto fail;
113: } else {
114: buffers[0] = malloc(sndbufsize);
115: buffers[1] = malloc(sndbufsize);
116: if(!buffers[0] || !buffers[1]) goto fail;
117: }
118: bufidx = 0;
119: sndbuffer = sndbufpt = (uae_u16*)buffers[bufidx];
120:
121: AudioIO->aio_U.aio_Map.amio_AudioMap = (struct pOS_AudioMap*)&AudioMap;
122: AudioMap.bam_Audio.am_Type = AUDIOMAPTYP_Std8Bit;
123: AudioMap.bam_Audio.am_Frequency = rate;
124: AudioMap.bam_Length = sndbufsize;
125: AudioMap.bam_Sample = (void*)sndbuffer;
126:
127: sample_evtime = (long)maxhpos * maxvpos * 50 / rate;
128: init_sound_table8 ();
1.1.1.2 ! root 129: sample_handler = sample8_handler;
1.1 root 130:
131: fprintf(stderr, "Sound driver found and configured for %d bits "
132: "at %d Hz, buffer is %d bytes (%s)\n",
133: 8, rate, sndbufsize,devname);
134:
135: sound_available = 1;
136: return 1;
137: fail:
138: sound_available = 0;
139: return 0;
140: }
141:
142: void close_sound(void)
143: {
144: if(AUDIO_FILE) {
145: fclose(AUDIO_FILE);
146: AUDIO_FILE = NULL;
147: }
148: if(channel_allocated) {
149: AudioIO->aio_Command = AUDIOCMD_FreeChannel;
150: pOS_DoIO((struct pOS_IORequest*)AudioIO);
151: channel_allocated = 0;
152: }
153: if(devopen) {
154: pOS_CloseDevice((void*)AudioIO);
155: devopen = 0;
156: }
157: if(AudioIO) {
158: pOS_DeleteIORequest((void*)AudioIO);
159: AudioIO = NULL;
160: }
161: if(port_created) {
162: pOS_DestructMsgPort(&AudioMP);
163: port_created = 0;
164: }
165: if(buffers[0]) {free(buffers[0]);buffers[0] = 0;}
166: if(buffers[1]) {free(buffers[1]);buffers[1] = 0;}
167: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.