+using boost::optional;
+
+AudioDecoder::AudioDecoder (Decoder* parent, shared_ptr<const AudioContent> content, shared_ptr<Log> log, bool fast)
+ : DecoderPart (parent, log)
+ , _content (content)
+ , _fast (fast)
+{
+ /* Set up _positions so that we have one for each stream */
+ BOOST_FOREACH (AudioStreamPtr i, content->streams ()) {
+ _positions[i] = 0;
+ }
+}
+
+void
+AudioDecoder::emit (AudioStreamPtr stream, shared_ptr<const AudioBuffers> data, ContentTime time)
+{
+ if (ignore ()) {
+ return;
+ }
+
+ if (_positions[stream] == 0) {
+ /* This is the first data we have received since initialisation or seek. Set
+ the position based on the ContentTime that was given. After this first time
+ we just count samples, as it seems that ContentTimes are unreliable from
+ FFmpegDecoder (not quite continuous; perhaps due to some rounding error).
+ */
+ if (_content->delay() > 0) {
+ /* Insert silence to give the delay */
+ silence (_content->delay ());
+ }
+ time += ContentTime::from_seconds (_content->delay() / 1000.0);
+ _positions[stream] = time.frames_round (stream->frame_rate ());
+ }
+
+ shared_ptr<Resampler> resampler;
+ map<AudioStreamPtr, shared_ptr<Resampler> >::iterator i = _resamplers.find(stream);
+ if (i != _resamplers.end ()) {
+ resampler = i->second;
+ } else {
+ if (stream->frame_rate() != _content->resampled_frame_rate()) {
+ LOG_GENERAL (
+ "Creating new resampler from %1 to %2 with %3 channels",
+ stream->frame_rate(),
+ _content->resampled_frame_rate(),
+ stream->channels()
+ );