/*
* Seven Kingdoms: Ancient Adversaries
*
* Copyright 1997,1998 Enlight Software Ltd.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see .
*
*/
//Filename : OAUDIO.H
//Description : Object Midi Audio and Digitized Sound
//Ownership : Gilbert
#ifndef __OAUDIO_H
#define __OAUDIO_H
#ifndef __ORESX_H
#include
#endif
#include
#include
#include
//------ Define constant -----------//
#define DEFAULT_MID_BUF_SIZE 0x8000
#define DEFAULT_WAV_BUF_SIZE 0x8000
#define MAX_AUDIO_VOLUME 100
#define MAX_WAV_CHANNEL 8
#define MAX_LONG_WAV_CH 4
#define MAX_LOOP_WAV_CH 4
//--------------- Define class Audio ---------------//
class Audio
{
public:
char init_flag;
char mid_init_flag; // whether the midi driver has been installed
char wav_init_flag; // whether the wave driver has been installed
char cd_init_flag;
char mid_flag; // flag determing whether MIDI music should be playing
char wav_flag; // flag determing whether WAV sound effects should be playing
char cd_flag; // flag determing whether Audio CD track should be playing
char* mid_buf;
char* wav_buf;
int mid_buf_size;
int wav_buf_size;
ResourceIdx mid_res;
ResourceIdx wav_res;
public:
Audio();
~Audio();
int init();
void deinit();
void yield(); // called by sys every some time
int play_mid(char*);
// functions on short wave
int play_wav(char*, DsVolume);
int play_wav(short resIdx, DsVolume);
int play_resided_wav(char *, DsVolume);
int get_free_wav_ch();
int stop_wav(int);
int is_wav_playing(int);
// functions on long wave
int play_long_wav(char*, DsVolume);
int stop_long_wav(int);
int is_long_wav_playing(int);
void volume_long_wav(int ch, DsVolume);
// functions on loop wave
int play_loop_wav(char *, int repeatOffset, DsVolume); // return channel no.
void stop_loop_wav(int ch);
void volume_loop_wav(int ch, DsVolume);
void fade_out_loop_wav(int ch, int fadeRate);
DsVolume get_loop_wav_volume(int ch);
int is_loop_wav_fading(int ch);
int play_cd(int, int retVolume);
void stop_mid();
void stop_wav(); // and stop also long wav
void stop_cd();
void stop_long_wav();
int is_mid_playing();
int is_wav_playing();
int is_cd_playing();
void toggle_mid(int);
void toggle_wav(int);
void toggle_cd(int);
void set_mid_volume(int);
void set_wav_volume(int); // 0 to 100
void set_cd_volume(int);
private:
int init_mid();
int init_wav();
int init_cd();
void deinit_mid();
void deinit_wav();
void deinit_cd();
LPDIRECTSOUND lp_direct_sound; // DirectSound object
LPDIRECTSOUNDBUFFER lp_wav_ch_dsb[MAX_WAV_CHANNEL];
// DirectSoundBuffer of each channel
int wav_serial_no[MAX_WAV_CHANNEL];
int max_wav_serial_no;
LPDIRECTSOUNDBUFFER lp_lwav_ch_dsb[MAX_LONG_WAV_CH];
int lwav_serial_no[MAX_LONG_WAV_CH];
int max_lwav_serial_no;
// DirectSoundBuffer of each long wave
File* lwav_fileptr[MAX_LONG_WAV_CH];
// file point of each long wave
short lwav_bank[MAX_LONG_WAV_CH]; // which bank to be filled next
short lwav_bufsiz[MAX_LONG_WAV_CH];
// buffer size of each channel = lwav_bufsiz[c]*LWAV_BANKS
long wav_volume; // -10000 to 0
char run_yield; // 0 = skip Audio::yield()
LPDIRECTSOUNDBUFFER lp_loop_ch_dsb[MAX_LOOP_WAV_CH];
File* loopwav_fileptr[MAX_LOOP_WAV_CH];
int repeat_offset[MAX_LOOP_WAV_CH];
short loopwav_bank[MAX_LOOP_WAV_CH];
DWORD loopwav_fade_time[MAX_LOOP_WAV_CH];
int loopwav_fade_rate[MAX_LOOP_WAV_CH];
long vol_multiply( int relVolume); // 0 to 100
int vol_divide( long dsVolume); // 0 to -10000
int assign_serial( int &);
friend class DsVolume;
};
extern Audio audio;
//--------------------------------------------------//
#endif