@@ -480,6 +480,13 @@ void MilesAudioManager::reset()
480480void MilesAudioManager::update ()
481481{
482482 AudioManager::update ();
483+
484+ // Check audio device is initialized before updating
485+ if (m_digitalHandle == nullptr )
486+ {
487+ return ; // Audio device not ready, skip update
488+ }
489+
483490 setDeviceListenerPosition ();
484491 processRequestList ();
485492 processPlayingList ();
@@ -1193,15 +1200,21 @@ void MilesAudioManager::freeAllMilesHandles()
11931200 std::list<HSAMPLE>::iterator it;
11941201 for ( it = m_availableSamples.begin (); it != m_availableSamples.end (); /* empty */ ) {
11951202 HSAMPLE sample = *it;
1196- AIL_release_sample_handle (sample);
1203+ if (sample != nullptr )
1204+ {
1205+ AIL_release_sample_handle (sample);
1206+ }
11971207 it = m_availableSamples.erase (it);
11981208 }
11991209 m_num2DSamples = 0 ;
12001210
12011211 std::list<H3DSAMPLE>::iterator it3D;
12021212 for ( it3D = m_available3DSamples.begin (); it3D != m_available3DSamples.end (); /* empty */ ) {
12031213 H3DSAMPLE sample3D = *it3D;
1204- AIL_release_3D_sample_handle (sample3D);
1214+ if (sample3D != nullptr )
1215+ {
1216+ AIL_release_3D_sample_handle (sample3D);
1217+ }
12051218 it3D = m_available3DSamples.erase (it3D);
12061219 }
12071220 m_num3DSamples = 0 ;
@@ -1440,9 +1453,13 @@ AsciiString MilesAudioManager::getMusicTrackName() const
14401453void MilesAudioManager::openDevice ()
14411454{
14421455 if (!TheGlobalData->m_audioOn ) {
1456+ m_digitalHandle = nullptr ;
14431457 return ;
14441458 }
14451459
1460+ // Always clear handle at start - only set if initialization succeeds
1461+ m_digitalHandle = nullptr ;
1462+
14461463 AIL_set_redist_directory (" MSS\\ " );
14471464 AIL_startup ();
14481465 Int retval = 0 ;
@@ -1453,22 +1470,31 @@ void MilesAudioManager::openDevice()
14531470
14541471 retval = AIL_quick_startup (audioSettings->m_useDigital , audioSettings->m_useMidi , audioSettings->m_outputRate , audioSettings->m_outputBits , audioSettings->m_outputChannels );
14551472
1456- // Quick handles tells us where to store the various devices. For now, we're only interested in the digital handle.
1473+ if (!retval) {
1474+ // Initialization failed - ensure m_digitalHandle stays nullptr and audio is disabled
1475+ m_digitalHandle = nullptr ;
1476+ setOn (false , AudioAffect_All);
1477+ return ; // EXIT EARLY - don't continue with invalid device
1478+ }
1479+
1480+ // Only get handles if initialization succeeded
14571481 AIL_quick_handles (&m_digitalHandle, nullptr , nullptr );
14581482
1459- if (retval) {
1460- buildProviderList ();
1461- } else {
1462- // if we couldn't initialize any devices, turn sound off (fail silently)
1463- setOn ( false , AudioAffect_All );
1483+ // If we still don't have a valid handle, disable audio
1484+ if (m_digitalHandle == nullptr ) {
1485+ setOn (false , AudioAffect_All);
1486+ return ;
14641487 }
14651488
1489+ // Device initialized successfully - proceed with setup
1490+ buildProviderList ();
14661491 selectProvider (TheAudio->getProviderIndex (m_pref3DProvider));
14671492
14681493 // Now that we're all done, update the cached variables so that everything is in sync.
14691494 TheAudio->refreshCachedVariables ();
14701495
14711496 if (!isValidProvider ()) {
1497+ m_digitalHandle = nullptr ; // Mark as invalid if provider check fails
14721498 return ;
14731499 }
14741500
@@ -1478,9 +1504,13 @@ void MilesAudioManager::openDevice()
14781504// -------------------------------------------------------------------------------------------------
14791505void MilesAudioManager::closeDevice ()
14801506{
1481- freeAllMilesHandles ();
1482- unselectProvider ();
1483- AIL_shutdown ();
1507+ if (m_digitalHandle != nullptr )
1508+ {
1509+ freeAllMilesHandles ();
1510+ unselectProvider ();
1511+ AIL_shutdown ();
1512+ m_digitalHandle = nullptr ;
1513+ }
14841514}
14851515
14861516// -------------------------------------------------------------------------------------------------
0 commit comments