diff playercode/unix_drv/drv_sgi.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_sgi.c	Fri Jan 23 16:05:10 1998 +0000
@@ -0,0 +1,174 @@
+/*
+
+Name:
+DRV_SGI.C, version 0.2
+Copyright 1996 by Stephan Kanthak, kanthak@i6.informatik.rwth-aachen.de
+
+Version 0.2 - updated to use new driver API
+
+Description:
+Mikmod driver for output on SGI audio system (needs libaudio from the
+dmedia package).
+
+Portability:
+SGI only. Mainly based on voxware driver.
+
+Fragment configuration:
+=======================
+
+You can use the environment variables 'MM_SGI_FRAGSIZE' and
+'MM_SGI_BUFSIZE' to override the default size of the audio buffer. If you
+experience crackles & pops, try experimenting with these values.
+
+Please read README.SGI first before contacting the author because there are
+some things to know about the specials of the SGI audio driver.
+
+*/
+
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <dmedia/audio.h>
+#include "mikmod.h"
+
+#define DEFAULT_SGI_FRAGSIZE  5000
+#define DEFAULT_SGI_BUFSIZE   10000
+
+static ALconfig sgi_config;
+static ALport sgi_port;
+static int sample_factor;
+static int sgi_fragsize;
+static int sgi_bufsize;
+static char* audiobuffer;
+
+
+static BOOL SGI_IsThere(void)
+{
+	long params[] = { AL_OUTPUT_RATE, 0 };
+
+	ALqueryparams(AL_DEFAULT_DEVICE, params, 2);
+	if (params[1] != 0) return 1;
+	else return 0;
+}
+
+static BOOL SGI_Init(void)
+{
+	char *env;
+	int play_rate;
+	int fragsize,numfrags;
+	long chpars[] = { AL_OUTPUT_RATE, AL_RATE_22050 };
+
+	printf("SGI audio driver: ");
+	switch(md_mixfreq) {
+	case 22050:
+		chpars[1] = AL_RATE_22050;
+		break;
+	case 44100:
+		chpars[1] = AL_RATE_44100;
+		break;
+	default:
+		printf("mixing rate not supported.\n");
+		return 0;
+		break;
+	}
+	ALsetparams(AL_DEFAULT_DEVICE, chpars, 2);
+
+	if ((sgi_config = ALnewconfig()) == 0) {
+		printf("cannot configure sound device.\n");
+		return 0;
+	}
+	
+	if (md_mode & DMODE_16BITS) {
+		if (ALsetwidth(sgi_config, AL_SAMPLE_16) < 0) {
+			printf("samplesize of 16 bits not supported.\n");
+			return 0;
+		}
+		sample_factor = 2;
+	} else {
+		if (ALsetwidth(sgi_config, AL_SAMPLE_8) < 0) {
+			printf("samplesize of 8 bits not supported.\n");
+			return 0;
+		}
+		sample_factor = 1;
+	}
+
+	if (md_mode & DMODE_STEREO) {
+		if (ALsetchannels(sgi_config, AL_STEREO) < 0) {
+			printf("stereo mode not supported.\n");
+			return 0;
+		}
+	} else{
+		if (ALsetchannels(sgi_config, AL_MONO) < 0) {
+			printf("mono mode not supported.\n");
+			return 0;
+		}
+	}
+
+	if(!VC_Init()){
+		return 0;
+	}
+
+	sgi_fragsize=(env=getenv("MM_SGI_FRAGSIZE")) ? atol(env) : DEFAULT_SGI_BUFSIZE;
+	sgi_bufsize=(env=getenv("MM_SGI_BUFSIZE")) ? atol(env) : DEFAULT_SGI_BUFSIZE;
+
+	ALsetqueuesize(sgi_config, sgi_bufsize);
+	if ((sgi_port = ALopenport("Mod4X", "w", sgi_config)) == 0) {
+		printf("cannot open SGI audio port.\n");
+		return 0;
+	}
+	printf("%dHz/%dBits/", md_mixfreq, 8*sample_factor);
+	if (md_mode & DMODE_STEREO) printf("stereo.\n");
+	else printf("mono.\n");
+
+
+	audiobuffer = (char*) MyMalloc(sgi_fragsize * sizeof(char));
+
+	if(audiobuffer==NULL){
+		VC_Exit();
+		return 0;
+	}
+	
+	return 1;
+}
+
+
+static void SGI_Exit(void)
+{
+	free(audiobuffer);
+	VC_Exit();
+}
+
+
+static void SGI_Update(void)
+{
+	VC_WriteBytes(audiobuffer, sgi_fragsize);
+	ALwritesamps(sgi_port,audiobuffer, sgi_fragsize/sample_factor);
+}
+
+
+DRIVER drv_sgi={
+	NULL,
+	"SGI Audio System",
+	"SGI Audio System Driver v0.2 - by Stephan Kanthak",
+	SGI_IsThere,
+	VC_SampleLoad,
+	VC_SampleUnload,
+	VC_SampleSpace,
+	VC_SampleLength,
+	SGI_Init,
+	SGI_Exit,
+	VC_SetNumChannels,
+        VC_PlayStart,
+        VC_PlayStop,
+	SGI_Update,
+	VC_VoiceSetVolume,
+	VC_VoiceSetFrequency,
+	VC_VoiceSetPanning,
+	VC_VoicePlay,
+	VC_VoiceStop,
+	VC_VoiceStopped,
+	VC_VoiceReleaseSustain,
+	VC_VoiceGetPosition,
+	VC_RealVolume
+};