瀏覽代碼

openal: Explicitly signal a needed cleanup from require_sound_data

Sam Edwards 7 年之前
父節點
當前提交
50b3b87ad5

+ 5 - 2
panda/src/audiotraits/openalAudioSound.I

@@ -37,16 +37,19 @@ get_calibrated_clock(double rtc) const {
 
 /**
  * Makes sure the sound data record is present, and if not, obtains it.
+ *
+ * Returns true on success, false on failure.
  */
-void OpenALAudioSound::
+bool OpenALAudioSound::
 require_sound_data() {
   if (_sd==0) {
     _sd = _manager->get_sound_data(_movie, _desired_mode);
     if (_sd==0) {
       audio_error("Could not open audio " << _movie->get_filename());
-      cleanup();
+      return false;
     }
   }
+  return true;
 }
 
 /**

+ 7 - 5
panda/src/audiotraits/openalAudioSound.cxx

@@ -69,8 +69,8 @@ OpenALAudioSound(OpenALAudioManager* manager,
 
   ReMutexHolder holder(OpenALAudioManager::_lock);
 
-  require_sound_data();
-  if (_manager == NULL) {
+  if (!require_sound_data()) {
+    cleanup();
     return;
   }
 
@@ -130,10 +130,12 @@ play() {
 
   stop();
 
-  require_sound_data();
-  if (_manager == 0) return;
-  _manager->starting_sound(this);
+  if (!require_sound_data()) {
+    cleanup();
+    return;
+  }
 
+  _manager->starting_sound(this);
   if (!_source) {
     return;
   }

+ 1 - 1
panda/src/audiotraits/openalAudioSound.h

@@ -116,7 +116,7 @@ private:
   int  read_stream_data(int bytelen, unsigned char *data);
   void pull_used_buffers();
   void push_fresh_buffers();
-  INLINE void require_sound_data();
+  INLINE bool require_sound_data();
   INLINE void release_sound_data();
 
 private: