X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsource_factory.cc;h=0729f21592040c615edc9bf9154247cc59404f6c;hb=456fb789d3adcdb52de3abd863c1bf64c973effa;hp=f8b721b99a15fac60fdb2920ff32cb014ffb2d7a;hpb=7cf4419d62d286bd3a62c98e891f35678f061479;p=ardour.git diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index f8b721b99a..0729f21592 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -28,18 +28,17 @@ #include "pbd/pthread_utils.h" #include "pbd/stacktrace.h" +#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 @@ -51,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 @@ -66,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()) { @@ -88,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)); } } @@ -104,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 { @@ -145,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); @@ -198,11 +218,11 @@ SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks) } boost::shared_ptr -SourceFactory::createReadable (DataType type, Session& s, const string& path, +SourceFactory::createExternal (DataType type, Session& s, const string& path, int chn, Source::Flag flags, bool announce, bool defer_peaks) { if (type == DataType::AUDIO) { - + if (!(flags & Destructive)) { try { @@ -212,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(); } @@ -225,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 @@ -251,19 +271,18 @@ SourceFactory::createReadable (DataType type, Session& s, const string& path, } } else if (type == DataType::MIDI) { - - SMFSource* src = new SMFSource (s, path, SMFSource::Flag(0)); + + boost::shared_ptr src (new SMFSource (s, path, SMFSource::Flag(0))); src->load_model (true, true); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif - boost::shared_ptr ret (src); if (announce) { - SourceCreated (ret); + SourceCreated (src); } - return ret; + return src; } @@ -271,19 +290,19 @@ SourceFactory::createReadable (DataType type, Session& s, const string& path, } boost::shared_ptr -SourceFactory::createWritable (DataType type, Session& s, const std::string& path, const std::string& origin, +SourceFactory::createWritable (DataType type, Session& s, const std::string& path, bool destructive, framecnt_t rate, bool announce, bool defer_peaks) { /* this might throw failed_constructor(), which is OK */ if (type == DataType::AUDIO) { - Source* src = new SndFileSource (s, path, origin, - s.config.get_native_file_data_format(), - s.config.get_native_file_header_format(), - rate, - (destructive - ? Source::Flag (SndFileSource::default_writable_flags | Source::Destructive) - : SndFileSource::default_writable_flags)); + Source* src = new SndFileSource (s, path, string(), + s.config.get_native_file_data_format(), + s.config.get_native_file_header_format(), + rate, + (destructive + ? Source::Flag (SndFileSource::default_writable_flags | Source::Destructive) + : SndFileSource::default_writable_flags)); #ifdef BOOST_SP_ENABLE_DEBUG_HOOKS // boost_debug_shared_ptr_mark_interesting (src, "Source"); #endif @@ -303,6 +322,8 @@ SourceFactory::createWritable (DataType type, Session& s, const std::string& pat } else if (type == DataType::MIDI) { // 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"); @@ -320,3 +341,66 @@ SourceFactory::createWritable (DataType type, Session& s, const std::string& pat return boost::shared_ptr (); } +boost::shared_ptr +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 { + + boost::shared_ptr ap = boost::dynamic_pointer_cast(p); + + if (ap) { + + 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 (); + SourceCreated (ret); + return ret; + } + } + + catch (failed_constructor& err) { + /* relax - return at function scope */ + } + + } 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(); +} +