From c513342247db5e0c54f696ccc4f78bd0fe3cac24 Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 29 Apr 2019 17:55:15 +0200 Subject: [PATCH] movies: return actual number of samples read in read_samples Various codecs may only partially fill the buffer and fill the rest with zeroes, but it is useful to know how many samples were actually read. --- panda/src/ffmpeg/ffmpegAudioCursor.cxx | 3 ++- panda/src/ffmpeg/ffmpegAudioCursor.h | 2 +- panda/src/movies/flacAudioCursor.cxx | 6 ++++-- panda/src/movies/flacAudioCursor.h | 2 +- panda/src/movies/microphoneAudioDS.cxx | 5 +++-- panda/src/movies/movieAudioCursor.cxx | 5 +++-- panda/src/movies/movieAudioCursor.h | 2 +- panda/src/movies/opusAudioCursor.cxx | 4 +++- panda/src/movies/opusAudioCursor.h | 2 +- panda/src/movies/userDataAudio.cxx | 9 ++++++--- panda/src/movies/userDataAudio.h | 2 +- panda/src/movies/userDataAudioCursor.cxx | 9 ++++++--- panda/src/movies/userDataAudioCursor.h | 2 +- panda/src/movies/vorbisAudioCursor.cxx | 3 ++- panda/src/movies/vorbisAudioCursor.h | 2 +- panda/src/movies/wavAudioCursor.cxx | 8 +++++--- panda/src/movies/wavAudioCursor.h | 2 +- 17 files changed, 42 insertions(+), 26 deletions(-) diff --git a/panda/src/ffmpeg/ffmpegAudioCursor.cxx b/panda/src/ffmpeg/ffmpegAudioCursor.cxx index 4b17800c2b..2fdc10b983 100644 --- a/panda/src/ffmpeg/ffmpegAudioCursor.cxx +++ b/panda/src/ffmpeg/ffmpegAudioCursor.cxx @@ -462,7 +462,7 @@ seek(double t) { * read. Your buffer must be equal in size to N * channels. Multiple-channel * audio will be interleaved. */ -void FfmpegAudioCursor:: +int FfmpegAudioCursor:: read_samples(int n, int16_t *data) { int desired = n * _audio_channels; @@ -486,4 +486,5 @@ read_samples(int n, int16_t *data) { } _samples_read += n; + return n; } diff --git a/panda/src/ffmpeg/ffmpegAudioCursor.h b/panda/src/ffmpeg/ffmpegAudioCursor.h index f3963ff527..77e8890d6c 100644 --- a/panda/src/ffmpeg/ffmpegAudioCursor.h +++ b/panda/src/ffmpeg/ffmpegAudioCursor.h @@ -45,7 +45,7 @@ PUBLISHED: virtual void seek(double offset); public: - virtual void read_samples(int n, int16_t *data); + virtual int read_samples(int n, int16_t *data); protected: void fetch_packet(); diff --git a/panda/src/movies/flacAudioCursor.cxx b/panda/src/movies/flacAudioCursor.cxx index 0e3bbb163a..1c9d06984b 100644 --- a/panda/src/movies/flacAudioCursor.cxx +++ b/panda/src/movies/flacAudioCursor.cxx @@ -118,8 +118,10 @@ seek(double t) { * read. Your buffer must be equal in size to N * channels. Multiple-channel * audio will be interleaved. */ -void FlacAudioCursor:: +int FlacAudioCursor:: read_samples(int n, int16_t *data) { int desired = n * _audio_channels; - _samples_read += drflac_read_s16(_drflac, desired, data) / _audio_channels; + n = drflac_read_s16(_drflac, desired, data) / _audio_channels; + _samples_read += n; + return n; } diff --git a/panda/src/movies/flacAudioCursor.h b/panda/src/movies/flacAudioCursor.h index 995be42e1e..93a48e5f32 100644 --- a/panda/src/movies/flacAudioCursor.h +++ b/panda/src/movies/flacAudioCursor.h @@ -37,7 +37,7 @@ PUBLISHED: virtual void seek(double offset); public: - virtual void read_samples(int n, int16_t *data); + virtual int read_samples(int n, int16_t *data); bool _is_valid; diff --git a/panda/src/movies/microphoneAudioDS.cxx b/panda/src/movies/microphoneAudioDS.cxx index 1ce78b0209..c04da23c3e 100644 --- a/panda/src/movies/microphoneAudioDS.cxx +++ b/panda/src/movies/microphoneAudioDS.cxx @@ -91,7 +91,7 @@ public: int _samples_per_buffer; public: - virtual void read_samples(int n, int16_t *data); + virtual int read_samples(int n, int16_t *data); virtual int ready() const; public: @@ -323,7 +323,7 @@ MicrophoneAudioCursorDS:: /** * */ -void MicrophoneAudioCursorDS:: +int MicrophoneAudioCursorDS:: read_samples(int n, int16_t *data) { int orign = n; if (_handle) { @@ -373,6 +373,7 @@ read_samples(int n, int16_t *data) { if (n > 0) { memcpy(data, 0, n*2*_audio_channels); } + return orign - n; } /** diff --git a/panda/src/movies/movieAudioCursor.cxx b/panda/src/movies/movieAudioCursor.cxx index 33acc0e10c..a725b56ad1 100644 --- a/panda/src/movies/movieAudioCursor.cxx +++ b/panda/src/movies/movieAudioCursor.cxx @@ -45,14 +45,14 @@ MovieAudioCursor:: * read. Your buffer must be equal in size to N * channels. Multiple-channel * audio will be interleaved. */ -void MovieAudioCursor:: +int MovieAudioCursor:: read_samples(int n, int16_t *data) { // This is the null implementation, which generates pure silence. Normally, // this method will be overridden by a subclass. if (n <= 0) { - return; + return 0; } int desired = n * _audio_channels; @@ -60,6 +60,7 @@ read_samples(int n, int16_t *data) { data[i] = 0; } _samples_read += n; + return n; } /** diff --git a/panda/src/movies/movieAudioCursor.h b/panda/src/movies/movieAudioCursor.h index b2d5d9bebe..28674f1215 100644 --- a/panda/src/movies/movieAudioCursor.h +++ b/panda/src/movies/movieAudioCursor.h @@ -51,7 +51,7 @@ PUBLISHED: std::string read_samples(int n); public: - virtual void read_samples(int n, int16_t *data); + virtual int read_samples(int n, int16_t *data); protected: PT(MovieAudio) _source; diff --git a/panda/src/movies/opusAudioCursor.cxx b/panda/src/movies/opusAudioCursor.cxx index 788a882885..814dc8fe04 100644 --- a/panda/src/movies/opusAudioCursor.cxx +++ b/panda/src/movies/opusAudioCursor.cxx @@ -228,7 +228,7 @@ seek(double t) { * read. Your buffer must be equal in size to N * channels. Multiple-channel * audio will be interleaved. */ -void OpusAudioCursor:: +int OpusAudioCursor:: read_samples(int n, int16_t *data) { int16_t *end = data + (n * _audio_channels); @@ -262,7 +262,9 @@ read_samples(int n, int16_t *data) { // Fill the rest of the buffer with silence. if (data < end) { memset(data, 0, (unsigned char *)end - (unsigned char *)data); + n -= (end - data) / _audio_channels; } + return n; } #endif // HAVE_OPUS diff --git a/panda/src/movies/opusAudioCursor.h b/panda/src/movies/opusAudioCursor.h index 11e05e4030..3e2137de5e 100644 --- a/panda/src/movies/opusAudioCursor.h +++ b/panda/src/movies/opusAudioCursor.h @@ -39,7 +39,7 @@ PUBLISHED: virtual void seek(double offset); public: - virtual void read_samples(int n, int16_t *data); + virtual int read_samples(int n, int16_t *data); bool _is_valid; diff --git a/panda/src/movies/userDataAudio.cxx b/panda/src/movies/userDataAudio.cxx index 4022b6b7f3..9490432dc0 100644 --- a/panda/src/movies/userDataAudio.cxx +++ b/panda/src/movies/userDataAudio.cxx @@ -57,12 +57,14 @@ open() { * read. Your buffer must be equal in size to N * channels. Multiple-channel * audio will be interleaved. */ -void UserDataAudio:: +int UserDataAudio:: read_samples(int n, int16_t *data) { int ready = (_data.size() / _desired_channels); int desired = n * _desired_channels; - int avail = ready * _desired_channels; - if (avail > desired) avail = desired; + if (n > ready) { + n = ready; + } + int avail = n * _desired_channels; for (int i=0; i_remove_after_read) { - source->read_samples(n, data); + if (source->_remove_after_read) { + n = source->read_samples(n, data); } else { int offset = _samples_read * _audio_channels; @@ -66,9 +66,12 @@ read_samples(int n, int16_t *data) { for (int i=avail; itellg() - _data_start; - _samples_read += read_samples / _audio_channels; + _samples_read += n; + return n; } diff --git a/panda/src/movies/wavAudioCursor.h b/panda/src/movies/wavAudioCursor.h index 21133b1c62..9ae03a5d7d 100644 --- a/panda/src/movies/wavAudioCursor.h +++ b/panda/src/movies/wavAudioCursor.h @@ -31,7 +31,7 @@ PUBLISHED: virtual void seek(double offset); public: - virtual void read_samples(int n, int16_t *data); + virtual int read_samples(int n, int16_t *data); bool _is_valid;