Mercurial > ~darius > hgwebdir.cgi > mikmod
diff playercode/unix_drv/drv_AF.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_AF.c Fri Jan 23 16:05:10 1998 +0000 @@ -0,0 +1,201 @@ +/* + + Name: + DRV_AF.C + + Description: + Mikmod driver for output on AF audio server. + + Written by Roine Gustafsson <e93_rog@e.kth.se> Oct 25, 1995 + + Portability: + Unixes running Digital AudioFile library, available from + ftp://crl.dec.com/pub/DEC/AF + + Usage: + Run the audio server (Aaxp&, Amsb&, whatever) + Set environment variable AUDIOFILE to something like 'mymachine:0'. + Remember, stereo is default! See commandline switches. + + I have a version which uses 2 computers for stereo. + Contact me if you want it. + + THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, + INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, + IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, INDIRECT OR + CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, + NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + History: + ver 1.21 Bugfix: AFFragmentSize could end up uneven. + Thanks to Marcus Sundberg <e94_msu@e.kth.se> + ver 1.22 Compatibility: change "AFBuffer" to "audiobuffer" + Steve McIntyre <stevem@chiark.greenend.org.uk> + ver 1.30 Compatibility: Use new driver API + Steve McIntyre <stevem@chiark.greenend.org.uk> +*/ + +#include <malloc.h> +#include <stdlib.h> +#include <AF/AFlib.h> + +#include "mikmod.h" + +/* Global variables */ + +SBYTE *audiobuffer; +static int AFFragmentSize; +AFAudioConn *AFaud; +ATime AFtime; +AC AFac; +AFDeviceDescriptor *AFdesc; + +BOOL AF_IsThere(void) +{ + + /* I'll think of a detection routine ... somtime */ + + return 1; + +} + +BOOL AF_Init(void) +{ + unsigned long mask; + AFSetACAttributes attributes; + int srate; + ADevice device; + unsigned int channels; + AEncodeType type; + char *server; + int n; + + AFaud = AFOpenAudioConn( "" ); + if ( AFaud == NULL ) { + myerr="Cannot open sounddevice."; + return 0; + } + + /* Search for a suitable device */ + device = -1; + for ( n = 0; n < AFaud->ndevices; n++ ) { + AFdesc = AAudioDeviceDescriptor( AFaud, n ); + if ( AFdesc->playNchannels == 2 && md_mode&DMODE_STEREO ) { + device = n; + break; + } + if ( AFdesc->playNchannels == 1 && !(md_mode&DMODE_STEREO) ) { + device = n; + break; + } + } + if ( device == -1 ) { + myerr="Cannot find suitable audio port!"; + AFCloseAudioConn( AFaud ); + return 0; + } + + attributes.preempt = Mix; + attributes.start_timeout = 0; + attributes.end_silence = 0; + attributes.type = LIN16; /* In case of an 8bit device, the AF converts the 16 bit data to 8 bit */ + attributes.channels = (md_mode&DMODE_STEREO)? Stereo: Mono; + + mask = ACPreemption | ACEncodingType | ACStartTimeout | ACEndSilence | ACChannels; + AFac = AFCreateAC( AFaud, device, mask, &attributes ); + srate=AFac->device->playSampleFreq; + + md_mode|=DMODE_16BITS; /* This driver only handles 16bits */ + AFFragmentSize = (srate/40)*8; /* Update 5 times/sec */ + md_mixfreq=srate; /* set mixing freq */ + + if ( md_mode & DMODE_STEREO ) { + if ( ( audiobuffer = (SBYTE *)malloc( 2*2*AFFragmentSize ) ) == NULL ) { + myerr="Out of memory!"; + AFCloseAudioConn( AFaud ); + return 0; + } + + } else { + if ( ( audiobuffer = (SBYTE *)malloc( 2*AFFragmentSize ) ) == NULL ) { + myerr="Out of memory!"; + AFCloseAudioConn( AFaud ); + return 0; + } + } + + if ( !VC_Init() ) { + AFCloseAudioConn( AFaud ); + free( audiobuffer ); + return 0; + } + + return 1; +} + +void AF_PlayStart( void ) +{ + + AFtime = AFGetTime( AFac ); + VC_PlayStart(); + +} + + +void AF_Exit(void) +{ + + VC_Exit(); + AFCloseAudioConn(AFaud); + free( AFBuffer ); + +} + +void AF_Update(void) +{ + + UWORD *p,*l,*r; + int i; + + + VC_WriteBytes( AFBuffer, AFFragmentSize ); + if ( md_mode & DMODE_STEREO ) { + AFPlaySamples( AFac, AFtime, AFFragmentSize, (unsigned char *)AFBuffer ); + AFtime+=AFFragmentSize/4; +// while ( AFGetTime( AFac ) < AFtime-1000 ); + } else { + AFPlaySamples( AFac, AFtime, AFFragmentSize, (unsigned char *)AFBuffer ); + AFtime+=AFFragmentSize/2; +// while ( AFGetTime( AFac ) < AFtime-1000 ); + } + +} + + +DRIVER drv_AF={ + NULL, + "AF driver", + "MikMod AudioFile Driver v1.22", + AF_IsThere, + VC_SampleLoad, + VC_SampleUnload, + VC_SampleSpace, + VC_SampleLength, + AF_Init, + AF_Exit, + VC_SetNumChannels, + AF_PlayStart, + VC_PlayStop, + AF_Update, + VC_VoiceSetVolume, + VC_VoiceSetFrequency, + VC_VoiceSetPanning, + VC_VoicePlay, + VC_VoiceStop, + VC_VoiceStopped, + VC_VoiceReleaseSustain, + VC_VoiceGetPosition, + VC_RealVolume +};