*/
+#include <iostream>
#include "audio_decoder.h"
#include "audio_buffers.h"
#include "exceptions.h"
#include "i18n.h"
-using std::stringstream;
using std::list;
using std::pair;
using std::cout;
AudioDecoder::AudioDecoder (shared_ptr<const Film> film, shared_ptr<const AudioContent> content)
: Decoder (film)
+ , _audio_content (content)
, _audio_position (0)
{
- if (content->content_audio_frame_rate() != content->output_audio_frame_rate() && content->audio_channels ()) {
- _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)
+AudioDecoder::audio (shared_ptr<const AudioBuffers> data, AudioContent::Frame frame)
{
- if (_resampler) {
- data = _resampler->run (data);
- }
-
- Audio (data, _audio_position);
- _audio_position += data->frames ();
+ Audio (data, frame);
+ _audio_position = frame + data->frames ();
}
-void
-AudioDecoder::flush ()
+/** 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
{
- if (_resampler) {
- _resampler->flush ();
- }
+ return _audio_content->audio_channels () > 0;
}