diff options
Diffstat (limited to 'apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gus.c')
-rw-r--r-- | apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gus.c | 283 |
1 files changed, 283 insertions, 0 deletions
diff --git a/apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gus.c b/apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gus.c new file mode 100644 index 0000000000..26cdc92537 --- /dev/null +++ b/apps/plugins/sdl/progs/duke3d/Game/src/audiolib/gus.c @@ -0,0 +1,283 @@ +/* +Copyright (C) 1994-1995 Apogee Software, Ltd. + +This program is free software; you can redistribute it and/or +modify it under the terms of the GNU General Public License +as published by the Free Software Foundation; either version 2 +of the License, or (at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + +See the GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +*/ +/********************************************************************** + file: GUS.C + + author: James R. Dose + date: September 7, 1994 + + Gravis Ultrasound initialization routines. + + (c) Copyright 1994 James R. Dose. All Rights Reserved. +**********************************************************************/ + +#include <conio.h> +#include <dos.h> +#include <stdio.h> +#include <io.h> +#include <fcntl.h> +#include <string.h> +#include <stdlib.h> +#include "usrhooks.h" +#include "interrup.h" +#include "newgf1.h" +#include "gusmidi.h" +#include "guswave.h" +#include "_guswave.h" + +#define TRUE ( 1 == 1 ) +#define FALSE ( !TRUE ) + +// size of DMA buffer for patch loading +#define DMABUFFSIZE 2048U + +struct gf1_dma_buff GUS_HoldBuffer; +static int HoldBufferAllocated = FALSE; + +static int GUS_Installed = 0; + +extern VoiceNode GUSWAVE_Voices[ VOICES ]; +extern int GUSWAVE_Installed; + +unsigned long GUS_TotalMemory; +int GUS_MemConfig; + +int GUS_AuxError = 0; + +int GUS_ErrorCode = GUS_Ok; + +#define GUS_SetErrorCode( status ) \ + GUS_ErrorCode = ( status ); + + +/*--------------------------------------------------------------------- + Function: GUS_ErrorString + + Returns a pointer to the error message associated with an error + number. A -1 returns a pointer the current error. +---------------------------------------------------------------------*/ + +char *GUS_ErrorString + ( + int ErrorNumber + ) + + { + char *ErrorString; + + switch( ErrorNumber ) + { + case GUS_Warning : + case GUS_Error : + ErrorString = GUS_ErrorString( GUS_ErrorCode ); + break; + + case GUS_Ok : + ErrorString = "Ultrasound music ok."; + break; + + case GUS_OutOfMemory : + ErrorString = "Out of memory in GusMidi."; + break; + + case GUS_OutOfDosMemory : + ErrorString = "Out of conventional (640K) memory in GusMidi."; + break; + + case GUS_GF1Error : + ErrorString = gf1_error_str( GUS_AuxError ); + break; + + case GUS_InvalidIrq : + ErrorString = "Ultrasound IRQ must be 7 or less."; + break; + + case GUS_ULTRADIRNotSet : + ErrorString = "ULTRADIR environment variable not set."; + break; + + case GUS_MissingConfig : +// ErrorString = "Can't find GUSMIDI.INI file."; + ErrorString = "Can't find ULTRAMID.INI file."; + break; + + case GUS_FileError : + ErrorString = strerror( GUS_AuxError ); + break; + + default : + ErrorString = "Unknown Ultrasound error code."; + break; + } + + return( ErrorString ); + } + + + +/*--------------------------------------------------------------------- + Function: D32DosMemAlloc + + Allocate a block of Conventional memory. +---------------------------------------------------------------------*/ + +void *D32DosMemAlloc + ( + unsigned size + ) + + { + union REGS r; + + // DPMI allocate DOS memory + r.x.eax = 0x0100; + + // Number of paragraphs requested + r.x.ebx = ( size + 15 ) >> 4; + int386( 0x31, &r, &r ); + if ( r.x.cflag ) + { + // Failed + return( NULL ); + } + + return( ( void * )( ( r.x.eax & 0xFFFF ) << 4 ) ); + } + + +/*--------------------------------------------------------------------- + Function: GUS_Init + + Initializes the Gravis Ultrasound for sound and music playback. +---------------------------------------------------------------------*/ + +int GUS_Init + ( + void + ) + + { + struct load_os os; + int ret; + + if ( GUS_Installed > 0 ) + { + GUS_Installed++; + return( GUS_Ok ); + } + + GUS_SetErrorCode( GUS_Ok ); + + GUS_Installed = 0; + + GetUltraCfg( &os ); + + if ( os.forced_gf1_irq > 7 ) + { + GUS_SetErrorCode( GUS_InvalidIrq ); + return( GUS_Error ); + } + + if ( !HoldBufferAllocated ) + { + GUS_HoldBuffer.vptr = D32DosMemAlloc( DMABUFFSIZE ); + if ( GUS_HoldBuffer.vptr == NULL ) + { + GUS_SetErrorCode( GUS_OutOfDosMemory ); + return( GUS_Error ); + } + GUS_HoldBuffer.paddr = ( unsigned long )GUS_HoldBuffer.vptr; + + HoldBufferAllocated = TRUE; + } + + os.voices = 24; + ret = gf1_load_os( &os ); + if ( ret ) + { + GUS_AuxError = ret; + GUS_SetErrorCode( GUS_GF1Error ); + return( GUS_Error ); + } + + GUS_TotalMemory = gf1_mem_avail(); + GUS_MemConfig = ( GUS_TotalMemory - 1 ) >> 18; + + GUS_Installed = 1; + return( GUS_Ok ); + } + + +/*--------------------------------------------------------------------- + Function: GUS_Shutdown + + Ends use of the Gravis Ultrasound. Must be called the same number + of times as GUS_Init. +---------------------------------------------------------------------*/ + +void GUS_Shutdown + ( + void + ) + + { + if ( GUS_Installed > 0 ) + { + GUS_Installed--; + if ( GUS_Installed == 0 ) + { + gf1_unload_os(); + } + } + } + + +/*--------------------------------------------------------------------- + Function: GUSWAVE_Shutdown + + Terminates use of the Gravis Ultrasound for digitized sound playback. +---------------------------------------------------------------------*/ + +void GUSWAVE_Shutdown + ( + void + ) + + { + int i; + + if ( GUSWAVE_Installed ) + { + GUSWAVE_KillAllVoices(); + + // free memory + for ( i = 0; i < VOICES; i++ ) + { + if ( GUSWAVE_Voices[ i ].mem != NULL ) + { + gf1_free( GUSWAVE_Voices[ i ].mem ); + GUSWAVE_Voices[ i ].mem = NULL; + } + } + + GUS_Shutdown(); + GUSWAVE_Installed = FALSE; + } + } |