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) {
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;
}
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) {

View File

@ -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 {

View File

@ -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;

View File

@ -14,6 +14,8 @@
#include <filename.h>
#include <mikmod.h>
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);

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;
}
NullPlaying::~NullPlaying(void) {
}
NullPlayer::~NullPlayer(void) {
}

View File

@ -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);

View File

@ -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;
}

View File

@ -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);

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

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) {
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) {

View File

@ -16,6 +16,8 @@
#include <dsound.h>
#include <dmusici.h>
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);

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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;
}