Browse Source

Fixing some sound-looping bugs.

Josh Yelon 18 years ago
parent
commit
9f89b56c0b
1 changed files with 25 additions and 37 deletions
  1. 25 37
      panda/src/audiotraits/fmodAudioSound.cxx

+ 25 - 37
panda/src/audiotraits/fmodAudioSound.cxx

@@ -119,7 +119,7 @@ FmodAudioSound(AudioManager *manager, Filename file_name, bool positional) {
 
 
   // Some WAV files contain a loop bit.  This is not handled
   // Some WAV files contain a loop bit.  This is not handled
   // consistently.  Override it.
   // consistently.  Override it.
-  _sound->setLoopCount(-1);
+  _sound->setLoopCount(1);
   _sound->setMode(FMOD_LOOP_OFF);
   _sound->setMode(FMOD_LOOP_OFF);
   
   
   //This is just to collect the defaults of the sound, so we don't
   //This is just to collect the defaults of the sound, so we don't
@@ -205,13 +205,11 @@ stop() {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 void FmodAudioSound::
 void FmodAudioSound::
 set_loop(bool loop) {
 set_loop(bool loop) {
-  FMOD_RESULT result;
-  if ( loop ) {
-    result = _sound->setMode(FMOD_LOOP_NORMAL);
+  if (loop) {
+    set_loop_count(0);
   } else {
   } else {
-    result = _sound->setMode(FMOD_LOOP_OFF);  
+    set_loop_count(1);
   }
   }
-  fmod_audio_errcheck("_sound->setMode()", result);
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -221,24 +219,11 @@ set_loop(bool loop) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 bool FmodAudioSound::
 bool FmodAudioSound::
 get_loop() const {
 get_loop() const {
-  // 0 means loop forever,
-  // >1 means loop that many times
-  // So _loop_count != 1 means we're looping
-
-  FMOD_RESULT result;
-  FMOD_MODE loopMode;
-  bool loopState;
-
-  result = _sound->getMode( &loopMode );
-  fmod_audio_errcheck("_sound->getMode()", result);
-
-  if ( (loopMode & FMOD_LOOP_NORMAL) != 0 ) {
-    loopState = true;
+  if (get_loop_count() == 1) {
+    return false;
   } else {
   } else {
-    loopState = false;
+    return true;
   }
   }
-
-  return (loopState);
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
@@ -257,17 +242,23 @@ set_loop_count(unsigned long loop_count) {
 
 
   //LOCALS
   //LOCALS
   FMOD_RESULT result;
   FMOD_RESULT result;
-  int numberOfLoops;
-
-  numberOfLoops = (int) loop_count;
-  numberOfLoops = numberOfLoops - 1;
 
 
-  if (numberOfLoops == 0) {
+  if (loop_count == 0) {
     result = _sound->setLoopCount( -1 );
     result = _sound->setLoopCount( -1 );
+    fmod_audio_errcheck("_sound->setLoopCount()", result);
+    result =_sound->setMode(FMOD_LOOP_NORMAL);    
+    fmod_audio_errcheck("_sound->setMode()", result);
+  } else if (loop_count == 1) {
+    result = _sound->setLoopCount( 1 );
+    fmod_audio_errcheck("_sound->setLoopCount()", result);
+    result =_sound->setMode(FMOD_LOOP_OFF);    
+    fmod_audio_errcheck("_sound->setMode()", result);
   } else {
   } else {
-    result = _sound->setLoopCount( numberOfLoops );
+    result = _sound->setLoopCount( loop_count );
+    fmod_audio_errcheck("_sound->setLoopCount()", result);
+    result =_sound->setMode(FMOD_LOOP_NORMAL);
+    fmod_audio_errcheck("_sound->setMode()", result);
   }
   }
-  fmod_audio_errcheck("_sound->setLoopCount()", result);
 
 
   audio_debug("FmodAudioSound::set_loop_count()   Sound's loop count should be set to: " << loop_count);
   audio_debug("FmodAudioSound::set_loop_count()   Sound's loop count should be set to: " << loop_count);
 }
 }
@@ -279,9 +270,6 @@ set_loop_count(unsigned long loop_count) {
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////
 unsigned long FmodAudioSound::
 unsigned long FmodAudioSound::
 get_loop_count() const {
 get_loop_count() const {
-
-  audio_debug("FmodAudioSound::get_loop_count() Getting the sound's loop count. ");
-
   FMOD_RESULT result;
   FMOD_RESULT result;
   int loop_count;
   int loop_count;
   unsigned long returnedNumber;
   unsigned long returnedNumber;
@@ -289,11 +277,11 @@ get_loop_count() const {
   result = _sound->getLoopCount( &loop_count );
   result = _sound->getLoopCount( &loop_count );
   fmod_audio_errcheck("_sound->getLoopCount()", result);
   fmod_audio_errcheck("_sound->getLoopCount()", result);
 
 
-  audio_debug("FmodAudioSound::get_loop_count() returning "<< loop_count);
-
-  returnedNumber = (unsigned long) loop_count;
-
-  return loop_count;
+  if (loop_count <= 0) {
+    return 0;
+  } else {
+    return (unsigned long)loop_count;
+  }
 }
 }
 
 
 ////////////////////////////////////////////////////////////////////
 ////////////////////////////////////////////////////////////////////