X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsource_factory.cc;h=da5980599d989f3530224de70d47b10ba4e967ef;hb=3b250c54754745985f087137b7ed9058a7bb6e90;hp=891e43154978e5aab1589625b8a078f8d348033c;hpb=41b23ca647c100a3e2cd1641aff52f77216db803;p=ardour.git diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index 891e431549..da5980599d 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -30,18 +30,15 @@ #include "ardour/audioplaylist.h" #include "ardour/audio_playlist_source.h" +#include "ardour/midi_playlist.h" +#include "ardour/midi_playlist_source.h" #include "ardour/source_factory.h" #include "ardour/sndfilesource.h" #include "ardour/silentfilesource.h" -#include "ardour/rc_configuration.h" #include "ardour/smf_source.h" #include "ardour/session.h" #ifdef HAVE_COREAUDIO -#define USE_COREAUDIO_FOR_FILES -#endif - -#ifdef USE_COREAUDIO_FOR_FILES #include "ardour/coreaudiosource.h" #endif @@ -53,8 +50,8 @@ using namespace std; using namespace PBD; PBD::Signal1 > SourceFactory::SourceCreated; -Glib::Cond* SourceFactory::PeaksToBuild; -Glib::StaticMutex SourceFactory::peak_building_lock = GLIBMM_STATIC_MUTEX_INIT; +Glib::Threads::Cond SourceFactory::PeaksToBuild; +Glib::Threads::Mutex SourceFactory::peak_building_lock; std::list > SourceFactory::files_with_peaks; static void @@ -68,7 +65,7 @@ peak_thread_work () wait: if (SourceFactory::files_with_peaks.empty()) { - SourceFactory::PeaksToBuild->wait (SourceFactory::peak_building_lock); + SourceFactory::PeaksToBuild.wait (SourceFactory::peak_building_lock); } if (SourceFactory::files_with_peaks.empty()) { @@ -90,10 +87,8 @@ peak_thread_work () void SourceFactory::init () { - PeaksToBuild = new Glib::Cond(); - for (int n = 0; n < 2; ++n) { - Glib::Thread::create (sigc::ptr_fun (::peak_thread_work), false); + Glib::Threads::Thread::create (sigc::ptr_fun (::peak_thread_work)); } } @@ -106,9 +101,9 @@ SourceFactory::setup_peakfile (boost::shared_ptr s, bool async) if (async) { - Glib::Mutex::Lock lm (peak_building_lock); + Glib::Threads::Mutex::Lock lm (peak_building_lock); files_with_peaks.push_back (boost::weak_ptr (as)); - PeaksToBuild->broadcast (); + PeaksToBuild.broadcast (); } else { @@ -147,44 +142,67 @@ SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks) if (type == DataType::AUDIO) { - try { - Source* src = new SndFileSource (s, node); + /* it could be nested */ + + if (node.property ("playlist") != 0) { + + try { + boost::shared_ptr ap (new AudioPlaylistSource (s, node)); + + if (setup_peakfile (ap, true)) { + return boost::shared_ptr(); + } + + ap->check_for_analysis_data_on_disk (); + + SourceCreated (ap); + return ap; + + } catch (failed_constructor&) { + /* oh well, so much for that then ... */ + } + + } else { + + + try { + Source* src = new SndFileSource (s, node); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS - // boost_debug_shared_ptr_mark_interesting (src, "Source"); + // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif - boost::shared_ptr ret (src); - if (setup_peakfile (ret, defer_peaks)) { - return boost::shared_ptr(); + boost::shared_ptr ret (src); + if (setup_peakfile (ret, defer_peaks)) { + return boost::shared_ptr(); + } + ret->check_for_analysis_data_on_disk (); + SourceCreated (ret); + return ret; } - ret->check_for_analysis_data_on_disk (); - SourceCreated (ret); - return ret; - } - catch (failed_constructor& err) { + catch (failed_constructor& err) { -#ifdef USE_COREAUDIO_FOR_FILES +#ifdef HAVE_COREAUDIO - /* this is allowed to throw */ + /* this is allowed to throw */ - Source *src = new CoreAudioSource (s, node); + Source *src = new CoreAudioSource (s, node); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS - // boost_debug_shared_ptr_mark_interesting (src, "Source"); + // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif - boost::shared_ptr ret (src); + boost::shared_ptr ret (src); - if (setup_peakfile (ret, defer_peaks)) { - return boost::shared_ptr(); - } + if (setup_peakfile (ret, defer_peaks)) { + return boost::shared_ptr(); + } - ret->check_for_analysis_data_on_disk (); - SourceCreated (ret); - return ret; + ret->check_for_analysis_data_on_disk (); + SourceCreated (ret); + return ret; #else - throw; // rethrow + throw; // rethrow #endif + } } - } else if (type == DataType::MIDI) { boost::shared_ptr src (new SMFSource (s, node)); src->load_model (true, true); @@ -214,7 +232,7 @@ SourceFactory::createReadable (DataType type, Session& s, const string& path, // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif boost::shared_ptr ret (src); - + if (setup_peakfile (ret, defer_peaks)) { return boost::shared_ptr(); } @@ -227,7 +245,7 @@ SourceFactory::createReadable (DataType type, Session& s, const string& path, } catch (failed_constructor& err) { -#ifdef USE_COREAUDIO_FOR_FILES +#ifdef HAVE_COREAUDIO Source* src = new CoreAudioSource (s, path, chn, flags); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS @@ -253,7 +271,7 @@ SourceFactory::createReadable (DataType type, Session& s, const string& path, } } else if (type == DataType::MIDI) { - + SMFSource* src = new SMFSource (s, path, SMFSource::Flag(0)); src->load_model (true, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS @@ -306,7 +324,7 @@ SourceFactory::createWritable (DataType type, Session& s, const std::string& pat // XXX writable flags should belong to MidiSource too boost::shared_ptr src (new SMFSource (s, path, SndFileSource::default_writable_flags)); assert (src->writable ()); - + src->load_model (true, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS // boost_debug_shared_ptr_mark_interesting (src, "Source"); @@ -325,9 +343,8 @@ SourceFactory::createWritable (DataType type, Session& s, const std::string& pat } boost::shared_ptr -SourceFactory::createFromPlaylist (DataType type, Session& s, boost::shared_ptr p, const std::string& name, - uint32_t chn, frameoffset_t start, framecnt_t len, bool copy, Source::Flag flags, - bool announce, bool defer_peaks) +SourceFactory::createFromPlaylist (DataType type, Session& s, boost::shared_ptr p, const PBD::ID& orig, const std::string& name, + uint32_t chn, frameoffset_t start, framecnt_t len, bool copy, bool defer_peaks) { if (type == DataType::AUDIO) { try { @@ -335,19 +352,21 @@ SourceFactory::createFromPlaylist (DataType type, Session& s, boost::shared_ptr< boost::shared_ptr ap = boost::dynamic_pointer_cast(p); if (ap) { - Source* src = new AudioPlaylistSource (s, name, ap, chn, start, len, copy, flags); + + if (copy) { + ap.reset (new AudioPlaylist (ap, start, len, name, true)); + start = 0; + } + + Source* src = new AudioPlaylistSource (s, orig, name, ap, chn, start, len, Source::Flag (0)); boost::shared_ptr ret (src); - + if (setup_peakfile (ret, defer_peaks)) { return boost::shared_ptr(); } - + ret->check_for_analysis_data_on_disk (); - - if (announce) { - SourceCreated (ret); - } - + SourceCreated (ret); return ret; } } @@ -358,6 +377,29 @@ SourceFactory::createFromPlaylist (DataType type, Session& s, boost::shared_ptr< } else if (type == DataType::MIDI) { + try { + + boost::shared_ptr ap = boost::dynamic_pointer_cast(p); + + if (ap) { + + if (copy) { + ap.reset (new MidiPlaylist (ap, start, len, name, true)); + start = 0; + } + + Source* src = new MidiPlaylistSource (s, orig, name, ap, chn, start, len, Source::Flag (0)); + boost::shared_ptr ret (src); + + SourceCreated (ret); + return ret; + } + } + + catch (failed_constructor& err) { + /* relax - return at function scope */ + } + } return boost::shared_ptr();