Cope with stereo click files by mixing them down to mono before playback. Kind-of...
authorCarl Hetherington <carl@carlh.net>
Thu, 17 Feb 2011 20:25:17 +0000 (20:25 +0000)
committerCarl Hetherington <carl@carlh.net>
Thu, 17 Feb 2011 20:25:17 +0000 (20:25 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@8894 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/session_click.cc

index 2a1b4122e4826644e0f8e67100f64faeca777525..cd8ee5ce1e8ac18c27d25059e71ed1a209805ee7 100644 (file)
@@ -157,16 +157,35 @@ Session::setup_click_sounds (Sample** data, Sample const * default_data, framecn
                        return;
                }
 
-               *data = new Sample[info.frames];
-               *length = info.frames;
+               /* read the (possibly multi-channel) click data into a temporary buffer */
                
-               if (sf_read_float (sndfile, *data, info.frames) != info.frames) {
+               sf_count_t const samples = info.frames * info.channels;
+
+               Sample* tmp = new Sample[samples];
+
+               if (sf_readf_float (sndfile, tmp, info.frames) != info.frames) {
+
                        warning << _("cannot read data from click soundfile") << endmsg;
-                       delete *data;
                        *data = 0;
                        _clicking = false;
+                       
+               } else {
+
+                       *data = new Sample[info.frames];
+                       *length = info.frames;
+                       
+                       /* mix down to mono */
+                       
+                       for (int i = 0; i < info.frames; ++i) {
+                               (*data)[i] = 0;
+                               for (int j = 0; j < info.channels; ++j) {
+                                       (*data)[i] = tmp[i * info.channels + j];
+                               }
+                               (*data)[i] /= info.channels;
+                       }
                }
-               
+
+               delete[] tmp;
                sf_close (sndfile);
        }
 }