summaryrefslogtreecommitdiff
path: root/audio/xamp/patches/patch-ag
diff options
context:
space:
mode:
authorblymn <blymn>2000-06-18 11:11:51 +0000
committerblymn <blymn>2000-06-18 11:11:51 +0000
commit59fd929d60a190e911587519b6a811cb42e0a2d7 (patch)
tree829892dcba3563a11d9620d12ff68cdc144a019b /audio/xamp/patches/patch-ag
parent582a4a18e1ba3903124d6b442d9afe9f94e61b1a (diff)
downloadpkgsrc-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-ag230
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);
++ }