#include "audio_processor.h"
#include "resampler.h"
#include "util.h"
+#include <iostream>
#include "i18n.h"
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->audio_frame_rate()), accurate);
+ seek (ContentTime::from_frames (frame, _audio_content->resampled_audio_frame_rate()), accurate);
}
/* Offset of the data that we want from the start of _decoded_audio.audio
*/
if (accurate) {
/* Keep stuffing data into _decoded_audio until we have enough data, or the subclass does not want to give us any more */
- while (!pass() && (_decoded_audio.frame > frame || (_decoded_audio.frame + _decoded_audio.audio->frames()) < end)) {}
+ while ((_decoded_audio.frame > frame || (_decoded_audio.frame + _decoded_audio.audio->frames()) < end) && !pass (PASS_REASON_AUDIO)) {}
decoded_offset = frame - _decoded_audio.frame;
} else {
- while (!pass() && _decoded_audio.audio->frames() < length) {}
+ while (_decoded_audio.audio->frames() < length && !pass (PASS_REASON_AUDIO)) {}
/* Use decoded_offset of 0, as we don't really care what frames we return */
}
_audio_position = time.frames (frame_rate);
}
- assert (_audio_position.get() >= (_decoded_audio.frame + _decoded_audio.audio->frames()));
+ DCPOMATIC_ASSERT (_audio_position.get() >= (_decoded_audio.frame + _decoded_audio.audio->frames()));
add (data);
}
void
AudioDecoder::add (shared_ptr<const AudioBuffers> data)
{
+ 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) {