Let the game engine manage it's own sound scene. This is to fix bug 1415 (Patch from Peter den Bak)

http://projects.blender.org/tracker/index.php?func=detail&aid=1415&group_id=9&atid=125
Also release the OpenAL device & context.  These were leaked before, and would cause an assertion.
This commit is contained in:
Kester Maddock 2004-07-26 11:54:10 +00:00
parent f64c5cacf7
commit 8a52016501
5 changed files with 24 additions and 9 deletions

@ -78,6 +78,9 @@ void SND_DeviceManager::Unsubscribe()
delete m_instance; delete m_instance;
m_instance = NULL; m_instance = NULL;
} }
if (m_subscriptions < 0)
m_subscriptions = 0;
} }

@ -205,6 +205,8 @@ ALvoid alutUnloadWAV(ALenum format,ALvoid *data,ALsizei size,ALsizei freq)
SND_OpenALDevice::SND_OpenALDevice() SND_OpenALDevice::SND_OpenALDevice()
: m_context(NULL),
m_device(NULL)
{ {
/* Removed the functionality for checking if noaudio was provided on */ /* Removed the functionality for checking if noaudio was provided on */
/* the commandline. */ /* the commandline. */
@ -229,6 +231,7 @@ SND_OpenALDevice::SND_OpenALDevice()
if (m_context) { if (m_context) {
alcMakeContextCurrent(m_context); alcMakeContextCurrent(m_context);
m_audio = true; m_audio = true;
m_device = dev;
} }
} }
@ -302,13 +305,16 @@ void SND_OpenALDevice::MakeCurrent() const
SND_OpenALDevice::~SND_OpenALDevice() SND_OpenALDevice::~SND_OpenALDevice()
{ {
if (m_context) { if (m_context) {
alcMakeContextCurrent(m_context); MakeCurrent();
if (m_buffersinitialized) if (m_buffersinitialized)
alDeleteBuffers(NUM_BUFFERS, m_buffers); alDeleteBuffers(NUM_BUFFERS, m_buffers);
if (m_sourcesinitialized) if (m_sourcesinitialized)
alDeleteSources(NUM_SOURCES, m_sources); alDeleteSources(NUM_SOURCES, m_sources);
alcDestroyContext(m_context);
m_context = NULL;
} }
// let's see if we used the cd. if not, just leave it alone // let's see if we used the cd. if not, just leave it alone
@ -323,6 +329,13 @@ SND_OpenALDevice::~SND_OpenALDevice()
if (m_cdrom) if (m_cdrom)
delete m_cdrom; delete m_cdrom;
#endif #endif
#ifdef OUDE_OPENAL
if (m_audio)
alutExit();
#else
if (m_device)
alcCloseDevice((ALCdevice*) m_device);
#endif
} }

@ -95,6 +95,7 @@ public:
private: private:
void* m_context; void* m_context;
void* m_device;
unsigned int m_buffers[NUM_BUFFERS]; unsigned int m_buffers[NUM_BUFFERS];
unsigned int m_sources[NUM_SOURCES]; unsigned int m_sources[NUM_SOURCES];

@ -514,7 +514,7 @@ int sound_get_filetype_from_header(bSound* sound, PackedFile* pf)
{ {
filetype = SAMPLE_OGG_VORBIS; filetype = SAMPLE_OGG_VORBIS;
} }
else if ((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "ÿû", 2))) else if ((!memcmp(buffer, "ID3", 3)) || (!memcmp(buffer, "", 2)))
{ {
filetype = SAMPLE_MP3; filetype = SAMPLE_MP3;
} }
@ -1015,9 +1015,6 @@ void sound_init_audio(void)
SYS_SystemHandle hSystem = NULL; SYS_SystemHandle hSystem = NULL;
if(ghSoundScene==NULL) { if(ghSoundScene==NULL) {
printf("sound init audio\n");
hSystem = SYS_GetSystem(); hSystem = SYS_GetSystem();
noaudio = SYS_GetCommandLineInt(hSystem,"noaudio",0); noaudio = SYS_GetCommandLineInt(hSystem,"noaudio",0);
@ -1043,5 +1040,6 @@ void sound_exit_audio(void)
if(ghSoundScene) { if(ghSoundScene) {
SND_DeleteScene(ghSoundScene); SND_DeleteScene(ghSoundScene);
SND_ReleaseDevice(); SND_ReleaseDevice();
ghSoundScene = NULL;
} }
} }

@ -456,9 +456,9 @@ void start_game(void)
scene_cfra_store= save_and_reset_all_scene_cfra(); scene_cfra_store= save_and_reset_all_scene_cfra();
/* sound init is save, only handles once */ /* game engine will do its own sounds. */
sound_init_audio();
sound_stop_all_sounds(); sound_stop_all_sounds();
sound_exit_audio();
/* Before jumping into Ketsji, we configure some settings. */ /* Before jumping into Ketsji, we configure some settings. */
space_set_commmandline_options(); space_set_commmandline_options();