diff options
author | blymn <blymn> | 2000-06-18 11:11:51 +0000 |
---|---|---|
committer | blymn <blymn> | 2000-06-18 11:11:51 +0000 |
commit | 59fd929d60a190e911587519b6a811cb42e0a2d7 (patch) | |
tree | 829892dcba3563a11d9620d12ff68cdc144a019b /audio/xamp/patches/patch-ag | |
parent | 582a4a18e1ba3903124d6b442d9afe9f94e61b1a (diff) | |
download | pkgsrc-59fd929d60a190e911587519b6a811cb42e0a2d7.tar.gz |
* Changed the way xamp supports NetBSD, we now have our own audioIO file.
* Added support for 8bit sound cards (it sounds crappy but when it is all
you have....)
* Fixed bug in debug mode code.
Diffstat (limited to 'audio/xamp/patches/patch-ag')
-rw-r--r-- | audio/xamp/patches/patch-ag | 230 |
1 files changed, 204 insertions, 26 deletions
diff --git a/audio/xamp/patches/patch-ag b/audio/xamp/patches/patch-ag index 608ba040344..e61857869b9 100644 --- a/audio/xamp/patches/patch-ag +++ b/audio/xamp/patches/patch-ag @@ -1,26 +1,204 @@ -$NetBSD: patch-ag,v 1.1 1999/11/15 13:07:12 rh Exp $ - ---- ../audioIO_SunOS.c.orig Sat May 31 19:47:58 1997 -+++ ../audioIO_SunOS.c Mon Nov 15 13:58:45 1999 -@@ -8,7 +8,11 @@ - - #include "amp.h" - #include <sys/types.h> -+#ifndef OS_NetBSD - #include <sys/stropts.h> -+#else -+#include <sys/ioctl.h> -+#endif - #include <fcntl.h> - #include <unistd.h> - #include <stdio.h> -@@ -36,8 +40,7 @@ - } - DB(audio, msg("Audio device opened on %d\n",audio_fd) ); - -- if (ioctl(audio_fd,AUDIO_GETINFO,&auinfo)<0) -- die("Unable to get audio info\n"); -+ AUDIO_INITINFO(&auinfo); - - auinfo.play.precision=16; - auinfo.play.encoding=AUDIO_ENCODING_LINEAR; +diff -c /dev/null ../audioIO_NetBSD.c:1.3 +*** /dev/null Wed Jun 14 22:24:24 2000 +--- ../audioIO_NetBSD.c Wed Jun 14 22:24:25 2000 +*************** +*** 0 **** +--- 1,198 ---- ++ /* this file is a part of amp software, (C) tomislav uzelac 1996,1997 ++ ++ Origional code by: tomislav uzelac ++ Modified by: ++ * Dan Nelson - BSD mods. ++ * Andrew Richards - moved code from audio.c and added mixer support etc ++ * Brett Lymn - NetBSD support & 8bit mode. ++ */ ++ ++ /* Support for NetBSD sound devices */ ++ ++ #include "amp.h" ++ #include <sys/types.h> ++ #include <sys/stat.h> ++ #include <sys/ioctl.h> ++ #include <fcntl.h> ++ #include <unistd.h> ++ #include <stdio.h> ++ #include <stdio.h> ++ #include <errno.h> ++ #include <string.h> ++ #include <malloc.h> ++ #include <stdlib.h> ++ #include <sys/types.h> ++ #include <sys/audioio.h> ++ #include <sys/param.h> ++ #include <sys/filio.h> ++ #include <sys/stat.h> ++ #include <sys/param.h> ++ #include <sys/ioctl.h> ++ #include <fcntl.h> ++ #include <signal.h> ++ #include <soundcard.h> ++ #include "audioIO.h" ++ ++ /* optimal fragment size - if this is set too high you will get clicks ++ * in the audio output, below is near the upper limit for the sb sound driver ++ * on my machine (Toshiba 400CDT laptop). ++ */ ++ ++ int AUSIZ = 20480; ++ ++ /* declare these static to effectively isolate the audio device */ ++ ++ static int audio_fd; ++ static int mixer_fd; ++ static int volumeIoctl; ++ ++ static char *reduce; ++ ++ /* audioOpen() */ ++ /* should open the audio device, perform any special initialization */ ++ /* Set the frequency, no of channels and volume. Volume is only set if */ ++ /* it is not -1 */ ++ ++ void ++ audioOpen(int frequency, int stereo, int volume) ++ { ++ audio_info_t audio_dev; ++ int supportedMixers; ++ ++ if ((audio_fd = open ("/dev/audio", O_WRONLY, 0)) == -1) ++ die("Unable to open the audio device\n"); ++ DB(audio, msg("Audio device opened on %d\n",audio_fd); ) ++ ++ if ((mixer_fd=open("/dev/mixer",O_RDWR)) == -1) ++ warn("Unable to open mixer device\n"); ++ DB(audio, msg("Mixer device opened on %d\n",mixer_fd) ); ++ ++ if (ioctl(mixer_fd, SOUND_MIXER_READ_DEVMASK, &supportedMixers) == -1) { ++ warn("Unable to get mixer info assuming master volume\n"); ++ volumeIoctl=SOUND_MIXER_WRITE_VOLUME; ++ } else { ++ if ((supportedMixers & SOUND_MASK_PCM) != 0) ++ volumeIoctl=SOUND_MIXER_WRITE_PCM; ++ else ++ volumeIoctl=0; ++ } ++ ++ ioctl(audio_fd, AUDIO_GETINFO, &audio_dev); /* get current settings */ ++ AUDIO_INITINFO(&audio_dev); ++ ++ /* Set 1 or 2 channels */ ++ audio_dev.play.channels = (stereo ? 2 : 1); ++ ++ /* Set the output frequency */ ++ DB(audio, msg("Setting freq to %d Hz\n",frequency) ); ++ audio_dev.play.sample_rate = frequency; ++ ++ if (volume != -1) ++ audioSetVolume(volume); ++ ++ audio_dev.blocksize = AUSIZ; ++ audio_dev.play.encoding = AUDIO_ENCODING_SLINEAR; ++ audio_dev.hiwat = 20; ++ audio_dev.lowat = 1; ++ audio_dev.mode = AUMODE_PLAY; ++ ++ if (ioctl(audio_fd, AUDIO_SETINFO, &audio_dev) < 0) ++ die("AUDIO_SETINFO failed\n"); ++ ++ /* ok - try running the sound system at 16 bits, if that does not ++ * work then try 8 bits, if that does not work, give up. ++ */ ++ reduce = NULL; ++ audio_dev.play.precision = 16; ++ if (ioctl(audio_fd, AUDIO_SETINFO, &audio_dev) < 0) { ++ DB(audio, ++ msg("AUDIO_SETINFO for 16 bits failed, try 8 bits\n")); ++ if ((reduce = (char *) malloc(AUSIZ * sizeof(char))) == NULL) ++ die("Cannot malloc reduce buffer\n"); ++ audio_dev.play.precision = 8; ++ if (ioctl(audio_fd, AUDIO_SETINFO, &audio_dev) < 0) ++ die("AUDIO_SETINFO failed both 16bit and 8bit\n"); ++ AUSIZ = AUSIZ * sizeof(short); ++ } ++ } ++ ++ ++ /* audioSetVolume - only code this if your system can change the volume while */ ++ /* playing. sets the output volume 0-100 */ ++ ++ void ++ audioSetVolume(int volume) ++ { ++ DB(audio, msg("Setting volume to: %d\n",volume); ) ++ ++ volume=(volume<<8)+volume; ++ if ((mixer_fd != -1) && (volumeIoctl!=0)) ++ if (ioctl(mixer_fd, volumeIoctl, &volume) < 0) ++ warn("Unable to set sound volume\n"); ++ } ++ ++ ++ /* audioFlush() */ ++ /* should flush the audio device */ ++ ++ inline void ++ audioFlush() ++ { ++ DB(audio, msg("audio: flush %d\n",audio_fd) ); ++ ++ if (ioctl(audio_fd, SNDCTL_DSP_RESET, 0) == -1) ++ die("Unable to reset audio device\n"); ++ } ++ ++ ++ /* audioClose() */ ++ /* should close the audio device and perform any special shutdown */ ++ ++ void ++ audioClose() ++ { ++ close(audio_fd); ++ if (mixer_fd != -1) ++ close(mixer_fd); ++ DB(audio, msg("audio: closed %d\n",audio_fd) ); ++ } ++ ++ /* audioWrite */ ++ /* writes count bytes from buffer to the audio device */ ++ /* returns the number of bytes actually written */ ++ ++ inline int ++ audioWrite(char *buffer, int count) ++ { ++ int i; ++ short *cast; ++ ++ DB(audio, msg("audio: Writing %d bytes to audio descriptor %d\n",count, ++ getAudioFd()) ); ++ ++ /* if the reduce buffer is allocated we need to do 8bit writes ++ * so munge the data buffer appropriately. ++ */ ++ if (reduce != NULL) { ++ cast = (short *) buffer; ++ ++ for (i=0; i < count/sizeof(short); i++) { ++ reduce[i] = cast[i] >> 8; ++ } ++ return (sizeof(short) * write(audio_fd, reduce, ++ count/sizeof(short))); ++ } else { ++ return(write(audio_fd,buffer,count)); ++ } ++ } ++ ++ /* Let buffer.c have the audio descriptor so it can select on it. This means */ ++ /* that the program is dependent on a file descriptor to work. Should really */ ++ /* move the select's etc (with inlines of course) in here so that this is the */ ++ /* ONLY file which has hardware dependent audio stuff in it */ ++ ++ int ++ getAudioFd() ++ { ++ return(audio_fd); ++ } |