AudioDecoder::AudioDecoder (shared_ptr<const AudioContent> content)
: _audio_content (content)
{
- if (content->output_audio_frame_rate() != content->content_audio_frame_rate() && content->audio_channels ()) {
- _resampler.reset (new Resampler (content->content_audio_frame_rate(), content->output_audio_frame_rate(), content->audio_channels ()));
+ if (content->resampled_audio_frame_rate() != content->audio_frame_rate() && content->audio_channels ()) {
+ _resampler.reset (new Resampler (content->audio_frame_rate(), content->resampled_audio_frame_rate(), content->audio_channels ()));
}
reset_decoded_audio ();
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);
+ seek (ContentTime::from_frames (frame, _audio_content->audio_frame_rate()), accurate);
}
/* Offset of the data that we want from the start of _decoded_audio.audio
}
if (!_audio_position) {
- _audio_position = time.frames (_audio_content->output_audio_frame_rate ());
+ _audio_position = time.frames (_audio_content->resampled_audio_frame_rate ());
}
assert (_audio_position.get() >= (_decoded_audio.frame + _decoded_audio.audio->frames()));
/* Resize _decoded_audio to fit the new data */
- int const new_size = _audio_position.get() + data->frames() - _decoded_audio.frame;
+ 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);