mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-04 02:42:49 -04:00
patch from Nox_fire(galaxy)
This commit is contained in:
parent
5b74526c15
commit
4a5db4ca35
@ -24,12 +24,13 @@ TypeHandle UserDataAudio::_type_handle;
|
|||||||
// a means to supply raw audio samples manually.
|
// a means to supply raw audio samples manually.
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
UserDataAudio::
|
UserDataAudio::
|
||||||
UserDataAudio(int rate, int channels) :
|
UserDataAudio(int rate, int channels, bool remove_after_read) :
|
||||||
MovieAudio("User Data Audio"),
|
MovieAudio("User Data Audio"),
|
||||||
_desired_rate(rate),
|
_desired_rate(rate),
|
||||||
_desired_channels(channels),
|
_desired_channels(channels),
|
||||||
_cursor(NULL),
|
_cursor(NULL),
|
||||||
_aborted(false)
|
_aborted(false),
|
||||||
|
_remove_after_read(remove_after_read)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -25,12 +25,17 @@ class UserDataAudioCursor;
|
|||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Class : UserDataAudio
|
// Class : UserDataAudio
|
||||||
// Description : A UserDataAudio is a way for the user to manually
|
// 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 {
|
class EXPCL_PANDA_MOVIES UserDataAudio : public MovieAudio {
|
||||||
|
|
||||||
PUBLISHED:
|
PUBLISHED:
|
||||||
UserDataAudio(int rate, int channels);
|
UserDataAudio(int rate, int channels, bool remove_after_read=true);
|
||||||
virtual ~UserDataAudio();
|
virtual ~UserDataAudio();
|
||||||
virtual PT(MovieAudioCursor) open();
|
virtual PT(MovieAudioCursor) open();
|
||||||
|
|
||||||
@ -47,6 +52,7 @@ class EXPCL_PANDA_MOVIES UserDataAudio : public MovieAudio {
|
|||||||
UserDataAudioCursor *_cursor;
|
UserDataAudioCursor *_cursor;
|
||||||
pdeque<PN_int16> _data;
|
pdeque<PN_int16> _data;
|
||||||
bool _aborted;
|
bool _aborted;
|
||||||
|
bool _remove_after_read;
|
||||||
friend class UserDataAudioCursor;
|
friend class UserDataAudioCursor;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
@ -27,9 +27,13 @@ UserDataAudioCursor(UserDataAudio *src) :
|
|||||||
{
|
{
|
||||||
_audio_rate = src->_desired_rate;
|
_audio_rate = src->_desired_rate;
|
||||||
_audio_channels = src->_desired_channels;
|
_audio_channels = src->_desired_channels;
|
||||||
_can_seek = false;
|
_can_seek = !src->_remove_after_read;
|
||||||
_can_seek_fast = false;
|
_can_seek_fast = !src->_remove_after_read;
|
||||||
_aborted = false;
|
_aborted = false;
|
||||||
|
if(!src->_remove_after_read) {
|
||||||
|
assert(src->_aborted && "UserData was not closed before by a done() call");
|
||||||
|
_length = static_cast<double>(src->_data.size() / _audio_channels) / _audio_rate;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
@ -54,10 +58,43 @@ UserDataAudioCursor::
|
|||||||
void UserDataAudioCursor::
|
void UserDataAudioCursor::
|
||||||
read_samples(int n, PN_int16 *data) {
|
read_samples(int n, PN_int16 *data) {
|
||||||
UserDataAudio *source = (UserDataAudio*)(MovieAudio*)_source;
|
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<avail; i++) {
|
||||||
|
data[i] = source->_data[i+offset];
|
||||||
|
}
|
||||||
|
for (int i=avail; i<desired; i++) {
|
||||||
|
data[i] = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
_samples_read += n;
|
_samples_read += n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
// Function: UserDataAudioCursor::ready
|
||||||
|
// Access: Published
|
||||||
|
// Description: Set the offset if possible.
|
||||||
|
////////////////////////////////////////////////////////////////////
|
||||||
|
void UserDataAudioCursor::
|
||||||
|
seek(double t) {
|
||||||
|
if(_can_seek && 0 <= t && _length <= t) {
|
||||||
|
_samples_read = static_cast<int>(t * _audio_rate * _audio_channels + 0.5f);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
_samples_read = 0;
|
||||||
|
}
|
||||||
|
_last_seek = t;
|
||||||
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////
|
||||||
// Function: UserDataAudioCursor::ready
|
// Function: UserDataAudioCursor::ready
|
||||||
// Access: Private
|
// Access: Private
|
||||||
@ -68,5 +105,7 @@ int UserDataAudioCursor::
|
|||||||
ready() const {
|
ready() const {
|
||||||
UserDataAudio *source = (UserDataAudio*)(MovieAudio*)_source;
|
UserDataAudio *source = (UserDataAudio*)(MovieAudio*)_source;
|
||||||
((UserDataAudioCursor*)this)->_aborted = source->_aborted;
|
((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;
|
||||||
}
|
}
|
||||||
|
@ -35,7 +35,7 @@ PUBLISHED:
|
|||||||
public:
|
public:
|
||||||
virtual void read_samples(int n, PN_int16 *data);
|
virtual void read_samples(int n, PN_int16 *data);
|
||||||
virtual int ready() const;
|
virtual int ready() const;
|
||||||
friend class UserDataAudio;
|
virtual void seek(double offset);
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static TypeHandle get_class_type() {
|
static TypeHandle get_class_type() {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user