This commit is contained in:
Cary Sandvig 2001-03-06 04:37:14 +00:00
parent bf0c865d0b
commit fe6ae687a2
14 changed files with 59 additions and 150 deletions

View File

@ -270,24 +270,10 @@ AudioTraits::PlayerClass* LinuxSample::get_player(void) const {
return LinuxSamplePlayer::get_instance();
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc* LinuxSample::get_destroy(void) const {
return LinuxSample::destroy;
}
*/
AudioTraits::DeletePlayingFunc* LinuxSample::get_delstate(void) const {
return LinuxSamplePlaying::destroy;
}
// REFCOUNT
/*
void LinuxSample::destroy(AudioTraits::SoundClass* sound) {
delete sound;
}
*/
LinuxSample* LinuxSample::load_raw(byte* data, unsigned long size) {
LinuxSample* ret = new LinuxSample(data, size);
return ret;
@ -308,24 +294,10 @@ AudioTraits::PlayerClass* LinuxMusic::get_player(void) const {
return LinuxMusicPlayer::get_instance();
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc* LinuxMusic::get_destroy(void) const {
return LinuxMusic::destroy;
}
*/
AudioTraits::DeletePlayingFunc* LinuxMusic::get_delstate(void) const {
return LinuxMusicPlaying::destroy;
}
// REFCOUNT
/*
void LinuxMusic::destroy(AudioTraits::SoundClass* music) {
delete music;
}
*/
LinuxSamplePlaying::~LinuxSamplePlaying(void) {
}
@ -358,9 +330,18 @@ LinuxSamplePlayer::~LinuxSamplePlayer(void) {
}
void LinuxSamplePlayer::play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass* playing) {
AudioTraits::PlayingClass* playing,
float start_time) {
initialize();
LinuxSamplePlaying* lplaying = (LinuxSamplePlaying*)playing;
unsigned long l = lplaying->get_data()->get_size();
float factor = ((float)l) / (audio_mix_freq * 2. * sample_size);
factor = start_time / factor;
if (factor > 1.)
factor = 1.;
unsigned long p = (unsigned long)(l * factor);
p = ( p >> 2 ) << 2; // zero the last 2 bits
lplaying->get_data()->reset(p);
buffers.insert(lplaying->get_data());
}
@ -387,7 +368,7 @@ LinuxMusicPlayer::~LinuxMusicPlayer(void) {
}
void LinuxMusicPlayer::play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
AudioTraits::PlayingClass*, float) {
initialize();
}

View File

@ -51,9 +51,9 @@ public:
INLINE unsigned long get_size(void) const {
return _size;
}
INLINE void reset(void) {
INLINE void reset(unsigned long p = 0) {
_done = false;
_pos = 0;
_pos = p;
}
};
@ -70,9 +70,6 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
// static void destroy(AudioTraits::SoundClass*);
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
public:
// used by the loader
@ -90,9 +87,6 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
// static void destroy(AudioTraits::SoundClass*);
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
};
@ -123,7 +117,7 @@ public:
virtual ~LinuxSamplePlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);
@ -140,7 +134,7 @@ public:
virtual ~LinuxMusicPlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);

View File

@ -8,9 +8,9 @@
// Access: Public, Static
// Description: Play some audio
////////////////////////////////////////////////////////////////////
INLINE void AudioManager::play(AudioSound* sound) {
INLINE void AudioManager::play(AudioSound* sound, float start_time) {
if (audio_is_active)
get_ptr()->ns_play(sound);
get_ptr()->ns_play(sound, start_time);
}
////////////////////////////////////////////////////////////////////

View File

@ -84,10 +84,11 @@ AudioManager* AudioManager::get_ptr(void) {
// Access: Private
// Description: get the player off the sound, and start it playing
////////////////////////////////////////////////////////////////////
void AudioManager::ns_play(AudioSound* sound) {
void AudioManager::ns_play(AudioSound* sound, float start_time) {
if (sound->status() == AudioSound::PLAYING)
this->ns_stop(sound);
sound->get_player()->play_sound(sound->get_sound(), sound->get_state());
sound->get_player()->play_sound(sound->get_sound(), sound->get_state(),
start_time);
}
////////////////////////////////////////////////////////////////////

View File

@ -18,7 +18,7 @@ class EXPCL_PANDA AudioManager {
private:
INLINE AudioManager(void);
void ns_play(AudioSound*);
void ns_play(AudioSound*, float);
void ns_stop(AudioSound*);
void ns_set_loop(AudioSound*, bool);
bool ns_get_loop(AudioSound*);
@ -47,7 +47,7 @@ public:
static void set_shutdown_func(ShutdownFunc*);
PUBLISHED:
INLINE static void play(AudioSound*);
INLINE static void play(AudioSound*, float = 0.);
INLINE static void stop(AudioSound*);
INLINE static void set_loop(AudioSound*, bool);
INLINE static bool get_loop(AudioSound*);

View File

@ -145,13 +145,6 @@ AudioTraits::PlayerClass* MikModSample::get_player(void) const {
return MikModSamplePlayer::get_instance();
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc* MikModSample::get_destroy(void) const {
return MikModSample::destroy;
}
*/
AudioTraits::DeletePlayingFunc* MikModSample::get_delstate(void) const {
return MikModSamplePlaying::destroy;
}
@ -167,13 +160,6 @@ MikModSample* MikModSample::load_wav(Filename filename) {
return new MikModSample(sample);
}
// REFCOUNT
/*
void MikModSample::destroy(AudioTraits::SoundClass* sample) {
delete sample;
}
*/
SAMPLE* MikModSample::get_sample(void) {
return _sample;
}
@ -200,24 +186,10 @@ AudioTraits::PlayerClass* MikModMusic::get_player(void) const {
return MikModFmsynthPlayer::get_instance();
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc* MikModMusic::get_destroy(void) const {
return MikModMusic::destroy;
}
*/
AudioTraits::DeletePlayingFunc* MikModMusic::get_delstate(void) const {
return MikModMusicPlaying::destroy;
}
// REFCOUNT
/*
void MikModMusic::destroy(AudioTraits::SoundClass* music) {
delete music;
}
*/
MikModMidi::MikModMidi(void) {
}
@ -241,24 +213,10 @@ AudioTraits::PlayerClass* MikModMidi::get_player(void) const {
return MikModMidiPlayer::get_instance();
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc* MikModMidi::get_destroy(void) const {
return MikModMidi::destroy;
}
*/
AudioTraits::DeletePlayingFunc* MikModMidi::get_delstate(void) const {
return MikModMidiPlaying::destroy;
}
// REFCOUNT
/*
void MikModMidi::destroy(AudioTraits::SoundClass* music) {
delete music;
}
*/
MikModSamplePlaying::MikModSamplePlaying(AudioTraits::SoundClass* s)
: AudioTraits::PlayingClass(s) {
}
@ -322,7 +280,8 @@ MikModSamplePlayer::~MikModSamplePlayer(void) {
}
void MikModSamplePlayer::play_sound(AudioTraits::SoundClass* sample,
AudioTraits::PlayingClass* playing) {
AudioTraits::PlayingClass* playing,
float) {
if (!have_initialized)
initialize();
if (!MikMod_Active()) {
@ -372,7 +331,7 @@ MikModFmsynthPlayer::~MikModFmsynthPlayer(void) {
}
void MikModFmsynthPlayer::play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
AudioTraits::PlayingClass*, float) {
audio_cat->error() << "trying to play a sample with a MikModFmsynthPlayer"
<< endl;
}
@ -401,7 +360,7 @@ MikModMidiPlayer::~MikModMidiPlayer(void) {
}
void MikModMidiPlayer::play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
AudioTraits::PlayingClass*, float) {
audio_cat->error() << "trying to play a sample with a MikModMidiPlayer"
<< endl;
}

View File

@ -27,14 +27,10 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
public:
// used by the readers
static MikModSample* load_wav(Filename);
// REFCOUNT
// static void destroy(AudioTraits::SoundClass*);
// used by the players
virtual SAMPLE* get_sample(void);
virtual int get_freq(void);
@ -50,9 +46,6 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
// static void destroy(AudioTraits::SoundClass*);
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
};
@ -65,9 +58,6 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
// static void destroy(AudioTraits::SoundClass*);
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
public:
// used by the readers
@ -112,7 +102,7 @@ public:
virtual ~MikModSamplePlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);
@ -129,7 +119,7 @@ public:
virtual ~MikModFmsynthPlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);
@ -146,7 +136,7 @@ public:
virtual ~MikModMidiPlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);

View File

@ -41,24 +41,11 @@ AudioTraits::PlayerClass* NullSound::get_player(void) const {
return new NullPlayer();
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc* NullSound::get_destroy(void) const {
return NullSound::destroy;
}
*/
AudioTraits::DeletePlayingFunc* NullSound::get_delstate(void) const {
return NullPlaying::destroy;
}
// REFCOUNT
/*
void NullSound::destroy(AudioTraits::SoundClass* sound) {
delete sound;
}
*/
NullPlaying::~NullPlaying(void) {
}
@ -76,7 +63,7 @@ NullPlayer::~NullPlayer(void) {
}
void NullPlayer::play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
AudioTraits::PlayingClass*, float) {
if (audio_cat->is_debug())
audio_cat->debug() << "in play sound in Null audio driver" << endl;
}

View File

@ -21,9 +21,6 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
// static void destroy(AudioTraits::SoundClass*);
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
};
@ -42,7 +39,7 @@ public:
virtual ~NullPlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);

View File

@ -24,15 +24,6 @@ AudioTraits::PlayerClass* AudioTraits::SoundClass::get_player(void) const {
return (AudioTraits::PlayerClass*)0L;
}
// REFCOUNT
/*
AudioTraits::DeleteSoundFunc*
AudioTraits::SoundClass::get_destroy(void) const {
audio_cat->error() << "In abstract SoundClass::get_destroy!" << endl;
return (AudioTraits::DeleteSoundFunc*)0L;
}
*/
AudioTraits::DeletePlayingFunc*
AudioTraits::SoundClass::get_delstate(void) const {
audio_cat->error() << "In abstract SoundClass::get_delstate!" << endl;
@ -52,7 +43,7 @@ AudioTraits::PlayerClass::~PlayerClass(void) {
}
void AudioTraits::PlayerClass::play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*) {
AudioTraits::PlayingClass*, float) {
audio_cat->error() << "In abstract PlayerClass::play_sound!" << endl;
}

View File

@ -26,8 +26,6 @@ public:
virtual float length(void) const = 0;
virtual PlayingClass* get_state(void) const = 0;
virtual PlayerClass* get_player(void) const = 0;
// REFCOUNT
// virtual DeleteSoundFunc* get_destroy(void) const = 0;
virtual DeletePlayingFunc* get_delstate(void) const = 0;
};
class EXPCL_PANDA PlayingClass {
@ -46,7 +44,7 @@ public:
PlayerClass(void) {}
virtual ~PlayerClass(void);
virtual void play_sound(SoundClass*, PlayingClass*) = 0;
virtual void play_sound(SoundClass*, PlayingClass*, float) = 0;
virtual void stop_sound(SoundClass*, PlayingClass*) = 0;
virtual void set_volume(PlayingClass*, float) = 0;
};

View File

@ -7,6 +7,14 @@ INLINE WinSample::WinSample(void) : AudioTraits::SoundClass(), _data(NULL),
_len(0) {
}
INLINE DWORD WinSample::get_length(void) const {
return _len;
}
INLINE WAVEFORMATEX WinSample::get_format(void) const {
return _info;
}
INLINE WinMusic::WinMusic(void) : AudioTraits::SoundClass(),
_performance(NULL), _music(NULL),
_buffer(NULL), _synth(NULL) {

View File

@ -183,10 +183,9 @@ WinSample::~WinSample(void) {
}
float WinSample::length(void) const {
// DO THIS
if (audio_cat->is_debug())
audio_cat->debug() << "winsample length called" << endl;
return 0.;
return _len / (audio_mix_freq * 2. * 2.);
}
AudioTraits::PlayingClass* WinSample::get_state(void) const {
@ -801,7 +800,7 @@ WinSamplePlayer::~WinSamplePlayer(void) {
}
void WinSamplePlayer::play_sound(AudioTraits::SoundClass* sample,
AudioTraits::PlayingClass* play) {
AudioTraits::PlayingClass* play, float start_time) {
if (audio_cat->is_debug())
audio_cat->debug() << "in winsampleplayer play_sound" << endl;
initialize();
@ -812,6 +811,15 @@ void WinSamplePlayer::play_sound(AudioTraits::SoundClass* sample,
LPDIRECTSOUNDBUFFER chan = wplay->get_channel();
if (chan) {
chan->Stop();
DWORD l = wsample->get_length();
WAVEFORMATEX f = wsample->get_format();
float factor = ((float)l) / wsample->get_format().nAvgBytesPerSec;
factor = start_time / factor;
if (factor > 1.)
factor = 1.;
DWORD p = (DWORD)(l * factor);
p = (p >> 2) << 2; // zero the last 2 bits
chan->SetCurrentPosition(p);
HRESULT result = chan->Play(0, 0, 0);
if (FAILED(result))
audio_cat->error() << "sample play failed" << endl;
@ -864,7 +872,7 @@ WinMusicPlayer::~WinMusicPlayer(void) {
}
void WinMusicPlayer::play_sound(AudioTraits::SoundClass* music,
AudioTraits::PlayingClass*) {
AudioTraits::PlayingClass*, float) {
if (audio_cat->is_debug())
audio_cat->debug() << "in WinMusicPlayer::play_sound()" << endl;
initialize();

View File

@ -30,14 +30,14 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
// used by play_sound
INLINE DWORD get_length(void) const;
INLINE WAVEFORMATEX get_format(void) const;
public:
static WinSample* load_wav(Filename);
static WinSample* load_raw(unsigned char*, unsigned long);
// REFCOUNT
// static void destroy(AudioTraits::SoundClass*);
};
class EXPCL_PANDA WinMusic : public AudioTraits::SoundClass {
@ -46,8 +46,6 @@ private:
IDirectMusicSegment* _music;
IDirectSoundBuffer* _buffer;
IDirectMusicPort* _synth;
// BYTE* _data;
// DWORD _len;
void init(void);
public:
@ -57,9 +55,6 @@ public:
virtual float length(void) const;
virtual AudioTraits::PlayingClass* get_state(void) const;
virtual AudioTraits::PlayerClass* get_player(void) const;
// REFCOUNT
// virtual AudioTraits::DeleteSoundFunc* get_destroy(void) const;
// static void destroy(AudioTraits::SoundClass*);
virtual AudioTraits::DeletePlayingFunc* get_delstate(void) const;
// these are used by the loaders
static WinMusic* load_midi(Filename);
@ -101,7 +96,7 @@ public:
virtual ~WinSamplePlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);
@ -118,7 +113,7 @@ public:
virtual ~WinMusicPlayer(void);
virtual void play_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
AudioTraits::PlayingClass*, float);
virtual void stop_sound(AudioTraits::SoundClass*,
AudioTraits::PlayingClass*);
virtual void set_volume(AudioTraits::PlayingClass*, float);