diff options
| author | Carl Hetherington <cth@carlh.net> | 2014-04-09 11:35:02 +0100 |
|---|---|---|
| committer | Carl Hetherington <cth@carlh.net> | 2014-04-09 11:35:02 +0100 |
| commit | b890b9d41c0bb9e6e29b0e2482ae792059a82ea3 (patch) | |
| tree | fe182da7f260a89d0ed65d6977f8cb2b43af18c3 /src/lib/audio_decoder.cc | |
| parent | 16b279646ca4e921aa6ea06c59256e3bca7e5a61 (diff) | |
Bug fix with audio and non-accurate seeks.
Diffstat (limited to 'src/lib/audio_decoder.cc')
| -rw-r--r-- | src/lib/audio_decoder.cc | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/src/lib/audio_decoder.cc b/src/lib/audio_decoder.cc index 9606c378c..ee6a9bc98 100644 --- a/src/lib/audio_decoder.cc +++ b/src/lib/audio_decoder.cc @@ -31,6 +31,7 @@ using std::stringstream; using std::list; using std::pair; using std::cout; +using std::min; using boost::optional; using boost::shared_ptr; @@ -55,6 +56,8 @@ AudioDecoder::get_audio (AudioFrame frame, AudioFrame length, bool accurate) seek (ContentTime::from_frames (frame, _audio_content->content_audio_frame_rate()), accurate); } + AudioFrame decoded_offset = 0; + /* Now enough pass() calls will either: * (a) give us what we want, or * (b) hit the end of the decoder. @@ -64,19 +67,21 @@ AudioDecoder::get_audio (AudioFrame frame, AudioFrame length, bool accurate) */ if (accurate) { while (!pass() && _decoded_audio.audio->frames() < length) {} + /* Use decoded_offset of 0, as we don't really care what frames we return */ } else { while (!pass() && (_decoded_audio.frame > frame || (_decoded_audio.frame + _decoded_audio.audio->frames()) < end)) {} + decoded_offset = frame - _decoded_audio.frame; } - - /* Clean up decoded */ - AudioFrame const decoded_offset = frame - _decoded_audio.frame; AudioFrame const amount_left = _decoded_audio.audio->frames() - decoded_offset; - _decoded_audio.audio->move (decoded_offset, 0, amount_left); - _decoded_audio.audio->set_frames (amount_left); - - shared_ptr<AudioBuffers> out (new AudioBuffers (_decoded_audio.audio->channels(), length)); - out->copy_from (_decoded_audio.audio.get(), length, frame - _decoded_audio.frame, 0); + + AudioFrame const to_return = min (amount_left, length); + shared_ptr<AudioBuffers> out (new AudioBuffers (_decoded_audio.audio->channels(), to_return)); + out->copy_from (_decoded_audio.audio.get(), to_return, decoded_offset, 0); + + /* Clean up decoded */ + _decoded_audio.audio->move (decoded_offset + to_return, 0, amount_left - to_return); + _decoded_audio.audio->set_frames (amount_left - to_return); return shared_ptr<ContentAudio> (new ContentAudio (out, frame)); } |
