AudioDecoder::AudioDecoder (shared_ptr<const Film> film, shared_ptr<const AudioContent> content)
: Decoder (film)
- , _audio_position (0)
+ , _audio_content (content)
{
- if (content->content_audio_frame_rate() != content->output_audio_frame_rate()) {
- _resampler.reset (
- new Resampler (
- content->content_audio_frame_rate(),
- content->output_audio_frame_rate(),
- content->audio_channels()
- )
- );
- }
+
}
void
-AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame frame)
+AudioDecoder::audio (shared_ptr<const AudioBuffers> data, ContentTime time)
+{
+ Audio (data, time);
+}
+
+/** This is a bit odd, but necessary when we have (e.g.) FFmpegDecoders with no audio.
+ * The player needs to know that there is no audio otherwise it will keep trying to
+ * pass() the decoder to get it to emit audio.
+ */
+bool
+AudioDecoder::has_audio () const
{
- /* XXX: no-one's calling _resampler->flush() again */
-
- if (_resampler) {
- data = _resampler->run (data);
- }
-
- Audio (data, _audio_position);
- _audio_position = frame + data->frames ();
+ return _audio_content->audio_channels () > 0;
}