From 9ecc3312b8eaef7b79a4dbfa74d0bdcc0565b42c Mon Sep 17 00:00:00 2001 From: Cary Sandvig Date: Fri, 6 Oct 2000 22:47:27 +0000 Subject: [PATCH] split out loaders --- panda/metalibs/panda/Sources.pp | 3 ++- panda/src/audio/Sources.pp | 3 +++ panda/src/audio/audio_linux_traits.cxx | 5 +++-- panda/src/audio/audio_manager.cxx | 2 +- panda/src/audio/audio_music.I | 22 +++++++++++-------- panda/src/audio/audio_music.cxx | 8 ++++++- panda/src/audio/audio_music.h | 8 ++++--- panda/src/audio/audio_pool.cxx | 9 +++++--- panda/src/audio/audio_sample.I | 4 ++++ panda/src/audio/audio_sample.cxx | 8 ++++++- panda/src/audio/audio_sample.h | 8 ++++--- panda/src/audio/audio_trait.cxx | 9 ++++++++ panda/src/audio/audio_trait.h | 30 +++++++++++++++----------- panda/src/audio/config_audio.cxx | 2 ++ panda/src/audio/config_audio.h | 1 + 15 files changed, 86 insertions(+), 36 deletions(-) diff --git a/panda/metalibs/panda/Sources.pp b/panda/metalibs/panda/Sources.pp index e818d62bcc..4abec3e211 100644 --- a/panda/metalibs/panda/Sources.pp +++ b/panda/metalibs/panda/Sources.pp @@ -15,7 +15,8 @@ gsgmisc light linmath mathutil net pnm \ pnmimagetypes pnmimage sgattrib sgmanip sgraph sgraphutil \ switchnode text tform tiff lerp loader putil effects \ - audio audio_load_midi audio_load_st audio_load_wav pandabase \ + audio pandabase \ +// audio audio_load_midi audio_load_st audio_load_wav pandabase \ #define LOCAL_LIBS downloader event ipc express pandabase #define OTHER_LIBS dtool diff --git a/panda/src/audio/Sources.pp b/panda/src/audio/Sources.pp index eca4e67938..9832c6343e 100644 --- a/panda/src/audio/Sources.pp +++ b/panda/src/audio/Sources.pp @@ -29,6 +29,7 @@ #begin lib_target #define TARGET audio_load_midi + #define BUILDING_DLL BUILDING_MISC #define LOCAL_LIBS \ audio @@ -39,6 +40,7 @@ #begin lib_target #define TARGET audio_load_wav + #define BUILDING_DLL BUILDING_MISC #define LOCAL_LIBS \ audio @@ -49,6 +51,7 @@ #begin lib_target #define TARGET audio_load_st + #define BUILDING_DLL BUILDING_MISC #define USE_SOXST yes #define LOCAL_LIBS \ audio diff --git a/panda/src/audio/audio_linux_traits.cxx b/panda/src/audio/audio_linux_traits.cxx index 08535f9458..94ccb84588 100644 --- a/panda/src/audio/audio_linux_traits.cxx +++ b/panda/src/audio/audio_linux_traits.cxx @@ -188,7 +188,7 @@ static void internal_update(void*) { } while (1) { if (have_buffers == 0) { - ipc_traits::sleep(0, 10000); + ipc_traits::sleep(0, audio_auto_update_delay); } else { write(output_fd, current_buffer, audio_buffer_size); { @@ -248,7 +248,8 @@ void LinuxSample::destroy(AudioTraits::SampleClass* sample) { } LinuxSample* LinuxSample::load_raw(byte* data, unsigned long size) { - return new LinuxSample(new Buffer(data, size)); + LinuxSample* ret = new LinuxSample(new Buffer(data, size)); + return ret; } LinuxMusic::~LinuxMusic(void) { diff --git a/panda/src/audio/audio_manager.cxx b/panda/src/audio/audio_manager.cxx index 1ac3788dc0..afa307269c 100644 --- a/panda/src/audio/audio_manager.cxx +++ b/panda/src/audio/audio_manager.cxx @@ -62,7 +62,7 @@ void AudioManager::ns_play(AudioMusic* music) { void AudioManager::spawned_update(void*) { while (1) { AudioManager::update(); - ipc_traits::sleep(0, 1000000); + ipc_traits::sleep(0, audio_auto_update_delay); } } diff --git a/panda/src/audio/audio_music.I b/panda/src/audio/audio_music.I index c85aedce70..c1a744918a 100644 --- a/panda/src/audio/audio_music.I +++ b/panda/src/audio/audio_music.I @@ -9,12 +9,14 @@ // Description: initialize a new music //////////////////////////////////////////////////////////////////// INLINE AudioMusic::AudioMusic(AudioTraits::MusicClass* music, - AudioTraits::PlayerClass* player, - AudioTraits::DeleteMusicFunc* destroy, - const string& filename) : Namable(filename), - _music(music), - _player(player), - _destroy(destroy) {} + AudioTraits::PlayingClass* state, + AudioTraits::PlayerClass* player, + AudioTraits::DeleteMusicFunc* destroy, + const string& filename) : Namable(filename), + _music(music), + _state(state), + _player(player), + _destroy(destroy) {} //////////////////////////////////////////////////////////////////// // Function: AudioMusic::copy constructor @@ -22,9 +24,10 @@ INLINE AudioMusic::AudioMusic(AudioTraits::MusicClass* music, // Description: copy a music, but we don't really want to allow this //////////////////////////////////////////////////////////////////// INLINE AudioMusic::AudioMusic(const AudioMusic& c) : Namable(c.get_name()), - _music(c._music), - _player(c._player), - _destroy(c._destroy) {} + _music(c._music), + _state(c._state), + _player(c._player), + _destroy(c._destroy) {} //////////////////////////////////////////////////////////////////// // Function: AudioMusic::assignment operator @@ -34,6 +37,7 @@ INLINE AudioMusic::AudioMusic(const AudioMusic& c) : Namable(c.get_name()), INLINE AudioMusic& AudioMusic::operator=(const AudioMusic& c) { this->set_name(c.get_name()); this->_music = c._music; + this->_state = c._state; this->_player = c._player; this->_destroy = c._destroy; return *this; diff --git a/panda/src/audio/audio_music.cxx b/panda/src/audio/audio_music.cxx index 4de5ae6ec1..f3e5d91a98 100644 --- a/panda/src/audio/audio_music.cxx +++ b/panda/src/audio/audio_music.cxx @@ -24,13 +24,19 @@ AudioMusic::~AudioMusic(void) { // Description: return the current play status of this music //////////////////////////////////////////////////////////////////// AudioMusic::MusicStatus AudioMusic::status(void) { + // AudioTraits::PlayingClass::PlayingStatus stat = _state->status(); AudioTraits::MusicClass::MusicStatus stat = _music->status(); switch (stat) { + // case AudioTraits::PlayingClass::BAD: + case AudioTraits::MusicClass::BAD: + return BAD; + // case AudioTraits::PlayingClass::READY: case AudioTraits::MusicClass::READY: return READY; + // case AudioTraits::PlayingClass::PLAYING: case AudioTraits::MusicClass::PLAYING: return PLAYING; } audio_cat->error() << "unknown status for music" << endl; - return READY; + return BAD; } diff --git a/panda/src/audio/audio_music.h b/panda/src/audio/audio_music.h index 64b38697c6..493b9ede71 100644 --- a/panda/src/audio/audio_music.h +++ b/panda/src/audio/audio_music.h @@ -16,11 +16,13 @@ class AudioManager; class EXPCL_PANDA AudioMusic : public TypedReferenceCount, public Namable { private: AudioTraits::MusicClass *_music; + AudioTraits::PlayingClass *_state; AudioTraits::PlayerClass *_player; AudioTraits::DeleteMusicFunc *_destroy; protected: - INLINE AudioMusic(AudioTraits::MusicClass*, AudioTraits::PlayerClass*, - AudioTraits::DeleteMusicFunc*, const string&); + INLINE AudioMusic(AudioTraits::MusicClass*, AudioTraits::PlayingClass*, + AudioTraits::PlayerClass*, AudioTraits::DeleteMusicFunc*, + const string&); INLINE AudioMusic(const AudioMusic&); INLINE AudioMusic& operator=(const AudioMusic&); @@ -33,7 +35,7 @@ public: virtual ~AudioMusic(void); INLINE bool operator==(const AudioMusic&) const; - enum MusicStatus { READY, PLAYING }; + enum MusicStatus { BAD, READY, PLAYING }; MusicStatus status(void); public: diff --git a/panda/src/audio/audio_pool.cxx b/panda/src/audio/audio_pool.cxx index dea66c69fe..7313317ad0 100644 --- a/panda/src/audio/audio_pool.cxx +++ b/panda/src/audio/audio_pool.cxx @@ -96,8 +96,9 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) { audio_cat->error() << "could not load '" << filename << "'" << endl; return (AudioSample*)0L; } - PT(AudioSample) the_sample = new AudioSample(sample, player, destroy, - filename); + PT(AudioSample) the_sample = new AudioSample(sample, + (AudioTraits::PlayingClass*)0L, + player, destroy, filename); _samples[filename] = the_sample; return the_sample; } @@ -195,7 +196,9 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) { audio_cat->error() << "could not load '" << filename << "'" << endl; return (AudioMusic*)0L; } - PT(AudioMusic) the_music = new AudioMusic(music, player, destroy, filename); + PT(AudioMusic) the_music = new AudioMusic(music, + (AudioTraits::PlayingClass*)0L, + player, destroy, filename); _music[filename] = the_music; return the_music; } diff --git a/panda/src/audio/audio_sample.I b/panda/src/audio/audio_sample.I index b291635881..d54a0988cc 100644 --- a/panda/src/audio/audio_sample.I +++ b/panda/src/audio/audio_sample.I @@ -9,10 +9,12 @@ // Description: initialize a new sample //////////////////////////////////////////////////////////////////// INLINE AudioSample::AudioSample(AudioTraits::SampleClass* sample, + AudioTraits::PlayingClass* state, AudioTraits::PlayerClass* player, AudioTraits::DeleteSampleFunc* destroy, const string& filename) : Namable(filename), _sample(sample), + _state(state), _player(player), _destroy(destroy) {} @@ -23,6 +25,7 @@ INLINE AudioSample::AudioSample(AudioTraits::SampleClass* sample, //////////////////////////////////////////////////////////////////// INLINE AudioSample::AudioSample(const AudioSample& c) : Namable(c.get_name()), _sample(c._sample), + _state(c._state), _player(c._player), _destroy(c._destroy) {} @@ -34,6 +37,7 @@ INLINE AudioSample::AudioSample(const AudioSample& c) : Namable(c.get_name()), INLINE AudioSample& AudioSample::operator=(const AudioSample& c) { this->set_name(c.get_name()); this->_sample = c._sample; + this->_state = c._state; this->_player = c._player; this->_destroy = c._destroy; return *this; diff --git a/panda/src/audio/audio_sample.cxx b/panda/src/audio/audio_sample.cxx index f156d75525..8383ad28bf 100644 --- a/panda/src/audio/audio_sample.cxx +++ b/panda/src/audio/audio_sample.cxx @@ -33,13 +33,19 @@ float AudioSample::length(void) { // Description: return the current play status of this sample //////////////////////////////////////////////////////////////////// AudioSample::SampleStatus AudioSample::status(void) { + // AudioTraits::PlayingClass::PlayingStatus stat = _state->status(); AudioTraits::SampleClass::SampleStatus stat = _sample->status(); switch (stat) { + // case AudioTraits::PlayingClass::BAD: + case AudioTraits::SampleClass::BAD: + return BAD; + // case AudioTraits::PlayingClass::READY: case AudioTraits::SampleClass::READY: return READY; + // case AudioTraits::PlayingClass::PLAYING: case AudioTraits::SampleClass::PLAYING: return PLAYING; } audio_cat->error() << "unknown status for sample" << endl; - return READY; + return BAD; } diff --git a/panda/src/audio/audio_sample.h b/panda/src/audio/audio_sample.h index 1a17cb1e46..8711e2f046 100644 --- a/panda/src/audio/audio_sample.h +++ b/panda/src/audio/audio_sample.h @@ -16,11 +16,13 @@ class AudioManager; class EXPCL_PANDA AudioSample : public TypedReferenceCount, public Namable { private: AudioTraits::SampleClass *_sample; + AudioTraits::PlayingClass *_state; AudioTraits::PlayerClass *_player; AudioTraits::DeleteSampleFunc *_destroy; protected: - INLINE AudioSample(AudioTraits::SampleClass*, AudioTraits::PlayerClass*, - AudioTraits::DeleteSampleFunc*, const string&); + INLINE AudioSample(AudioTraits::SampleClass*, AudioTraits::PlayingClass*, + AudioTraits::PlayerClass*, AudioTraits::DeleteSampleFunc*, + const string&); INLINE AudioSample(const AudioSample&); INLINE AudioSample& operator=(const AudioSample&); @@ -33,7 +35,7 @@ public: virtual ~AudioSample(void); INLINE bool operator==(const AudioSample&) const; - enum SampleStatus { READY, PLAYING } ; + enum SampleStatus { BAD, READY, PLAYING } ; float length(void); SampleStatus status(void); diff --git a/panda/src/audio/audio_trait.cxx b/panda/src/audio/audio_trait.cxx index 6dabe33541..d07afd55d7 100644 --- a/panda/src/audio/audio_trait.cxx +++ b/panda/src/audio/audio_trait.cxx @@ -27,6 +27,15 @@ AudioTraits::MusicClass::MusicStatus AudioTraits::MusicClass::status(void) { return READY; } +AudioTraits::PlayingClass::~PlayingClass(void) { +} + +AudioTraits::PlayingClass::PlayingStatus +AudioTraits::PlayingClass::status(void) { + audio_cat->error() << "In abstract PlayingClass::status!" << endl; + return BAD; +} + AudioTraits::PlayerClass::~PlayerClass(void) { } diff --git a/panda/src/audio/audio_trait.h b/panda/src/audio/audio_trait.h index c90c3f035d..68b33cc195 100644 --- a/panda/src/audio/audio_trait.h +++ b/panda/src/audio/audio_trait.h @@ -21,7 +21,7 @@ public: SampleClass(void) {} virtual ~SampleClass(void); - enum SampleStatus { READY, PLAYING } ; + enum SampleStatus { BAD, READY, PLAYING } ; virtual float length(void) = 0; virtual SampleStatus status(void) = 0; @@ -31,9 +31,19 @@ public: MusicClass(void) {} virtual ~MusicClass(void); - enum MusicStatus { READY, PLAYING }; + enum MusicStatus { BAD, READY, PLAYING } ; + virtual MusicStatus status(void) = 0; }; + class EXPCL_PANDA PlayingClass { + public: + PlayingClass(void) {} + virtual ~PlayingClass(void); + + enum PlayingStatus { BAD, READY, PLAYING } ; + + virtual PlayingStatus status(void) = 0; + }; class EXPCL_PANDA PlayerClass { public: PlayerClass(void) {} @@ -49,18 +59,14 @@ public: // this is really ugly. But since we have to be able to include/compile // all of the driver files on any system, I need to centralize a switch // for which one is real. -#ifdef HAVE_MIKMOD -#define AUDIO_USE_MIKMOD -#else /* HAVE_MIKMOD */ -#ifdef PENV_WIN32 -#define AUDIO_USE_WIN32 -#else /* PENV_WIN32 */ #ifdef PENV_LINUX #define AUDIO_USE_LINUX -#else /* PENV_LINUX */ +#elif defined(PENV_WIN32) +#define AUDIO_USE_WIN32 +#elif defined(HAVE_MIKMOD) +#define AUDIO_USE_MIKMOD +#else #define AUDIO_USE_NULL -#endif /* PENV_LINUX */ -#endif /* PENV_WIN32 */ -#endif /* HAVE_MIKMOD */ +#endif #endif /* __AUDIO_TRAIT_H__ */ diff --git a/panda/src/audio/config_audio.cxx b/panda/src/audio/config_audio.cxx index 494b0f6a14..3034217b97 100644 --- a/panda/src/audio/config_audio.cxx +++ b/panda/src/audio/config_audio.cxx @@ -20,6 +20,8 @@ int audio_driver_select = config_audio.GetInt("audio-driver-select", 0); string* audio_driver_params; int audio_buffer_size = config_audio.GetInt("audio-buffer-size", 4096); string* audio_device; +int audio_auto_update_delay = config_audio.GetInt("audio-auto-update-delay", + 100000); ConfigureFn(config_audio) { AudioSample::init_type(); diff --git a/panda/src/audio/config_audio.h b/panda/src/audio/config_audio.h index 16f61f9906..5747dca73a 100644 --- a/panda/src/audio/config_audio.h +++ b/panda/src/audio/config_audio.h @@ -18,5 +18,6 @@ extern int audio_driver_select; extern string* audio_driver_params; extern int audio_buffer_size; extern string* audio_device; +extern int audio_auto_update_delay; #endif /* __CONFIG_AUDIO_H__ */