From eed2cb7fa50804615232fc4fde4f4ba41733453f Mon Sep 17 00:00:00 2001 From: Cary Sandvig Date: Tue, 10 Oct 2000 00:00:50 +0000 Subject: [PATCH] rev for playing state --- panda/src/audio/audio_linux_traits.I | 10 +++++++--- panda/src/audio/audio_linux_traits.cxx | 19 +++++++++++++++++++ panda/src/audio/audio_linux_traits.h | 16 +++++++++++++++- panda/src/audio/audio_mikmod_traits.cxx | 14 ++++++++++++++ panda/src/audio/audio_mikmod_traits.h | 10 ++++++++++ panda/src/audio/audio_null_traits.I | 9 ++++++--- panda/src/audio/audio_null_traits.cxx | 3 +++ panda/src/audio/audio_null_traits.h | 8 ++++++++ panda/src/audio/audio_pool.cxx | 18 ++++++++++-------- panda/src/audio/audio_pool.h | 2 ++ panda/src/audio/audio_win_traits.I | 11 ++++++++--- panda/src/audio/audio_win_traits.cxx | 11 +++++++++++ panda/src/audio/audio_win_traits.h | 10 ++++++++++ panda/src/audiotraits/audio_load_midi.cxx | 16 ++++++++++++---- panda/src/audiotraits/audio_load_st.cxx | 14 ++++++++++++-- panda/src/audiotraits/audio_load_wav.cxx | 16 +++++++++++++--- 16 files changed, 160 insertions(+), 27 deletions(-) diff --git a/panda/src/audio/audio_linux_traits.I b/panda/src/audio/audio_linux_traits.I index 4232ed7887..648f1ef68e 100644 --- a/panda/src/audio/audio_linux_traits.I +++ b/panda/src/audio/audio_linux_traits.I @@ -3,15 +3,19 @@ // //////////////////////////////////////////////////////////////////// -INLINE LinuxSample::LinuxSample(Buffer* b) : _data(b) { +INLINE LinuxSample::LinuxSample(Buffer* b) : AudioTraits::SampleClass(), + _data(b) { } INLINE Buffer* LinuxSample::get_data(void) { return _data; } -INLINE LinuxMusic::LinuxMusic(void) { +INLINE LinuxMusic::LinuxMusic(void) : AudioTraits::MusicClass() { } -INLINE LinuxPlayer::LinuxPlayer(void) { +INLINE LinuxPlaying::LinuxPlaying(void) : AudioTraits::PlayingClass() { +} + +INLINE LinuxPlayer::LinuxPlayer(void) : AudioTraits::PlayerClass() { } diff --git a/panda/src/audio/audio_linux_traits.cxx b/panda/src/audio/audio_linux_traits.cxx index 94ccb84588..bfa52f9472 100644 --- a/panda/src/audio/audio_linux_traits.cxx +++ b/panda/src/audio/audio_linux_traits.cxx @@ -243,6 +243,10 @@ AudioTraits::SampleClass::SampleStatus LinuxSample::status(void) { return AudioTraits::SampleClass::READY; } +LinuxPlaying* LinuxSample::get_state(void) { + return new LinuxPlaying(); +} + void LinuxSample::destroy(AudioTraits::SampleClass* sample) { delete sample; } @@ -259,6 +263,21 @@ AudioTraits::MusicClass::MusicStatus LinuxMusic::status(void) { return AudioTraits::MusicClass::READY; } +LinuxPlaying* LinuxMusic::get_state(void) { + return new LinuxPlaying(); +} + +void LinuxMusic::destroy(AudioTraits::MusicClass* music) { + delete music; +} + +LinuxPlaying::~LinuxPlaying(void) { +} + +AudioTraits::PlayingClass::PlayingStatus LinuxPlaying::status(void) { + return AudioTraits::PlayingClass::BAD; +} + LinuxPlayer* LinuxPlayer::_global_instance = (LinuxPlayer*)0L; LinuxPlayer::~LinuxPlayer(void) { diff --git a/panda/src/audio/audio_linux_traits.h b/panda/src/audio/audio_linux_traits.h index a238dd35b2..b8f2295104 100644 --- a/panda/src/audio/audio_linux_traits.h +++ b/panda/src/audio/audio_linux_traits.h @@ -57,6 +57,8 @@ public: } }; +class LinuxPlaying; + class EXPCL_PANDA LinuxSample : public AudioTraits::SampleClass { private: Buffer* _data; @@ -67,10 +69,11 @@ public: virtual float length(void); virtual AudioTraits::SampleClass::SampleStatus status(void); - static void destroy(AudioTraits::SampleClass*); public: // used by the loader static LinuxSample* load_raw(byte*, unsigned long); + virtual LinuxPlaying* get_state(void); + static void destroy(AudioTraits::SampleClass*); // used by the players INLINE Buffer* get_data(void); }; @@ -81,6 +84,17 @@ public: virtual ~LinuxMusic(void); virtual AudioTraits::MusicClass::MusicStatus status(void); +public: + virtual LinuxPlaying* get_state(void); + static void destroy(AudioTraits::MusicClass*); +}; + +class EXPCL_PANDA LinuxPlaying : public AudioTraits::PlayingClass { +public: + INLINE LinuxPlaying(void); + virtual ~LinuxPlaying(void); + + virtual AudioTraits::PlayingClass::PlayingStatus status(void); }; class EXPCL_PANDA LinuxPlayer : public AudioTraits::PlayerClass { diff --git a/panda/src/audio/audio_mikmod_traits.cxx b/panda/src/audio/audio_mikmod_traits.cxx index b6a642bdaa..a5c061e531 100644 --- a/panda/src/audio/audio_mikmod_traits.cxx +++ b/panda/src/audio/audio_mikmod_traits.cxx @@ -156,6 +156,10 @@ MikModSample* MikModSample::load_wav(Filename filename) { return new MikModSample(sample); } +MikModPlaying* MikModSample::get_state(void) { + return new MikModPlaying(); +} + void MikModSample::destroy(AudioTraits::SampleClass* sample) { delete sample; } @@ -197,6 +201,10 @@ MikModMidi* MikModMidi::load_midi(Filename) { return new MikModMidi(); } +MikModPlaying* MikModMidi::get_state(void) { + return new MikModPlaying(); +} + void MikModMidi::destroy(AudioTraits::MusicClass* music) { delete music; } @@ -205,6 +213,12 @@ AudioTraits::MusicClass::MusicStatus MikModMidi::status(void) { return READY; } +MikModPlaying::MikModPlaying(void) : AudioTraits::PlayingClass() { +} + +MikModPlaying::~MikModPlaying(void) { +} + MikModSamplePlayer* MikModSamplePlayer::_global_instance = (MikModSamplePlayer*)0L; diff --git a/panda/src/audio/audio_mikmod_traits.h b/panda/src/audio/audio_mikmod_traits.h index 863725de3e..7cdd0d1463 100644 --- a/panda/src/audio/audio_mikmod_traits.h +++ b/panda/src/audio/audio_mikmod_traits.h @@ -14,6 +14,8 @@ #include #include +class MikModPlaying; + class EXPCL_PANDA MikModSample : public AudioTraits::SampleClass { private: SAMPLE* _sample; @@ -28,6 +30,7 @@ public: public: // used by the readers static MikModSample* load_wav(Filename); + virtual MikModPlaying* get_state(void); static void destroy(AudioTraits::SampleClass*); // used by the players virtual void set_voice(int); @@ -57,8 +60,15 @@ public: // used by the readers static MikModMidi* load_midi(Filename); static void destroy(AudioTraits::MusicClass*); + virtual MikModPlaying* get_state(void); }; +class EXPCL_PANDA MikModPlaying : public AudioTraits::PlayingClass { +public: + MikModPlaying(void); + ~MikModPlaying(void); +} + class EXPCL_PANDA MikModSamplePlayer : public AudioTraits::PlayerClass { public: MikModSamplePlayer(void); diff --git a/panda/src/audio/audio_null_traits.I b/panda/src/audio/audio_null_traits.I index 60dd1be58e..e7cb45280f 100644 --- a/panda/src/audio/audio_null_traits.I +++ b/panda/src/audio/audio_null_traits.I @@ -3,11 +3,14 @@ // //////////////////////////////////////////////////////////////////// -INLINE NullSample::NullSample(void) { +INLINE NullSample::NullSample(void) : AudioTraits::SampleClass() { } -INLINE NullMusic::NullMusic(void) { +INLINE NullMusic::NullMusic(void) : AudioTraits::MusicClass() { } -INLINE NullPlayer::NullPlayer(void) { +INLINE NullPlaying::NullPlaying(void) : AudioTraits::PlayingClass() { +} + +INLINE NullPlayer::NullPlayer(void) : AudioTraits::PlayerClass() { } diff --git a/panda/src/audio/audio_null_traits.cxx b/panda/src/audio/audio_null_traits.cxx index d06ecc2467..527d5e694b 100644 --- a/panda/src/audio/audio_null_traits.cxx +++ b/panda/src/audio/audio_null_traits.cxx @@ -48,6 +48,9 @@ AudioTraits::MusicClass::MusicStatus NullMusic::status(void) { return READY; } +NullPlaying::~NullPlaying(void) { +} + NullPlayer::~NullPlayer(void) { } diff --git a/panda/src/audio/audio_null_traits.h b/panda/src/audio/audio_null_traits.h index 2d3300b4ba..d6e9156f19 100644 --- a/panda/src/audio/audio_null_traits.h +++ b/panda/src/audio/audio_null_traits.h @@ -11,6 +11,8 @@ #ifndef __AUDIO_NULL_TRAITS_H__ #define __AUDIO_NULL_TRAITS_H__ +class NullPlaying; + class EXPCL_PANDA NullSample : public AudioTraits::SampleClass { public: INLINE NullSample(void); @@ -28,6 +30,12 @@ public: virtual AudioTraits::MusicClass::MusicStatus status(void); }; +class EXPCL_PANDA NullPlaying : public AudioTraits::PlayingClass { +public: + INLINE NullPlaying(void); + virtual ~NullPlaying(void); +}; + class EXPCL_PANDA NullPlayer : public AudioTraits::PlayerClass { public: INLINE NullPlayer(void); diff --git a/panda/src/audio/audio_pool.cxx b/panda/src/audio/audio_pool.cxx index 7313317ad0..90eb778714 100644 --- a/panda/src/audio/audio_pool.cxx +++ b/panda/src/audio/audio_pool.cxx @@ -78,6 +78,7 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) { } audio_cat.info() << "Loading sample " << filename << "\n"; AudioTraits::SampleClass* sample = (AudioTraits::SampleClass*)0L; + AudioTraits::PlayingClass* state = (AudioTraits::PlayingClass*)0L; AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L; AudioTraits::DeleteSampleFunc* destroy = (AudioTraits::DeleteSampleFunc*)0L; string ext = filename.get_extension(); @@ -89,16 +90,16 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) { << "'" << endl; return (AudioSample*)0L; } - (*((*sli).second))(&sample, &player, &destroy, filename); + (*((*sli).second))(&sample, &state, &player, &destroy, filename); if ((sample == (AudioTraits::SampleClass*)0L) || + (state == (AudioTraits::PlayingClass*)0L) || (player == (AudioTraits::PlayerClass*)0L) || (destroy == (AudioTraits::DeleteSampleFunc*)0L)) { audio_cat->error() << "could not load '" << filename << "'" << endl; return (AudioSample*)0L; } - PT(AudioSample) the_sample = new AudioSample(sample, - (AudioTraits::PlayingClass*)0L, - player, destroy, filename); + PT(AudioSample) the_sample = new AudioSample(sample, state, player, destroy, + filename); _samples[filename] = the_sample; return the_sample; } @@ -178,6 +179,7 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) { } audio_cat.info() << "Loading music " << filename << "\n"; AudioTraits::MusicClass* music = (AudioTraits::MusicClass*)0L; + AudioTraits::PlayingClass* state = (AudioTraits::PlayingClass*)0L; AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L; AudioTraits::DeleteMusicFunc* destroy = (AudioTraits::DeleteMusicFunc*)0L; string ext = filename.get_extension(); @@ -189,16 +191,16 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) { << "'" << endl; return (AudioMusic*)0L; } - (*((*sli).second))(&music, &player, &destroy, filename); + (*((*sli).second))(&music, &state, &player, &destroy, filename); if ((music == (AudioTraits::MusicClass*)0L) || + (state == (AudioTraits::PlayingClass*)0L) || (player == (AudioTraits::PlayerClass*)0L) || (destroy == (AudioTraits::DeleteMusicFunc*)0L)) { audio_cat->error() << "could not load '" << filename << "'" << endl; return (AudioMusic*)0L; } - PT(AudioMusic) the_music = new AudioMusic(music, - (AudioTraits::PlayingClass*)0L, - player, destroy, filename); + PT(AudioMusic) the_music = new AudioMusic(music, state, player, destroy, + filename); _music[filename] = the_music; return the_music; } diff --git a/panda/src/audio/audio_pool.h b/panda/src/audio/audio_pool.h index 30f276d868..2481cc35a8 100644 --- a/panda/src/audio/audio_pool.h +++ b/panda/src/audio/audio_pool.h @@ -36,6 +36,7 @@ private: MusicMap _music; public: typedef void SampleLoadFunc(AudioTraits::SampleClass**, + AudioTraits::PlayingClass**, AudioTraits::PlayerClass**, AudioTraits::DeleteSampleFunc**, Filename); @@ -47,6 +48,7 @@ public: static void register_sample_loader(const string&, SampleLoadFunc*); typedef void MusicLoadFunc(AudioTraits::MusicClass**, + AudioTraits::PlayingClass**, AudioTraits::PlayerClass**, AudioTraits::DeleteMusicFunc**, Filename); diff --git a/panda/src/audio/audio_win_traits.I b/panda/src/audio/audio_win_traits.I index b1802d77fe..d2b08eb38a 100644 --- a/panda/src/audio/audio_win_traits.I +++ b/panda/src/audio/audio_win_traits.I @@ -3,14 +3,16 @@ // //////////////////////////////////////////////////////////////////// -INLINE WinSample::WinSample(void) : _channel(NULL), _data(NULL), _len(0) { +INLINE WinSample::WinSample(void) : AudioTraits::SampleClass(), _channel(NULL), + _data(NULL), _len(0) { } INLINE LPDIRECTSOUNDBUFFER WinSample::get_channel(void) { return _channel; } -INLINE WinMusic::WinMusic(void) : _performance(NULL), _music(NULL), +INLINE WinMusic::WinMusic(void) : AudioTraits::MusicClass(), + _performance(NULL), _music(NULL), _buffer(NULL), _synth(NULL), _data(NULL), _len(0) { init(); @@ -24,5 +26,8 @@ INLINE IDirectMusicSegment* WinMusic::get_music(void) { return _music; } -INLINE WinPlayer::WinPlayer(void) { +INLINE WinPlaying::WinPlaying(void) : AudioTraits::PlayingClass() { +} + +INLINE WinPlayer::WinPlayer(void) : AudioTraits::PlayerClass() { } diff --git a/panda/src/audio/audio_win_traits.cxx b/panda/src/audio/audio_win_traits.cxx index b1fe7ccc78..9e994e7593 100644 --- a/panda/src/audio/audio_win_traits.cxx +++ b/panda/src/audio/audio_win_traits.cxx @@ -443,6 +443,10 @@ WinSample* WinSample::load_raw(unsigned char* data, unsigned long size) { } } +WinPlaying* WinSample::get_state(void) { + return new WinPlaying(); +} + void WinSample::destroy(AudioTraits::SampleClass* sample) { delete sample; } @@ -638,6 +642,10 @@ WinMusic* WinMusic::load_midi(Filename filename) { return ret; } +WinPlaying* WinMusic::get_state(void) { + return new WinPlaying(); +} + void WinMusic::destroy(AudioTraits::MusicClass* music) { if (audio_cat->is_debug()) audio_cat->debug() << "in WinMusic::destroy()" << endl; @@ -646,6 +654,9 @@ void WinMusic::destroy(AudioTraits::MusicClass* music) { audio_cat->debug() << "out of WinMusic::destroy()" << endl; } +WinPlaying::~WinPlaying(void) { +} + WinPlayer* WinPlayer::_global_instance = (WinPlayer*)0L; WinPlayer::~WinPlayer(void) { diff --git a/panda/src/audio/audio_win_traits.h b/panda/src/audio/audio_win_traits.h index 8300a54959..928e79b425 100644 --- a/panda/src/audio/audio_win_traits.h +++ b/panda/src/audio/audio_win_traits.h @@ -16,6 +16,8 @@ #include #include +class WinPlaying; + class EXPCL_PANDA WinSample : public AudioTraits::SampleClass { private: LPDIRECTSOUNDBUFFER _channel; @@ -33,6 +35,7 @@ public: void unlock(void); static WinSample* load_wav(Filename); static WinSample* load_raw(unsigned char*, unsigned long); + virtual WinPlaying* get_state(void); static void destroy(AudioTraits::SampleClass*); // these are used by the player INLINE LPDIRECTSOUNDBUFFER get_channel(void); @@ -55,12 +58,19 @@ public: virtual AudioTraits::MusicClass::MusicStatus status(void); // these are used by the loaders static WinMusic* load_midi(Filename); + virtual WinPlaying* get_state(void); static void destroy(AudioTraits::MusicClass*); // these are used by the players INLINE IDirectMusicPerformance* get_performance(void); INLINE IDirectMusicSegment* get_music(void); }; +class EXPCL_PANDA WinPlaying : public AudioTraits::PlayingClass { +public: + INLINE WinPlaying(void); + ~WinPlaying(void); +}; + class EXPCL_PANDA WinPlayer : public AudioTraits::PlayerClass { public: INLINE WinPlayer(void); diff --git a/panda/src/audiotraits/audio_load_midi.cxx b/panda/src/audiotraits/audio_load_midi.cxx index 598998cd69..6a741cfaa9 100644 --- a/panda/src/audiotraits/audio_load_midi.cxx +++ b/panda/src/audiotraits/audio_load_midi.cxx @@ -19,11 +19,13 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) { } void AudioLoadMidi(AudioTraits::MusicClass** music, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteMusicFunc** destroy, Filename filename) { *music = MikModMidi::load_midi(filename); if (*music == (AudioTraits::MusicClass*)0L) return; + *state = *music->get_state(); *player = MikModMidiPlayer::get_instance(); *destroy = AudioDestroyMidi; } @@ -39,31 +41,35 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) { } void AudioLoadMidi(AudioTraits::MusicClass** music, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteMusicFunc** destroy, Filename filename) { *music = WinMusic::load_midi(filename); if (*music == (AudioTraits::MusicClass*)0L) return; + *state = *music->get_state(); *player = WinPlayer::get_instance(); *destroy = AudioDestroyMidi; - audio_cat->debug() << "sanity check: music = " << (void*)*music - << " player = " << (void*)*player << " destroy = " - << (void*)*destroy << endl; } + #else /* AUDIO_USE_WIN32 */ #ifdef AUDIO_USE_LINUX +#include "audio_linux_traits.h" + void AudioDestroyMidi(AudioTraits::MusicClass* music) { - delete music; + LinuxMusic::destroy(music); } void AudioLoadMidi(AudioTraits::MusicClass** music, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteMusicFunc** destroy, Filename) { audio_cat->warning() << "linux doesn't support reading midi data yet" << endl; *music = (AudioTraits::MusicClass*)0L; + *state = (AudioTraits::PlayingClass*)0L; *player = (AudioTraits::PlayerClass*)0L; *destroy = AudioDestroyMidi; } @@ -80,9 +86,11 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) { } void AudioLoadMidi(AudioTraits::MusicClass** music, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteMusicFunc** destroy, Filename) { *music = new NullMusic(); + *state = new NullPlaying(); *player = new NullPlayer(); *destroy = AudioDestroyMidi; } diff --git a/panda/src/audiotraits/audio_load_st.cxx b/panda/src/audiotraits/audio_load_st.cxx index 0c347836eb..4ad21ae1b1 100644 --- a/panda/src/audiotraits/audio_load_st.cxx +++ b/panda/src/audiotraits/audio_load_st.cxx @@ -386,11 +386,13 @@ void AudioDestroySt(AudioTraits::SampleClass* sample) { } void AudioLoadSt(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename) { audio_cat->warning() << "MikMod doesn't support reading raw data yet" << endl; *sample = (AudioTraits::SampleClass*)0L; + *state = (AudioTraits::PlayingClass*)0L; *player = (AudioTraits::PlayerClass*)0L; *destroy = AudioDestroySt; } @@ -402,10 +404,11 @@ void AudioLoadSt(AudioTraits::SampleClass** sample, #include "audio_win_traits.h" void AudioDestroySt(AudioTraits::SampleClass* sample) { - delete sample; + WinSample::destroy(sample); } void AudioLoadSt(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename filename) { #ifdef HAVE_SOXST @@ -414,11 +417,13 @@ void AudioLoadSt(AudioTraits::SampleClass** sample, read_file(filename, &buf, len); if (buf != (unsigned char*)0L) { *sample = WinSample::load_raw(buf, len); + *state = ((WinSample*)(*sample))->get_state(); *player = WinPlayer::get_instance(); *destroy = AudioDestroySt; } #else /* HAVE_SOXST */ *sample = (AudioTraits::SampleClass*)0L; + *state = (AudioTraits::PlayingClass*)0L; *player = (AudioTraits::PlayerClass*)0L; *destroy = AudioDestroySt; #endif /* HAVE_SOXST */ @@ -431,10 +436,11 @@ void AudioLoadSt(AudioTraits::SampleClass** sample, #include "audio_linux_traits.h" void AudioDestroySt(AudioTraits::SampleClass* sample) { - delete sample; + LinuxSample::destroy(sample); } void AudioLoadSt(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename filename) { #ifdef HAVE_SOXST @@ -443,11 +449,13 @@ void AudioLoadSt(AudioTraits::SampleClass** sample, read_file(filename, &buf, len); if (buf != (byte*)0L) { *sample = LinuxSample::load_raw(buf, len); + *state = ((LinuxSample*)(*sample))->get_state(); *player = LinuxPlayer::get_instance(); *destroy = AudioDestroySt; } #else /* HAVE_SOXST */ *sample = (AudioTraits::SampleClass*)0L; + *state = (AudioTraits::PlayingClass*)0L; *player = (AudioTraits::PlayerClass*)0L; *destroy = AudioDestroySt; #endif /* HAVE_SOXST */ @@ -465,9 +473,11 @@ void AudioDestroySt(AudioTraits::SampleClass* sample) { } void AudioLoadSt(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename) { *sample = new NullSample(); + *state = new NullPlaying(); *player = new NullPlayer(); *destroy = AudioDestroySt; } diff --git a/panda/src/audiotraits/audio_load_wav.cxx b/panda/src/audiotraits/audio_load_wav.cxx index b528cf2022..7dba572e7f 100644 --- a/panda/src/audiotraits/audio_load_wav.cxx +++ b/panda/src/audiotraits/audio_load_wav.cxx @@ -20,11 +20,13 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) { } void AudioLoadWav(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename filename) { *sample = MikModSample::load_wav(filename); if (*sample == (AudioTraits::SampleClass*)0L) return; + *state = *sample->get_state(); *player = MikModSamplePlayer::get_instance(); *destroy = AudioDestroyWav; } @@ -40,11 +42,13 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) { } void AudioLoadWav(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename filename) { *sample = WinSample::load_wav(filename); if (*sample == (AudioTraits::SampleClass*)0L) return; + *state = *sample->get_state(); *player = WinPlayer::get_instance(); *destroy = AudioDestroyWav; } @@ -53,14 +57,20 @@ void AudioLoadWav(AudioTraits::SampleClass** sample, #ifdef AUDIO_USE_LINUX +#include "audio_linux_traits.h" + void AudioDestroyWav(AudioTraits::SampleClass* sample) { - delete sample; + LinuxSample::destroy(sample); } void AudioLoadWav(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename) { + audio_cat->error() << "Linux driver does not natively support WAV." + << " Try the 'st' loader." << endl; *sample = (AudioTraits::SampleClass*)0L; + *state = (AudioTraits::PlayingClass*)0L; *player = (AudioTraits::PlayerClass*)0L; *destroy = AudioDestroyWav; } @@ -77,11 +87,11 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) { } void AudioLoadWav(AudioTraits::SampleClass** sample, + AudioTraits::PlayingClass** state, AudioTraits::PlayerClass** player, AudioTraits::DeleteSampleFunc** destroy, Filename) { - audio_cat->error() << "Linux driver does not natively support WAV." - << " Try the 'st' loader." << endl; *sample = new NullSample(); + *state = new NullPlaying(); *player = new NullPlayer(); *destroy = AudioDestroyWav; }