From 4a5db4ca35aa3f4233c9238bf416b4c7e55133ee Mon Sep 17 00:00:00 2001 From: rdb Date: Wed, 11 May 2011 14:12:37 +0000 Subject: [PATCH] patch from Nox_fire(galaxy) --- panda/src/movies/userDataAudio.cxx | 5 ++- panda/src/movies/userDataAudio.h | 10 ++++- panda/src/movies/userDataAudioCursor.cxx | 47 ++++++++++++++++++++++-- panda/src/movies/userDataAudioCursor.h | 2 +- 4 files changed, 55 insertions(+), 9 deletions(-) diff --git a/panda/src/movies/userDataAudio.cxx b/panda/src/movies/userDataAudio.cxx index 168fc28645..49f1347da0 100644 --- a/panda/src/movies/userDataAudio.cxx +++ b/panda/src/movies/userDataAudio.cxx @@ -24,12 +24,13 @@ TypeHandle UserDataAudio::_type_handle; // a means to supply raw audio samples manually. //////////////////////////////////////////////////////////////////// UserDataAudio:: -UserDataAudio(int rate, int channels) : +UserDataAudio(int rate, int channels, bool remove_after_read) : MovieAudio("User Data Audio"), _desired_rate(rate), _desired_channels(channels), _cursor(NULL), - _aborted(false) + _aborted(false), + _remove_after_read(remove_after_read) { } diff --git a/panda/src/movies/userDataAudio.h b/panda/src/movies/userDataAudio.h index fabd3f8aff..1928ea1dfe 100644 --- a/panda/src/movies/userDataAudio.h +++ b/panda/src/movies/userDataAudio.h @@ -25,12 +25,17 @@ class UserDataAudioCursor; //////////////////////////////////////////////////////////////////// // Class : UserDataAudio // Description : A UserDataAudio is a way for the user to manually -// supply raw audio samples. +// supply raw audio samples. remove_after_read means the +// data will be removed if read once. Else data will +// be stored (enable looping and seeking). +// Expects data as 16 bit signed (word); Example for stereo: +// 1.word = 1.channel,2.word = 2.channel, +// 3.word = 1.channel,4.word = 2.channel, etc. //////////////////////////////////////////////////////////////////// class EXPCL_PANDA_MOVIES UserDataAudio : public MovieAudio { PUBLISHED: - UserDataAudio(int rate, int channels); + UserDataAudio(int rate, int channels, bool remove_after_read=true); virtual ~UserDataAudio(); virtual PT(MovieAudioCursor) open(); @@ -47,6 +52,7 @@ class EXPCL_PANDA_MOVIES UserDataAudio : public MovieAudio { UserDataAudioCursor *_cursor; pdeque _data; bool _aborted; + bool _remove_after_read; friend class UserDataAudioCursor; public: diff --git a/panda/src/movies/userDataAudioCursor.cxx b/panda/src/movies/userDataAudioCursor.cxx index 72ef9a7788..e9e23fe08b 100644 --- a/panda/src/movies/userDataAudioCursor.cxx +++ b/panda/src/movies/userDataAudioCursor.cxx @@ -27,9 +27,13 @@ UserDataAudioCursor(UserDataAudio *src) : { _audio_rate = src->_desired_rate; _audio_channels = src->_desired_channels; - _can_seek = false; - _can_seek_fast = false; + _can_seek = !src->_remove_after_read; + _can_seek_fast = !src->_remove_after_read; _aborted = false; + if(!src->_remove_after_read) { + assert(src->_aborted && "UserData was not closed before by a done() call"); + _length = static_cast(src->_data.size() / _audio_channels) / _audio_rate; + } } //////////////////////////////////////////////////////////////////// @@ -54,10 +58,43 @@ UserDataAudioCursor:: void UserDataAudioCursor:: read_samples(int n, PN_int16 *data) { UserDataAudio *source = (UserDataAudio*)(MovieAudio*)_source; - source->read_samples(n, data); + + if(source->_remove_after_read) { + source->read_samples(n, data); + } + else { + int offset = _samples_read * _audio_channels; + int avail = source->_data.size() - offset; + int desired = n * _audio_channels; + if (avail > desired) avail = desired; + + for (int i=0; i_data[i+offset]; + } + for (int i=avail; i(t * _audio_rate * _audio_channels + 0.5f); + } + else { + _samples_read = 0; + } + _last_seek = t; +} + //////////////////////////////////////////////////////////////////// // Function: UserDataAudioCursor::ready // Access: Private @@ -68,5 +105,7 @@ int UserDataAudioCursor:: ready() const { UserDataAudio *source = (UserDataAudio*)(MovieAudio*)_source; ((UserDataAudioCursor*)this)->_aborted = source->_aborted; - return (source->_data.size()) / _audio_channels; + + if(source->_remove_after_read) return source->_data.size() / _audio_channels; + else return source->_data.size() / _audio_channels - _samples_read; } diff --git a/panda/src/movies/userDataAudioCursor.h b/panda/src/movies/userDataAudioCursor.h index 2b026da33c..dc27607a8c 100644 --- a/panda/src/movies/userDataAudioCursor.h +++ b/panda/src/movies/userDataAudioCursor.h @@ -35,7 +35,7 @@ PUBLISHED: public: virtual void read_samples(int n, PN_int16 *data); virtual int ready() const; - friend class UserDataAudio; + virtual void seek(double offset); public: static TypeHandle get_class_type() {