diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2007-10-11 22:07:47 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2007-10-11 22:07:47 +0000 |
commit | f7f9d6fdc40248b190ec9c6e1a886261d55777ae (patch) | |
tree | 080723e9dc35a66013b37acbafc67a6afa929302 /libs/ardour/source_factory.cc | |
parent | aa1f736a651376534acaa2268b65d42a3786fff7 (diff) |
merge from 2.0-ongoing by hand, minus key binding editor
git-svn-id: svn://localhost/ardour2/trunk@2539 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/source_factory.cc')
-rw-r--r-- | libs/ardour/source_factory.cc | 189 |
1 files changed, 125 insertions, 64 deletions
diff --git a/libs/ardour/source_factory.cc b/libs/ardour/source_factory.cc index 148f737551..c6b19c8600 100644 --- a/libs/ardour/source_factory.cc +++ b/libs/ardour/source_factory.cc @@ -19,6 +19,8 @@ */ #include <pbd/error.h> +#include <pbd/convert.h> +#include <pbd/pthread_utils.h> #include <ardour/source_factory.h> #include <ardour/sndfilesource.h> @@ -37,15 +39,69 @@ using namespace std; using namespace PBD; sigc::signal<void,boost::shared_ptr<Source> > SourceFactory::SourceCreated; +Glib::Cond* SourceFactory::PeaksToBuild; +Glib::StaticMutex SourceFactory::peak_building_lock; +std::list<boost::weak_ptr<AudioSource> > SourceFactory::files_with_peaks; + +static void +peak_thread_work () +{ + PBD::ThreadCreated (pthread_self(), string ("peakbuilder-") + to_string (pthread_self(), std::dec)); + + while (true) { + + SourceFactory::peak_building_lock.lock (); + + wait: + if (SourceFactory::files_with_peaks.empty()) { + SourceFactory::PeaksToBuild->wait (SourceFactory::peak_building_lock); + } + + if (SourceFactory::files_with_peaks.empty()) { + goto wait; + } + + boost::shared_ptr<AudioSource> as (SourceFactory::files_with_peaks.front().lock()); + SourceFactory::files_with_peaks.pop_front (); + SourceFactory::peak_building_lock.unlock (); + + if (!as) { + continue; + } + + as->setup_peakfile (); + } +} + +void +SourceFactory::init () +{ + PeaksToBuild = new Glib::Cond(); + + for (int n = 0; n < 2; ++n) { + Glib::Thread::create (sigc::ptr_fun (::peak_thread_work), false); + } +} int -SourceFactory::setup_peakfile (boost::shared_ptr<Source> s) +SourceFactory::setup_peakfile (boost::shared_ptr<Source> s, bool async) { boost::shared_ptr<AudioSource> as (boost::dynamic_pointer_cast<AudioSource> (s)); + if (as) { - if (as->setup_peakfile ()) { - error << string_compose("SourceFactory: could not set up peakfile for %1", as->name()) << endmsg; - return -1; + + if (async) { + + Glib::Mutex::Lock lm (peak_building_lock); + files_with_peaks.push_back (boost::weak_ptr<AudioSource> (as)); + PeaksToBuild->broadcast (); + + } else { + + if (as->setup_peakfile ()) { + error << string_compose("SourceFactory: could not set up peakfile for %1", as->name()) << endmsg; + return -1; + } } } @@ -60,84 +116,85 @@ SourceFactory::createSilent (Session& s, const XMLNode& node, nframes_t nframes, return ret; } +#ifdef USE_COREAUDIO_FOR_FILES boost::shared_ptr<Source> -SourceFactory::create (Session& s, const XMLNode& node) +SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks) { - /* this is allowed to throw */ - - DataType type = DataType::AUDIO; - const XMLProperty* prop = node.property("type"); - if (prop) { - type = DataType(prop->value()); - } - - if (type == DataType::AUDIO) { - -#ifdef HAVE_COREAUDIO - try { - boost::shared_ptr<Source> ret (new CoreAudioSource (s, node)); - if (setup_peakfile (ret)) { + try { + boost::shared_ptr<Source> ret (new CoreAudioSource (s, node)); + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { return boost::shared_ptr<Source>(); } - SourceCreated (ret); - return ret; - } + } + SourceCreated (ret); + return ret; + } - catch (failed_constructor& err) { - - /* this is allowed to throw */ - - boost::shared_ptr<Source> ret (new SndFileSource (s, node)); - if (setup_peakfile (ret)) { + + catch (failed_constructor& err) { + + /* this is allowed to throw */ + + boost::shared_ptr<Source> ret (new SndFileSource (s, node)); + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { return boost::shared_ptr<Source>(); } - SourceCreated (ret); - return ret; } -#else - boost::shared_ptr<Source> ret (new SndFileSource (s, node)); - - if (setup_peakfile (ret)) { - return boost::shared_ptr<Source>(); - } - SourceCreated (ret); return ret; -#endif + } - } else if (type == DataType::MIDI) { + return boost::shared_ptr<Source>(); +} - boost::shared_ptr<Source> ret (new SMFSource (s, node)); - - SourceCreated (ret); - return ret; +#else + +boost::shared_ptr<Source> +SourceFactory::create (Session& s, const XMLNode& node, bool defer_peaks) +{ + /* this is allowed to throw */ + boost::shared_ptr<Source> ret (new SndFileSource (s, node)); + + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { + return boost::shared_ptr<Source>(); + } } - return boost::shared_ptr<Source> (); + SourceCreated (ret); + return ret; } +#endif // USE_COREAUDIO_FOR_FILES + boost::shared_ptr<Source> -SourceFactory::createReadable (DataType type, Session& s, string path, int chn, AudioFileSource::Flag flags, bool announce) +SourceFactory::createReadable (DataType type, Session& s, string path, int chn, AudioFileSource::Flag flags, bool announce, bool defer_peaks) { if (type == DataType::AUDIO) { #ifdef HAVE_COREAUDIO try { boost::shared_ptr<Source> ret (new CoreAudioSource (s, path, chn, flags)); - if (setup_peakfile (ret)) { - return boost::shared_ptr<Source>(); + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { + return boost::shared_ptr<Source>(); + } } if (announce) { SourceCreated (ret); } return ret; } - + catch (failed_constructor& err) { boost::shared_ptr<Source> ret (new SndFileSource (s, path, chn, flags)); - if (setup_peakfile (ret)) { - return boost::shared_ptr<Source>(); + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { + return boost::shared_ptr<Source>(); + } } if (announce) { SourceCreated (ret); @@ -147,8 +204,10 @@ SourceFactory::createReadable (DataType type, Session& s, string path, int chn, #else boost::shared_ptr<Source> ret (new SndFileSource (s, path, chn, flags)); - if (setup_peakfile (ret)) { - return boost::shared_ptr<Source>(); + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { + return boost::shared_ptr<Source>(); + } } if (announce) { @@ -157,7 +216,7 @@ SourceFactory::createReadable (DataType type, Session& s, string path, int chn, return ret; #endif - + } else if (type == DataType::MIDI) { // FIXME: flags? @@ -174,21 +233,23 @@ SourceFactory::createReadable (DataType type, Session& s, string path, int chn, } boost::shared_ptr<Source> -SourceFactory::createWritable (DataType type, Session& s, std::string path, bool destructive, nframes_t rate, bool announce) +SourceFactory::createWritable (DataType type, Session& s, std::string path, bool destructive, nframes_t rate, bool announce, bool defer_peaks) { /* this might throw failed_constructor(), which is OK */ - + if (type == DataType::AUDIO) { boost::shared_ptr<Source> ret (new SndFileSource - (s, path, - Config->get_native_file_data_format(), - Config->get_native_file_header_format(), - rate, - (destructive ? AudioFileSource::Flag (SndFileSource::default_writable_flags | AudioFileSource::Destructive) : - SndFileSource::default_writable_flags))); - - if (setup_peakfile (ret)) { - return boost::shared_ptr<Source>(); + (s, path, + Config->get_native_file_data_format(), + Config->get_native_file_header_format(), + rate, + (destructive ? AudioFileSource::Flag (SndFileSource::default_writable_flags | AudioFileSource::Destructive) : + SndFileSource::default_writable_flags))); + + if (!defer_peaks) { + if (setup_peakfile (ret, false)) { + return boost::shared_ptr<Source>(); + } } if (announce) { SourceCreated (ret); |