From e2db8d83492723a4dabbc643d4a1682d0209ef72 Mon Sep 17 00:00:00 2001 From: Dave Schuyler Date: Sat, 7 May 2005 01:13:19 +0000 Subject: [PATCH] set_play_rate --- panda/src/audio/audioSound.h | 5 ++ panda/src/audio/nullAudioManager.cxx | 20 ++++++ panda/src/audio/nullAudioManager.h | 3 + panda/src/audio/nullAudioSound.cxx | 8 +++ panda/src/audio/nullAudioSound.h | 3 + panda/src/audiotraits/milesAudioManager.cxx | 30 +++++++++ panda/src/audiotraits/milesAudioManager.h | 4 ++ panda/src/audiotraits/milesAudioSound.cxx | 67 +++++++++++++++++++++ panda/src/audiotraits/milesAudioSound.h | 7 +++ 9 files changed, 147 insertions(+) diff --git a/panda/src/audio/audioSound.h b/panda/src/audio/audioSound.h index b49a3338a2..70a2ada7be 100644 --- a/panda/src/audio/audioSound.h +++ b/panda/src/audio/audioSound.h @@ -79,6 +79,11 @@ PUBLISHED: // inits to 0.0. virtual void set_balance(float balance_right=0.0) = 0; virtual float get_balance() const = 0; + + // play_rate is any positive float value. + // inits to 1.0. + virtual void set_play_rate(float play_rate=1.0f) = 0; + virtual float get_play_rate() const = 0; // inits to manager's state. virtual void set_active(bool flag=true) = 0; diff --git a/panda/src/audio/nullAudioManager.cxx b/panda/src/audio/nullAudioManager.cxx index d1b4761434..ff3e16b854 100644 --- a/panda/src/audio/nullAudioManager.cxx +++ b/panda/src/audio/nullAudioManager.cxx @@ -127,6 +127,26 @@ get_volume() const { return 0; } +//////////////////////////////////////////////////////////////////// +// Function: NullAudioManager::set_play_rate +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +void NullAudioManager:: +set_play_rate(float) { + // intentionally blank. +} + +//////////////////////////////////////////////////////////////////// +// Function: NullAudioManager::get_play_rate +// Access: Public +// Description: +//////////////////////////////////////////////////////////////////// +float NullAudioManager:: +get_play_rate() const { + return 0; +} + //////////////////////////////////////////////////////////////////// // Function: NullAudioManager::set_active // Access: Public diff --git a/panda/src/audio/nullAudioManager.h b/panda/src/audio/nullAudioManager.h index d969773bd0..8163f9e5f1 100644 --- a/panda/src/audio/nullAudioManager.h +++ b/panda/src/audio/nullAudioManager.h @@ -42,6 +42,9 @@ public: virtual void set_volume(float); virtual float get_volume() const; + + virtual void set_play_rate(float); + virtual float get_play_rate() const; virtual void set_active(bool); virtual bool get_active() const; diff --git a/panda/src/audio/nullAudioSound.cxx b/panda/src/audio/nullAudioSound.cxx index 4bbbd85c5b..556ed698fd 100644 --- a/panda/src/audio/nullAudioSound.cxx +++ b/panda/src/audio/nullAudioSound.cxx @@ -86,6 +86,14 @@ float NullAudioSound::get_balance() const { return 0; } +void NullAudioSound::set_play_rate(float) { + // Intentionally blank. +} + +float NullAudioSound::get_play_rate() const { + return 0; +} + void NullAudioSound::set_active(bool) { // Intentionally blank. } diff --git a/panda/src/audio/nullAudioSound.h b/panda/src/audio/nullAudioSound.h index 56ea9a7fef..95c84951e4 100644 --- a/panda/src/audio/nullAudioSound.h +++ b/panda/src/audio/nullAudioSound.h @@ -51,6 +51,9 @@ public: void set_balance(float); float get_balance() const; + + void set_play_rate(float); + float get_play_rate() const; void set_active(bool); bool get_active() const; diff --git a/panda/src/audiotraits/milesAudioManager.cxx b/panda/src/audiotraits/milesAudioManager.cxx index 478e7fe429..b975cc6712 100644 --- a/panda/src/audiotraits/milesAudioManager.cxx +++ b/panda/src/audiotraits/milesAudioManager.cxx @@ -69,6 +69,7 @@ MilesAudioManager() { _cleanup_required = true; _active = audio_active; _volume = audio_volume; + _play_rate = 1.0f; _cache_limit = audio_cache_limit; _concurrent_sound_limit = 0; _is_valid = true; @@ -531,6 +532,35 @@ get_volume() const { return _volume; } +//////////////////////////////////////////////////////////////////// +// Function: MilesAudioManager::set_play_rate +// Access: Public +// Description: set the overall play rate +//////////////////////////////////////////////////////////////////// +void MilesAudioManager:: +set_play_rate(float play_rate) { + audio_debug("MilesAudioManager::set_play_rate(play_rate="<type) { + case AIL_QUICK_XMIDI_TYPE: + case AIL_QUICK_DLS_XMIDI_TYPE: + return AIL_sequence_tempo((HSEQUENCE)audio->handle); + break; + case AIL_QUICK_DIGITAL_TYPE: + case AIL_QUICK_MPEG_DIGITAL_TYPE: + return AIL_sample_playback_rate((HSAMPLE)audio->handle); + break; + } + } + return 0; + } + + } //////////////////////////////////////////////////////////////////// @@ -171,6 +189,8 @@ MilesAudioSound(MilesAudioManager* manager, <<", sd=0x"<<(void*)sd<<", file_name="<_audio); + _play_rate = 1.0f; + _original_playback_rate = Get_playback_rate(_audio); } //////////////////////////////////////////////////////////////////// @@ -413,6 +433,53 @@ get_volume() const { return _volume; } +//////////////////////////////////////////////////////////////////// +// Function: MilesAudioSound:: +// Access: +// Description: +//////////////////////////////////////////////////////////////////// +void MilesAudioSound:: +set_play_rate(float play_rate) { + miles_audio_debug("set_play_rate(play_rate="<get_play_rate(); + switch (_audio->type) { + case AIL_QUICK_XMIDI_TYPE: + case AIL_QUICK_DLS_XMIDI_TYPE: + // midi uses whole percentage values 100 == 100% + _audio->speed = S32(play_rate*100.0f); + if ((_audio->speed != -1) && (AIL_quick_status(_audio) == QSTAT_PLAYING)) { + AIL_set_sequence_tempo((HSEQUENCE)_audio->handle, _audio->speed, 0); + } + audio_debug(" play_rate for this midi is now "<<_audio->speed); + break; + case AIL_QUICK_DIGITAL_TYPE: + case AIL_QUICK_MPEG_DIGITAL_TYPE: + // wave and mp3 use sample rate (e.g. 44100) + _audio->speed = S32(play_rate*_original_playback_rate); + if ((_audio->speed != -1) && (AIL_quick_status(_audio) == QSTAT_PLAYING)) { + AIL_set_sample_playback_rate((HSAMPLE)_audio->handle, _audio->speed); + } + audio_debug(" play_rate for this wav or mp3 is now "<<_audio->speed); + break; + } + } +} + +//////////////////////////////////////////////////////////////////// +// Function: MilesAudioSound::get_play_rate +// Access: +// Description: +//////////////////////////////////////////////////////////////////// +float MilesAudioSound:: +get_play_rate() const { + miles_audio_debug("get_play_rate() returning "<<_play_rate); + return _play_rate; +} + //////////////////////////////////////////////////////////////////// // Function: MilesAudioSound::set_balance // Access: diff --git a/panda/src/audiotraits/milesAudioSound.h b/panda/src/audiotraits/milesAudioSound.h index e33b30e9d0..58298ee591 100644 --- a/panda/src/audiotraits/milesAudioSound.h +++ b/panda/src/audiotraits/milesAudioSound.h @@ -92,6 +92,11 @@ public: // inits to 0.0. void set_balance(float balance_right=0.0f); float get_balance() const; + + // play_rate is any positive float value. + // inits to 1.0. + void set_play_rate(float play_rate=1.0f); + float get_play_rate() const; // inits to manager's state. void set_active(bool active=true); @@ -121,8 +126,10 @@ private: PT(MilesAudioManager) _manager; float _volume; // 0..1.0 float _balance; // -1..1 + float _play_rate; // 0..1.0 mutable float _length; // in seconds. unsigned long _loop_count; + S32 _original_playback_rate; // This is the string that throw_event() will throw // when the sound finishes playing. It is not triggered