Cary Sandvig 25 år sedan
förälder
incheckning
fe6ae687a2

+ 11 - 30
panda/src/audio/audio_linux_traits.cxx

@@ -270,24 +270,10 @@ AudioTraits::PlayerClass* LinuxSample::get_player(void) const {
   return LinuxSamplePlayer::get_instance();
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc* LinuxSample::get_destroy(void) const {
-  return LinuxSample::destroy;
-}
-*/
-
 AudioTraits::DeletePlayingFunc* LinuxSample::get_delstate(void) const {
   return LinuxSamplePlaying::destroy;
 }
 
-// REFCOUNT
-/*
-void LinuxSample::destroy(AudioTraits::SoundClass* sound) {
-  delete sound;
-}
-*/
-
 LinuxSample* LinuxSample::load_raw(byte* data, unsigned long size) {
   LinuxSample* ret = new LinuxSample(data, size);
   return ret;
@@ -308,24 +294,10 @@ AudioTraits::PlayerClass* LinuxMusic::get_player(void) const {
   return LinuxMusicPlayer::get_instance();
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc* LinuxMusic::get_destroy(void) const {
-  return LinuxMusic::destroy;
-}
-*/
-
 AudioTraits::DeletePlayingFunc* LinuxMusic::get_delstate(void) const {
   return LinuxMusicPlaying::destroy;
 }
 
-// REFCOUNT
-/*
-void LinuxMusic::destroy(AudioTraits::SoundClass* music) {
-  delete music;
-}
-*/
-
 LinuxSamplePlaying::~LinuxSamplePlaying(void) {
 }
 
@@ -358,9 +330,18 @@ LinuxSamplePlayer::~LinuxSamplePlayer(void) {
 }
 
 void LinuxSamplePlayer::play_sound(AudioTraits::SoundClass*,
-				   AudioTraits::PlayingClass* playing) {
+				   AudioTraits::PlayingClass* playing,
+				   float start_time) {
   initialize();
   LinuxSamplePlaying* lplaying = (LinuxSamplePlaying*)playing;
+  unsigned long l = lplaying->get_data()->get_size();
+  float factor = ((float)l) / (audio_mix_freq * 2. * sample_size);
+  factor = start_time / factor;
+  if (factor > 1.)
+    factor = 1.;
+  unsigned long p = (unsigned long)(l * factor);
+  p = ( p >> 2 ) << 2;  // zero the last 2 bits
+  lplaying->get_data()->reset(p);
   buffers.insert(lplaying->get_data());
 }
 
@@ -387,7 +368,7 @@ LinuxMusicPlayer::~LinuxMusicPlayer(void) {
 }
 
 void LinuxMusicPlayer::play_sound(AudioTraits::SoundClass*,
-				  AudioTraits::PlayingClass*) {
+				  AudioTraits::PlayingClass*, float) {
   initialize();
 }
 

+ 4 - 10
panda/src/audio/audio_linux_traits.h

@@ -51,9 +51,9 @@ public:
   INLINE unsigned long get_size(void) const {
     return _size;
   }
-  INLINE void reset(void) {
+  INLINE void reset(unsigned long p = 0) {
     _done = false;
-    _pos = 0;
+    _pos = p;
   }
 };
 
@@ -70,9 +70,6 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
-  //  static void destroy(AudioTraits::SoundClass*);
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
 public:
   // used by the loader
@@ -90,9 +87,6 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
-  //  static void destroy(AudioTraits::SoundClass*);
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
 };
 
@@ -123,7 +117,7 @@ public:
   virtual ~LinuxSamplePlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);
@@ -140,7 +134,7 @@ public:
   virtual ~LinuxMusicPlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);

+ 2 - 2
panda/src/audio/audio_manager.I

@@ -8,9 +8,9 @@
 //       Access: Public, Static
 //  Description: Play some audio
 ////////////////////////////////////////////////////////////////////
-INLINE void AudioManager::play(AudioSound* sound) {
+INLINE void AudioManager::play(AudioSound* sound, float start_time) {
   if (audio_is_active)
-    get_ptr()->ns_play(sound);
+    get_ptr()->ns_play(sound, start_time);
 }
 
 ////////////////////////////////////////////////////////////////////

+ 3 - 2
panda/src/audio/audio_manager.cxx

@@ -84,10 +84,11 @@ AudioManager* AudioManager::get_ptr(void) {
 //       Access: Private
 //  Description: get the player off the sound, and start it playing
 ////////////////////////////////////////////////////////////////////
-void AudioManager::ns_play(AudioSound* sound) {
+void AudioManager::ns_play(AudioSound* sound, float start_time) {
   if (sound->status() == AudioSound::PLAYING)
     this->ns_stop(sound);
-  sound->get_player()->play_sound(sound->get_sound(), sound->get_state());
+  sound->get_player()->play_sound(sound->get_sound(), sound->get_state(),
+				  start_time);
 }
 
 ////////////////////////////////////////////////////////////////////

+ 2 - 2
panda/src/audio/audio_manager.h

@@ -18,7 +18,7 @@ class EXPCL_PANDA AudioManager {
 private:
   INLINE AudioManager(void);
 
-  void ns_play(AudioSound*);
+  void ns_play(AudioSound*, float);
   void ns_stop(AudioSound*);
   void ns_set_loop(AudioSound*, bool);
   bool ns_get_loop(AudioSound*);
@@ -47,7 +47,7 @@ public:
   static void set_shutdown_func(ShutdownFunc*);
 
 PUBLISHED:
-  INLINE static void play(AudioSound*);
+  INLINE static void play(AudioSound*, float = 0.);
   INLINE static void stop(AudioSound*);
   INLINE static void set_loop(AudioSound*, bool);
   INLINE static bool get_loop(AudioSound*);

+ 4 - 45
panda/src/audio/audio_mikmod_traits.cxx

@@ -145,13 +145,6 @@ AudioTraits::PlayerClass* MikModSample::get_player(void) const {
   return MikModSamplePlayer::get_instance();
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc* MikModSample::get_destroy(void) const {
-  return MikModSample::destroy;
-}
-*/
-
 AudioTraits::DeletePlayingFunc* MikModSample::get_delstate(void) const {
   return MikModSamplePlaying::destroy;
 }
@@ -167,13 +160,6 @@ MikModSample* MikModSample::load_wav(Filename filename) {
   return new MikModSample(sample);
 }
 
-// REFCOUNT
-/*
-void MikModSample::destroy(AudioTraits::SoundClass* sample) {
-  delete sample;
-}
-*/
-
 SAMPLE* MikModSample::get_sample(void) {
   return _sample;
 }
@@ -200,24 +186,10 @@ AudioTraits::PlayerClass* MikModMusic::get_player(void) const {
   return MikModFmsynthPlayer::get_instance();
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc* MikModMusic::get_destroy(void) const {
-  return MikModMusic::destroy;
-}
-*/
-
 AudioTraits::DeletePlayingFunc* MikModMusic::get_delstate(void) const {
   return MikModMusicPlaying::destroy;
 }
 
-// REFCOUNT
-/*
-void MikModMusic::destroy(AudioTraits::SoundClass* music) {
-  delete music;
-}
-*/
-
 MikModMidi::MikModMidi(void) {
 }
 
@@ -241,24 +213,10 @@ AudioTraits::PlayerClass* MikModMidi::get_player(void) const {
   return MikModMidiPlayer::get_instance();
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc* MikModMidi::get_destroy(void) const {
-  return MikModMidi::destroy;
-}
-*/
-
 AudioTraits::DeletePlayingFunc* MikModMidi::get_delstate(void) const {
   return MikModMidiPlaying::destroy;
 }
 
-// REFCOUNT
-/*
-void MikModMidi::destroy(AudioTraits::SoundClass* music) {
-  delete music;
-}
-*/
-
 MikModSamplePlaying::MikModSamplePlaying(AudioTraits::SoundClass* s)
   : AudioTraits::PlayingClass(s) {
 }
@@ -322,7 +280,8 @@ MikModSamplePlayer::~MikModSamplePlayer(void) {
 }
 
 void MikModSamplePlayer::play_sound(AudioTraits::SoundClass* sample,
-				    AudioTraits::PlayingClass* playing) {
+				    AudioTraits::PlayingClass* playing,
+				    float) {
   if (!have_initialized)
     initialize();
   if (!MikMod_Active()) {
@@ -372,7 +331,7 @@ MikModFmsynthPlayer::~MikModFmsynthPlayer(void) {
 }
 
 void MikModFmsynthPlayer::play_sound(AudioTraits::SoundClass*,
-				     AudioTraits::PlayingClass*) {
+				     AudioTraits::PlayingClass*, float) {
   audio_cat->error() << "trying to play a sample with a MikModFmsynthPlayer"
 		     << endl;
 }
@@ -401,7 +360,7 @@ MikModMidiPlayer::~MikModMidiPlayer(void) {
 }
 
 void MikModMidiPlayer::play_sound(AudioTraits::SoundClass*,
-				  AudioTraits::PlayingClass*) {
+				  AudioTraits::PlayingClass*, float) {
   audio_cat->error() << "trying to play a sample with a MikModMidiPlayer"
 		     << endl;
 }

+ 3 - 13
panda/src/audio/audio_mikmod_traits.h

@@ -27,14 +27,10 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
 public:
   // used by the readers
   static MikModSample* load_wav(Filename);
-  // REFCOUNT
-  //  static void destroy(AudioTraits::SoundClass*);
   // used by the players
   virtual SAMPLE* get_sample(void);
   virtual int get_freq(void);
@@ -50,9 +46,6 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
-  //  static void destroy(AudioTraits::SoundClass*);
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
 };
 
@@ -65,9 +58,6 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
-  //  static void destroy(AudioTraits::SoundClass*);
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
 public:
   // used by the readers
@@ -112,7 +102,7 @@ public:
   virtual ~MikModSamplePlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);
@@ -129,7 +119,7 @@ public:
   virtual ~MikModFmsynthPlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);
@@ -146,7 +136,7 @@ public:
   virtual ~MikModMidiPlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);

+ 1 - 14
panda/src/audio/audio_null_traits.cxx

@@ -41,24 +41,11 @@ AudioTraits::PlayerClass* NullSound::get_player(void) const {
   return new NullPlayer();
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc* NullSound::get_destroy(void) const {
-  return NullSound::destroy;
-}
-*/
 
 AudioTraits::DeletePlayingFunc* NullSound::get_delstate(void) const {
   return NullPlaying::destroy;
 }
 
-// REFCOUNT
-/*
-void NullSound::destroy(AudioTraits::SoundClass* sound) {
-  delete sound;
-}
-*/
-
 NullPlaying::~NullPlaying(void) {
 }
 
@@ -76,7 +63,7 @@ NullPlayer::~NullPlayer(void) {
 }
 
 void NullPlayer::play_sound(AudioTraits::SoundClass*,
-			    AudioTraits::PlayingClass*) {
+			    AudioTraits::PlayingClass*, float) {
   if (audio_cat->is_debug())
     audio_cat->debug() << "in play sound in Null audio driver" << endl;
 }

+ 1 - 4
panda/src/audio/audio_null_traits.h

@@ -21,9 +21,6 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
-  //  static void destroy(AudioTraits::SoundClass*);
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
 };
 
@@ -42,7 +39,7 @@ public:
   virtual ~NullPlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);

+ 1 - 10
panda/src/audio/audio_trait.cxx

@@ -24,15 +24,6 @@ AudioTraits::PlayerClass* AudioTraits::SoundClass::get_player(void) const {
   return (AudioTraits::PlayerClass*)0L;
 }
 
-// REFCOUNT
-/*
-AudioTraits::DeleteSoundFunc*
-AudioTraits::SoundClass::get_destroy(void) const {
-  audio_cat->error() << "In abstract SoundClass::get_destroy!" << endl;
-  return (AudioTraits::DeleteSoundFunc*)0L;
-}
-*/
-
 AudioTraits::DeletePlayingFunc*
 AudioTraits::SoundClass::get_delstate(void) const {
   audio_cat->error() << "In abstract SoundClass::get_delstate!" << endl;
@@ -52,7 +43,7 @@ AudioTraits::PlayerClass::~PlayerClass(void) {
 }
 
 void AudioTraits::PlayerClass::play_sound(AudioTraits::SoundClass*,
-					  AudioTraits::PlayingClass*) {
+					  AudioTraits::PlayingClass*, float) {
   audio_cat->error() << "In abstract PlayerClass::play_sound!" << endl;
 }
 

+ 1 - 3
panda/src/audio/audio_trait.h

@@ -26,8 +26,6 @@ public:
     virtual float length(void) const = 0;
     virtual PlayingClass* get_state(void) const = 0;
     virtual PlayerClass* get_player(void) const = 0;
-    // REFCOUNT
-    //    virtual DeleteSoundFunc* get_destroy(void) const = 0;
     virtual DeletePlayingFunc* get_delstate(void) const = 0;
   };
   class EXPCL_PANDA PlayingClass {
@@ -46,7 +44,7 @@ public:
     PlayerClass(void) {}
     virtual ~PlayerClass(void);
 
-    virtual void play_sound(SoundClass*, PlayingClass*) = 0;
+    virtual void play_sound(SoundClass*, PlayingClass*, float) = 0;
     virtual void stop_sound(SoundClass*, PlayingClass*) = 0;
     virtual void set_volume(PlayingClass*, float) = 0;
   };

+ 8 - 0
panda/src/audio/audio_win_traits.I

@@ -7,6 +7,14 @@ INLINE WinSample::WinSample(void) : AudioTraits::SoundClass(), _data(NULL),
 				    _len(0) {
 }
 
+INLINE DWORD WinSample::get_length(void) const {
+  return _len;
+}
+
+INLINE WAVEFORMATEX WinSample::get_format(void) const {
+  return _info;
+}
+
 INLINE WinMusic::WinMusic(void) : AudioTraits::SoundClass(),
 				  _performance(NULL), _music(NULL),
 			          _buffer(NULL), _synth(NULL) {

+ 12 - 4
panda/src/audio/audio_win_traits.cxx

@@ -183,10 +183,9 @@ WinSample::~WinSample(void) {
 }
 
 float WinSample::length(void) const {
-  // DO THIS
   if (audio_cat->is_debug())
     audio_cat->debug() << "winsample length called" << endl;
-  return 0.;
+  return _len / (audio_mix_freq * 2. * 2.);
 }
 
 AudioTraits::PlayingClass* WinSample::get_state(void) const {
@@ -801,7 +800,7 @@ WinSamplePlayer::~WinSamplePlayer(void) {
 }
 
 void WinSamplePlayer::play_sound(AudioTraits::SoundClass* sample,
-			   AudioTraits::PlayingClass* play) {
+			   AudioTraits::PlayingClass* play, float start_time) {
   if (audio_cat->is_debug())
     audio_cat->debug() << "in winsampleplayer play_sound" << endl;
   initialize();
@@ -812,6 +811,15 @@ void WinSamplePlayer::play_sound(AudioTraits::SoundClass* sample,
   LPDIRECTSOUNDBUFFER chan = wplay->get_channel();
   if (chan) {
     chan->Stop();
+    DWORD l = wsample->get_length();
+    WAVEFORMATEX f = wsample->get_format();
+    float factor = ((float)l) / wsample->get_format().nAvgBytesPerSec;
+    factor = start_time / factor;
+    if (factor > 1.)
+      factor = 1.;
+    DWORD p = (DWORD)(l * factor);
+    p = (p >> 2) << 2;  // zero the last 2 bits
+    chan->SetCurrentPosition(p);
     HRESULT result = chan->Play(0, 0, 0);
     if (FAILED(result))
       audio_cat->error() << "sample play failed" << endl;
@@ -864,7 +872,7 @@ WinMusicPlayer::~WinMusicPlayer(void) {
 }
 
 void WinMusicPlayer::play_sound(AudioTraits::SoundClass* music,
-				AudioTraits::PlayingClass*) {
+				AudioTraits::PlayingClass*, float) {
   if (audio_cat->is_debug())
     audio_cat->debug() << "in WinMusicPlayer::play_sound()" << endl;
   initialize();

+ 6 - 11
panda/src/audio/audio_win_traits.h

@@ -30,14 +30,14 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
+
+  // used by play_sound
+  INLINE DWORD get_length(void) const;
+  INLINE WAVEFORMATEX get_format(void) const;
 public:
   static WinSample* load_wav(Filename);
   static WinSample* load_raw(unsigned char*, unsigned long);
-  // REFCOUNT
-  //  static void destroy(AudioTraits::SoundClass*);
 };
 
 class EXPCL_PANDA WinMusic : public AudioTraits::SoundClass {
@@ -46,8 +46,6 @@ private:
   IDirectMusicSegment* _music;
   IDirectSoundBuffer* _buffer;
   IDirectMusicPort* _synth;
-  //  BYTE* _data;
-  //  DWORD _len;
 
   void init(void);
 public:
@@ -57,9 +55,6 @@ public:
   virtual float length(void) const;
   virtual AudioTraits::PlayingClass* get_state(void) const;
   virtual AudioTraits::PlayerClass* get_player(void) const;
-  // REFCOUNT
-  //  virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
-  //  static void destroy(AudioTraits::SoundClass*);
   virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
   // these are used by the loaders
   static WinMusic* load_midi(Filename);
@@ -101,7 +96,7 @@ public:
   virtual ~WinSamplePlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);
@@ -118,7 +113,7 @@ public:
   virtual ~WinMusicPlayer(void);
 
   virtual void play_sound(AudioTraits::SoundClass*,
-			  AudioTraits::PlayingClass*);
+			  AudioTraits::PlayingClass*, float);
   virtual void stop_sound(AudioTraits::SoundClass*,
 			  AudioTraits::PlayingClass*);
   virtual void set_volume(AudioTraits::PlayingClass*, float);