|
|
1.1.1.4 root 1: /*
1.1 root 2: * UAE - The Un*x Amiga Emulator
1.1.1.4 root 3: *
1.1 root 4: * Support for Amiga audio.device sound
1.1.1.4 root 5: *
1.1 root 6: * Copyright 1996, 1997 Samuel Devulder
7: */
8:
9: #include "sysconfig.h"
10: #include "sysdeps.h"
11:
12: #include "options.h"
13: #include "memory.h"
1.1.1.3 root 14: #include "events.h"
1.1 root 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) {
1.1.1.4 root 51: pOS_UnlockObject(lock);
52: return fopen(buff,"wb");
1.1 root 53: }
54: return NULL;
55: }
56:
57: int setup_sound(void)
58: {
59: sound_available = 1;
60: return 1;
61: }
62:
1.1.1.4 root 63: int init_sound (void)
1.1 root 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"),
1.1.1.4 root 79: rate, sndbufsize);
1.1 root 80: if(!AUDIO_FILE) /* AHI */
81: AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY=%d/BUFFER=%d",
1.1.1.4 root 82: rate, sndbufsize);
1.1 root 83: if(!AUDIO_FILE) /* AUD: */
84: AUDIO_FILE = TST_AUDIO_FILE(buff, "AUDIO:FREQUENCY%d/BUFFER%d",
1.1.1.4 root 85: rate, sndbufsize);
1.1 root 86: if(!AUDIO_FILE)
87: AUDIO_FILE = TST_AUDIO_FILE(buff, "AUD:FREQUENCY%d/BUFFER%d",
1.1.1.4 root 88: rate, sndbufsize);
1.1 root 89:
90: /* else use audio.device */
91: if(!AUDIO_FILE) {
1.1.1.4 root 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;
1.1 root 106: }
107:
108: /* get the buffers */
109: if(AUDIO_FILE) {
1.1.1.4 root 110: buffers[0] = malloc(sndbufsize);
111: buffers[1] = NULL;
112: if(!buffers[0]) goto fail;
1.1 root 113: } else {
1.1.1.4 root 114: buffers[0] = malloc(sndbufsize);
115: buffers[1] = malloc(sndbufsize);
116: if(!buffers[0] || !buffers[1]) goto fail;
1.1 root 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:
1.1.1.3 root 127: scaled_sample_evtime = (unsigned long)maxhpos * maxvpos * vblank_hz * CYCLE_UNIT / rate;
128: scaled_sample_evtime_ok = 1;
129:
1.1 root 130: init_sound_table8 ();
1.1.1.2 root 131: sample_handler = sample8_handler;
1.1 root 132:
133: fprintf(stderr, "Sound driver found and configured for %d bits "
1.1.1.4 root 134: "at %d Hz, buffer is %d bytes (%s)\n",
135: 8, rate, sndbufsize,devname);
1.1 root 136:
137: sound_available = 1;
138: return 1;
139: fail:
140: sound_available = 0;
141: return 0;
142: }
143:
144: void close_sound(void)
145: {
146: if(AUDIO_FILE) {
1.1.1.4 root 147: fclose(AUDIO_FILE);
148: AUDIO_FILE = NULL;
1.1 root 149: }
150: if(channel_allocated) {
1.1.1.4 root 151: AudioIO->aio_Command = AUDIOCMD_FreeChannel;
152: pOS_DoIO((struct pOS_IORequest*)AudioIO);
153: channel_allocated = 0;
1.1 root 154: }
155: if(devopen) {
1.1.1.4 root 156: pOS_CloseDevice((void*)AudioIO);
157: devopen = 0;
1.1 root 158: }
159: if(AudioIO) {
1.1.1.4 root 160: pOS_DeleteIORequest((void*)AudioIO);
161: AudioIO = NULL;
1.1 root 162: }
163: if(port_created) {
1.1.1.4 root 164: pOS_DestructMsgPort(&AudioMP);
165: port_created = 0;
1.1 root 166: }
167: if(buffers[0]) {free(buffers[0]);buffers[0] = 0;}
168: if(buffers[1]) {free(buffers[1]);buffers[1] = 0;}
169: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.