157 lines
3.6 KiB
C++
157 lines
3.6 KiB
C++
//////////////////////////////////////////////////////////////////////////////
|
||
// PROGRAMACION DEL CANAL DE SONIDO DE LA SOUND BLASTER //
|
||
// //
|
||
// por: Jos‚ Antonio Acedo Mart¡n-Grande, miembro de "GOLDY GAMES" //
|
||
// //
|
||
// TEL: (91) 6 11 72 71 (MADRID) //
|
||
//////////////////////////////////////////////////////////////////////////////
|
||
// //
|
||
// ADAPTACION PARA CATALOGO POR Jos‚ David Guill‚n //
|
||
// JD... Fv //
|
||
///////////////////////////// FICHEROS A INCLUIR ////////////////////////////
|
||
|
||
#include <dos.h>
|
||
#include <bios.h>
|
||
#include <stdio.h>
|
||
#include <alloc.h>
|
||
#include <stdlib.h>
|
||
|
||
//////////////////////////////// DEFINICIONES ////////////////////////////////
|
||
|
||
#define INICIFX 0x17
|
||
#define FINALFX 0x21
|
||
#define PAUSAFX 0x19
|
||
#define CONTIFX 0x2E
|
||
|
||
#define INICISOUND 6
|
||
#define FINALSOUND 8
|
||
#define PAUSASOUND 10
|
||
#define CONTISOUND 11
|
||
|
||
#define FINDRV 9
|
||
#define TAMSFXDRV 5000
|
||
#define TAMVOC 70000L
|
||
|
||
//////////////////////// DECLARACIONES DE FUNCIONES //////////////////////////
|
||
volatile int statusw=0; //palabra de estado del sonido FX
|
||
char sfxdriver[TAMSFXDRV]; //debe ser 16 bytes mayor que el driver
|
||
char *dir_sfxdriver;
|
||
|
||
|
||
extern char *dir_voc;
|
||
extern char *dir_sfx;
|
||
extern int sb;
|
||
|
||
extern "C" int INICIALIZADRV(char *, volatile int *);
|
||
|
||
extern "C" void ELIGEFICHFX(char *);
|
||
extern "C" void SOUNDFXDRIVER(int);
|
||
|
||
|
||
int lee_ficheros(char *, char *, long);
|
||
|
||
int asigna_memoria(void);
|
||
void libera_memoria(void);
|
||
void sin_memoria(void);
|
||
void fichero_enorme(void);
|
||
|
||
int Inicializa_SB(void);
|
||
void PlaySound(int Lee);
|
||
|
||
|
||
////////////////////////////////// PROGRAMA //////////////////////////////////
|
||
|
||
int Inicializa_SB(void)
|
||
{
|
||
int sonido = 1;
|
||
|
||
// dir_sfx=argv[1];
|
||
if ( asigna_memoria() ) return (sonido = 0);
|
||
|
||
if( lee_ficheros( "CATALOG0.drv", dir_sfxdriver, TAMSFXDRV) == 0) sonido = 0;
|
||
else {
|
||
|
||
if(INICIALIZADRV(dir_sfxdriver, &statusw)!=NULL) sonido = 0;
|
||
|
||
}
|
||
|
||
if (sonido == 0) farfree(dir_voc);
|
||
|
||
return sonido;
|
||
|
||
|
||
}
|
||
|
||
void PlaySound(int Lee){
|
||
|
||
SOUNDFXDRIVER(FINALSOUND);
|
||
|
||
if(Lee) {
|
||
if( lee_ficheros(dir_sfx, dir_voc, TAMVOC) == 1 )
|
||
ELIGEFICHFX(dir_voc);
|
||
}
|
||
SOUNDFXDRIVER(INICISOUND);
|
||
|
||
|
||
}
|
||
|
||
void fichero_enorme(void)
|
||
{
|
||
|
||
libera_memoria();
|
||
printf("El fichero VOC no puede ser mayor de %ld bytes.", TAMVOC);
|
||
exit(1);
|
||
}
|
||
|
||
int asigna_memoria(void)
|
||
{
|
||
long dir, des_dir, seg_dir;
|
||
|
||
if((dir_voc =(char *)farmalloc (80000L))==NULL) return 1;
|
||
|
||
|
||
dir_sfxdriver=sfxdriver;
|
||
dir=(long)dir_sfxdriver;
|
||
des_dir=dir & 0x0000FFFF;
|
||
seg_dir=dir & 0xFFFF0000;
|
||
des_dir=(des_dir+16) >> 4;
|
||
(long)dir_sfxdriver=seg_dir+(des_dir << 16);
|
||
|
||
return 0;
|
||
}
|
||
|
||
void libera_memoria(void)
|
||
{
|
||
farfree(dir_voc);
|
||
}
|
||
|
||
void sin_memoria(void)
|
||
{
|
||
|
||
libera_memoria();
|
||
printf("No hay suficiente memoria. Libere programas residentes.");
|
||
exit(1);
|
||
}
|
||
|
||
int lee_ficheros(char *file, char *dir_carga, long tam_fichero)
|
||
{
|
||
FILE *handle_sonido;
|
||
char *p;
|
||
long tam=0;
|
||
|
||
if((handle_sonido = fopen(file, "rb"))==NULL) {
|
||
if(file=="CATALOG0.drv") { sb = 0; return 0; }
|
||
if(file==dir_sfx) return 0;
|
||
return 0;
|
||
}
|
||
p=dir_carga;
|
||
while(!feof(handle_sonido)) {
|
||
*p=getc(handle_sonido);
|
||
(long)p++; tam++;
|
||
if(tam > tam_fichero) fichero_enorme();
|
||
}
|
||
fclose(handle_sonido);
|
||
return 1;
|
||
}
|
||
|