From c329a41dd3d25f6646136fe3be11edf37dc451bc Mon Sep 17 00:00:00 2001 From: rdb Date: Mon, 29 Apr 2019 18:00:29 +0200 Subject: [PATCH] movies: Python-facing read_samples should return bytes object Also, properly returns partial buffers based on number of actual samples read --- panda/src/movies/movieAudioCursor.cxx | 27 ++++++++++++++++----------- panda/src/movies/movieAudioCursor.h | 2 +- 2 files changed, 17 insertions(+), 12 deletions(-) diff --git a/panda/src/movies/movieAudioCursor.cxx b/panda/src/movies/movieAudioCursor.cxx index a725b56ad1..a836937455 100644 --- a/panda/src/movies/movieAudioCursor.cxx +++ b/panda/src/movies/movieAudioCursor.cxx @@ -93,23 +93,28 @@ read_samples(int n, Datagram *dg) { * This is not particularly efficient, but it may be a convenient way to * manipulate samples in python. */ -std::string MovieAudioCursor:: +vector_uchar MovieAudioCursor:: read_samples(int n) { - std::ostringstream result; + vector_uchar result; int16_t tmp[4096]; while (n > 0) { int blocksize = (4096 / _audio_channels); - if (blocksize > n) blocksize = n; - int words = blocksize * _audio_channels; - read_samples(blocksize, tmp); - for (int i=0; i>8) & 255)); + if (blocksize > n) { + blocksize = n; } - n -= blocksize; + int nread = read_samples(blocksize, tmp); + if (nread == 0) { + return result; + } + int words = nread * _audio_channels; + for (int i = 0; i < words; ++i) { + int16_t word = tmp[i]; + result.push_back((uint8_t)(word & 255u)); + result.push_back((uint8_t)((word >> 8) & 255u)); + } + n -= nread; } - return result.str(); + return result; } diff --git a/panda/src/movies/movieAudioCursor.h b/panda/src/movies/movieAudioCursor.h index 28674f1215..e7c9668713 100644 --- a/panda/src/movies/movieAudioCursor.h +++ b/panda/src/movies/movieAudioCursor.h @@ -48,7 +48,7 @@ PUBLISHED: virtual int ready() const; virtual void seek(double offset); void read_samples(int n, Datagram *dg); - std::string read_samples(int n); + vector_uchar read_samples(int n); public: virtual int read_samples(int n, int16_t *data);