Fix mapping of audio in DCP.
authorCarl Hetherington <cth@carlh.net>
Sat, 13 Apr 2013 23:48:27 +0000 (00:48 +0100)
committerCarl Hetherington <cth@carlh.net>
Sat, 13 Apr 2013 23:48:27 +0000 (00:48 +0100)
src/lib/audio_mapping.cc
src/lib/encoder.cc
src/lib/player.cc
src/lib/player.h

index b85ea731402046347a58738be6d5bb550df7fdd3..2e807756566ec31a068437b99ec7038117f75880 100644 (file)
@@ -41,7 +41,7 @@ int
 AudioMapping::dcp_channels () const
 {
        for (list<pair<Channel, libdcp::Channel> >::const_iterator i = _content_to_dcp.begin(); i != _content_to_dcp.end(); ++i) {
-               if (((int) i->second) > 2) {
+               if (((int) i->second) >= 2) {
                        return 6;
                }
        }
index b897c8a314f5b6c439d9ba389077545e4f9742bc..d6a57ae6b24efccebf0b149c27125329accddc3e 100644 (file)
@@ -135,9 +135,9 @@ void
 Encoder::process_end ()
 {
 #if HAVE_SWRESAMPLE    
-       if (_film->has_audio() && _film->audio_channels() && _swr_context) {
+       if (_film->has_audio() && _swr_context) {
 
-               shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_channels(), 256));
+               shared_ptr<AudioBuffers> out (new AudioBuffers (_film->audio_mapping().dcp_channels(), 256));
                        
                while (1) {
                        int const frames = swr_convert (_swr_context, (uint8_t **) out->data(), 256, 0, 0);
@@ -312,7 +312,7 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
                /* Compute the resampled frames count and add 32 for luck */
                int const max_resampled_frames = ceil ((int64_t) data->frames() * _film->target_audio_sample_rate() / _film->audio_frame_rate()) + 32;
 
-               shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_channels(), max_resampled_frames));
+               shared_ptr<AudioBuffers> resampled (new AudioBuffers (_film->audio_mapping().dcp_channels(), max_resampled_frames));
 
                /* Resample audio */
                int const resampled_frames = swr_convert (
index 92c2929acacc18e6cf29f1565b08ca76aa3074c4..c77059b0ab546ce5fdb503fa12b6becce155e3e1 100644 (file)
@@ -92,8 +92,8 @@ Player::pass ()
                        }
                }
 
-               Audio (_sndfile_buffers);
-               _sndfile_buffers.reset ();
+               Audio (_audio_buffers);
+               _audio_buffers.reset ();
        }
 
        return done;
@@ -126,22 +126,23 @@ Player::process_video (shared_ptr<Image> i, bool same, shared_ptr<Subtitle> s)
 void
 Player::process_audio (weak_ptr<const AudioContent> c, shared_ptr<AudioBuffers> b)
 {
-       if (_playlist->audio_from() == Playlist::AUDIO_SNDFILE) {
-               AudioMapping mapping = _film->audio_mapping ();
-               if (!_sndfile_buffers) {
-                       _sndfile_buffers.reset (new AudioBuffers (mapping.dcp_channels(), b->frames ()));
-                       _sndfile_buffers->make_silent ();
-               }
+       AudioMapping mapping = _film->audio_mapping ();
+       if (!_audio_buffers) {
+               _audio_buffers.reset (new AudioBuffers (mapping.dcp_channels(), b->frames ()));
+               _audio_buffers->make_silent ();
+       }
 
-               for (int i = 0; i < b->channels(); ++i) {
-                       list<libdcp::Channel> dcp = mapping.content_to_dcp (AudioMapping::Channel (c, i));
-                       for (list<libdcp::Channel>::iterator j = dcp.begin(); j != dcp.end(); ++j) {
-                               _sndfile_buffers->accumulate (b, i, static_cast<int> (*j));
-                       }
+       for (int i = 0; i < b->channels(); ++i) {
+               list<libdcp::Channel> dcp = mapping.content_to_dcp (AudioMapping::Channel (c, i));
+               for (list<libdcp::Channel>::iterator j = dcp.begin(); j != dcp.end(); ++j) {
+                       _audio_buffers->accumulate (b, i, static_cast<int> (*j));
                }
+       }
 
-       } else {
-               Audio (b);
+       if (_playlist->audio_from() == Playlist::AUDIO_FFMPEG) {
+               /* We can just emit this audio now as it will all be here */
+               Audio (_audio_buffers);
+               _audio_buffers.reset ();
        }
 }
 
index 8a82ab2980b644e408d35b48f37f0921f2d5e749..7a99d656190bd25c23faddcd08f61e218942c884 100644 (file)
@@ -70,7 +70,7 @@ private:
        std::list<boost::shared_ptr<VideoDecoder> >::iterator _video_decoder;
        std::list<boost::shared_ptr<SndfileDecoder> > _sndfile_decoders;
 
-       boost::shared_ptr<AudioBuffers> _sndfile_buffers;
+       boost::shared_ptr<AudioBuffers> _audio_buffers;
 
        bool _video_sync;
 };