|
|
1.1 ! root 1: /* ! 2: * UAE - The Un*x Amiga Emulator ! 3: * ! 4: * Support for Linux/USS sound ! 5: * ! 6: * Copyright 1997 Bernd Schmidt ! 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 <sys/ioctl.h> ! 22: #include <sys/soundcard.h> ! 23: ! 24: int sound_fd; ! 25: static int have_sound; ! 26: static unsigned long formats; ! 27: ! 28: unsigned long sndbuf_written; ! 29: ! 30: uae_u16 sndbuffer[44100]; ! 31: uae_u16 *sndbufpt; ! 32: int sndbufsize; ! 33: ! 34: static int exact_log2(int v) ! 35: { ! 36: int l = 0; ! 37: while ((v >>= 1) != 0) ! 38: l++; ! 39: return l; ! 40: } ! 41: ! 42: void close_sound(void) ! 43: { ! 44: int t; ! 45: uae_u32 v; ! 46: char buf[4]; ! 47: ! 48: if (!have_sound) ! 49: return; ! 50: ! 51: t = 0; ! 52: v = sndbuf_written; ! 53: buf[t] = v & 255; ! 54: buf[t+1] = (v>>8) & 255; ! 55: buf[t+2] = (v>>16) & 255; ! 56: buf[t+3] = (v>>24) & 255; ! 57: lseek (sound_fd, 40, SEEK_SET); ! 58: write (sound_fd, buf, 4); ! 59: ! 60: v += 36; ! 61: buf[t] = v & 255; ! 62: buf[t+1] = (v>>8) & 255; ! 63: buf[t+2] = (v>>16) & 255; ! 64: buf[t+3] = (v>>24) & 255; ! 65: lseek (sound_fd, 4, SEEK_SET); ! 66: write (sound_fd, buf, 4); ! 67: ! 68: close(sound_fd); ! 69: } ! 70: ! 71: int setup_sound(void) ! 72: { ! 73: sound_fd = open ("sound.output", O_CREAT|O_TRUNC|O_WRONLY, 0666); ! 74: have_sound = !(sound_fd < 0); ! 75: if (!have_sound) ! 76: return 0; ! 77: ! 78: sound_available = 1; ! 79: return 1; ! 80: } ! 81: ! 82: int init_sound (void) ! 83: { ! 84: int t; ! 85: uae_u32 v; ! 86: int tmp; ! 87: ! 88: char buf[200] = "RIFF WAVEfmt data "; ! 89: ! 90: /* Prepare a .WAV header */ ! 91: sndbuf_written = 44; ! 92: t = 16; v = 16; ! 93: buf[t] = v & 255; ! 94: buf[t+1] = (v>>8) & 255; ! 95: buf[t+2] = (v>>16) & 255; ! 96: buf[t+3] = (v>>24) & 255; ! 97: ! 98: t = 20; v = 0x00010001 + (currprefs.stereo ? 0x10000 : 0); ! 99: buf[t] = v & 255; ! 100: buf[t+1] = (v>>8) & 255; ! 101: buf[t+2] = (v>>16) & 255; ! 102: buf[t+3] = (v>>24) & 255; ! 103: ! 104: t = 24; v = currprefs.sound_freq; ! 105: buf[t] = v & 255; ! 106: buf[t+1] = (v>>8) & 255; ! 107: buf[t+2] = (v>>16) & 255; ! 108: buf[t+3] = (v>>24) & 255; ! 109: t = 32; v = ((currprefs.sound_bits == 8 ? 1 : 2) ! 110: * (currprefs.stereo ? 2 : 1)) + 65536*currprefs.sound_bits; ! 111: buf[t] = v & 255; ! 112: buf[t+1] = (v>>8) & 255; ! 113: buf[t+2] = (v>>16) & 255; ! 114: buf[t+3] = (v>>24) & 255; ! 115: t = 28; v = (currprefs.sound_freq * (currprefs.sound_bits == 8 ? 1 : 2) ! 116: * (currprefs.stereo ? 2 : 1)); ! 117: buf[t] = v & 255; ! 118: buf[t+1] = (v>>8) & 255; ! 119: buf[t+2] = (v>>16) & 255; ! 120: buf[t+3] = (v>>24) & 255; ! 121: write (sound_fd, buf, 44); ! 122: ! 123: sample_evtime = (long)maxhpos * maxvpos * 50 / currprefs.sound_freq; ! 124: ! 125: if (currprefs.sound_bits == 16) { ! 126: init_sound_table16 (); ! 127: eventtab[ev_sample].handler = currprefs.stereo ? sample16s_handler : sample16_handler; ! 128: } else { ! 129: init_sound_table8 (); ! 130: eventtab[ev_sample].handler = currprefs.stereo ? sample8s_handler : sample8_handler; ! 131: } ! 132: sound_available = 1; ! 133: sndbufsize = 44100; ! 134: printf ("Writing sound into \"sound.output\"; %d bits at %d Hz\n", ! 135: currprefs.sound_bits, currprefs.sound_freq, sndbufsize); ! 136: sndbufpt = sndbuffer; ! 137: return 1; ! 138: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.