From fe6ae687a2799b66922b969ec02a550882c3b952 Mon Sep 17 00:00:00 2001 From: Cary Sandvig Date: Tue, 6 Mar 2001 04:37:14 +0000 Subject: [PATCH] whee --- panda/src/audio/audio_linux_traits.cxx | 41 ++++++--------------- panda/src/audio/audio_linux_traits.h | 14 ++----- panda/src/audio/audio_manager.I | 4 +- panda/src/audio/audio_manager.cxx | 5 ++- panda/src/audio/audio_manager.h | 4 +- panda/src/audio/audio_mikmod_traits.cxx | 49 ++----------------------- panda/src/audio/audio_mikmod_traits.h | 16 ++------ panda/src/audio/audio_null_traits.cxx | 15 +------- panda/src/audio/audio_null_traits.h | 5 +-- panda/src/audio/audio_trait.cxx | 11 +----- panda/src/audio/audio_trait.h | 4 +- panda/src/audio/audio_win_traits.I | 8 ++++ panda/src/audio/audio_win_traits.cxx | 16 ++++++-- panda/src/audio/audio_win_traits.h | 17 +++------ 14 files changed, 59 insertions(+), 150 deletions(-) diff --git a/panda/src/audio/audio_linux_traits.cxx b/panda/src/audio/audio_linux_traits.cxx index 65b224aca0..0528ae74f8 100644 --- a/panda/src/audio/audio_linux_traits.cxx +++ b/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(); } diff --git a/panda/src/audio/audio_linux_traits.h b/panda/src/audio/audio_linux_traits.h index 261ea36b8f..1e7eab5a52 100644 --- a/panda/src/audio/audio_linux_traits.h +++ b/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); diff --git a/panda/src/audio/audio_manager.I b/panda/src/audio/audio_manager.I index f7a6310e76..f283164075 100644 --- a/panda/src/audio/audio_manager.I +++ b/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); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/audio/audio_manager.cxx b/panda/src/audio/audio_manager.cxx index f108e6b832..577c3ec19c 100644 --- a/panda/src/audio/audio_manager.cxx +++ b/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); } //////////////////////////////////////////////////////////////////// diff --git a/panda/src/audio/audio_manager.h b/panda/src/audio/audio_manager.h index 8e10f1bf7e..e8ba63f5e8 100644 --- a/panda/src/audio/audio_manager.h +++ b/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*); diff --git a/panda/src/audio/audio_mikmod_traits.cxx b/panda/src/audio/audio_mikmod_traits.cxx index 90c24fba14..572432c09e 100644 --- a/panda/src/audio/audio_mikmod_traits.cxx +++ b/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; } diff --git a/panda/src/audio/audio_mikmod_traits.h b/panda/src/audio/audio_mikmod_traits.h index 4f05e80e6d..c249deed1a 100644 --- a/panda/src/audio/audio_mikmod_traits.h +++ b/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); diff --git a/panda/src/audio/audio_null_traits.cxx b/panda/src/audio/audio_null_traits.cxx index 4bc64d5c4e..44dbede3ef 100644 --- a/panda/src/audio/audio_null_traits.cxx +++ b/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; } diff --git a/panda/src/audio/audio_null_traits.h b/panda/src/audio/audio_null_traits.h index a647df8cba..fc9c08149c 100644 --- a/panda/src/audio/audio_null_traits.h +++ b/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); diff --git a/panda/src/audio/audio_trait.cxx b/panda/src/audio/audio_trait.cxx index acf33b5061..a88e38a784 100644 --- a/panda/src/audio/audio_trait.cxx +++ b/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; } diff --git a/panda/src/audio/audio_trait.h b/panda/src/audio/audio_trait.h index 637979b7dc..db123f1bf6 100644 --- a/panda/src/audio/audio_trait.h +++ b/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; }; diff --git a/panda/src/audio/audio_win_traits.I b/panda/src/audio/audio_win_traits.I index c219d51af3..bc8a271aff 100644 --- a/panda/src/audio/audio_win_traits.I +++ b/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) { diff --git a/panda/src/audio/audio_win_traits.cxx b/panda/src/audio/audio_win_traits.cxx index 79c60ae6c4..fe05b66dc5 100644 --- a/panda/src/audio/audio_win_traits.cxx +++ b/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(); diff --git a/panda/src/audio/audio_win_traits.h b/panda/src/audio/audio_win_traits.h index 266ba699cd..af21c6a0ff 100644 --- a/panda/src/audio/audio_win_traits.h +++ b/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);