Quellcode durchsuchen

define AudioSound::set_time() to have effect only upon the next call to play()

David Rose vor 18 Jahren
Ursprung
Commit
93bfc2ea3f

+ 3 - 3
panda/src/audio/audioSound.h

@@ -56,9 +56,9 @@ PUBLISHED:
   // a file.
   // time in seconds: 0 = beginning; length() = end.
   // inits to 0.0.
-  // - Unlike the other get_* and set_* calls for a sound, the
-  //   current time position will change while the sound is playing.
-  //   To play the same sound from a time offset a second time,
+  // - The current time position will not change while the sound is
+  //   playing; you must call play() again to effect the change.  To
+  //   play the same sound from a time offset a second time,
   //   explicitly set the time position again.  When looping, the
   //   second and later loops will start from the beginning of the
   //   sound.

+ 35 - 25
panda/src/audiotraits/milesAudioSample.cxx

@@ -102,8 +102,16 @@ play() {
         set_volume(_volume);
         set_play_rate(_play_rate);
         AIL_set_sample_loop_count(_sample, _loop_count);
-        AIL_start_sample(_sample);
+
+        if (_got_start_time) {
+          do_set_time(_start_time);
+          AIL_resume_sample(_sample);
+        } else {
+          AIL_start_sample(_sample);
+        }
       }
+      
+      _got_start_time = false;
     }
   } else {
     // In case _loop_count gets set to forever (zero):
@@ -139,30 +147,6 @@ stop() {
   }
 }
 
-////////////////////////////////////////////////////////////////////
-//     Function: MilesAudioSample::set_time
-//       Access: Public, Virtual
-//  Description: 
-////////////////////////////////////////////////////////////////////
-void MilesAudioSample::
-set_time(float time) {
-  miles_audio_debug("set_time(time="<<time<<")");
-
-  if (_sample != 0) {
-    // Ensure we don't inadvertently run off the end of the sound.
-    float max_time = length();
-    if (time > max_time) {
-      milesAudio_cat.warning()
-        << "set_time(" << time << ") requested for sound of length " 
-        << max_time << "\n";
-      time = max_time;
-    }
-    
-    S32 time_ms = (S32)(1000.0f * time);
-    AIL_set_sample_ms_position(_sample, time_ms);
-  }
-}
-
 ////////////////////////////////////////////////////////////////////
 //     Function: MilesAudioSample::get_time
 //       Access: Public, Virtual
@@ -171,6 +155,9 @@ set_time(float time) {
 float MilesAudioSample::
 get_time() const {
   if (_sample == 0) {
+    if (_got_start_time) {
+      return _start_time;
+    }
     return 0.0f;
   }
 
@@ -337,4 +324,27 @@ finish_callback(HSAMPLE sample) {
   self->_manager->_sounds_finished = true;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: MilesAudioSample::do_set_time
+//       Access: Private
+//  Description: Sets the start time of an already allocated sample.
+////////////////////////////////////////////////////////////////////
+void MilesAudioSample::
+do_set_time(float time) {
+  miles_audio_debug("do_set_time(time="<<time<<")");
+  nassertv(_sample != 0);
+
+  // Ensure we don't inadvertently run off the end of the sound.
+  float max_time = length();
+  if (time > max_time) {
+    milesAudio_cat.warning()
+      << "set_time(" << time << ") requested for sound of length " 
+      << max_time << "\n";
+    time = max_time;
+  }
+  
+  S32 time_ms = (S32)(1000.0f * time);
+  AIL_set_sample_ms_position(_sample, time_ms);
+}
+
 #endif //]

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

@@ -44,7 +44,6 @@ public:
   virtual void play();
   virtual void stop();
   
-  virtual void set_time(float time=0.0f);
   virtual float get_time() const;
   
   virtual void set_volume(float volume=1.0f);
@@ -61,6 +60,7 @@ public:
 private:
   void internal_stop();
   static void AILCALLBACK finish_callback(HSAMPLE sample);
+  void do_set_time(float time);
 
   PT(MilesAudioManager::SoundData) _sd;
   HSAMPLE _sample;

+ 33 - 22
panda/src/audiotraits/milesAudioSequence.cxx

@@ -98,8 +98,16 @@ play() {
         set_volume(_volume);
         set_play_rate(_play_rate);
         AIL_set_sequence_loop_count(_sequence, _loop_count);
-        AIL_start_sequence(_sequence);
+
+        if (_got_start_time) {
+          do_set_time(_start_time);
+          AIL_resume_sequence(_sequence);
+        } else {
+          AIL_start_sequence(_sequence);
+        }
       }
+
+      _got_start_time = false;
     }
   } else {
     // In case _loop_count gets set to forever (zero):
@@ -135,27 +143,6 @@ stop() {
   }
 }
 
-////////////////////////////////////////////////////////////////////
-//     Function: MilesAudioSequence::set_time
-//       Access: Public, Virtual
-//  Description: 
-////////////////////////////////////////////////////////////////////
-void MilesAudioSequence::
-set_time(float time) {
-  miles_audio_debug("set_time(time="<<time<<")");
-
-  if (_sequence != 0) {
-    S32 time_ms = (S32)(1000.0f * time);
-
-    // Ensure we don't inadvertently run off the end of the sound.
-    S32 length_ms;
-    AIL_sequence_ms_position(_sequence, &length_ms, NULL);
-    time_ms = min(time_ms, length_ms);
-    
-    AIL_set_sequence_ms_position(_sequence, time_ms);
-  }
-}
-
 ////////////////////////////////////////////////////////////////////
 //     Function: MilesAudioSequence::get_time
 //       Access: Public, Virtual
@@ -164,6 +151,9 @@ set_time(float time) {
 float MilesAudioSequence::
 get_time() const {
   if (_sequence == 0) {
+    if (_got_start_time) {
+      return _start_time;
+    }
     return 0.0f;
   }
 
@@ -314,4 +304,25 @@ finish_callback(HSEQUENCE sequence) {
   self->_manager->_sounds_finished = true;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: MilesAudioSequence::do_set_time
+//       Access: Private
+//  Description: Sets the start time of an already allocated stream.
+////////////////////////////////////////////////////////////////////
+void MilesAudioSequence::
+do_set_time(float time) {
+  miles_audio_debug("do_set_time(time="<<time<<")");
+
+  nassertv(_sequence != 0);
+
+  S32 time_ms = (S32)(1000.0f * time);
+
+    // Ensure we don't inadvertently run off the end of the sound.
+  S32 length_ms;
+  AIL_sequence_ms_position(_sequence, &length_ms, NULL);
+  time_ms = min(time_ms, length_ms);
+  
+  AIL_set_sequence_ms_position(_sequence, time_ms);
+}
+
 #endif //]

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

@@ -43,7 +43,6 @@ public:
   virtual void play();
   virtual void stop();
   
-  virtual void set_time(float time=0.0f);
   virtual float get_time() const;
   
   virtual void set_volume(float volume=1.0f);
@@ -59,6 +58,7 @@ public:
 private:
   void internal_stop();
   static void AILCALLBACK finish_callback(HSEQUENCE sequence);
+  void do_set_time(float time);
 
   PT(MilesAudioManager::SoundData) _sd;
   HSEQUENCE _sequence;

+ 18 - 1
panda/src/audiotraits/milesAudioSound.cxx

@@ -44,7 +44,10 @@ MilesAudioSound(MilesAudioManager *manager,
   _file_name(file_name),
   _volume(1.0f), _balance(0), _play_rate(1.0f),
   _loop_count(1), 
-  _active(true), _paused(false) 
+  _active(true), 
+  _paused(false),
+  _start_time(0.0f),
+  _got_start_time(false)
 {
   nassertv(!file_name.empty());
 }
@@ -132,6 +135,20 @@ get_play_rate() const {
   return _play_rate;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: MilesAudioSound::set_time
+//       Access: Public, Virtual
+//  Description: 
+////////////////////////////////////////////////////////////////////
+void MilesAudioSound::
+set_time(float time) {
+  miles_audio_debug("set_time(time="<<time<<")");
+
+  // Mark this position for the next play().
+  _start_time = time;
+  _got_start_time = true;
+}
+
 ////////////////////////////////////////////////////////////////////
 //     Function: MilesAudioSound::set_active
 //       Access: Public, Virtual

+ 7 - 0
panda/src/audiotraits/milesAudioSound.h

@@ -46,6 +46,8 @@ public:
   virtual float get_balance() const;
   virtual float get_play_rate() const;
 
+  virtual void set_time(float start_time=0.0);
+
   virtual void set_active(bool active=true);
   virtual bool get_active() const;
 
@@ -81,6 +83,11 @@ protected:
   // with stop().  Note: no longer implemented.
   string _finished_event;
 
+  // This is set whenever we call set_time().  Calling play() will
+  // respect this if it is set, and then reset it.
+  float _start_time;
+  bool _got_start_time;
+
 public:
   static TypeHandle get_class_type() {
     return _type_handle;

+ 34 - 21
panda/src/audiotraits/milesAudioStream.cxx

@@ -102,6 +102,13 @@ play() {
     set_play_rate(_play_rate);
     
     AIL_set_stream_loop_count(_stream, _loop_count);
+
+    AIL_start_stream(_stream);
+    if (_got_start_time) {
+      // There's no AIL_resume_stream(), so we start in the middle by
+      // starting normally, then immediately skipping to the middle.
+      do_set_time(_start_time);
+    }
     
     if (miles_audio_panda_threads) {
       AIL_auto_service_stream(_stream, 0);
@@ -109,7 +116,8 @@ play() {
     } else {
       AIL_auto_service_stream(_stream, 1);
     }
-    AIL_start_stream(_stream);
+
+    _got_start_time = false;
 
   } else {
     // In case _loop_count gets set to forever (zero):
@@ -143,25 +151,6 @@ stop() {
   }
 }
 
-////////////////////////////////////////////////////////////////////
-//     Function: MilesAudioStream::
-//       Access: Public, Virtual
-//  Description: 
-////////////////////////////////////////////////////////////////////
-void MilesAudioStream::
-set_time(float time) {
-  if (_stream != 0) {
-    S32 time_ms = (S32)(1000.0f * time);
-
-    // Ensure we don't inadvertently run off the end of the sound.
-    S32 length_ms;
-    AIL_stream_ms_position(_stream, &length_ms, NULL);
-    time_ms = min(time_ms, length_ms);
-    
-    AIL_set_stream_ms_position(_stream, time_ms);
-  }
-}
-
 ////////////////////////////////////////////////////////////////////
 //     Function: MilesAudioStream::
 //       Access: Public, Virtual
@@ -169,7 +158,12 @@ set_time(float time) {
 ////////////////////////////////////////////////////////////////////
 float MilesAudioStream::
 get_time() const {
-  nassertr(_stream, 0.0f);
+  if (_stream == 0) {
+    if (_got_start_time) {
+      return _start_time;
+    }
+    return 0.0f;
+  }
 
   S32 current_ms;
   AIL_stream_ms_position(_stream, NULL, &current_ms);
@@ -314,5 +308,24 @@ finish_callback(HSTREAM stream) {
   self->_manager->_sounds_finished = true;
 }
 
+////////////////////////////////////////////////////////////////////
+//     Function: MilesAudioStream::do_set_time
+//       Access: Private
+//  Description: Sets the start time of an already allocated stream.
+////////////////////////////////////////////////////////////////////
+void MilesAudioStream::
+do_set_time(float time) {
+  nassertv(_stream != 0);
+
+  S32 time_ms = (S32)(1000.0f * time);
+
+  // Ensure we don't inadvertently run off the end of the sound.
+  S32 length_ms;
+  AIL_stream_ms_position(_stream, &length_ms, NULL);
+  time_ms = min(time_ms, length_ms);
+  
+  AIL_set_stream_ms_position(_stream, time_ms);
+}
+
 
 #endif //]

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

@@ -44,7 +44,6 @@ public:
   virtual void play();
   virtual void stop();
   
-  virtual void set_time(float time=0.0f);
   virtual float get_time() const;
   
   virtual void set_volume(float volume=1.0f);
@@ -59,6 +58,7 @@ public:
 
 private:
   static void AILCALLBACK finish_callback(HSTREAM stream);
+  void do_set_time(float time);
 
   Filename _path;
   HSTREAM _stream;