Start the sound manager in a deactived state. This means the code now has to activate it explicitly when desired. A non active state means the update function will no be executed.

This commit is contained in:
ehofman
2009-10-18 13:44:38 +00:00
committed by Tim Moore
parent 0d5634475c
commit 7287509fef
3 changed files with 30 additions and 31 deletions

View File

@@ -35,8 +35,6 @@
#if defined(__APPLE__)
# include <OpenAL/al.h>
#elif defined(_WIN32)
# include <al.h>
#else
# include <AL/al.h>
#endif

View File

@@ -57,6 +57,7 @@ int SGSoundMgr::_alut_init = 0;
// constructor
SGSoundMgr::SGSoundMgr() :
_working(false),
_active(false),
_changed(true),
_volume(0.0),
_device(NULL),
@@ -162,10 +163,11 @@ void SGSoundMgr::init() {
}
}
// suspend the sound manager
// stop the sound manager
void SGSoundMgr::stop() {
if (_working) {
_working = false;
_active = false;
// clear any OpenAL buffers before shutting down
buffer_map_iterator buffers_current;
@@ -177,25 +179,34 @@ void SGSoundMgr::stop() {
_buffers.erase( buffers_current );
}
_context = alcGetCurrentContext();
_device = alcGetContextsDevice(_context);
alcMakeContextCurrent(NULL);
alcDestroyContext(_context);
alcCloseDevice(_device);
}
}
void SGSoundMgr::suspend() {
if (_working) {
if (_active) {
sample_group_map_iterator sample_grp_current = _sample_groups.begin();
sample_group_map_iterator sample_grp_end = _sample_groups.end();
for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
SGSampleGroup *sgrp = sample_grp_current->second;
sgrp->suspend();
}
_active = false;
}
}
void SGSoundMgr::resume() {
if (!_active) {
sample_group_map_iterator sample_grp_current = _sample_groups.begin();
sample_group_map_iterator sample_grp_end = _sample_groups.end();
for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
SGSampleGroup *sgrp = sample_grp_current->second;
sgrp->resume();
}
_active = true;
}
}
void SGSoundMgr::bind ()
{
@@ -222,9 +233,7 @@ void SGSoundMgr::unbind ()
// run the audio scheduler
void SGSoundMgr::update_late( double dt ) {
if (_working && dt != 0.0) {
alcSuspendContext(_context);
if (_active) {
sample_group_map_iterator sample_grp_current = _sample_groups.begin();
sample_group_map_iterator sample_grp_end = _sample_groups.end();
for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
@@ -241,26 +250,10 @@ void SGSoundMgr::update_late( double dt ) {
testForALError("update");
_changed = false;
}
alcProcessContext(_context);
}
}
void
SGSoundMgr::resume ()
{
if (_working) {
sample_group_map_iterator sample_grp_current = _sample_groups.begin();
sample_group_map_iterator sample_grp_end = _sample_groups.end();
for ( ; sample_grp_current != sample_grp_end; ++sample_grp_current ) {
SGSampleGroup *sgrp = sample_grp_current->second;
sgrp->resume();
}
}
}
// add a sampel group, return true if successful
// add a sample group, return true if successful
bool SGSoundMgr::add( SGSampleGroup *sgrp, const string& refname )
{
sample_group_map_iterator sample_grp_it = _sample_groups.find( refname );

View File

@@ -49,10 +49,6 @@
# include <OpenAL/al.h>
# include <OpenAL/alc.h>
# include <OpenAL/alut.h>
#elif defined(_WIN32)
# include <al.h>
# include <alc.h>
# include <AL/alut.h>
#else
# include <AL/al.h>
# include <AL/alc.h>
@@ -113,6 +109,17 @@ public:
*/
inline bool is_working() const { return _working; }
/**
* Set the sound manager to a working condition.
*/
inline void activate() { _active = true; }
/**
* Test is the sound manager is in an active and working condition.
* @return true is the sound manager is active
*/
inline bool is_active() const { return (_working && _active); }
/**
* Register a sample group to the sound manager.
* @para sgrp Pointer to a sample group to add
@@ -263,6 +270,7 @@ private:
static int _alut_init;
bool _working;
bool _active;
bool _changed;
float _volume;