summaryrefslogtreecommitdiff
path: root/src/sound/sound.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/sound/sound.cpp')
-rw-r--r--src/sound/sound.cpp454
1 files changed, 227 insertions, 227 deletions
diff --git a/src/sound/sound.cpp b/src/sound/sound.cpp
index 822675e8..da65461e 100644
--- a/src/sound/sound.cpp
+++ b/src/sound/sound.cpp
@@ -20,312 +20,312 @@
*/
#ifdef WIN32
- #pragma warning(disable:4312)
+ #pragma warning(disable:4312)
#endif
#include "sound.h"
/**
- \brief install the sound engine
- \param voices overall reserved voices
- \param mod_voices voices dedicated for mod-playback
-
- NOTE:
- overall voices must not be less or equal to the
- specified amount of mod_voices!
- if mod-voices is too low some mods will not sound
- correctly since a couple of tracks are not going
- to be played along w/ the others. so missing ins-
- truments can be a result.
- 32/20 sounds realistic here.
+ \brief install the sound engine
+ \param voices overall reserved voices
+ \param mod_voices voices dedicated for mod-playback
+
+ NOTE:
+ overall voices must not be less or equal to the
+ specified amount of mod_voices!
+ if mod-voices is too low some mods will not sound
+ correctly since a couple of tracks are not going
+ to be played along w/ the others. so missing ins-
+ truments can be a result.
+ 32/20 sounds realistic here.
*/
void TmwSound::Init(int voices, int mod_voices) {
- isOk = -1;
+ isOk = -1;
- if(mod_voices >= voices)
- throw("No voices left for SFX! Sound will be disabled!");
+ if(mod_voices >= voices)
+ throw("No voices left for SFX! Sound will be disabled!");
- install_timer();
- reserve_voices (voices, -1);
+ install_timer();
+ reserve_voices (voices, -1);
- #ifdef WIN32
- if (install_sound (DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) < 0)
- #else
- if (install_sound (DIGI_AUTODETECT, MIDI_NONE, NULL) < 0)
- #endif
- throw("Could not initialize sound... :-(");
+ #ifdef WIN32
+ if (install_sound (DIGI_AUTODETECT, MIDI_AUTODETECT, NULL) < 0)
+ #else
+ if (install_sound (DIGI_AUTODETECT, MIDI_NONE, NULL) < 0)
+ #endif
+ throw("Could not initialize sound... :-(");
- if (install_mod (mod_voices) < 0)
- throw("Could not install MOD player... :-(");
+ if (install_mod (mod_voices) < 0)
+ throw("Could not install MOD player... :-(");
- mod = NULL;
- mid = NULL;
- sfx = NULL;
+ mod = NULL;
+ mid = NULL;
+ sfx = NULL;
- pan = 128;
- pitch=1000;
+ pan = 128;
+ pitch=1000;
- items = 0;
+ items = 0;
- isOk = 0;
+ isOk = 0;
}
/**
- \brief set the volume value-range: 0-255
- \param digi for digital playback
- \param mid for midi playback
- \param mod for... aw, you guess ^^
-
- NOTE:
- all values may only be between 0-255 where 0 means
- muted.
+ \brief set the volume value-range: 0-255
+ \param digi for digital playback
+ \param mid for midi playback
+ \param mod for... aw, you guess ^^
+
+ NOTE:
+ all values may only be between 0-255 where 0 means
+ muted.
*/
void TmwSound::SetVol(int digi, int mid, int mod) {
- if(isOk==-1)
- return;
- set_volume(digi, mid);
- set_mod_volume(mod);
- set_hardware_volume(digi, mid);
-
- if(isMaxVol(vol_digi + digi)==false) vol_digi += digi;
- if(isMaxVol(vol_midi + mid) ==false) vol_midi += mid;
- if(isMaxVol(vol_mod + mod) ==false) vol_mod += mod;
+ if(isOk==-1)
+ return;
+ set_volume(digi, mid);
+ set_mod_volume(mod);
+ set_hardware_volume(digi, mid);
+
+ if(isMaxVol(vol_digi + digi)==false) vol_digi += digi;
+ if(isMaxVol(vol_midi + mid) ==false) vol_midi += mid;
+ if(isMaxVol(vol_mod + mod) ==false) vol_mod += mod;
}
/**
- \brief adjusts current volume
- \param adigi for digital playback
- \param amid for midi playback
- \param amod for... aw, you guess ^^
-
- NOTE:
- all values may only be between 0-255 where 0 means
- muted.
+ \brief adjusts current volume
+ \param adigi for digital playback
+ \param amid for midi playback
+ \param amod for... aw, you guess ^^
+
+ NOTE:
+ all values may only be between 0-255 where 0 means
+ muted.
*/
void TmwSound::SetAdjVol(int adigi, int amid, int amod) {
- if(isOk==-1)
- return;
- set_volume(vol_digi + adigi, vol_midi + amid);
- set_mod_volume(vol_mod + amod);
-
- if(isMaxVol(vol_digi + adigi)==false) vol_digi += adigi;
- if(isMaxVol(vol_midi + amid) ==false) vol_midi += amid;
- if(isMaxVol(vol_mod + amod) ==false) vol_mod += amod;
+ if(isOk==-1)
+ return;
+ set_volume(vol_digi + adigi, vol_midi + amid);
+ set_mod_volume(vol_mod + amod);
+
+ if(isMaxVol(vol_digi + adigi)==false) vol_digi += adigi;
+ if(isMaxVol(vol_midi + amid) ==false) vol_midi += amid;
+ if(isMaxVol(vol_mod + amod) ==false) vol_mod += amod;
}
/**
- \brief start BGM using a midi file
- \param in full path of midi file
- \param loop how many times should the midi be looped? (-1 = infinite)
-
- NOTE:
- playing midi does not steal away any voices but
- does not work w/ most soundcards w/o software
- emulation. this means that *nix-users will most
- probably be left out. do not use this unless we
- find a way to always get it to work. :-)
-
- at this point of time only standard RMI midi files
- can be played. so no m$ extensions like GS and such.
+ \brief start BGM using a midi file
+ \param in full path of midi file
+ \param loop how many times should the midi be looped? (-1 = infinite)
+
+ NOTE:
+ playing midi does not steal away any voices but
+ does not work w/ most soundcards w/o software
+ emulation. this means that *nix-users will most
+ probably be left out. do not use this unless we
+ find a way to always get it to work. :-)
+
+ at this point of time only standard RMI midi files
+ can be played. so no m$ extensions like GS and such.
*/
void TmwSound::StartMIDI(char *in, int loop) {
- if(isOk==-1)
- return;
+ if(isOk==-1)
+ return;
- mid = load_midi(in);
- if (!mid) {
- isOk=-1;
- throw("Could not load MIDI file!");
- }
+ mid = load_midi(in);
+ if (!mid) {
+ isOk=-1;
+ throw("Could not load MIDI file!");
+ }
- play_midi(mid, TRUE);
+ play_midi(mid, TRUE);
}
/**
- \brief start BGM using a mod file
- \param in full path of mod file
- \param loop how many times should the midi be looped? (-1 = infinite)
-
- NOTE:
- playing mod is a pretty good choice. most of the work
- is being done by the cpu so it's not dependend on the
- sound-card how things sound. if it works, it just
- works! ;-)
-
- JGMOD supports several formats:
- MOD
- S3M
- XM
- Unreal
- and S3M (in UMX extension)
+ \brief start BGM using a mod file
+ \param in full path of mod file
+ \param loop how many times should the midi be looped? (-1 = infinite)
+
+ NOTE:
+ playing mod is a pretty good choice. most of the work
+ is being done by the cpu so it's not dependend on the
+ sound-card how things sound. if it works, it just
+ works! ;-)
+
+ JGMOD supports several formats:
+ MOD
+ S3M
+ XM
+ Unreal
+ and S3M (in UMX extension)
*/
void TmwSound::StartMOD(char * in, int loop) {
- if(isOk==-1)
- return;
-
- mod = load_mod(in);
- if(!mod) {
- isOk=-1;
- throw("Error reading MOD file...");
- }
- play_mod(mod, TRUE);
+ if(isOk==-1)
+ return;
+
+ mod = load_mod(in);
+ if(!mod) {
+ isOk=-1;
+ throw("Error reading MOD file...");
+ }
+ play_mod(mod, TRUE);
}
/**
- \brief stop all currently running BGM tracks
-
- NOTE:
- you need to stop all playback when you want to
- switch from mod to midi. playing a new track is
- usually simple as calling StartMIDI() or StartMOD() again.
- passing NULL to the playing functions only means to make
- playback stop.
+ \brief stop all currently running BGM tracks
+
+ NOTE:
+ you need to stop all playback when you want to
+ switch from mod to midi. playing a new track is
+ usually simple as calling StartMIDI() or StartMOD() again.
+ passing NULL to the playing functions only means to make
+ playback stop.
*/
void TmwSound::StopBGM() {
- if(isOk==-1)
- return;
+ if(isOk==-1)
+ return;
- play_midi(NULL,-1);
- stop_mod();
+ play_midi(NULL,-1);
+ stop_mod();
- mod = NULL;
- mid = NULL;
+ mod = NULL;
+ mid = NULL;
}
/**
- \brief play short sample usually for sfx
- \param in full path to the sample file
- \param pan panning of the sound, values can be 0-255 where 128 is the middle
-
- NOTE:
- later on this will be a subsequent call to another
- function that preloads all wavs corresponding to
- the current area (e.g. monster screams) to memory.
- right now the function loads the file from hdd
- everytime you want it to be played. this is kind of
- resource intensive even though most OS'ses cache a
- already loaded file for some time.
-
- allegro supports different formats but this is not
- stated clear enough - these will work for sure:
- WAV
- VOC
-
- i don't know what kind of samples are necessary so we
- need to test this thoroughly.
+ \brief play short sample usually for sfx
+ \param in full path to the sample file
+ \param pan panning of the sound, values can be 0-255 where 128 is the middle
+
+ NOTE:
+ later on this will be a subsequent call to another
+ function that preloads all wavs corresponding to
+ the current area (e.g. monster screams) to memory.
+ right now the function loads the file from hdd
+ everytime you want it to be played. this is kind of
+ resource intensive even though most OS'ses cache a
+ already loaded file for some time.
+
+ allegro supports different formats but this is not
+ stated clear enough - these will work for sure:
+ WAV
+ VOC
+
+ i don't know what kind of samples are necessary so we
+ need to test this thoroughly.
*/
void TmwSound::StartWAV(char * in, int pan) {
- if(isOk==-1)
- return;
+ if(isOk==-1)
+ return;
- sfx = load_sample(in);
- if (!sfx)
- throw("Error reading WAV file...");
+ sfx = load_sample(in);
+ if (!sfx)
+ throw("Error reading WAV file...");
- play_sample(sfx, vol_digi, pan, pitch, FALSE);
+ play_sample(sfx, vol_digi, pan, pitch, FALSE);
}
/**
- \brief preloads a sound-item into buffer
- \param fpath full path to file
- \param type type of item (TMWSOUND_MOD, TMWSOUND_MID, TMWSOUND_SFX)
+ \brief preloads a sound-item into buffer
+ \param fpath full path to file
+ \param type type of item (TMWSOUND_MOD, TMWSOUND_MID, TMWSOUND_SFX)
- NOTE:
- only TMWSOUND_SFX items get preloaded. everything
- else will only store the full path to the file.
+ NOTE:
+ only TMWSOUND_SFX items get preloaded. everything
+ else will only store the full path to the file.
- please make sure that the object is not loaded more
- than once since the function will not be able to run
- checks for its own!
+ please make sure that the object is not loaded more
+ than once since the function will not be able to run
+ checks for its own!
- the return value should be kept as a reference to the
- object loaded. if not it is practicaly lost.
+ the return value should be kept as a reference to the
+ object loaded. if not it is practicaly lost.
*/
TMWSOUND_SID TmwSound::LoadItem(char *fpath, char type) {
- POOL_ITEM item;
- if(type == TMWSOUND_SFX) {
- if(!(item.data = (void*)load_sample(fpath)))
- throw(sprintf("Unable to load sample: %s\n", fpath));
- }
-
- items++;
- item.id = items;
- item.type = type;
- item.fname = fpath;
-
- soundpool.push_front(item);
- return item.id;
+ POOL_ITEM item;
+ if(type == TMWSOUND_SFX) {
+ if(!(item.data = (void*)load_sample(fpath)))
+ throw(sprintf("Unable to load sample: %s\n", fpath));
+ }
+
+ items++;
+ item.id = items;
+ item.type = type;
+ item.fname = fpath;
+
+ soundpool.push_front(item);
+ return item.id;
}
/**
- \brief unloads an item from the soundpool
- \param id id returned by LoadItem()
+ \brief unloads an item from the soundpool
+ \param id id returned by LoadItem()
*/
void TmwSound::UnloadItem(TMWSOUND_SID id) {
- int cnt = 0;
- POOL_ITEM item;
- for(sounditem = soundpool.begin(); sounditem != soundpool.end(); sounditem++) {
- item = *sounditem;
- if(item.id == id) {
- destroy_sample((SAMPLE*)item.data);
- soundpool.erase(sounditem);
- return;
- }
- cnt++;
- }
+ int cnt = 0;
+ POOL_ITEM item;
+ for(sounditem = soundpool.begin(); sounditem != soundpool.end(); sounditem++) {
+ item = *sounditem;
+ if(item.id == id) {
+ destroy_sample((SAMPLE*)item.data);
+ soundpool.erase(sounditem);
+ return;
+ }
+ cnt++;
+ }
}
/**
- \brief plays an item in soundpool
- \param id id returned by LoadItem()
- \param loop loop n times (-1 is infinite)
+ \brief plays an item in soundpool
+ \param id id returned by LoadItem()
+ \param loop loop n times (-1 is infinite)
*/
void TmwSound::PlayItem(TMWSOUND_SID id, int loop) {
- POOL_ITEM item;
- for(sounditem = soundpool.begin(); sounditem != soundpool.end(); sounditem++) {
- item = *sounditem;
- if(item.id = id) {
- switch(item.type) {
- case TMWSOUND_SFX :
- play_sample((SAMPLE*)item.data, vol_digi, pan, pitch, FALSE);
- break;
- case TMWSOUND_MOD :
- StartMOD((char*)item.fname.c_str(),loop);
- break;
- case TMWSOUND_MID :
- StartMIDI((char*)item.fname.c_str(),loop);
- break;
- }
- }
- }
+ POOL_ITEM item;
+ for(sounditem = soundpool.begin(); sounditem != soundpool.end(); sounditem++) {
+ item = *sounditem;
+ if(item.id = id) {
+ switch(item.type) {
+ case TMWSOUND_SFX :
+ play_sample((SAMPLE*)item.data, vol_digi, pan, pitch, FALSE);
+ break;
+ case TMWSOUND_MOD :
+ StartMOD((char*)item.fname.c_str(),loop);
+ break;
+ case TMWSOUND_MID :
+ StartMIDI((char*)item.fname.c_str(),loop);
+ break;
+ }
+ }
+ }
}
/**
- \brief deinstall all sound functionality
-
- NOTE:
- normally you won't need to call this since this is
- done by allegro when shutting itself down. but if
- you find a reason to delete the sound-engine from
- memory (e.g. garbage-collection) feel free to use
- it. :-P
+ \brief deinstall all sound functionality
+
+ NOTE:
+ normally you won't need to call this since this is
+ done by allegro when shutting itself down. but if
+ you find a reason to delete the sound-engine from
+ memory (e.g. garbage-collection) feel free to use
+ it. :-P
*/
void TmwSound::Close(void) {
- mod = NULL;
- mid = NULL;
- sfx = NULL;
+ mod = NULL;
+ mid = NULL;
+ sfx = NULL;
- remove_mod();
- remove_sound();
- isOk = -1;
+ remove_mod();
+ remove_sound();
+ isOk = -1;
}
/**
- \brief checks if value equals min-/maximum volume and returns
- true if that's the case.
+ \brief checks if value equals min-/maximum volume and returns
+ true if that's the case.
*/
bool TmwSound::isMaxVol(int vol) {
- if( vol > 0 && vol < 255 ) return false;
- else return true;
+ if( vol > 0 && vol < 255 ) return false;
+ else return true;
}