Mercurial > ~darius > hgwebdir.cgi > mikmod
view playercode/unix_drv/drv_sgi.c @ 10:55420dceb8e0
Initial entry of mikmod into the CVS tree.
author | darius |
---|---|
date | Fri, 23 Jan 1998 16:05:11 +0000 |
parents | b30908f9d9f9 |
children |
line wrap: on
line source
/* 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 };