duke3d/audiolib/gus.c

284 lines
6.2 KiB
C
Executable File

/*
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;
}
}