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