diff playercode/unix_drv/drv_aix.c @ 8:b30908f9d9f9

Initial entry of mikmod into the CVS tree.
author darius
date Fri, 23 Jan 1998 16:05:10 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/playercode/unix_drv/drv_aix.c	Fri Jan 23 16:05:10 1998 +0000
@@ -0,0 +1,173 @@
+/*
+
+Name:
+drv_aix.c
+
+Description:
+Mikmod driver for output to AIX series audio device
+
+Portability:
+
+AIX >= 3.25 with appropriate audio hardware.
+
+Written by Lutz Vieweg <lkv@mania.robin.de>
+based on drv_raw.c
+
+Feel free to distribute just as you like.
+No warranties at all.
+
+*/
+
+#include <stdio.h>
+#include <stdlib.h>
+
+#include <unistd.h>
+#include <fcntl.h>
+#include <errno.h>
+#include <sys/stat.h>
+#include <sys/audio.h>
+
+#include "mikmod.h"
+
+struct _track_info
+{
+        unsigned short master_volume;
+        unsigned short dither_percent;
+        unsigned short reserved[3];
+} t_info;
+audio_init a_init;
+audio_control a_control;
+audio_change a_change;
+
+
+static int fd;
+#define RAWBUFFERSIZE 32768
+static char RAW_DMABUF[RAWBUFFERSIZE];
+
+static BOOL AIX_IsThere(void)
+{
+	return 1;
+}
+
+static BOOL AIX_Init(void)
+{
+	float volume = (float)1.0;
+	int flags;
+	
+	if (! (md_mode & DMODE_16BITS)) {
+		myerr = "sorry, this driver supports 16-bit linear output only";
+		return 0;
+	}
+	
+   if ((fd = open ("/dev/acpa0/1", O_WRONLY)) < 3)
+     if ((fd = open ("/dev/paud0/1", O_WRONLY)) < 3)
+       if ((fd = open ("/dev/baud0/1", O_WRONLY)) < 3)
+       {
+         myerr = "unable to open audio-device";
+         return 0;
+       }
+	
+	
+  t_info.master_volume=0x7fff;
+  t_info.dither_percent=0;
+	
+  a_init.srate=md_mixfreq;
+  a_init.bits_per_sample=16;
+  a_init.channels=(md_mode & DMODE_STEREO)? 2 : 1;
+  a_init.mode=PCM;
+  a_init.flags=FIXED | BIG_ENDIAN | TWOS_COMPLEMENT;
+  a_init.operation=PLAY;
+	
+  a_change.balance=0x3fff0000;
+  a_change.balance_delay=0;
+  a_change.volume=(long)(volume * (float)0x7FFFFFFF);
+  a_change.volume_delay=0;
+  a_change.monitor=AUDIO_IGNORE;
+  a_change.input=AUDIO_IGNORE;
+  a_change.output=OUTPUT_1;
+  a_change.dev_info=&t_info;
+
+  a_control.ioctl_request=AUDIO_CHANGE;
+  a_control.position=0;
+  a_control.request_info=&a_change;
+
+  if (ioctl(fd, AUDIO_INIT, &a_init) == -1 )
+  {
+    myerr = "configuration (init) of audio device failed";
+    return 0;
+  }
+  if (ioctl(fd, AUDIO_CONTROL, &a_control) == -1 )
+  {
+    myerr = "configuration (control) of audio device failed";
+    return 0;
+  }
+
+  a_control.ioctl_request=AUDIO_START;
+  a_control.request_info=NULL;
+  if (ioctl(fd, AUDIO_CONTROL, &a_control) == -1 )
+  {
+    myerr = "configuration (start) of audio device failed";
+    return 0;
+  }
+	
+#if 0
+	if ((flags = fcntl (fd, F_GETFL, 0)) < 0) {
+		myerr = "unable to set non-blocking mode for /dev/audio";
+		return 0;
+	}
+	flags |= O_NDELAY;
+	if (fcntl (fd, F_SETFL, flags) < 0) {
+		myerr = "unable to set non-blocking mode for /dev/audio";
+		return 0;
+	}
+#endif
+	
+	if(!VC_Init()){
+		close(fd);
+		return 0;
+	}
+
+	return 1;
+}
+
+
+
+static void AIX_Exit(void)
+{
+	VC_Exit();
+	close(fd);
+}
+
+
+static void AIX_Update(void)
+{
+	VC_WriteBytes(RAW_DMABUF,RAWBUFFERSIZE);
+	write(fd, RAW_DMABUF, RAWBUFFERSIZE);
+}
+
+
+DRIVER drv_aix={
+	NULL,
+	"AIX audio-device",
+	"MikMod AIX audio-device driver v1.10",
+	AIX_IsThere,
+	VC_SampleLoad,
+	VC_SampleUnload,
+	VC_SampleSpace,
+	VC_SampleLength,
+	AIX_Init,
+	AIX_Exit,
+	VC_SetNumChannels,
+	VC_PlayStart,
+	VC_PlayStop,
+	AIX_Update,
+	VC_VoiceSetVolume,
+	VC_VoiceSetFrequency,
+	VC_VoiceSetPanning,
+	VC_VoicePlay,
+	VC_VoiceStop,
+	VC_VoiceStopped,
+	VC_VoiceReleaseSustain,
+	VC_VoiceGetPosition,
+	VC_RealVolume
+};