- shared_ptr<ContentAudio> dec;
-
- AudioFrame const end = frame + length - 1;
-
- if (frame < _decoded_audio.frame || end > (_decoded_audio.frame + length * 4)) {
- /* Either we have no decoded data, or what we do have is a long way from what we want: seek */
- 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.
- *
- * If we are being accurate, we want the right frames,
- * otherwise any frames will do.
- */
- 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;
- }
-
- AudioFrame const amount_left = _decoded_audio.audio->frames() - decoded_offset;
-
- 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));