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