rev for playing state

This commit is contained in:
Cary Sandvig 2000-10-10 00:00:50 +00:00
parent 6984fca9dd
commit eed2cb7fa5
16 changed files with 160 additions and 27 deletions

View File

@ -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) { INLINE Buffer* LinuxSample::get_data(void) {
return _data; 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() {
} }

View File

@ -243,6 +243,10 @@ AudioTraits::SampleClass::SampleStatus LinuxSample::status(void) {
return AudioTraits::SampleClass::READY; return AudioTraits::SampleClass::READY;
} }
LinuxPlaying* LinuxSample::get_state(void) {
return new LinuxPlaying();
}
void LinuxSample::destroy(AudioTraits::SampleClass* sample) { void LinuxSample::destroy(AudioTraits::SampleClass* sample) {
delete sample; delete sample;
} }
@ -259,6 +263,21 @@ AudioTraits::MusicClass::MusicStatus LinuxMusic::status(void) {
return AudioTraits::MusicClass::READY; 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::_global_instance = (LinuxPlayer*)0L;
LinuxPlayer::~LinuxPlayer(void) { LinuxPlayer::~LinuxPlayer(void) {

View File

@ -57,6 +57,8 @@ public:
} }
}; };
class LinuxPlaying;
class EXPCL_PANDA LinuxSample : public AudioTraits::SampleClass { class EXPCL_PANDA LinuxSample : public AudioTraits::SampleClass {
private: private:
Buffer* _data; Buffer* _data;
@ -67,10 +69,11 @@ public:
virtual float length(void); virtual float length(void);
virtual AudioTraits::SampleClass::SampleStatus status(void); virtual AudioTraits::SampleClass::SampleStatus status(void);
static void destroy(AudioTraits::SampleClass*);
public: public:
// used by the loader // used by the loader
static LinuxSample* load_raw(byte*, unsigned long); static LinuxSample* load_raw(byte*, unsigned long);
virtual LinuxPlaying* get_state(void);
static void destroy(AudioTraits::SampleClass*);
// used by the players // used by the players
INLINE Buffer* get_data(void); INLINE Buffer* get_data(void);
}; };
@ -81,6 +84,17 @@ public:
virtual ~LinuxMusic(void); virtual ~LinuxMusic(void);
virtual AudioTraits::MusicClass::MusicStatus status(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 { class EXPCL_PANDA LinuxPlayer : public AudioTraits::PlayerClass {

View File

@ -156,6 +156,10 @@ MikModSample* MikModSample::load_wav(Filename filename) {
return new MikModSample(sample); return new MikModSample(sample);
} }
MikModPlaying* MikModSample::get_state(void) {
return new MikModPlaying();
}
void MikModSample::destroy(AudioTraits::SampleClass* sample) { void MikModSample::destroy(AudioTraits::SampleClass* sample) {
delete sample; delete sample;
} }
@ -197,6 +201,10 @@ MikModMidi* MikModMidi::load_midi(Filename) {
return new MikModMidi(); return new MikModMidi();
} }
MikModPlaying* MikModMidi::get_state(void) {
return new MikModPlaying();
}
void MikModMidi::destroy(AudioTraits::MusicClass* music) { void MikModMidi::destroy(AudioTraits::MusicClass* music) {
delete music; delete music;
} }
@ -205,6 +213,12 @@ AudioTraits::MusicClass::MusicStatus MikModMidi::status(void) {
return READY; return READY;
} }
MikModPlaying::MikModPlaying(void) : AudioTraits::PlayingClass() {
}
MikModPlaying::~MikModPlaying(void) {
}
MikModSamplePlayer* MikModSamplePlayer::_global_instance = MikModSamplePlayer* MikModSamplePlayer::_global_instance =
(MikModSamplePlayer*)0L; (MikModSamplePlayer*)0L;

View File

@ -14,6 +14,8 @@
#include <filename.h> #include <filename.h>
#include <mikmod.h> #include <mikmod.h>
class MikModPlaying;
class EXPCL_PANDA MikModSample : public AudioTraits::SampleClass { class EXPCL_PANDA MikModSample : public AudioTraits::SampleClass {
private: private:
SAMPLE* _sample; SAMPLE* _sample;
@ -28,6 +30,7 @@ public:
public: public:
// used by the readers // used by the readers
static MikModSample* load_wav(Filename); static MikModSample* load_wav(Filename);
virtual MikModPlaying* get_state(void);
static void destroy(AudioTraits::SampleClass*); static void destroy(AudioTraits::SampleClass*);
// used by the players // used by the players
virtual void set_voice(int); virtual void set_voice(int);
@ -57,8 +60,15 @@ public:
// used by the readers // used by the readers
static MikModMidi* load_midi(Filename); static MikModMidi* load_midi(Filename);
static void destroy(AudioTraits::MusicClass*); 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 { class EXPCL_PANDA MikModSamplePlayer : public AudioTraits::PlayerClass {
public: public:
MikModSamplePlayer(void); MikModSamplePlayer(void);

View File

@ -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() {
} }

View File

@ -48,6 +48,9 @@ AudioTraits::MusicClass::MusicStatus NullMusic::status(void) {
return READY; return READY;
} }
NullPlaying::~NullPlaying(void) {
}
NullPlayer::~NullPlayer(void) { NullPlayer::~NullPlayer(void) {
} }

View File

@ -11,6 +11,8 @@
#ifndef __AUDIO_NULL_TRAITS_H__ #ifndef __AUDIO_NULL_TRAITS_H__
#define __AUDIO_NULL_TRAITS_H__ #define __AUDIO_NULL_TRAITS_H__
class NullPlaying;
class EXPCL_PANDA NullSample : public AudioTraits::SampleClass { class EXPCL_PANDA NullSample : public AudioTraits::SampleClass {
public: public:
INLINE NullSample(void); INLINE NullSample(void);
@ -28,6 +30,12 @@ public:
virtual AudioTraits::MusicClass::MusicStatus status(void); 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 { class EXPCL_PANDA NullPlayer : public AudioTraits::PlayerClass {
public: public:
INLINE NullPlayer(void); INLINE NullPlayer(void);

View File

@ -78,6 +78,7 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) {
} }
audio_cat.info() << "Loading sample " << filename << "\n"; audio_cat.info() << "Loading sample " << filename << "\n";
AudioTraits::SampleClass* sample = (AudioTraits::SampleClass*)0L; AudioTraits::SampleClass* sample = (AudioTraits::SampleClass*)0L;
AudioTraits::PlayingClass* state = (AudioTraits::PlayingClass*)0L;
AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L; AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L;
AudioTraits::DeleteSampleFunc* destroy = (AudioTraits::DeleteSampleFunc*)0L; AudioTraits::DeleteSampleFunc* destroy = (AudioTraits::DeleteSampleFunc*)0L;
string ext = filename.get_extension(); string ext = filename.get_extension();
@ -89,16 +90,16 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) {
<< "'" << endl; << "'" << endl;
return (AudioSample*)0L; return (AudioSample*)0L;
} }
(*((*sli).second))(&sample, &player, &destroy, filename); (*((*sli).second))(&sample, &state, &player, &destroy, filename);
if ((sample == (AudioTraits::SampleClass*)0L) || if ((sample == (AudioTraits::SampleClass*)0L) ||
(state == (AudioTraits::PlayingClass*)0L) ||
(player == (AudioTraits::PlayerClass*)0L) || (player == (AudioTraits::PlayerClass*)0L) ||
(destroy == (AudioTraits::DeleteSampleFunc*)0L)) { (destroy == (AudioTraits::DeleteSampleFunc*)0L)) {
audio_cat->error() << "could not load '" << filename << "'" << endl; audio_cat->error() << "could not load '" << filename << "'" << endl;
return (AudioSample*)0L; return (AudioSample*)0L;
} }
PT(AudioSample) the_sample = new AudioSample(sample, PT(AudioSample) the_sample = new AudioSample(sample, state, player, destroy,
(AudioTraits::PlayingClass*)0L, filename);
player, destroy, filename);
_samples[filename] = the_sample; _samples[filename] = the_sample;
return the_sample; return the_sample;
} }
@ -178,6 +179,7 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) {
} }
audio_cat.info() << "Loading music " << filename << "\n"; audio_cat.info() << "Loading music " << filename << "\n";
AudioTraits::MusicClass* music = (AudioTraits::MusicClass*)0L; AudioTraits::MusicClass* music = (AudioTraits::MusicClass*)0L;
AudioTraits::PlayingClass* state = (AudioTraits::PlayingClass*)0L;
AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L; AudioTraits::PlayerClass* player = (AudioTraits::PlayerClass*)0L;
AudioTraits::DeleteMusicFunc* destroy = (AudioTraits::DeleteMusicFunc*)0L; AudioTraits::DeleteMusicFunc* destroy = (AudioTraits::DeleteMusicFunc*)0L;
string ext = filename.get_extension(); string ext = filename.get_extension();
@ -189,16 +191,16 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) {
<< "'" << endl; << "'" << endl;
return (AudioMusic*)0L; return (AudioMusic*)0L;
} }
(*((*sli).second))(&music, &player, &destroy, filename); (*((*sli).second))(&music, &state, &player, &destroy, filename);
if ((music == (AudioTraits::MusicClass*)0L) || if ((music == (AudioTraits::MusicClass*)0L) ||
(state == (AudioTraits::PlayingClass*)0L) ||
(player == (AudioTraits::PlayerClass*)0L) || (player == (AudioTraits::PlayerClass*)0L) ||
(destroy == (AudioTraits::DeleteMusicFunc*)0L)) { (destroy == (AudioTraits::DeleteMusicFunc*)0L)) {
audio_cat->error() << "could not load '" << filename << "'" << endl; audio_cat->error() << "could not load '" << filename << "'" << endl;
return (AudioMusic*)0L; return (AudioMusic*)0L;
} }
PT(AudioMusic) the_music = new AudioMusic(music, PT(AudioMusic) the_music = new AudioMusic(music, state, player, destroy,
(AudioTraits::PlayingClass*)0L, filename);
player, destroy, filename);
_music[filename] = the_music; _music[filename] = the_music;
return the_music; return the_music;
} }

View File

@ -36,6 +36,7 @@ private:
MusicMap _music; MusicMap _music;
public: public:
typedef void SampleLoadFunc(AudioTraits::SampleClass**, typedef void SampleLoadFunc(AudioTraits::SampleClass**,
AudioTraits::PlayingClass**,
AudioTraits::PlayerClass**, AudioTraits::PlayerClass**,
AudioTraits::DeleteSampleFunc**, Filename); AudioTraits::DeleteSampleFunc**, Filename);
@ -47,6 +48,7 @@ public:
static void register_sample_loader(const string&, SampleLoadFunc*); static void register_sample_loader(const string&, SampleLoadFunc*);
typedef void MusicLoadFunc(AudioTraits::MusicClass**, typedef void MusicLoadFunc(AudioTraits::MusicClass**,
AudioTraits::PlayingClass**,
AudioTraits::PlayerClass**, AudioTraits::PlayerClass**,
AudioTraits::DeleteMusicFunc**, Filename); AudioTraits::DeleteMusicFunc**, Filename);

View File

@ -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) { INLINE LPDIRECTSOUNDBUFFER WinSample::get_channel(void) {
return _channel; 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), _buffer(NULL), _synth(NULL), _data(NULL),
_len(0) { _len(0) {
init(); init();
@ -24,5 +26,8 @@ INLINE IDirectMusicSegment* WinMusic::get_music(void) {
return _music; return _music;
} }
INLINE WinPlayer::WinPlayer(void) { INLINE WinPlaying::WinPlaying(void) : AudioTraits::PlayingClass() {
}
INLINE WinPlayer::WinPlayer(void) : AudioTraits::PlayerClass() {
} }

View File

@ -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) { void WinSample::destroy(AudioTraits::SampleClass* sample) {
delete sample; delete sample;
} }
@ -638,6 +642,10 @@ WinMusic* WinMusic::load_midi(Filename filename) {
return ret; return ret;
} }
WinPlaying* WinMusic::get_state(void) {
return new WinPlaying();
}
void WinMusic::destroy(AudioTraits::MusicClass* music) { void WinMusic::destroy(AudioTraits::MusicClass* music) {
if (audio_cat->is_debug()) if (audio_cat->is_debug())
audio_cat->debug() << "in WinMusic::destroy()" << endl; 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; audio_cat->debug() << "out of WinMusic::destroy()" << endl;
} }
WinPlaying::~WinPlaying(void) {
}
WinPlayer* WinPlayer::_global_instance = (WinPlayer*)0L; WinPlayer* WinPlayer::_global_instance = (WinPlayer*)0L;
WinPlayer::~WinPlayer(void) { WinPlayer::~WinPlayer(void) {

View File

@ -16,6 +16,8 @@
#include <dsound.h> #include <dsound.h>
#include <dmusici.h> #include <dmusici.h>
class WinPlaying;
class EXPCL_PANDA WinSample : public AudioTraits::SampleClass { class EXPCL_PANDA WinSample : public AudioTraits::SampleClass {
private: private:
LPDIRECTSOUNDBUFFER _channel; LPDIRECTSOUNDBUFFER _channel;
@ -33,6 +35,7 @@ public:
void unlock(void); void unlock(void);
static WinSample* load_wav(Filename); static WinSample* load_wav(Filename);
static WinSample* load_raw(unsigned char*, unsigned long); static WinSample* load_raw(unsigned char*, unsigned long);
virtual WinPlaying* get_state(void);
static void destroy(AudioTraits::SampleClass*); static void destroy(AudioTraits::SampleClass*);
// these are used by the player // these are used by the player
INLINE LPDIRECTSOUNDBUFFER get_channel(void); INLINE LPDIRECTSOUNDBUFFER get_channel(void);
@ -55,12 +58,19 @@ public:
virtual AudioTraits::MusicClass::MusicStatus status(void); virtual AudioTraits::MusicClass::MusicStatus status(void);
// these are used by the loaders // these are used by the loaders
static WinMusic* load_midi(Filename); static WinMusic* load_midi(Filename);
virtual WinPlaying* get_state(void);
static void destroy(AudioTraits::MusicClass*); static void destroy(AudioTraits::MusicClass*);
// these are used by the players // these are used by the players
INLINE IDirectMusicPerformance* get_performance(void); INLINE IDirectMusicPerformance* get_performance(void);
INLINE IDirectMusicSegment* get_music(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 { class EXPCL_PANDA WinPlayer : public AudioTraits::PlayerClass {
public: public:
INLINE WinPlayer(void); INLINE WinPlayer(void);

View File

@ -19,11 +19,13 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) {
} }
void AudioLoadMidi(AudioTraits::MusicClass** music, void AudioLoadMidi(AudioTraits::MusicClass** music,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteMusicFunc** destroy, Filename filename) { AudioTraits::DeleteMusicFunc** destroy, Filename filename) {
*music = MikModMidi::load_midi(filename); *music = MikModMidi::load_midi(filename);
if (*music == (AudioTraits::MusicClass*)0L) if (*music == (AudioTraits::MusicClass*)0L)
return; return;
*state = *music->get_state();
*player = MikModMidiPlayer::get_instance(); *player = MikModMidiPlayer::get_instance();
*destroy = AudioDestroyMidi; *destroy = AudioDestroyMidi;
} }
@ -39,31 +41,35 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) {
} }
void AudioLoadMidi(AudioTraits::MusicClass** music, void AudioLoadMidi(AudioTraits::MusicClass** music,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteMusicFunc** destroy, Filename filename) { AudioTraits::DeleteMusicFunc** destroy, Filename filename) {
*music = WinMusic::load_midi(filename); *music = WinMusic::load_midi(filename);
if (*music == (AudioTraits::MusicClass*)0L) if (*music == (AudioTraits::MusicClass*)0L)
return; return;
*state = *music->get_state();
*player = WinPlayer::get_instance(); *player = WinPlayer::get_instance();
*destroy = AudioDestroyMidi; *destroy = AudioDestroyMidi;
audio_cat->debug() << "sanity check: music = " << (void*)*music
<< " player = " << (void*)*player << " destroy = "
<< (void*)*destroy << endl;
} }
#else /* AUDIO_USE_WIN32 */ #else /* AUDIO_USE_WIN32 */
#ifdef AUDIO_USE_LINUX #ifdef AUDIO_USE_LINUX
#include "audio_linux_traits.h"
void AudioDestroyMidi(AudioTraits::MusicClass* music) { void AudioDestroyMidi(AudioTraits::MusicClass* music) {
delete music; LinuxMusic::destroy(music);
} }
void AudioLoadMidi(AudioTraits::MusicClass** music, void AudioLoadMidi(AudioTraits::MusicClass** music,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteMusicFunc** destroy, Filename) { AudioTraits::DeleteMusicFunc** destroy, Filename) {
audio_cat->warning() << "linux doesn't support reading midi data yet" audio_cat->warning() << "linux doesn't support reading midi data yet"
<< endl; << endl;
*music = (AudioTraits::MusicClass*)0L; *music = (AudioTraits::MusicClass*)0L;
*state = (AudioTraits::PlayingClass*)0L;
*player = (AudioTraits::PlayerClass*)0L; *player = (AudioTraits::PlayerClass*)0L;
*destroy = AudioDestroyMidi; *destroy = AudioDestroyMidi;
} }
@ -80,9 +86,11 @@ void AudioDestroyMidi(AudioTraits::MusicClass* music) {
} }
void AudioLoadMidi(AudioTraits::MusicClass** music, void AudioLoadMidi(AudioTraits::MusicClass** music,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteMusicFunc** destroy, Filename) { AudioTraits::DeleteMusicFunc** destroy, Filename) {
*music = new NullMusic(); *music = new NullMusic();
*state = new NullPlaying();
*player = new NullPlayer(); *player = new NullPlayer();
*destroy = AudioDestroyMidi; *destroy = AudioDestroyMidi;
} }

View File

@ -386,11 +386,13 @@ void AudioDestroySt(AudioTraits::SampleClass* sample) {
} }
void AudioLoadSt(AudioTraits::SampleClass** sample, void AudioLoadSt(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename) { AudioTraits::DeleteSampleFunc** destroy, Filename) {
audio_cat->warning() << "MikMod doesn't support reading raw data yet" audio_cat->warning() << "MikMod doesn't support reading raw data yet"
<< endl; << endl;
*sample = (AudioTraits::SampleClass*)0L; *sample = (AudioTraits::SampleClass*)0L;
*state = (AudioTraits::PlayingClass*)0L;
*player = (AudioTraits::PlayerClass*)0L; *player = (AudioTraits::PlayerClass*)0L;
*destroy = AudioDestroySt; *destroy = AudioDestroySt;
} }
@ -402,10 +404,11 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
#include "audio_win_traits.h" #include "audio_win_traits.h"
void AudioDestroySt(AudioTraits::SampleClass* sample) { void AudioDestroySt(AudioTraits::SampleClass* sample) {
delete sample; WinSample::destroy(sample);
} }
void AudioLoadSt(AudioTraits::SampleClass** sample, void AudioLoadSt(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename filename) { AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
#ifdef HAVE_SOXST #ifdef HAVE_SOXST
@ -414,11 +417,13 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
read_file(filename, &buf, len); read_file(filename, &buf, len);
if (buf != (unsigned char*)0L) { if (buf != (unsigned char*)0L) {
*sample = WinSample::load_raw(buf, len); *sample = WinSample::load_raw(buf, len);
*state = ((WinSample*)(*sample))->get_state();
*player = WinPlayer::get_instance(); *player = WinPlayer::get_instance();
*destroy = AudioDestroySt; *destroy = AudioDestroySt;
} }
#else /* HAVE_SOXST */ #else /* HAVE_SOXST */
*sample = (AudioTraits::SampleClass*)0L; *sample = (AudioTraits::SampleClass*)0L;
*state = (AudioTraits::PlayingClass*)0L;
*player = (AudioTraits::PlayerClass*)0L; *player = (AudioTraits::PlayerClass*)0L;
*destroy = AudioDestroySt; *destroy = AudioDestroySt;
#endif /* HAVE_SOXST */ #endif /* HAVE_SOXST */
@ -431,10 +436,11 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
#include "audio_linux_traits.h" #include "audio_linux_traits.h"
void AudioDestroySt(AudioTraits::SampleClass* sample) { void AudioDestroySt(AudioTraits::SampleClass* sample) {
delete sample; LinuxSample::destroy(sample);
} }
void AudioLoadSt(AudioTraits::SampleClass** sample, void AudioLoadSt(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename filename) { AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
#ifdef HAVE_SOXST #ifdef HAVE_SOXST
@ -443,11 +449,13 @@ void AudioLoadSt(AudioTraits::SampleClass** sample,
read_file(filename, &buf, len); read_file(filename, &buf, len);
if (buf != (byte*)0L) { if (buf != (byte*)0L) {
*sample = LinuxSample::load_raw(buf, len); *sample = LinuxSample::load_raw(buf, len);
*state = ((LinuxSample*)(*sample))->get_state();
*player = LinuxPlayer::get_instance(); *player = LinuxPlayer::get_instance();
*destroy = AudioDestroySt; *destroy = AudioDestroySt;
} }
#else /* HAVE_SOXST */ #else /* HAVE_SOXST */
*sample = (AudioTraits::SampleClass*)0L; *sample = (AudioTraits::SampleClass*)0L;
*state = (AudioTraits::PlayingClass*)0L;
*player = (AudioTraits::PlayerClass*)0L; *player = (AudioTraits::PlayerClass*)0L;
*destroy = AudioDestroySt; *destroy = AudioDestroySt;
#endif /* HAVE_SOXST */ #endif /* HAVE_SOXST */
@ -465,9 +473,11 @@ void AudioDestroySt(AudioTraits::SampleClass* sample) {
} }
void AudioLoadSt(AudioTraits::SampleClass** sample, void AudioLoadSt(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename) { AudioTraits::DeleteSampleFunc** destroy, Filename) {
*sample = new NullSample(); *sample = new NullSample();
*state = new NullPlaying();
*player = new NullPlayer(); *player = new NullPlayer();
*destroy = AudioDestroySt; *destroy = AudioDestroySt;
} }

View File

@ -20,11 +20,13 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
} }
void AudioLoadWav(AudioTraits::SampleClass** sample, void AudioLoadWav(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename filename) { AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
*sample = MikModSample::load_wav(filename); *sample = MikModSample::load_wav(filename);
if (*sample == (AudioTraits::SampleClass*)0L) if (*sample == (AudioTraits::SampleClass*)0L)
return; return;
*state = *sample->get_state();
*player = MikModSamplePlayer::get_instance(); *player = MikModSamplePlayer::get_instance();
*destroy = AudioDestroyWav; *destroy = AudioDestroyWav;
} }
@ -40,11 +42,13 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
} }
void AudioLoadWav(AudioTraits::SampleClass** sample, void AudioLoadWav(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename filename) { AudioTraits::DeleteSampleFunc** destroy, Filename filename) {
*sample = WinSample::load_wav(filename); *sample = WinSample::load_wav(filename);
if (*sample == (AudioTraits::SampleClass*)0L) if (*sample == (AudioTraits::SampleClass*)0L)
return; return;
*state = *sample->get_state();
*player = WinPlayer::get_instance(); *player = WinPlayer::get_instance();
*destroy = AudioDestroyWav; *destroy = AudioDestroyWav;
} }
@ -53,14 +57,20 @@ void AudioLoadWav(AudioTraits::SampleClass** sample,
#ifdef AUDIO_USE_LINUX #ifdef AUDIO_USE_LINUX
#include "audio_linux_traits.h"
void AudioDestroyWav(AudioTraits::SampleClass* sample) { void AudioDestroyWav(AudioTraits::SampleClass* sample) {
delete sample; LinuxSample::destroy(sample);
} }
void AudioLoadWav(AudioTraits::SampleClass** sample, void AudioLoadWav(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename) { AudioTraits::DeleteSampleFunc** destroy, Filename) {
audio_cat->error() << "Linux driver does not natively support WAV."
<< " Try the 'st' loader." << endl;
*sample = (AudioTraits::SampleClass*)0L; *sample = (AudioTraits::SampleClass*)0L;
*state = (AudioTraits::PlayingClass*)0L;
*player = (AudioTraits::PlayerClass*)0L; *player = (AudioTraits::PlayerClass*)0L;
*destroy = AudioDestroyWav; *destroy = AudioDestroyWav;
} }
@ -77,11 +87,11 @@ void AudioDestroyWav(AudioTraits::SampleClass* sample) {
} }
void AudioLoadWav(AudioTraits::SampleClass** sample, void AudioLoadWav(AudioTraits::SampleClass** sample,
AudioTraits::PlayingClass** state,
AudioTraits::PlayerClass** player, AudioTraits::PlayerClass** player,
AudioTraits::DeleteSampleFunc** destroy, Filename) { AudioTraits::DeleteSampleFunc** destroy, Filename) {
audio_cat->error() << "Linux driver does not natively support WAV."
<< " Try the 'st' loader." << endl;
*sample = new NullSample(); *sample = new NullSample();
*state = new NullPlaying();
*player = new NullPlayer(); *player = new NullPlayer();
*destroy = AudioDestroyWav; *destroy = AudioDestroyWav;
} }