split out loaders

This commit is contained in:
Cary Sandvig 2000-10-06 22:47:27 +00:00
parent 6954fcd070
commit 9ecc3312b8
15 changed files with 86 additions and 36 deletions

View File

@ -15,7 +15,8 @@
gsgmisc light linmath mathutil net pnm \ gsgmisc light linmath mathutil net pnm \
pnmimagetypes pnmimage sgattrib sgmanip sgraph sgraphutil \ pnmimagetypes pnmimage sgattrib sgmanip sgraph sgraphutil \
switchnode text tform tiff lerp loader putil effects \ 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 LOCAL_LIBS downloader event ipc express pandabase
#define OTHER_LIBS dtool #define OTHER_LIBS dtool

View File

@ -29,6 +29,7 @@
#begin lib_target #begin lib_target
#define TARGET audio_load_midi #define TARGET audio_load_midi
#define BUILDING_DLL BUILDING_MISC
#define LOCAL_LIBS \ #define LOCAL_LIBS \
audio audio
@ -39,6 +40,7 @@
#begin lib_target #begin lib_target
#define TARGET audio_load_wav #define TARGET audio_load_wav
#define BUILDING_DLL BUILDING_MISC
#define LOCAL_LIBS \ #define LOCAL_LIBS \
audio audio
@ -49,6 +51,7 @@
#begin lib_target #begin lib_target
#define TARGET audio_load_st #define TARGET audio_load_st
#define BUILDING_DLL BUILDING_MISC
#define USE_SOXST yes #define USE_SOXST yes
#define LOCAL_LIBS \ #define LOCAL_LIBS \
audio audio

View File

@ -188,7 +188,7 @@ static void internal_update(void*) {
} }
while (1) { while (1) {
if (have_buffers == 0) { if (have_buffers == 0) {
ipc_traits::sleep(0, 10000); ipc_traits::sleep(0, audio_auto_update_delay);
} else { } else {
write(output_fd, current_buffer, audio_buffer_size); 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) { 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) { LinuxMusic::~LinuxMusic(void) {

View File

@ -62,7 +62,7 @@ void AudioManager::ns_play(AudioMusic* music) {
void AudioManager::spawned_update(void*) { void AudioManager::spawned_update(void*) {
while (1) { while (1) {
AudioManager::update(); AudioManager::update();
ipc_traits::sleep(0, 1000000); ipc_traits::sleep(0, audio_auto_update_delay);
} }
} }

View File

@ -9,12 +9,14 @@
// Description: initialize a new music // Description: initialize a new music
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE AudioMusic::AudioMusic(AudioTraits::MusicClass* music, INLINE AudioMusic::AudioMusic(AudioTraits::MusicClass* music,
AudioTraits::PlayerClass* player, AudioTraits::PlayingClass* state,
AudioTraits::DeleteMusicFunc* destroy, AudioTraits::PlayerClass* player,
const string& filename) : Namable(filename), AudioTraits::DeleteMusicFunc* destroy,
_music(music), const string& filename) : Namable(filename),
_player(player), _music(music),
_destroy(destroy) {} _state(state),
_player(player),
_destroy(destroy) {}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: AudioMusic::copy constructor // 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 // Description: copy a music, but we don't really want to allow this
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE AudioMusic::AudioMusic(const AudioMusic& c) : Namable(c.get_name()), INLINE AudioMusic::AudioMusic(const AudioMusic& c) : Namable(c.get_name()),
_music(c._music), _music(c._music),
_player(c._player), _state(c._state),
_destroy(c._destroy) {} _player(c._player),
_destroy(c._destroy) {}
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
// Function: AudioMusic::assignment operator // 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) { INLINE AudioMusic& AudioMusic::operator=(const AudioMusic& c) {
this->set_name(c.get_name()); this->set_name(c.get_name());
this->_music = c._music; this->_music = c._music;
this->_state = c._state;
this->_player = c._player; this->_player = c._player;
this->_destroy = c._destroy; this->_destroy = c._destroy;
return *this; return *this;

View File

@ -24,13 +24,19 @@ AudioMusic::~AudioMusic(void) {
// Description: return the current play status of this music // Description: return the current play status of this music
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
AudioMusic::MusicStatus AudioMusic::status(void) { AudioMusic::MusicStatus AudioMusic::status(void) {
// AudioTraits::PlayingClass::PlayingStatus stat = _state->status();
AudioTraits::MusicClass::MusicStatus stat = _music->status(); AudioTraits::MusicClass::MusicStatus stat = _music->status();
switch (stat) { switch (stat) {
// case AudioTraits::PlayingClass::BAD:
case AudioTraits::MusicClass::BAD:
return BAD;
// case AudioTraits::PlayingClass::READY:
case AudioTraits::MusicClass::READY: case AudioTraits::MusicClass::READY:
return READY; return READY;
// case AudioTraits::PlayingClass::PLAYING:
case AudioTraits::MusicClass::PLAYING: case AudioTraits::MusicClass::PLAYING:
return PLAYING; return PLAYING;
} }
audio_cat->error() << "unknown status for music" << endl; audio_cat->error() << "unknown status for music" << endl;
return READY; return BAD;
} }

View File

@ -16,11 +16,13 @@ class AudioManager;
class EXPCL_PANDA AudioMusic : public TypedReferenceCount, public Namable { class EXPCL_PANDA AudioMusic : public TypedReferenceCount, public Namable {
private: private:
AudioTraits::MusicClass *_music; AudioTraits::MusicClass *_music;
AudioTraits::PlayingClass *_state;
AudioTraits::PlayerClass *_player; AudioTraits::PlayerClass *_player;
AudioTraits::DeleteMusicFunc *_destroy; AudioTraits::DeleteMusicFunc *_destroy;
protected: protected:
INLINE AudioMusic(AudioTraits::MusicClass*, AudioTraits::PlayerClass*, INLINE AudioMusic(AudioTraits::MusicClass*, AudioTraits::PlayingClass*,
AudioTraits::DeleteMusicFunc*, const string&); AudioTraits::PlayerClass*, AudioTraits::DeleteMusicFunc*,
const string&);
INLINE AudioMusic(const AudioMusic&); INLINE AudioMusic(const AudioMusic&);
INLINE AudioMusic& operator=(const AudioMusic&); INLINE AudioMusic& operator=(const AudioMusic&);
@ -33,7 +35,7 @@ public:
virtual ~AudioMusic(void); virtual ~AudioMusic(void);
INLINE bool operator==(const AudioMusic&) const; INLINE bool operator==(const AudioMusic&) const;
enum MusicStatus { READY, PLAYING }; enum MusicStatus { BAD, READY, PLAYING };
MusicStatus status(void); MusicStatus status(void);
public: public:

View File

@ -96,8 +96,9 @@ AudioSample* AudioPool::ns_load_sample(Filename filename) {
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, player, destroy, PT(AudioSample) the_sample = new AudioSample(sample,
filename); (AudioTraits::PlayingClass*)0L,
player, destroy, filename);
_samples[filename] = the_sample; _samples[filename] = the_sample;
return the_sample; return the_sample;
} }
@ -195,7 +196,9 @@ AudioMusic* AudioPool::ns_load_music(Filename filename) {
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, player, destroy, filename); PT(AudioMusic) the_music = new AudioMusic(music,
(AudioTraits::PlayingClass*)0L,
player, destroy, filename);
_music[filename] = the_music; _music[filename] = the_music;
return the_music; return the_music;
} }

View File

@ -9,10 +9,12 @@
// Description: initialize a new sample // Description: initialize a new sample
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE AudioSample::AudioSample(AudioTraits::SampleClass* sample, INLINE AudioSample::AudioSample(AudioTraits::SampleClass* sample,
AudioTraits::PlayingClass* state,
AudioTraits::PlayerClass* player, AudioTraits::PlayerClass* player,
AudioTraits::DeleteSampleFunc* destroy, AudioTraits::DeleteSampleFunc* destroy,
const string& filename) : Namable(filename), const string& filename) : Namable(filename),
_sample(sample), _sample(sample),
_state(state),
_player(player), _player(player),
_destroy(destroy) {} _destroy(destroy) {}
@ -23,6 +25,7 @@ INLINE AudioSample::AudioSample(AudioTraits::SampleClass* sample,
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
INLINE AudioSample::AudioSample(const AudioSample& c) : Namable(c.get_name()), INLINE AudioSample::AudioSample(const AudioSample& c) : Namable(c.get_name()),
_sample(c._sample), _sample(c._sample),
_state(c._state),
_player(c._player), _player(c._player),
_destroy(c._destroy) {} _destroy(c._destroy) {}
@ -34,6 +37,7 @@ INLINE AudioSample::AudioSample(const AudioSample& c) : Namable(c.get_name()),
INLINE AudioSample& AudioSample::operator=(const AudioSample& c) { INLINE AudioSample& AudioSample::operator=(const AudioSample& c) {
this->set_name(c.get_name()); this->set_name(c.get_name());
this->_sample = c._sample; this->_sample = c._sample;
this->_state = c._state;
this->_player = c._player; this->_player = c._player;
this->_destroy = c._destroy; this->_destroy = c._destroy;
return *this; return *this;

View File

@ -33,13 +33,19 @@ float AudioSample::length(void) {
// Description: return the current play status of this sample // Description: return the current play status of this sample
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
AudioSample::SampleStatus AudioSample::status(void) { AudioSample::SampleStatus AudioSample::status(void) {
// AudioTraits::PlayingClass::PlayingStatus stat = _state->status();
AudioTraits::SampleClass::SampleStatus stat = _sample->status(); AudioTraits::SampleClass::SampleStatus stat = _sample->status();
switch (stat) { switch (stat) {
// case AudioTraits::PlayingClass::BAD:
case AudioTraits::SampleClass::BAD:
return BAD;
// case AudioTraits::PlayingClass::READY:
case AudioTraits::SampleClass::READY: case AudioTraits::SampleClass::READY:
return READY; return READY;
// case AudioTraits::PlayingClass::PLAYING:
case AudioTraits::SampleClass::PLAYING: case AudioTraits::SampleClass::PLAYING:
return PLAYING; return PLAYING;
} }
audio_cat->error() << "unknown status for sample" << endl; audio_cat->error() << "unknown status for sample" << endl;
return READY; return BAD;
} }

View File

@ -16,11 +16,13 @@ class AudioManager;
class EXPCL_PANDA AudioSample : public TypedReferenceCount, public Namable { class EXPCL_PANDA AudioSample : public TypedReferenceCount, public Namable {
private: private:
AudioTraits::SampleClass *_sample; AudioTraits::SampleClass *_sample;
AudioTraits::PlayingClass *_state;
AudioTraits::PlayerClass *_player; AudioTraits::PlayerClass *_player;
AudioTraits::DeleteSampleFunc *_destroy; AudioTraits::DeleteSampleFunc *_destroy;
protected: protected:
INLINE AudioSample(AudioTraits::SampleClass*, AudioTraits::PlayerClass*, INLINE AudioSample(AudioTraits::SampleClass*, AudioTraits::PlayingClass*,
AudioTraits::DeleteSampleFunc*, const string&); AudioTraits::PlayerClass*, AudioTraits::DeleteSampleFunc*,
const string&);
INLINE AudioSample(const AudioSample&); INLINE AudioSample(const AudioSample&);
INLINE AudioSample& operator=(const AudioSample&); INLINE AudioSample& operator=(const AudioSample&);
@ -33,7 +35,7 @@ public:
virtual ~AudioSample(void); virtual ~AudioSample(void);
INLINE bool operator==(const AudioSample&) const; INLINE bool operator==(const AudioSample&) const;
enum SampleStatus { READY, PLAYING } ; enum SampleStatus { BAD, READY, PLAYING } ;
float length(void); float length(void);
SampleStatus status(void); SampleStatus status(void);

View File

@ -27,6 +27,15 @@ AudioTraits::MusicClass::MusicStatus AudioTraits::MusicClass::status(void) {
return READY; 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) { AudioTraits::PlayerClass::~PlayerClass(void) {
} }

View File

@ -21,7 +21,7 @@ public:
SampleClass(void) {} SampleClass(void) {}
virtual ~SampleClass(void); virtual ~SampleClass(void);
enum SampleStatus { READY, PLAYING } ; enum SampleStatus { BAD, READY, PLAYING } ;
virtual float length(void) = 0; virtual float length(void) = 0;
virtual SampleStatus status(void) = 0; virtual SampleStatus status(void) = 0;
@ -31,9 +31,19 @@ public:
MusicClass(void) {} MusicClass(void) {}
virtual ~MusicClass(void); virtual ~MusicClass(void);
enum MusicStatus { READY, PLAYING }; enum MusicStatus { BAD, READY, PLAYING } ;
virtual MusicStatus status(void) = 0; 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 { class EXPCL_PANDA PlayerClass {
public: public:
PlayerClass(void) {} PlayerClass(void) {}
@ -49,18 +59,14 @@ public:
// this is really ugly. But since we have to be able to include/compile // 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 // all of the driver files on any system, I need to centralize a switch
// for which one is real. // 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 #ifdef PENV_LINUX
#define AUDIO_USE_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 #define AUDIO_USE_NULL
#endif /* PENV_LINUX */ #endif
#endif /* PENV_WIN32 */
#endif /* HAVE_MIKMOD */
#endif /* __AUDIO_TRAIT_H__ */ #endif /* __AUDIO_TRAIT_H__ */

View File

@ -20,6 +20,8 @@ int audio_driver_select = config_audio.GetInt("audio-driver-select", 0);
string* audio_driver_params; string* audio_driver_params;
int audio_buffer_size = config_audio.GetInt("audio-buffer-size", 4096); int audio_buffer_size = config_audio.GetInt("audio-buffer-size", 4096);
string* audio_device; string* audio_device;
int audio_auto_update_delay = config_audio.GetInt("audio-auto-update-delay",
100000);
ConfigureFn(config_audio) { ConfigureFn(config_audio) {
AudioSample::init_type(); AudioSample::init_type();

View File

@ -18,5 +18,6 @@ extern int audio_driver_select;
extern string* audio_driver_params; extern string* audio_driver_params;
extern int audio_buffer_size; extern int audio_buffer_size;
extern string* audio_device; extern string* audio_device;
extern int audio_auto_update_delay;
#endif /* __CONFIG_AUDIO_H__ */ #endif /* __CONFIG_AUDIO_H__ */