Mercurial > ~darius > hgwebdir.cgi > mikmod
diff playercode/unix_drv/drv_oss.c @ 13:32f80cd7bfee
General tidy up..
author | darius |
---|---|
date | Thu, 23 Apr 1998 07:20:19 +0000 |
parents | 990c9dadb348 |
children |
line wrap: on
line diff
--- a/playercode/unix_drv/drv_oss.c Thu Apr 23 07:20:13 1998 +0000 +++ b/playercode/unix_drv/drv_oss.c Thu Apr 23 07:20:19 1998 +0000 @@ -1,37 +1,33 @@ /* - -Name: -DRV_VOX.C - -Description: -Mikmod driver for output on linux and FreeBSD Open Sound System (OSS) -(/dev/dsp) - -Portability: VoxWare/SS/OSS land. Linux, FreeBSD (NetBSD & SCO?) - -New fragment configuration code done by Rao: -============================================ - -You can use the environment variables 'MM_FRAGSIZE' and 'MM_NUMFRAGS' to -override the default size & number of audio buffer fragments. If you -experience crackles & pops, try experimenting with these values. - -Read experimental.txt within the VoxWare package for information on these -options. They are _VERY_ important with relation to sound popping and smooth -playback. - -In general, the slower your system, the higher these values need to be. - -MM_NUMFRAGS is within the range 2 to 255 (decimal) - -MM_FRAGSIZE is is within the range 7 to 17 (dec). The requested fragment size -will be 2^MM_FRAGSIZE - -- This driver DOES work with MikMod 3.0 -- modifed to use an ioctl() to figure out how much data to do with - each write, keeps us from blocking extensivly - -*/ + * Name: DRV_VOX.C + * + * Description: Mikmod driver for output on linux and FreeBSD Open Sound System + * (OSS) (/dev/dsp) + * + * Portability: VoxWare/SS/OSS land. Linux, FreeBSD (NetBSD & SCO?) + * + * New fragment configuration code done by Rao: + * ============================================ + * + * You can use the environment variables 'MM_FRAGSIZE' and 'MM_NUMFRAGS' to + * override the default size & number of audio buffer fragments. If you + * experience crackles & pops, try experimenting with these values. + * + * Read experimental.txt within the VoxWare package for information on these + * options. They are _VERY_ important with relation to sound popping and + * smooth playback. + * + * In general, the slower your system, the higher these values need to be. + * + * MM_NUMFRAGS is within the range 2 to 255 (decimal) + * + * MM_FRAGSIZE is is within the range 7 to 17 (dec). The requested fragment size + * will be 2^MM_FRAGSIZE + * + * - This driver DOES work with MikMod 3.0 - modifed to use an ioctl() to figure + * out how much data to do with each write, keeps us from blocking extensivly + * + */ #include <stdio.h> #include <stdlib.h> #include <unistd.h> @@ -43,7 +39,7 @@ #include <machine/soundcard.h> #else #include <sys/soundcard.h> -#endif /* __FreeBSD__ */ +#endif /* __FreeBSD__ */ #include <sys/ioctl.h> #include <sys/wait.h> #include "mikmod.h" @@ -52,124 +48,133 @@ #define DEFAULT_FRAGSIZE 17 #define DEFAULT_NUMFRAGS 4 -static int sndfd; -static int fragmentsize; -static char* audiobuffer; +static int sndfd; +static int fragmentsize; +static char *audiobuffer; -static BOOL OSS_IsThere(void) +static BOOL +OSS_IsThere(void) { - return (access("/dev/dsp",W_OK)==0); + return (access("/dev/dsp", W_OK) == 0); } -static BOOL OSS_Init(void) +static BOOL +OSS_Init(void) { - char *env; - int play_precision,play_stereo,play_rate; - int fragsize,numfrags; - - if((sndfd=open("/dev/dsp",O_WRONLY))<0){ - return 1; - } + char *env; + int play_precision, play_stereo, play_rate; + int fragsize, numfrags; - fragsize=(env=getenv("MM_FRAGSIZE")) ? atoi(env) : DEFAULT_FRAGSIZE; - numfrags=(env=getenv("MM_NUMFRAGS")) ? atoi(env) : DEFAULT_NUMFRAGS; - - if(fragsize<7 || fragsize>17) fragsize=DEFAULT_FRAGSIZE; - if(numfrags<2 || numfrags>255) numfrags=DEFAULT_NUMFRAGS; + if ((sndfd = open("/dev/dsp", O_WRONLY)) < 0) { + return 1; + } + fragsize = (env = getenv("MM_FRAGSIZE")) ? atoi(env) : DEFAULT_FRAGSIZE; + numfrags = (env = getenv("MM_NUMFRAGS")) ? atoi(env) : DEFAULT_NUMFRAGS; - fragmentsize=(numfrags<<16) | fragsize; - -#ifndef __FreeBSD__ - if(ioctl(sndfd, SNDCTL_DSP_SETFRAGMENT, &fragmentsize)<0){ + if (fragsize < 7 || fragsize > 17) + fragsize = DEFAULT_FRAGSIZE; + + if (numfrags < 2 || numfrags > 255) + numfrags = DEFAULT_NUMFRAGS; + + fragmentsize = (numfrags << 16) | fragsize; + +#ifndef __FreeBSD__ + if (ioctl(sndfd, SNDCTL_DSP_SETFRAGMENT, &fragmentsize) < 0) { close(sndfd); return 1; - } -#endif /* __FreeBSD__ */ + } +#endif /* __FreeBSD__ */ - play_precision = (md_mode & DMODE_16BITS) ? 16 : 8; - play_stereo= (md_mode & DMODE_STEREO) ? 1 : 0; - play_rate=md_mixfreq; + play_precision = (md_mode & DMODE_16BITS) ? 16 : 8; + play_stereo = (md_mode & DMODE_STEREO) ? 1 : 0; + play_rate = md_mixfreq; - if(ioctl(sndfd, SNDCTL_DSP_SAMPLESIZE, &play_precision) == -1 || - ioctl(sndfd, SNDCTL_DSP_STEREO, &play_stereo) == -1 || - ioctl(sndfd, SNDCTL_DSP_SPEED, &play_rate) == -1){ + if (ioctl(sndfd, SNDCTL_DSP_SAMPLESIZE, &play_precision) == -1 || + ioctl(sndfd, SNDCTL_DSP_STEREO, &play_stereo) == -1 || + ioctl(sndfd, SNDCTL_DSP_SPEED, &play_rate) == -1) { + close(sndfd); return 1; - } + } - ioctl(sndfd, SNDCTL_DSP_GETBLKSIZE, &fragmentsize); + ioctl(sndfd, SNDCTL_DSP_GETBLKSIZE, &fragmentsize); -/* Lose this for now - it will confuse ncurses etc... - printf("Fragment size is %ld\n",fragmentsize); */ + /* + * Lose this for now - it will confuse ncurses etc... printf("Fragment + * size is %ld\n",fragmentsize); + */ - if(VC_Init()){ + if (VC_Init()) { close(sndfd); return 1; - } + } + audiobuffer = (char *) _mm_malloc(fragmentsize * sizeof(char) * 2); - audiobuffer = (char*) _mm_malloc(fragmentsize * sizeof(char) * 2); - - if(audiobuffer==NULL){ + if (audiobuffer == NULL) { VC_Exit(); close(sndfd); return 1; - } - - return 0; + } + return 0; } -static void OSS_Exit(void) +static void +OSS_Exit(void) { - free(audiobuffer); - VC_Exit(); - close(sndfd); + free(audiobuffer); + VC_Exit(); + close(sndfd); } -static void OSS_Update(void) +static void +OSS_Update(void) { - audio_buf_info buffinf; - ioctl(sndfd, SNDCTL_DSP_GETOSPACE, &buffinf); - VC_WriteBytes(audiobuffer,buffinf.fragments*buffinf.fragsize); - write(sndfd,audiobuffer,buffinf.fragments*buffinf.fragsize); + audio_buf_info buffinf; + + ioctl(sndfd, SNDCTL_DSP_GETOSPACE, &buffinf); + VC_WriteBytes(audiobuffer, buffinf.fragments * buffinf.fragsize); + write(sndfd, audiobuffer, buffinf.fragments * buffinf.fragsize); } -BOOL OSS_Reset(void) +BOOL +OSS_Reset(void) { - ioctl(sndfd, SNDCTL_DSP_RESET); - VC_Exit(); - return VC_Init(); + ioctl(sndfd, SNDCTL_DSP_RESET); + VC_Exit(); + return VC_Init(); } -MDRIVER drv_oss = +MDRIVER drv_oss = { - NULL, - "Open Sound System (OSS)", - "Open Sound System (OSS) Driver v1.3 - by Rao & MikMak (with a little hacking from Pete)", - 0,255, - OSS_IsThere, - VC_SampleLoad, - VC_SampleUnload, - VC_SampleSpace, - VC_SampleLength, - OSS_Init, - OSS_Exit, - OSS_Reset, - VC_SetNumVoices, - VC_PlayStart, - VC_PlayStop, - OSS_Update, - VC_VoiceSetVolume, - VC_VoiceSetFrequency, - VC_VoiceSetPanning, - VC_VoicePlay, - VC_VoiceStop, - VC_VoiceStopped, - VC_VoiceReleaseSustain, - VC_VoiceGetPosition, - VC_VoiceRealVolume + NULL, + "Open Sound System (OSS)", + "Open Sound System (OSS) Driver v1.3 - by Rao & MikMak (with a little hacking from Pete)", + 0, 255, + OSS_IsThere, + VC_SampleLoad, + VC_SampleUnload, + VC_SampleSpace, + VC_SampleLength, + OSS_Init, + OSS_Exit, + OSS_Reset, + VC_SetNumVoices, + VC_PlayStart, + VC_PlayStop, + OSS_Update, + VC_VoiceSetVolume, + VC_VoiceSetFrequency, + VC_VoiceSetPanning, + VC_VoicePlay, + VC_VoiceStop, + VC_VoiceStopped, + VC_VoiceReleaseSustain, + VC_VoiceGetPosition, + VC_VoiceRealVolume };