sound code refactoring, made sourcescheduler a singleton

git-svn-id: svn://svn.code.sf.net/p/actiongame/code/trunk/ac@3792 e016b1c5-ed68-44aa-a2f7-31cac88cffde
This commit is contained in:
driAn
2008-11-28 22:50:15 +00:00
parent 5f1b0de62f
commit 02cf7f903f
5 changed files with 21 additions and 12 deletions
+3 -3
View File
@@ -76,7 +76,7 @@ void audiomanager::initsound()
conoutf("Driver: %s", alGetString(AL_VERSION));
// allocate OpenAL resources
scheduler.init();
sourcescheduler::default().init();
// let the stream get the first source from the scheduler
gamemusic = new oggstream();
@@ -230,7 +230,7 @@ void audiomanager::soundcleanup()
bufferpool.clear();
// kill scheduler
scheduler.reset();
sourcescheduler::default().reset();
// shutdown openal
alcMakeContextCurrent(NULL);
@@ -736,7 +736,7 @@ COMMANDF(mapsoundreset, ARG_NONE, ()
audiomgr.mapsoundreset();
});
VARF(soundchannels, 4, 32, 1024, { if(!audiomgr.nosound) scheduler.init(); });
VARF(soundchannels, 4, 32, 1024, { if(!audiomgr.nosound) sourcescheduler::default().init(); });
VARFP(soundvol, 0, 128, 255,
{
+3 -3
View File
@@ -27,7 +27,7 @@ oggstream::oggstream() : valid(false), isopen(false), src(NULL)
reset();
// grab a source and keep it during the whole lifetime
src = scheduler.newsource(SP_HIGHEST, camera1->o);
src = sourcescheduler::default().newsource(SP_HIGHEST, camera1->o);
if(src)
{
if(src->valid)
@@ -37,7 +37,7 @@ oggstream::oggstream() : valid(false), isopen(false), src(NULL)
}
else
{
scheduler.releasesource(src);
sourcescheduler::default().releasesource(src);
src = NULL;
}
}
@@ -53,7 +53,7 @@ oggstream::~oggstream()
{
reset();
if(src) scheduler.releasesource(src);
if(src) sourcescheduler::default().releasesource(src);
if(alIsBuffer(bufferids[0]) || alIsBuffer(bufferids[1]))
{
+5 -3
View File
@@ -154,14 +154,17 @@ public:
virtual sbuffer *find(char *name);
};
// manages sources
// manages available sources, abstracts audio channels
// is a singleton
class sourcescheduler
{
public:
static sourcescheduler *instance;
vector<source *> sources;
public:
sourcescheduler();
static sourcescheduler &default(); // singleton access
void init();
void reset();
@@ -405,7 +408,6 @@ extern ov_callbacks oggcallbacks;
extern int soundvol;
extern int audiodebug;
extern sourcescheduler scheduler; // FIXME
extern audiomanager audiomgr;
+2 -2
View File
@@ -35,7 +35,7 @@ location::location(int sound, const worldobjreference &r, int priority) : cfg(NU
}
// obtain source
src = scheduler.newsource(priority, r.currentposition());
src = sourcescheduler::default().newsource(priority, r.currentposition());
// apply configuration
if(!src || !src->valid || !src->buffer(cfg->buf->id) || !src->looping(cfg->loop) || !src->gain(cfg->vol/100.0f*((float)gainscale)/100.0f))
{
@@ -50,7 +50,7 @@ location::location(int sound, const worldobjreference &r, int priority) : cfg(NU
location::~location()
{
if(src) scheduler.releasesource(src);
if(src) sourcescheduler::default().releasesource(src);
if(cfg) cfg->ondetach();
if(ref)
{
+8 -1
View File
@@ -14,10 +14,18 @@ VARP(soundscheddistancescore, 0, 5, 1000);
VARP(soundschedoldbonus, 0, 100, 1000);
VARP(soundschedreserve, 0, 2, 100);
sourcescheduler *sourcescheduler::instance;
sourcescheduler::sourcescheduler()
{
}
sourcescheduler &sourcescheduler::default()
{
if(instance==NULL) instance = new sourcescheduler();
return *instance;
}
void sourcescheduler::init()
{
int newchannels = soundchannels - sources.length();
@@ -150,5 +158,4 @@ void sourcescheduler::releasesource(source *src)
}
}
sourcescheduler scheduler; // FIXME, move to audiomanager