home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
C++ Games Programming
/
CPPGAMES.ISO
/
thx
/
source
/
theatrix
/
music.cpp
< prev
next >
Wrap
C/C++ Source or Header
|
1995-04-26
|
4KB
|
199 lines
#include <fstream.h>
#include <iomanip.h>
#include <values.h> // MAXINT
#include <io.h>
#include <dir.h>
#include <dos.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include "theatrix.h"
int MusicHand::music_supported;
char *MusicHand::drivers[3];
char *MusicHand::realptr[3];
char *MusicHand::driverptr[3];
static char far *initptr;
static char far *deinitptr;
MusicHand::MusicHand(char *sc) : Hand(0)
{
scorefilename = sc;
score = 0;
}
MusicHand::~MusicHand()
{
delete score;
}
void MusicHand::startup()
{
cout << "looking for music driver...\n";
if ((music_supported = load_sound_drivers()) != 0) {
cout << "MIDPAK drivers loaded...\n";
if ((music_supported = init_driver()) != 0) {
cout << "MIDPAK driver initialized...\n";
return;
}
}
cout << "music driver not initialized...\n";
}
void MusicHand::initialize()
{
if (music_supported && scorefilename)
load_score(scorefilename);
}
void MusicHand::shutdown()
{
if (music_supported) {
terminate_driver();
cout << "music driver terminated...\n";
}
}
void MusicHand::load_score(char *fname)
{
if (!music_supported)
return;
delete score;
score = 0;
scorefilename = 0;
struct ffblk ffblk;
if (findfirst(fname, &ffblk, 0) == -1)
return;
scorefilename = fname;
score = new char[(int)ffblk.ff_fsize];
ifstream sfile(fname, ios::binary);
sfile.read(score, (int)ffblk.ff_fsize);
// ----- register XMI file with DIGPAK
unsigned segm = FP_SEG(score);
unsigned offs = FP_OFF(score);
_DI = 0;
_SI = (int)ffblk.ff_fsize;
_BX = offs;
_CX = segm;
_AX = 0x704;
geninterrupt(0x66);
if (_AX != 2) {
delete score;
score = 0;
}
}
void MusicHand::play_music_clip(int index)
{
if (!music_supported || scorefilename == 0)
return;
stop_music_clip();
_BX = index-1;
_AX = 0x0702;
geninterrupt(0x66);
}
void MusicHand::stop_music_clip()
{
if (!music_supported || scorefilename == 0)
return;
_AX = 0x0705;
geninterrupt(0x66);
}
int MusicHand::music_clip_is_playing()
{
if (!music_supported || scorefilename == 0)
return 0;
_AX = 0x070c;
geninterrupt(0x66);
return _AX == 1;
}
void MusicHand::delete_drivers(int i)
{
while (i > 0) {
delete realptr[--i];
realptr[i] = 0;
delete driverptr[i];
driverptr[i] = 0;
}
}
int MusicHand::load_sound_drivers()
{
static char *dnames[] = {
"midpak.com",
"midpak.adv",
"midpak.ad"
};
for (int i = 0; i < 3; i++) {
struct ffblk ffblk;
if (findfirst(dnames[i],&ffblk,0) == -1)
break;
long siz = ffblk.ff_fsize;
realptr[i] = new char[(int)siz+16];
driverptr[i] = (char*)MK_FP(FP_SEG(realptr[i])+1,0);
ifstream dfile(dnames[i],ios::binary);
dfile.read(driverptr[i],(int)siz);
}
if (i < 3 || strncmp(driverptr[0]+3, "MIDPAK", 6)) {
delete_drivers(i);
return 0;
}
initptr = (char*)MK_FP(FP_SEG(driverptr[0])-0x10, 0x200);
deinitptr = (char*)MK_FP(FP_SEG(driverptr[0])-0x10, 0x203);
return 1;
}
int MusicHand::init_driver()
{
unsigned drv;
asm {
call initptr
mov drv,ax
}
if (drv) {
delete_drivers(3);
return 0;
}
unsigned segadv = FP_SEG(driverptr[1]);
unsigned offadv = FP_OFF(driverptr[1]);
unsigned segad = FP_SEG(driverptr[2]);
unsigned offad = FP_OFF(driverptr[2]);
asm {
push si
push dx
push cx
push bx
mov si,offad
mov dx,segad
mov cx,offadv
mov bx,segadv
mov ax,710h
int 66h
pop bx
pop cx
pop dx
pop si
}
return 1;
}
void MusicHand::terminate_driver()
{
if (!music_supported)
return;
asm {
call deinitptr
}
delete_drivers(3);
}