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