visibility macros and flush() added to SrcFileSource; merge with master
authorPaul Davis <paul@linuxaudiosystems.com>
Sun, 19 Jan 2014 22:54:47 +0000 (17:54 -0500)
committerPaul Davis <paul@linuxaudiosystems.com>
Sun, 19 Jan 2014 22:54:47 +0000 (17:54 -0500)
1  2 
gtk2_ardour/sfdb_ui.cc
libs/ardour/ardour/panner_shell.h
libs/ardour/ardour/route.h
libs/ardour/route.cc
libs/ardour/wscript

diff --combined gtk2_ardour/sfdb_ui.cc
index 84065c69b1b4d8b1192a5a99960baef1da8a7f5e,7637025a41d367b6b425b0f71a9d353e27a11d94..90bb0a3dceaf31981f6ae698cfbb8d8c78f6e81e
@@@ -31,8 -31,6 +31,8 @@@
  
  #include <gtkmm/box.h>
  #include <gtkmm/stock.h>
 +
 +#include <glib/gstdio.h>
  #include <glibmm/fileutils.h>
  
  #include "pbd/convert.h"
@@@ -54,6 -52,7 +54,7 @@@
  #include "ardour/source_factory.h"
  #include "ardour/session.h"
  #include "ardour/session_directory.h"
+ #include "ardour/srcfilesource.h"
  
  #include "ardour_ui.h"
  #include "editing.h"
@@@ -391,8 -390,12 +392,12 @@@ SoundFileBox::audition (
                                SourceFactory::createExternal (DataType::AUDIO, *_session,
                                                               path, n,
                                                               Source::Flag (0), false));
-                       
-                       srclist.push_back(afs);
+                       if (afs->sample_rate() != _session->nominal_frame_rate()) {
+                               boost::shared_ptr<SrcFileSource> sfs (new SrcFileSource(*_session, afs, _src_quality));
+                               srclist.push_back(sfs);
+                       } else {
+                               srclist.push_back(afs);
+                       }
  
                } catch (failed_constructor& err) {
                        error << _("Could not access soundfile: ") << path << endmsg;
@@@ -1506,9 -1509,6 +1511,9 @@@ SoundFileOmega::check_info (const vecto
  bool
  SoundFileOmega::check_link_status (const Session* s, const vector<string>& paths)
  {
 +#ifdef PLATFORM_WINDOWS
 +      return false;
 +#else
        std::string tmpdir(Glib::build_filename (s->session_directory().sound_path(), "linktest"));
        bool ret = false;
  
                        goto out;
                }
  
 -              unlink (tmpc);
 +              ::g_unlink (tmpc);
        }
  
        ret = true;
    out:
        rmdir (tmpdir.c_str());
        return ret;
 +#endif
  }
  
  SoundFileChooser::SoundFileChooser (string title, ARDOUR::Session* s)
@@@ -1683,6 -1682,7 +1688,7 @@@ SoundFileOmega::SoundFileOmega (string 
        set_popdown_strings (src_combo, str);
        src_combo.set_active_text (str.front());
        src_combo.set_sensitive (false);
+       src_combo.signal_changed().connect (sigc::mem_fun (*this, &SoundFileOmega::src_combo_changed));
  
        reset_options ();
  
@@@ -1793,6 -1793,12 +1799,12 @@@ SoundFileOmega::get_src_quality() cons
        }
  }
  
+ void
+ SoundFileOmega::src_combo_changed()
+ {
+       preview.set_src_quality(get_src_quality());
+ }
  ImportDisposition
  SoundFileOmega::get_channel_disposition () const
  {
index 02f80c7b28bc0db237c6d298593055270f407897,da4e6e3bee2943a622bf5725dde5d31e26bbfe04..f344afd54a5569e734b35d592132a0e13d4837c7
@@@ -30,7 -30,6 +30,7 @@@
  
  #include "pbd/cartesian.h"
  
 +#include "ardour/libardour_visibility.h"
  #include "ardour/types.h"
  #include "ardour/session_object.h"
  
@@@ -47,7 -46,7 +47,7 @@@ class Pannable
  /** Class to manage panning by instantiating and controlling
   *  an appropriate Panner object for a given in/out configuration.
   */
 -class PannerShell : public SessionObject
 +class LIBARDOUR_API PannerShell : public SessionObject
  {
  public:
        PannerShell (std::string name, Session&, boost::shared_ptr<Pannable>, bool is_send = false);
@@@ -86,7 -85,6 +86,6 @@@
        bool select_panner_by_uri (std::string const uri);
  
    private:
-       friend class Route;
        void distribute_no_automation (BufferSet& src, BufferSet& dest, pframes_t nframes, gain_t gain_coeff);
        bool set_user_selected_panner_uri (std::string const uri);
  
index 5cd17ee24e006ca7e020173dade6f058fde50b72,83605d74136c5492d26e287d5a1ff8df1d68fd3b..fb2b18f177d5e54fc7af1e3c635af413f9dc487f
@@@ -43,7 -43,6 +43,7 @@@
  #include "ardour/ardour.h"
  #include "ardour/instrument_info.h"
  #include "ardour/io.h"
 +#include "ardour/libardour_visibility.h"
  #include "ardour/types.h"
  #include "ardour/mute_master.h"
  #include "ardour/route_group_member.h"
@@@ -68,7 -67,7 +68,7 @@@ class Pannable
  class CapturingProcessor;
  class InternalSend;
  
 -class Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
 +class LIBARDOUR_API Route : public SessionObject, public Automatable, public RouteGroupMember, public GraphNode, public boost::enable_shared_from_this<Route>
  {
    public:
  
        int remove_processor (boost::shared_ptr<Processor>, ProcessorStreams* err = 0, bool need_process_lock = true);
        int remove_processors (const ProcessorList&, ProcessorStreams* err = 0);
        int reorder_processors (const ProcessorList& new_order, ProcessorStreams* err = 0);
-       void set_custom_panner_uri (std::string const panner_uri);
        void disable_processors (Placement);
        void disable_processors ();
        void disable_plugins (Placement);
diff --combined libs/ardour/route.cc
index 7eb50c7695f3dc32d7c54d709c126a58cafb985c,a9122ab673381f0b3b2c315862139b642029c2f0..66a8ea706d15c37f83785837d554798293a2aa10
@@@ -1070,8 -1070,7 +1070,8 @@@ Route::add_processor_from_xml_2X (cons
  
                } else if (node.name() == "Send") {
  
 -                      processor.reset (new Send (_session, _pannable, _mute_master));
 +                      boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
 +                      processor.reset (new Send (_session, sendpan, _mute_master));
  
                } else {
  
@@@ -1569,63 -1568,6 +1569,6 @@@ Route::remove_processors (const Process
        return 0;
  }
  
- #if 0
- /* currently unused (again) -- but will come in handy soon (again)
-  * once there is an option to link route + delivery panner settings
-  */
- void
- Route::set_custom_panner_uri (std::string const panner_uri)
- {
-       if (_in_configure_processors) {
-               DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1' -- called while in_configure_processors\n"), name()));
-               return;
-       }
-       if (!_main_outs->panner_shell()->set_user_selected_panner_uri(panner_uri)) {
-               DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1 '%2' -- no change needed\n"), name(), panner_uri));
-               /* no change needed */
-               return;
-       }
-       DEBUG_TRACE (DEBUG::Panning, string_compose (_("Route::set_custom_panner_uri '%1 '%2' -- reconfigure I/O\n"), name(), panner_uri));
-       /* reconfigure I/O -- re-initialize panner modules */
-       {
-               Glib::Threads::Mutex::Lock lx (AudioEngine::instance()->process_lock ());
-               Glib::Threads::RWLock::WriterLock lm (_processor_lock);
-               for (ProcessorList::iterator p = _processors.begin(); p != _processors.end(); ++p) {
-                       boost::shared_ptr<Delivery> dl;
-                       boost::shared_ptr<Panner> panner;
-                       if ((dl = boost::dynamic_pointer_cast<Delivery> (*p)) == 0) {
-                               continue;
-                       }
-                       if (!dl->panner_shell()) {
-                               continue;
-                       }
-                       if (!(panner = dl->panner_shell()->panner())) {
-                               continue;
-                       }
-                       /* _main_outs has already been set before the loop.
-                        * Ignore the return status here. It need reconfiguration */
-                       if (dl->panner_shell() != _main_outs->panner_shell()) {
-                               if (!dl->panner_shell()->set_user_selected_panner_uri(panner_uri)) {
-                                       continue;
-                               }
-                       }
-                       ChanCount in = panner->in();
-                       ChanCount out = panner->out();
-                       dl->panner_shell()->configure_io(in, out);
-                       dl->panner_shell()->pannable()->set_panner(dl->panner_shell()->panner());
-               }
-       }
-       processors_changed (RouteProcessorChange ()); /* EMIT SIGNAL */
-       _session.set_dirty ();
- }
- #endif
  void
  Route::reset_instrument_info ()
  {
  int
  Route::configure_processors (ProcessorStreams* err)
  {
 +#ifndef PLATFORM_WINDOWS
        assert (!AudioEngine::instance()->process_lock().trylock());
 +#endif
 +
        if (!_in_configure_processors) {
                Glib::Threads::RWLock::WriterLock lm (_processor_lock);
                return configure_processors_unlocked (err);
@@@ -1712,9 -1651,7 +1655,9 @@@ Route::try_configure_processors_unlocke
  int
  Route::configure_processors_unlocked (ProcessorStreams* err)
  {
 +#ifndef PLATFORM_WINDOWS
        assert (!AudioEngine::instance()->process_lock().trylock());
 +#endif
  
        if (_in_configure_processors) {
                return 0;
@@@ -2765,8 -2702,7 +2708,8 @@@ Route::add_aux_send (boost::shared_ptr<
  
                {
                        Glib::Threads::Mutex::Lock lm (AudioEngine::instance()->process_lock ());
 -                      listener.reset (new InternalSend (_session, _pannable, _mute_master, route, Delivery::Aux));
 +                      boost::shared_ptr<Pannable> sendpan (new Pannable (_session));
 +                      listener.reset (new InternalSend (_session, sendpan, _mute_master, route, Delivery::Aux));
                }
  
                add_processor (listener, before);
@@@ -2853,7 -2789,7 +2796,7 @@@ Route::feeds (boost::shared_ptr<Route> 
  {
        const FedBy& fed_by (other->fed_by());
  
 -      for (FedBy::iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
 +      for (FedBy::const_iterator f = fed_by.begin(); f != fed_by.end(); ++f) {
                boost::shared_ptr<Route> sr = f->r.lock();
  
                if (sr && (sr.get() == this)) {
diff --combined libs/ardour/wscript
index 799349c22542a25170bff0b339231f1a54c2f507,608bbf199198cf6fe25278918a8debc42822d48c..56c864ca509cb97b01b3ded6c3f13b74797edad1
@@@ -2,7 -2,6 +2,7 @@@
  from waflib.extras import autowaf as autowaf
  from waflib import Options
  import os
 +import sys
  import re
  import subprocess
  import sys
@@@ -107,7 -106,6 +107,7 @@@ libardour_sources = 
          'io_processor.cc',
          'kmeterdsp.cc',
          'ladspa_plugin.cc',
 +        'ladspa_search_path.cc',
          'location.cc',
          'location_importer.cc',
          'ltc_slave.cc',
          'source.cc',
          'source_factory.cc',
          'speakers.cc',
+         'srcfilesource.cc',
          'strip_silence.cc',
          'revision.cc',
          'tape_file_matcher.cc',
@@@ -243,24 -242,23 +244,24 @@@ def configure(conf)
      autowaf.build_version_files(
          path_prefix + 'ardour/version.h',
          path_prefix + 'version.cc',
 -        'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0)
 +        'libardour3', conf.env['MAJOR'], conf.env['MINOR'], 0,
 +        'LIBARDOUR_API', 'ardour/libardour_visibility.h')
      autowaf.configure(conf)
      autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO',
                        atleast_version='0.3.2')
      autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO4',
                        atleast_version='0.4.0', mandatory=False)
      autowaf.check_pkg(conf, 'libxml-2.0', uselib_store='XML')
 -    autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
 -                      atleast_version='0.4.0')
 +    if Options.options.dist_target != 'mingw':
 +        autowaf.check_pkg(conf, 'lrdf', uselib_store='LRDF',
 +                          atleast_version='0.4.0')
 +        autowaf.check_pkg(conf, 'aubio', uselib_store='AUBIO',
 +                          atleast_version='0.3.2')
      autowaf.check_pkg(conf, 'samplerate', uselib_store='SAMPLERATE',
                        atleast_version='0.1.0')
      autowaf.check_pkg(conf, 'sigc++-2.0', uselib_store='SIGCPP',
                        atleast_version='2.0')
  
 -    if re.search ("linux", sys.platform) != None:
 -        autowaf.check_pkg(conf, 'alsa', uselib_store='ALSA')
 -
      if Options.options.lv2:
          autowaf.check_pkg(conf, 'lv2', uselib_store='LV2',
                            atleast_version='1.0.0', mandatory=True)
      autowaf.check_pkg(conf, 'libcurl', uselib_store='CURL',
                        atleast_version='7.0.0')
  
 -    # we don't try to detect this, since its part of our source tree
 -
 -    conf.define('HAVE_RUBBERBAND', 1) # controls whether we think we have it
 -    conf.define('USE_RUBBERBAND', 1)  # controls whether we actually use it
 +    # controls whether we actually use it in preference to soundtouch
 +    # Note: as of 2104, soundtouch (WSOLA) has been out-of-use for years.
 +    conf.define('USE_RUBBERBAND', 1)  
  
      conf.define('CURRENT_SESSION_FILE_VERSION', CURRENT_SESSION_FILE_VERSION)
  
@@@ -320,44 -319,40 +321,44 @@@ def build(bld)
      # major increment <=> incompatible changes
      # minor increment <=> compatible changes (additions)
      # micro increment <=> no interface changes
 -    LIBARDOUR_LIB_VERSION = "3.0.0."
 +    LIBARDOUR_LIB_VERSION = "3.0.0"
  
      # Library
      if bld.is_defined ('INTERNAL_SHARED_LIBS'):
          obj              = bld.shlib(features = 'c cxx cshlib cxxshlib', source=libardour_sources)
 +        # macros for this shared library
 +        obj.defines      = [ 'LIBARDOUR_DLL_EXPORTS=1' ]
      else:
          obj              = bld.stlib(features = 'c cxx cstlib cxxstlib', source=libardour_sources)
          obj.cxxflags     = [ '-fPIC' ]
          obj.cflags       = [ '-fPIC' ]
 +        obj.defines      = []
  
      obj.export_includes = ['.']
      obj.includes     = ['.', '../surfaces/control_protocol', '..']
 -    obj.name         = 'ardour'
 +    obj.name         = 'libardour'
      obj.target       = 'ardour'
      obj.uselib       = ['GLIBMM','GTHREAD','AUBIO','SIGCPP','XML','UUID',
                          'SNDFILE','SAMPLERATE','LRDF','AUDIOUNITS',
 -                        'OSX','BOOST','CURL','DL']
 -    obj.use          = ['libpbd','libmidipp','libevoral','libvampplugin',
 -                        'libaudiographer','libltc','libtimecode']
 +                        'OSX','BOOST','CURL','DL','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
 +    obj.use          = ['libpbd','libmidipp','libevoral',
 +                        'libaudiographer', 
 +                        'libtimecode',
 +                        ]
      if bld.is_defined('USE_EXTERNAL_LIBS'):
 -        obj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
 -                           'VAMPHOSTSDK'])
 +        obj.uselib.extend(['VAMPSDK', 'LIBLTC'])
      else:
 -        obj.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost'])
 +        obj.use.extend(['librubberband', 'libltc_includes', 'libltc'])
  
      obj.vnum         = LIBARDOUR_LIB_VERSION
      obj.install_path = os.path.join(bld.env['LIBDIR'], 'ardour3')
 -    obj.defines      = [
 +    obj.defines      += [
          'PACKAGE="' + I18N_PACKAGE + '"',
          'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
          'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
          'LOCALEDIR="' + os.path.join(os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
          'PROGRAM_NAME="' + bld.env['PROGRAM_NAME'] + '"',
 -        'EVORAL_MIDI_XML=1' 
 +        'EVORAL_MIDI_XML=1',
          ]
  
      #obj.source += ' st_stretch.cc st_pitch.cc '
          testcommon.source       = ['test/testrunner.cc', 'test/test_needing_session.cc',
                                     'test/test_common.cc', 'test/dummy_lxvst.cc', 'test/audio_region_test.cc', 'test/test_util.cc']
          testcommon.uselib       = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
 -                                   'SAMPLERATE','XML','LRDF','COREAUDIO']
 +                                   'SAMPLERATE','XML','LRDF','COREAUDIO','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
          testcommon.use          = ['libpbd','libmidipp','libevoral',
 -                                   'libvampplugin','libaudiographer','ardour']
 +                                   'libaudiographer','ardour']
          if bld.is_defined('USE_EXTERNAL_LIBS'):
 -            testcommon.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
 -                                      'VAMPHOSTSDK'])
 +            testcommon.uselib.extend(['LIBLTC',])
          else:
 -            testcommon.use.extend(['libltc', 'librubberband', 'libtaglib', 'libvamphost'])
 +            testcommon.use.extend(['libltc', 'librubberband'])
          testcommon.defines      = [
              'DATA_DIR="' + os.path.normpath(bld.env['DATADIR']) + '"',
              'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
              'LOCALEDIR="' + os.path.join(
                  os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
 -            'VAMP_DIR="' + os.path.join(
 -                os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
              ]
          testcommon.name         = 'testcommon'
  
                  testcommon.source += [ 'sse_functions_64bit.s' ]
  
          if bld.env['SINGLE_TESTS']:
 +            create_ardour_test_program(bld, obj.includes, 'audio_engine_test', 'test_audio_engine', ['test/audio_engine_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'automation_list_property_test', 'test_automation_list_property', ['test/automation_list_property_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'bbt', 'test_bbt', ['test/bbt_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'tempo', 'test_tempo', ['test/tempo_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'framepos_minus_beats', 'test_framepos_minus_beats', ['test/framepos_minus_beats_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'playlist_equivalent_regions', 'test_playlist_equivalent_regions', ['test/playlist_equivalent_regions_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'playlist_layering', 'test_playlist_layering', ['test/playlist_layering_test.cc'])
 +            create_ardour_test_program(bld, obj.includes, 'plugins_test', 'test_plugins', ['test/plugins_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'region_naming', 'test_region_naming', ['test/region_naming_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'control_surface', 'test_control_surfaces', ['test/control_surfaces_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'mtdm_test', 'test_mtdm', ['test/mtdm_test.cc'])
              create_ardour_test_program(bld, obj.includes, 'session_test', 'test_session', ['test/session_test.cc'])
  
          test_sources  = '''
 +            test/audio_engine_test.cc
              test/automation_list_property_test.cc
              test/bbt_test.cc
              test/tempo_test.cc
              test/framepos_minus_beats_test.cc
              test/playlist_equivalent_regions_test.cc
              test/playlist_layering_test.cc
 +            test/plugins_test.cc
              test/region_naming_test.cc
              test/control_surfaces_test.cc
              test/mtdm_test.cc
              'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
              'LOCALEDIR="' + os.path.join(
                  os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
 -            'VAMP_DIR="' + os.path.join(
 -                os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
              ]
          if bld.env['FPU_OPTIMIZATION']:
              session_load_tester.source += [ 'sse_functions_xmm.cc' ]
                  'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
                  'LOCALEDIR="' + os.path.join(
                      os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
 -                'VAMP_DIR="' + os.path.join(
 -                    os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
                  ]
              if bld.env['FPU_OPTIMIZATION']:
                  profilingobj.source += [ 'sse_functions_xmm.cc' ]
@@@ -551,13 -549,15 +552,13 @@@ def create_ardour_test_program(bld, inc
      testobj.includes     = includes + ['test', '../pbd', '..']
      testobj.source       = sources
      testobj.uselib       = ['CPPUNIT','SIGCPP','GLIBMM','GTHREAD',
 -                            'SAMPLERATE','XML','LRDF','COREAUDIO']
 -    testobj.use          = ['libpbd','libmidipp','libevoral','libvampplugin',
 +                            'SAMPLERATE','XML','LRDF','COREAUDIO','TAGLIB','VAMPSDK','VAMPHOSTSDK','RUBBERBAND']
 +    testobj.use          = ['libpbd','libmidipp','libevoral',
                              'libaudiographer','ardour','testcommon']
      if bld.is_defined('USE_EXTERNAL_LIBS'):
 -        testobj.uselib.extend(['RUBBERBAND', 'TAGLIB', 'LIBLTC', 'VAMPSDK',
 -                               'VAMPHOSTSDK'])
 +        testobj.uselib.extend(['LIBLTC'])
      else:
 -        testobj.use.extend(['libltc', 'librubberband', 'libtaglib',
 -                            'libvamphost'])
 +        testobj.use.extend(['libltc'])
  
      testobj.name         = name
      testobj.target       = target
          'CONFIG_DIR="' + os.path.normpath(bld.env['SYSCONFDIR']) + '"',
          'LOCALEDIR="' + os.path.join(
              os.path.normpath(bld.env['DATADIR']), 'locale') + '"',
 -        'VAMP_DIR="' + os.path.join(
 -            os.path.normpath(bld.env['LIBDIR']), 'ardour3', 'vamp') + '"'
          ]
  
  def shutdown():