Try to put mono sound tracks on the centre speaker.
authorCarl Hetherington <cth@carlh.net>
Sun, 6 Jan 2013 14:29:40 +0000 (14:29 +0000)
committerCarl Hetherington <cth@carlh.net>
Sun, 6 Jan 2013 14:29:40 +0000 (14:29 +0000)
src/lib/encoder.cc
src/lib/make_dcp_job.cc
src/lib/util.cc
src/lib/util.h

index 07ce8f3bc20c2aa35b43a7f9646da5db0b123ac6..4a829bafda0ee1cae08306344c3b7ff546a2f250 100644 (file)
@@ -65,7 +65,7 @@ Encoder::Encoder (shared_ptr<const Film> f, shared_ptr<const EncodeOptions> o)
                /* Create sound output files with .tmp suffixes; we will rename
                   them if and when we complete.
                */
-               for (int i = 0; i < _film->audio_channels(); ++i) {
+               for (int i = 0; i < dcp_audio_channels (_film->audio_channels()); ++i) {
                        SF_INFO sf_info;
                        sf_info.samplerate = dcp_audio_sample_rate (_film->audio_stream()->sample_rate());
                        /* We write mono files */
@@ -163,7 +163,7 @@ Encoder::process_end ()
                close_sound_files ();
                
                /* Rename .wav.tmp files to .wav */
-               for (int i = 0; i < _film->audio_channels(); ++i) {
+               for (int i = 0; i < dcp_audio_channels (_film->audio_channels()); ++i) {
                        if (boost::filesystem::exists (_opt->multichannel_audio_out_path (i, false))) {
                                boost::filesystem::remove (_opt->multichannel_audio_out_path (i, false));
                        }
@@ -380,6 +380,20 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
        }
 #endif
 
+       if (_film->audio_channels() == 1) {
+               /* We need to switch things around so that the mono channel is on
+                  the centre channel of a 5.1 set (with other channels silent).
+               */
+
+               shared_ptr<AudioBuffers> b (new AudioBuffers (6, data->frames ()));
+               b->make_silent (libdcp::LEFT);
+               b->make_silent (libdcp::RIGHT);
+               memcpy (b->data()[libdcp::CENTRE], data->data()[0], data->frames() * sizeof(float));
+               b->make_silent (libdcp::LFE);
+               b->make_silent (libdcp::LS);
+               b->make_silent (libdcp::RS);
+       }
+
        write_audio (data);
        
        _audio_frame += data->frames ();
@@ -388,7 +402,7 @@ Encoder::process_audio (shared_ptr<AudioBuffers> data)
 void
 Encoder::write_audio (shared_ptr<const AudioBuffers> audio)
 {
-       for (int i = 0; i < _film->audio_channels(); ++i) {
+       for (int i = 0; i < audio->channels(); ++i) {
                sf_write_float (_sound_files[i], audio->data(i), audio->frames());
        }
 
index 4605d17247e14c1e6f038c57f632016698df1ce3..5272d6badf59b341d8ed1d2a851b207ab03d9806 100644 (file)
@@ -131,7 +131,7 @@ MakeDCPJob::run ()
                                &dcp.Progress,
                                dfr.frames_per_second,
                                frames,
-                               _film->audio_channels()
+                               dcp_audio_channels (_film->audio_channels())
                                )
                        );
                ascend ();
index 45965385c6c9b4f5e4bdb9202be0671b2335f720..395c53e31ebf0500b255a81c7e6edb4b007fcf1a 100644 (file)
@@ -364,6 +364,20 @@ dcp_audio_sample_rate (int fs)
        return 96000;
 }
 
+int
+dcp_audio_channels (int f)
+{
+       if (f) {
+               /* The source is mono, so to put the mono channel into
+                  the centre we need to generate a 5.1 soundtrack.
+               */
+               return 6;
+       }
+
+       return f;
+}
+
+
 bool operator== (Size const & a, Size const & b)
 {
        return (a.width == b.width && a.height == b.height);
index 3832cc57945900b9ca82f61b5caee0501a510425..0744d9c090080806fac6438a322cd9a715c2e7c7 100644 (file)
@@ -184,6 +184,7 @@ struct Rect
 extern std::string crop_string (Position, Size);
 extern int dcp_audio_sample_rate (int);
 extern DCPFrameRate dcp_frame_rate (float);
+extern int dcp_audio_channels (int);
 extern std::string colour_lut_index_to_name (int index);
 extern int stride_round_up (int, int const *, int);
 extern int stride_lookup (int c, int const * stride);