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