CATALOGO/SONIDOP.CPP
2021-09-03 17:43:05 +02:00

157 lines
3.6 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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