movies: Python-facing read_samples should return bytes object

Also, properly returns partial buffers based on number of actual samples read
This commit is contained in:
rdb 2019-04-29 18:00:29 +02:00
parent c513342247
commit c329a41dd3
2 changed files with 17 additions and 12 deletions

View File

@ -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<words; i++) {
int16_t word = tmp[i];
result.put((char)(word & 255));
result.put((char)((word>>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;
}

View File

@ -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);