- if (!_audio_position) {
- /* This should only happen when there is a seek followed by a flush, but
- we need to cope with it.
- */
- return;
- }
-
- /* Resize _decoded_audio to fit the new data */
- int new_size = 0;
- if (_decoded_audio.audio->frames() == 0) {
- /* There's nothing in there, so just store the new data */
- new_size = data->frames ();
- _decoded_audio.frame = _audio_position.get ();
- } else {
- /* Otherwise we need to extend _decoded_audio to include the new stuff */
- new_size = _audio_position.get() + data->frames() - _decoded_audio.frame;
- }
-
- _decoded_audio.audio->ensure_size (new_size);
- _decoded_audio.audio->set_frames (new_size);
-
- /* Copy new data in */
- _decoded_audio.audio->copy_from (data.get(), data->frames(), 0, _audio_position.get() - _decoded_audio.frame);
- _audio_position = _audio_position.get() + data->frames ();
-
- /* Limit the amount of data we keep in case nobody is asking for it */
- int const max_frames = _audio_content->resampled_audio_frame_rate () * 10;
- if (_decoded_audio.audio->frames() > max_frames) {
- int const to_remove = _decoded_audio.audio->frames() - max_frames;
- _decoded_audio.frame += to_remove;
- _decoded_audio.audio->move (to_remove, 0, max_frames);
- _decoded_audio.audio->set_frames (max_frames);