Write BWF info on export. Fixes #3398.
authorCarl Hetherington <carl@carlh.net>
Thu, 19 Aug 2010 14:58:54 +0000 (14:58 +0000)
committerCarl Hetherington <carl@carlh.net>
Thu, 19 Aug 2010 14:58:54 +0000 (14:58 +0000)
git-svn-id: svn://localhost/ardour2/branches/3.0@7652 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/ardour/broadcast_info.h
libs/ardour/ardour/export_handler.h
libs/ardour/broadcast_info.cc
libs/ardour/export_graph_builder.cc
libs/ardour/export_handler.cc
libs/ardour/export_profile_manager.cc
libs/ardour/sndfilesource.cc
libs/audiographer/audiographer/broadcast_info.h [new file with mode: 0644]
libs/audiographer/audiographer/sndfile/sndfile_writer.h
libs/audiographer/src/general/broadcast_info.cc [new file with mode: 0644]
libs/audiographer/wscript

index 522d7e7361e2acadae8131327e21f22a8326885c..991a3bbbcc76b0790cbb9687f95790d6e2a5de10 100644 (file)
@@ -26,6 +26,7 @@
 
 #include <sndfile.h>
 
+#include "audiographer/broadcast_info.h"
 #include "ardour/types.h"
 
 namespace ARDOUR
@@ -33,57 +34,15 @@ namespace ARDOUR
 
 class Session;
 
-class BroadcastInfo
+class BroadcastInfo : public AudioGrapher::BroadcastInfo
 {
   public:
-
-       /// Construct empty broadcast info
        BroadcastInfo ();
-       ~BroadcastInfo ();
-
-       /// Returns last error sring from libsndfile
-       std::string get_error () const { return error; }
-
-       /* Convenience functions */
 
        void set_from_session (Session const & session, int64_t time_ref);
 
-       /* Reading */
-
-       bool load_from_file (std::string const & filename);
-       bool load_from_file (SNDFILE* sf);
-
-       std::string get_description () const;
-       int64_t get_time_reference () const;
-       struct tm get_origination_time () const;
-       std::string get_originator () const;
-       std::string get_originator_ref () const;
-
-       /* Writing */
-
-       bool write_to_file (std::string const & filename);
-       bool write_to_file (SNDFILE* sf);
-
-       void set_description (std::string const & desc);
-       void set_time_reference (int64_t when);
-       void set_origination_time (struct tm * now = 0); // if 0, use time generated at construction
        void set_originator (std::string const & str = "");
-       void set_originator_ref (Session const &, std::string const & str = "");
-
-       /* State info */
-
-       /// Returns true if a info has been succesfully loaded or anything has been manually set
-       bool has_info () const { return _has_info; }
-
-  private:
-
-       SF_BROADCAST_INFO * info;
-       struct tm _time;
-
-       void update_error ();
-       std::string error;
-
-       bool _has_info;
+       void set_originator_ref_from_session (Session const &);
 };
 
 
index 05fbddecf57a08fb28f8a6729e47eb54c6097b04..49400a9363770e3efc06294f2696b91276fac560 100644 (file)
 #include "ardour/session.h"
 #include "ardour/types.h"
 
+namespace AudioGrapher {
+       class BroadcastInfo;
+}
+
 namespace ARDOUR
 {
 
@@ -40,6 +44,7 @@ class ExportFormatSpecification;
 class ExportFilename;
 class ExportGraphBuilder;
 
+
 class ExportElementFactory
 {
   public:
@@ -73,15 +78,17 @@ class ExportHandler : public ExportElementFactory
   public:
        struct FileSpec {
                FileSpec() {}
-               FileSpec (ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename)
+               FileSpec (ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename, boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info)
                  : channel_config (channel_config)
                  , format (format)
                  , filename (filename)
+                 , broadcast_info (broadcast_info)
                        {}
 
                ChannelConfigPtr channel_config;
                FormatPtr        format;
                FilenamePtr      filename;
+               boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info;
        };
        
   private:
@@ -107,7 +114,7 @@ class ExportHandler : public ExportElementFactory
   public:
        ~ExportHandler ();
 
-       bool add_export_config (TimespanPtr timespan, ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename);
+       bool add_export_config (TimespanPtr timespan, ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename, boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info);
        void do_export (bool rt = false);
 
   private:
index ccdb4a331eddb4117a072efc79a3aa4019db6f7f..12fafa29fefc773fc06725a284c92f00456876b9 100644 (file)
@@ -51,23 +51,9 @@ snprintf_bounded_null_filled (char* target, size_t target_size, char const * fmt
 
 }
 
-BroadcastInfo::BroadcastInfo () :
-  _has_info (false)
+BroadcastInfo::BroadcastInfo ()
 {
-       info = new SF_BROADCAST_INFO;
-       memset (info, 0, sizeof (*info));
-
-       // Note: Set version to 1 when UMID is used, otherwise version should stay at 0
-       info->version = 0;
-
-       time_t rawtime;
-       std::time (&rawtime);
-       _time = *localtime (&rawtime);
-}
-
-BroadcastInfo::~BroadcastInfo ()
-{
-       delete info;
+       
 }
 
 void
@@ -77,155 +63,7 @@ BroadcastInfo::set_from_session (Session const & session, int64_t time_ref)
        set_time_reference (time_ref);
        set_origination_time ();
        set_originator ();
-       set_originator_ref (session);
-}
-
-bool
-BroadcastInfo::load_from_file (std::string const & filename)
-{
-       SNDFILE * file = 0;
-       SF_INFO info;
-
-       info.format = 0;
-
-       if (!(file = sf_open (filename.c_str(), SFM_READ, &info))) {
-               update_error();
-               return false;
-       }
-
-       bool ret = load_from_file (file);
-
-       sf_close (file);
-       return ret;
-}
-
-bool
-BroadcastInfo::load_from_file (SNDFILE* sf)
-{
-       if (sf_command (sf, SFC_GET_BROADCAST_INFO, info, sizeof (*info)) != SF_TRUE) {
-               update_error();
-               _has_info = false;
-               return false;
-       }
-
-       _has_info = true;
-       return true;
-}
-
-std::string
-BroadcastInfo::get_description () const
-{
-       return info->description;
-}
-
-int64_t
-BroadcastInfo::get_time_reference () const
-{
-       if (!_has_info) {
-               return 0;
-       }
-
-       int64_t ret = (uint32_t) info->time_reference_high;
-       ret <<= 32;
-       ret |= (uint32_t) info->time_reference_low;
-       return ret;
-}
-
-struct tm
-BroadcastInfo::get_origination_time () const
-{
-       struct tm ret;
-
-       std::string date = info->origination_date;
-       ret.tm_year = atoi (date.substr (0, 4)) - 1900;
-       ret.tm_mon = atoi (date.substr (5, 2));
-       ret.tm_mday = atoi (date.substr (8, 2));
-
-       std::string time = info->origination_time;
-       ret.tm_hour = atoi (time.substr (0,2));
-       ret.tm_min = atoi (time.substr (3,2));
-       ret.tm_sec = atoi (time.substr (6,2));
-
-       return ret;
-}
-
-std::string
-BroadcastInfo::get_originator () const
-{
-       return info->originator;
-}
-
-std::string
-BroadcastInfo::get_originator_ref () const
-{
-       return info->originator_reference;
-}
-
-bool
-BroadcastInfo::write_to_file (std::string const & filename)
-{
-       SNDFILE * file = 0;
-       SF_INFO info;
-
-       info.format = 0;
-
-       if (!(file = sf_open (filename.c_str(), SFM_RDWR, &info))) {
-               update_error();
-               return false;
-       }
-
-       bool ret = write_to_file (file);
-
-       sf_close (file);
-       return ret;
-}
-
-bool
-BroadcastInfo::write_to_file (SNDFILE* sf)
-{
-       if (sf_command (sf, SFC_SET_BROADCAST_INFO, info, sizeof (*info)) != SF_TRUE) {
-               update_error();
-               return false;
-       }
-
-       return true;
-}
-
-void
-BroadcastInfo::set_description (std::string const & desc)
-{
-       _has_info = true;
-
-       snprintf_bounded_null_filled (info->description, sizeof (info->description), desc.c_str());
-}
-
-void
-BroadcastInfo::set_time_reference (int64_t when)
-{
-       _has_info = true;
-
-       info->time_reference_high = (when >> 32);
-       info->time_reference_low = (when & 0xffffffff);
-}
-
-void
-BroadcastInfo::set_origination_time (struct tm * now)
-{
-       _has_info = true;
-
-       if (now) {
-               _time = *now;
-       }
-
-       snprintf_bounded_null_filled (info->origination_date, sizeof (info->origination_date), "%4d-%02d-%02d",
-                 _time.tm_year + 1900,
-                 _time.tm_mon + 1,
-                 _time.tm_mday);
-
-       snprintf_bounded_null_filled (info->origination_time, sizeof (info->origination_time), "%02d:%02d:%02d",
-                 _time.tm_hour,
-                 _time.tm_min,
-                 _time.tm_sec);
+       set_originator_ref_from_session (session);
 }
 
 void
@@ -234,7 +72,7 @@ BroadcastInfo::set_originator (std::string const & str)
        _has_info = true;
 
        if (!str.empty()) {
-               snprintf_bounded_null_filled (info->originator, sizeof (info->originator), str.c_str());
+               AudioGrapher::BroadcastInfo::set_originator (str);
                return;
        }
 
@@ -242,15 +80,10 @@ BroadcastInfo::set_originator (std::string const & str)
 }
 
 void
-BroadcastInfo::set_originator_ref (Session const & session, std::string const & str)
+BroadcastInfo::set_originator_ref_from_session (Session const & session)
 {
        _has_info = true;
 
-       if (!str.empty()) {
-               snprintf_bounded_null_filled (info->originator_reference, sizeof (info->originator_reference), str.c_str());
-               return;
-       }
-
        /* random code is 9 digits */
 
        int random_code = random() % 999999999;
@@ -271,13 +104,5 @@ BroadcastInfo::set_originator_ref (Session const & session, std::string const &
 
 }
 
-void
-BroadcastInfo::update_error ()
-{
-       char errbuf[256];
-       sf_error_str (0, errbuf, sizeof (errbuf) - 1);
-       error = errbuf;
-}
-
 } // namespace ARDOUR
 
index ab77252e0513aeaea5defc9adcfdb57da68ca6b6..002bc62932f344b5b373ca6e2bb642b727de9573 100644 (file)
@@ -168,7 +168,7 @@ ExportGraphBuilder::Encoder::init_writer (boost::shared_ptr<AudioGrapher::Sndfil
        int format = get_real_format (config);
        Glib::ustring filename = config.filename->get_path (config.format);
        
-       writer.reset (new AudioGrapher::SndfileWriter<T> (filename, format, channels, config.format->sample_rate()));
+       writer.reset (new AudioGrapher::SndfileWriter<T> (filename, format, channels, config.format->sample_rate(), config.broadcast_info));
        writer->FileWritten.connect_same_thread (copy_files_connection, boost::bind (&ExportGraphBuilder::Encoder::copy_files, this, _1));
 }
 
index 988b9588a8d5f2a50bc893ee90315d157b834ed3..b4131a5cf87630b5059d50d60a27d2e7cec316ed 100644 (file)
@@ -118,9 +118,9 @@ ExportHandler::~ExportHandler ()
 }
 
 bool
-ExportHandler::add_export_config (TimespanPtr timespan, ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename)
+ExportHandler::add_export_config (TimespanPtr timespan, ChannelConfigPtr channel_config, FormatPtr format, FilenamePtr filename, boost::shared_ptr<AudioGrapher::BroadcastInfo> broadcast_info)
 {
-       FileSpec spec (channel_config, format, filename);
+       FileSpec spec (channel_config, format, filename, broadcast_info);
        ConfigPair pair (timespan, spec);
        config_map.insert (pair);
        
index 521f72747fcb32ee687b2b552b4ed2ab0bf2dc9c..40160d1ada4bea8b4815c1ac1135e00c94b322a7 100644 (file)
@@ -38,6 +38,7 @@
 #include "ardour/filename_extensions.h"
 #include "ardour/route.h"
 #include "ardour/session.h"
+#include "ardour/broadcast_info.h"
 
 #include "i18n.h"
 
@@ -122,7 +123,14 @@ ExportProfileManager::prepare_for_export ()
                     ++format_it, ++filename_it) {
 
 //                     filename->include_timespan = (ts_list->size() > 1); Disabled for now...
-                       handler->add_export_config (*ts_it, channel_config, (*format_it)->format, (*filename_it)->filename);
+
+                       boost::shared_ptr<BroadcastInfo> b;
+                       if ((*format_it)->format->has_broadcast_info()) {
+                               b.reset (new BroadcastInfo);
+                               b->set_from_session (session, (*ts_it)->get_start());
+                       }
+                       
+                       handler->add_export_config (*ts_it, channel_config, (*format_it)->format, (*filename_it)->filename, b);
                }
        }
 }
index 28286dbebf1a0636413cdd427707f0099ce4b6aa..9ab647e98e55a02d6f985d5fa951d0b4ae6d8b05 100644 (file)
@@ -532,7 +532,7 @@ SndFileSource::setup_broadcast_info (sframes_t /*when*/, struct tm& now, time_t
                return 0;
        }
 
-       _broadcast_info->set_originator_ref (_session);
+       _broadcast_info->set_originator_ref_from_session (_session);
        _broadcast_info->set_origination_time (&now);
 
        /* now update header position taking header offset into account */
diff --git a/libs/audiographer/audiographer/broadcast_info.h b/libs/audiographer/audiographer/broadcast_info.h
new file mode 100644 (file)
index 0000000..c111156
--- /dev/null
@@ -0,0 +1,86 @@
+/*
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#ifndef AUDIOGRAPHER_BROADCAST_INFO_H
+#define AUDIOGRAPHER_BROADCAST_INFO_H
+
+#include <string>
+#include <ctime>
+
+#include <sndfile.h>
+
+namespace AudioGrapher
+{
+
+class SndfileHandle;   
+
+class BroadcastInfo
+{
+  public:
+
+       /// Construct empty broadcast info
+       BroadcastInfo ();
+       virtual ~BroadcastInfo ();
+
+       /// Returns last error sring from libsndfile
+       std::string get_error () const { return error; }
+
+       /* Reading */
+
+       bool load_from_file (std::string const & filename);
+       bool load_from_file (SNDFILE* sf);
+
+       std::string get_description () const;
+       int64_t get_time_reference () const;
+       struct tm get_origination_time () const;
+       std::string get_originator () const;
+       std::string get_originator_ref () const;
+
+       /* Writing */
+
+       bool write_to_file (std::string const & filename);
+       bool write_to_file (SNDFILE* sf);
+       bool write_to_file (SndfileHandle* sf);
+
+       void set_description (std::string const & desc);
+       void set_time_reference (int64_t when);
+       void set_origination_time (struct tm * now = 0); // if 0, use time generated at construction
+       virtual void set_originator (std::string const & str = "");
+       void set_originator_ref (std::string const & str = "");
+
+       /* State info */
+
+       /// Returns true if a info has been succesfully loaded or anything has been manually set
+       bool has_info () const { return _has_info; }
+
+protected:
+
+       SF_BROADCAST_INFO * info;
+       struct tm _time;
+
+       void update_error ();
+       std::string error;
+
+       bool _has_info;
+};
+
+} // namespace AudioGrapher
+
+#endif /* AUDIOGRAPHER_BROADCAST_INFO_H */
index 38e1b8148cc60803d456a9a2b81d56370af1624e..a6f338487a96fd6dec37517c2b929e7e636f8dbc 100644 (file)
@@ -9,6 +9,7 @@
 #include "audiographer/sink.h"
 #include "audiographer/types.h"
 #include "audiographer/sndfile/sndfile_base.h"
+#include "audiographer/broadcast_info.h"
 
 #include "pbd/signals.h"
 
@@ -26,11 +27,15 @@ class SndfileWriter
   , public FlagDebuggable<>
 {
   public:
-       SndfileWriter (std::string const & path, int format, ChannelCount channels, nframes_t samplerate)
+       SndfileWriter (std::string const & path, int format, ChannelCount channels, nframes_t samplerate, boost::shared_ptr<BroadcastInfo> broadcast_info)
          : SndfileHandle (path, Write, format, channels, samplerate)
          , path (path)
        {
                add_supported_flag (ProcessContext<T>::EndOfInput);
+
+               if (broadcast_info) {
+                       broadcast_info->write_to_file (this);
+               }
        }
        
        virtual ~SndfileWriter () {}
@@ -79,4 +84,4 @@ class SndfileWriter
 
 } // namespace
 
-#endif // AUDIOGRAPHER_SNDFILE_WRITER_H
\ No newline at end of file
+#endif // AUDIOGRAPHER_SNDFILE_WRITER_H
diff --git a/libs/audiographer/src/general/broadcast_info.cc b/libs/audiographer/src/general/broadcast_info.cc
new file mode 100644 (file)
index 0000000..43e5008
--- /dev/null
@@ -0,0 +1,252 @@
+/*
+    Copyright (C) 2008 Paul Davis
+    Author: Sakari Bergen
+
+    This program is free software; you can redistribute it and/or modify
+    it under the terms of the GNU General Public License as published by
+    the Free Software Foundation; either version 2 of the License, or
+    (at your option) any later version.
+
+    This program is distributed in the hope that it will be useful,
+    but WITHOUT ANY WARRANTY; without even the implied warranty of
+    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+    GNU General Public License for more details.
+
+    You should have received a copy of the GNU General Public License
+    along with this program; if not, write to the Free Software
+    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+
+*/
+
+#include "audiographer/broadcast_info.h"
+#include "audiographer/sndfile/sndfile_base.h"
+#include <iostream>
+#include <sstream>
+#include <iomanip>
+#include <cstdarg>
+#include <cstring>
+#include <inttypes.h>
+#include <cstdlib>
+
+namespace AudioGrapher
+{
+
+static void
+snprintf_bounded_null_filled (char* target, size_t target_size, char const * fmt, ...)
+{
+       char buf[target_size+1];
+       va_list ap;
+
+       va_start (ap, fmt);
+       vsnprintf (buf, target_size+1, fmt, ap);
+       va_end (ap);
+
+       memset (target, 0, target_size);
+       memcpy (target, buf, target_size);
+
+}
+
+BroadcastInfo::BroadcastInfo ()
+       : _has_info (false)
+{
+       info = new SF_BROADCAST_INFO;
+       memset (info, 0, sizeof (*info));
+
+       // Note: Set version to 1 when UMID is used, otherwise version should stay at 0
+       info->version = 0;
+
+       time_t rawtime;
+       std::time (&rawtime);
+       _time = *localtime (&rawtime);
+}
+
+BroadcastInfo::~BroadcastInfo ()
+{
+       delete info;
+}
+
+bool
+BroadcastInfo::load_from_file (std::string const & filename)
+{
+       SNDFILE * file = 0;
+       SF_INFO info;
+
+       info.format = 0;
+
+       if (!(file = sf_open (filename.c_str(), SFM_READ, &info))) {
+               update_error();
+               return false;
+       }
+
+       bool ret = load_from_file (file);
+
+       sf_close (file);
+       return ret;
+}
+
+bool
+BroadcastInfo::load_from_file (SNDFILE* sf)
+{
+       if (sf_command (sf, SFC_GET_BROADCAST_INFO, info, sizeof (*info)) != SF_TRUE) {
+               update_error();
+               _has_info = false;
+               return false;
+       }
+
+       _has_info = true;
+       return true;
+}
+
+std::string
+BroadcastInfo::get_description () const
+{
+       return info->description;
+}
+
+int64_t
+BroadcastInfo::get_time_reference () const
+{
+       if (!_has_info) {
+               return 0;
+       }
+
+       int64_t ret = (uint32_t) info->time_reference_high;
+       ret <<= 32;
+       ret |= (uint32_t) info->time_reference_low;
+       return ret;
+}
+
+struct tm
+BroadcastInfo::get_origination_time () const
+{
+       struct tm ret;
+
+       std::string date = info->origination_date;
+       ret.tm_year = atoi (date.substr (0, 4).c_str()) - 1900;
+       ret.tm_mon = atoi (date.substr (5, 2).c_str());
+       ret.tm_mday = atoi (date.substr (8, 2).c_str());
+
+       std::string time = info->origination_time;
+       ret.tm_hour = atoi (time.substr (0,2).c_str());
+       ret.tm_min = atoi (time.substr (3,2).c_str());
+       ret.tm_sec = atoi (time.substr (6,2).c_str());
+
+       return ret;
+}
+
+std::string
+BroadcastInfo::get_originator () const
+{
+       return info->originator;
+}
+
+std::string
+BroadcastInfo::get_originator_ref () const
+{
+       return info->originator_reference;
+}
+
+bool
+BroadcastInfo::write_to_file (std::string const & filename)
+{
+       SNDFILE * file = 0;
+       SF_INFO info;
+
+       info.format = 0;
+
+       if (!(file = sf_open (filename.c_str(), SFM_RDWR, &info))) {
+               update_error();
+               return false;
+       }
+
+       bool ret = write_to_file (file);
+
+       sf_close (file);
+       return ret;
+}
+
+bool
+BroadcastInfo::write_to_file (SNDFILE* sf)
+{
+       if (sf_command (sf, SFC_SET_BROADCAST_INFO, info, sizeof (*info)) != SF_TRUE) {
+               update_error();
+               return false;
+       }
+
+       return true;
+}
+
+bool
+BroadcastInfo::write_to_file (SndfileHandle* sf)
+{
+       if (sf->command (SFC_SET_BROADCAST_INFO, info, sizeof (*info)) != SF_TRUE) {
+               update_error ();
+               return false;
+       }
+
+       return true;
+}
+
+void
+BroadcastInfo::set_description (std::string const & desc)
+{
+       _has_info = true;
+
+       snprintf_bounded_null_filled (info->description, sizeof (info->description), desc.c_str());
+}
+
+void
+BroadcastInfo::set_time_reference (int64_t when)
+{
+       _has_info = true;
+
+       info->time_reference_high = (when >> 32);
+       info->time_reference_low = (when & 0xffffffff);
+}
+
+void
+BroadcastInfo::set_origination_time (struct tm * now)
+{
+       _has_info = true;
+
+       if (now) {
+               _time = *now;
+       }
+
+       snprintf_bounded_null_filled (info->origination_date, sizeof (info->origination_date), "%4d-%02d-%02d",
+                 _time.tm_year + 1900,
+                 _time.tm_mon + 1,
+                 _time.tm_mday);
+
+       snprintf_bounded_null_filled (info->origination_time, sizeof (info->origination_time), "%02d:%02d:%02d",
+                 _time.tm_hour,
+                 _time.tm_min,
+                 _time.tm_sec);
+}
+
+void
+BroadcastInfo::set_originator (std::string const & str)
+{
+       _has_info = true;
+
+       snprintf_bounded_null_filled (info->originator, sizeof (info->originator), str.c_str());
+}
+
+void
+BroadcastInfo::set_originator_ref (std::string const & str)
+{
+       _has_info = true;
+
+       snprintf_bounded_null_filled (info->originator_reference, sizeof (info->originator_reference), str.c_str());
+}
+
+void
+BroadcastInfo::update_error ()
+{
+       char errbuf[256];
+       sf_error_str (0, errbuf, sizeof (errbuf) - 1);
+       error = errbuf;
+}
+
+} // namespace AudioGrapher
+
index 1243638d8afd6db67ffb3156feed4f31113d1c19..e25df5ec95963b670003919a5385396c22fd98ae 100644 (file)
@@ -59,6 +59,7 @@ def build(bld):
                src/general/sample_format_converter.cc
                src/routines.cc
                src/debug_utils.cc
+               src/general/broadcast_info.cc
        '''
        
        if bld.env['HAVE_SAMPLERATE']: