diff playercode/unix_drv/drv_hp.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_hp.c	Fri Jan 23 16:05:10 1998 +0000
@@ -0,0 +1,167 @@
+/*
+
+Name:
+drv_hp.c
+
+Description:
+Mikmod driver for output to HP 9000 series /dev/audio
+
+Portability:
+
+HP-UX only
+
+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 <sys/audio.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <sys/ioctl.h>
+
+#include "mikmod.h"
+
+static int fd;
+#define RAWBUFFERSIZE 16384
+static char RAW_DMABUF[RAWBUFFERSIZE];
+
+static BOOL HP_IsThere(void)
+{
+	return 1;
+}
+
+static BOOL HP_Init(void)
+{
+	int flags;
+	
+	if (! (md_mode & DMODE_16BITS)) {
+		myerr = "sorry, this driver supports 16-bit linear output only";
+		return 0;
+	}
+	
+	if ((fd = open("/dev/audio", O_WRONLY | O_NDELAY, 0)) < 0) {
+		myerr = "unable to open /dev/audio";
+		return 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;
+	}
+	
+	if (ioctl(fd, AUDIO_SET_DATA_FORMAT, AUDIO_FORMAT_LINEAR16BIT)) {
+		myerr = "unable to select 16bit-linear sample format";
+		return 0;
+	}
+	
+	if (ioctl(fd, AUDIO_SET_SAMPLE_RATE, md_mixfreq)) {
+		myerr = "unable to select requested sample-rate";
+		return 0;
+	}
+	
+	if (ioctl(fd, AUDIO_SET_CHANNELS, (md_mode & DMODE_STEREO)? 2 : 1)) {
+		myerr = "unable to select requested number of channels";
+		return 0;
+	}
+	
+	/*
+	  choose between:
+	  AUDIO_OUT_SPEAKER
+	  AUDIO_OUT_HEADPHONE
+	  AUDIO_OUT_LINE
+	*/
+	if (ioctl(fd, AUDIO_SET_OUTPUT, 
+	              AUDIO_OUT_SPEAKER | AUDIO_OUT_HEADPHONE | AUDIO_OUT_LINE)) {
+		myerr = "unable to select audio output";
+		return 0;
+	}
+
+	{
+		struct audio_describe description;
+		struct audio_gains gains;
+		float volume = 1.0;
+		if (ioctl(fd, AUDIO_DESCRIBE, &description)) {
+			myerr = "unable to get audio description";
+			return 0;
+		}
+		if (ioctl (fd, AUDIO_GET_GAINS, &gains)) {
+			myerr = "unable to get gain values";
+			return 0;
+		}
+		
+		gains.transmit_gain = (int)((float)description.min_transmit_gain +
+                                  (float)(description.max_transmit_gain
+                                          - description.min_transmit_gain)
+                                          * volume);
+		if (ioctl (fd, AUDIO_SET_GAINS, &gains)) {
+			myerr = "unable to set gain values";
+			return 0;
+		}
+	}
+	
+	if (ioctl(fd, AUDIO_SET_TXBUFSIZE, RAWBUFFERSIZE*8)) {
+		myerr = "unable to set transmission buffer size";
+		return 0;
+	}
+	
+	if(!VC_Init()){
+		close(fd);
+		return 0;
+	}
+
+	return 1;
+}
+
+
+
+static void HP_Exit(void)
+{
+	VC_Exit();
+	close(fd);
+}
+
+
+static void HP_Update(void)
+{
+	VC_WriteBytes(RAW_DMABUF,RAWBUFFERSIZE);
+	write(fd, RAW_DMABUF, RAWBUFFERSIZE);
+}
+
+
+DRIVER drv_hp={
+	NULL,
+	"HP-UX /dev/audio",
+	"MikMod HP-UX /dev/audio driver v1.10",
+	HP_IsThere,
+	VC_SampleLoad,
+	VC_SampleUnload,
+	VC_SampleSpace,
+	VC_SampleLength,
+	HP_Init,
+	HP_Exit,
+	VC_SetNumChannels,
+	VC_PlayStart,
+	VC_PlayStop,
+	HP_Update,
+	VC_VoiceSetVolume,
+	VC_VoiceSetFrequency,
+	VC_VoiceSetPanning,
+	VC_VoicePlay,
+	VC_VoiceStop,
+	VC_VoiceStopped,
+	VC_VoiceReleaseSustain,
+	VC_VoiceGetPosition,
+	VC_RealVolume
+};