diff options
author | David Robillard <d@drobilla.net> | 2007-08-06 05:30:18 +0000 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2007-08-06 05:30:18 +0000 |
commit | f68caf23ddd0bfe5c189b94f0f57b194c1e2d912 (patch) | |
tree | 69248108d45aa89feaa68679b540b9a73edc5680 /libs | |
parent | d594470148c5ac722937aa4765a15f92082c4b86 (diff) |
Genericificationalizeified AudioFilter (now Filter).
Added primitive (non-undoable, placeholder, etc) quantization.
git-svn-id: svn://localhost/ardour2/trunk@2254 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs')
-rw-r--r-- | libs/ardour/SConscript | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/audioregion.h | 6 | ||||
-rw-r--r-- | libs/ardour/ardour/filter.h (renamed from libs/ardour/ardour/audiofilter.h) | 31 | ||||
-rw-r--r-- | libs/ardour/ardour/region.h | 3 | ||||
-rw-r--r-- | libs/ardour/ardour/reverse.h | 6 | ||||
-rw-r--r-- | libs/ardour/ardour/session.h | 2 | ||||
-rw-r--r-- | libs/ardour/audioregion.cc | 8 | ||||
-rw-r--r-- | libs/ardour/filter.cc (renamed from libs/ardour/audiofilter.cc) | 35 | ||||
-rw-r--r-- | libs/ardour/region.cc | 8 | ||||
-rw-r--r-- | libs/ardour/reverse.cc | 8 | ||||
-rw-r--r-- | libs/ardour/session_state.cc | 15 | ||||
-rw-r--r-- | libs/ardour/session_timefx.cc | 2 |
12 files changed, 74 insertions, 53 deletions
diff --git a/libs/ardour/SConscript b/libs/ardour/SConscript index 5d56e198fb..a0070117e1 100644 --- a/libs/ardour/SConscript +++ b/libs/ardour/SConscript @@ -52,8 +52,8 @@ buffer_set.cc meter.cc amp.cc panner.cc +filter.cc audiofilesource.cc -audiofilter.cc audioregion.cc audiosource.cc midi_source.cc @@ -99,6 +99,7 @@ recent_sessions.cc region.cc region_factory.cc reverse.cc +quantize.cc route.cc route_group.cc send.cc diff --git a/libs/ardour/ardour/audioregion.h b/libs/ardour/ardour/audioregion.h index 52a07679af..ddda1f4321 100644 --- a/libs/ardour/ardour/audioregion.h +++ b/libs/ardour/ardour/audioregion.h @@ -38,7 +38,7 @@ namespace ARDOUR { class Route; class Playlist; class Session; -class AudioFilter; +class Filter; class AudioSource; class AudioRegion : public Region @@ -115,10 +115,6 @@ class AudioRegion : public Region int separate_by_channel (ARDOUR::Session&, vector<boost::shared_ptr<AudioRegion> >&) const; - /* filter */ - - int apply (AudioFilter&); - /* export */ int exportme (ARDOUR::Session&, ARDOUR::AudioExportSpecification&); diff --git a/libs/ardour/ardour/audiofilter.h b/libs/ardour/ardour/filter.h index 6b60544942..0e4c6b3de0 100644 --- a/libs/ardour/ardour/audiofilter.h +++ b/libs/ardour/ardour/filter.h @@ -1,5 +1,6 @@ /* - Copyright (C) 2004 Paul Davis + Copyright (C) 2007 Paul Davis + Author: Dave Robillard 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 @@ -17,34 +18,34 @@ */ -#ifndef __ardour_audiofilter_h__ -#define __ardour_audiofilter_h__ +#ifndef __ardour_filter_h__ +#define __ardour_filter_h__ #include <vector> -#include <ardour/audioregion.h> +#include <ardour/region.h> namespace ARDOUR { -class AudioRegion; +class Region; class Session; -class AudioFilter { +class Filter { public: - AudioFilter (ARDOUR::Session& s) - : session (s){} - virtual ~AudioFilter() {} + virtual ~Filter() {} - virtual int run (boost::shared_ptr<ARDOUR::AudioRegion>) = 0; - std::vector<boost::shared_ptr<ARDOUR::AudioRegion> > results; + virtual int run (boost::shared_ptr<ARDOUR::Region>) = 0; + std::vector<boost::shared_ptr<ARDOUR::Region> > results; protected: - ARDOUR::Session& session; + Filter (ARDOUR::Session& s) : session(s) {} - int make_new_sources (boost::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::SourceList&); - int finish (boost::shared_ptr<ARDOUR::AudioRegion>, ARDOUR::SourceList&); + int make_new_sources (boost::shared_ptr<ARDOUR::Region>, ARDOUR::SourceList&); + int finish (boost::shared_ptr<ARDOUR::Region>, ARDOUR::SourceList&); + + ARDOUR::Session& session; }; } /* namespace */ -#endif /* __ardour_audiofilter_h__ */ +#endif /* __ardour_filter_h__ */ diff --git a/libs/ardour/ardour/region.h b/libs/ardour/ardour/region.h index c3aac3dfa8..e6b799fdcf 100644 --- a/libs/ardour/ardour/region.h +++ b/libs/ardour/ardour/region.h @@ -35,6 +35,7 @@ class XMLNode; namespace ARDOUR { class Playlist; +class Filter; enum RegionEditState { EditChangesNothing = 0, @@ -165,6 +166,8 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro void set_opaque (bool yn); void set_locked (bool yn); void set_position_locked (bool yn); + + int apply (Filter&); virtual uint32_t read_data_count() const { return _read_data_count; } diff --git a/libs/ardour/ardour/reverse.h b/libs/ardour/ardour/reverse.h index 3296c77c62..7870b5aa2e 100644 --- a/libs/ardour/ardour/reverse.h +++ b/libs/ardour/ardour/reverse.h @@ -20,16 +20,16 @@ #ifndef __ardour_reverse_h__ #define __ardour_reverse_h__ -#include <ardour/audiofilter.h> +#include <ardour/filter.h> namespace ARDOUR { -class Reverse : public AudioFilter { +class Reverse : public Filter { public: Reverse (ARDOUR::Session&); ~Reverse (); - int run (boost::shared_ptr<ARDOUR::AudioRegion>); + int run (boost::shared_ptr<ARDOUR::Region>); }; } /* namespace */ diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 05d87620f2..63be24d9f7 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -553,7 +553,7 @@ class Session : public PBD::StatefulDestructible int region_name (string& result, string base = string(""), bool newlevel = false) const; string new_region_name (string); - string path_from_region_name (string name, string identifier); + string path_from_region_name (DataType type, string name, string identifier); boost::shared_ptr<Region> find_whole_file_parent (boost::shared_ptr<Region const>); diff --git a/libs/ardour/audioregion.cc b/libs/ardour/audioregion.cc index dcf17ba2ea..58ece331c3 100644 --- a/libs/ardour/audioregion.cc +++ b/libs/ardour/audioregion.cc @@ -38,7 +38,6 @@ #include <ardour/gain.h> #include <ardour/dB.h> #include <ardour/playlist.h> -#include <ardour/audiofilter.h> #include <ardour/audiofilesource.h> #include <ardour/region_factory.h> #include <ardour/runtime_functions.h> @@ -977,13 +976,6 @@ AudioRegion::separate_by_channel (Session& session, vector<boost::shared_ptr<Aud return 0; } -int -AudioRegion::apply (AudioFilter& filter) -{ - boost::shared_ptr<AudioRegion> ar = boost::dynamic_pointer_cast<AudioRegion> (shared_from_this()); - return filter.run (ar); -} - nframes_t AudioRegion::read_raw_internal (Sample* buf, nframes_t pos, nframes_t cnt) const { diff --git a/libs/ardour/audiofilter.cc b/libs/ardour/filter.cc index d4d59d4a60..f655f71668 100644 --- a/libs/ardour/audiofilter.cc +++ b/libs/ardour/filter.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2004 Paul Davis + Copyright (C) 2004-2007 Paul Davis 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 @@ -22,9 +22,10 @@ #include <pbd/basename.h> #include <ardour/sndfilesource.h> +#include <ardour/smf_source.h> #include <ardour/session.h> -#include <ardour/audioregion.h> -#include <ardour/audiofilter.h> +#include <ardour/region.h> +#include <ardour/filter.h> #include <ardour/region_factory.h> #include <ardour/source_factory.h> @@ -34,27 +35,28 @@ using namespace ARDOUR; using namespace PBD; int -AudioFilter::make_new_sources (boost::shared_ptr<AudioRegion> region, SourceList& nsrcs) +Filter::make_new_sources (boost::shared_ptr<Region> region, SourceList& nsrcs) { vector<string> names = region->master_source_names(); for (uint32_t i = 0; i < region->n_channels(); ++i) { - string path = session.path_from_region_name (PBD::basename_nosuffix (names[i]), string ("")); + string path = session.path_from_region_name (region->data_type(), + PBD::basename_nosuffix (names[i]), string ("")); if (path.length() == 0) { - error << string_compose (_("audiofilter: error creating name for new audio file based on %1"), region->name()) + error << string_compose (_("filter: error creating name for new file based on %1"), region->name()) << endmsg; return -1; } try { - nsrcs.push_back (boost::dynamic_pointer_cast<AudioSource> ( - SourceFactory::createWritable (DataType::AUDIO, session, path, false, session.frame_rate()))); + nsrcs.push_back (boost::dynamic_pointer_cast<Source> ( + SourceFactory::createWritable (region->data_type(), session, path, false, session.frame_rate()))); } catch (failed_constructor& err) { - error << string_compose (_("audiofilter: error creating new audio file %1 (%2)"), path, strerror (errno)) << endmsg; + error << string_compose (_("filter: error creating new file %1 (%2)"), path, strerror (errno)) << endmsg; return -1; } } @@ -63,7 +65,7 @@ AudioFilter::make_new_sources (boost::shared_ptr<AudioRegion> region, SourceList } int -AudioFilter::finish (boost::shared_ptr<AudioRegion> region, SourceList& nsrcs) +Filter::finish (boost::shared_ptr<Region> region, SourceList& nsrcs) { string region_name; @@ -75,20 +77,29 @@ AudioFilter::finish (boost::shared_ptr<AudioRegion> region, SourceList& nsrcs) time (&xnow); now = localtime (&xnow); + /* this is ugly. */ for (SourceList::iterator si = nsrcs.begin(); si != nsrcs.end(); ++si) { boost::shared_ptr<AudioFileSource> afs = boost::dynamic_pointer_cast<AudioFileSource>(*si); if (afs) { afs->update_header (region->position(), *now, xnow); afs->mark_immutable (); } + + boost::shared_ptr<SMFSource> smfs = boost::dynamic_pointer_cast<SMFSource>(*si); + if (smfs) { + smfs->update_header (region->position(), *now, xnow); + smfs->flush_footer (); + } } /* create a new region */ region_name = session.new_region_name (region->name()); results.clear (); - results.push_back (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (nsrcs, 0, region->length(), region_name, 0, - Region::Flag (Region::WholeFile|Region::DefaultFlags)))); + results.push_back (RegionFactory::create (nsrcs, 0, region->length(), region_name, 0, + Region::Flag (Region::WholeFile|Region::DefaultFlags))); return 0; } + + diff --git a/libs/ardour/region.cc b/libs/ardour/region.cc index 8ac101282d..a828460bce 100644 --- a/libs/ardour/region.cc +++ b/libs/ardour/region.cc @@ -34,6 +34,7 @@ #include <ardour/session.h> #include <ardour/source.h> #include <ardour/region_factory.h> +#include <ardour/filter.h> #include "i18n.h" @@ -1265,3 +1266,10 @@ Region::get_parent() const return boost::shared_ptr<Region>(); } +int +Region::apply (Filter& filter) +{ + return filter.run (shared_from_this()); +} + + diff --git a/libs/ardour/reverse.cc b/libs/ardour/reverse.cc index c7ebecea31..02ec2924b0 100644 --- a/libs/ardour/reverse.cc +++ b/libs/ardour/reverse.cc @@ -33,7 +33,7 @@ using namespace std; using namespace ARDOUR; Reverse::Reverse (Session& s) - : AudioFilter (s) + : Filter (s) { } @@ -42,7 +42,7 @@ Reverse::~Reverse () } int -Reverse::run (boost::shared_ptr<AudioRegion> region) +Reverse::run (boost::shared_ptr<Region> r) { SourceList nsrcs; SourceList::iterator si; @@ -53,6 +53,10 @@ Reverse::run (boost::shared_ptr<AudioRegion> region) nframes_t to_read; int ret = -1; + boost::shared_ptr<AudioRegion> region = boost::dynamic_pointer_cast<AudioRegion>(r); + if (!region) + return ret; + /* create new sources */ if (make_new_sources (region, nsrcs)) { diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc index f6debff123..a7c8dc0200 100644 --- a/libs/ardour/session_state.cc +++ b/libs/ardour/session_state.cc @@ -1502,19 +1502,24 @@ Session::get_sources_as_xml () } string -Session::path_from_region_name (string name, string identifier) +Session::path_from_region_name (DataType type, string name, string identifier) { char buf[PATH_MAX+1]; uint32_t n; SessionDirectory sdir(get_best_session_directory_for_new_source()); - string sound_dir = sdir.sound_path().to_string(); + string sound_dir = ((type == DataType::AUDIO) + ? sdir.sound_path().to_string() + : sdir.midi_path().to_string()); + + string ext = ((type == DataType::AUDIO) ? ".wav" : ".mid"); for (n = 0; n < 999999; ++n) { if (identifier.length()) { - snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 ".wav", sound_dir.c_str(), name.c_str(), - identifier.c_str(), n); + snprintf (buf, sizeof(buf), "%s/%s%s%" PRIu32 "%s", sound_dir.c_str(), name.c_str(), + identifier.c_str(), n, ext.c_str()); } else { - snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 ".wav", sound_dir.c_str(), name.c_str(), n); + snprintf (buf, sizeof(buf), "%s/%s-%" PRIu32 "%s", sound_dir.c_str(), name.c_str(), + n, ext.c_str()); } if (!Glib::file_test (buf, Glib::FILE_TEST_EXISTS)) { diff --git a/libs/ardour/session_timefx.cc b/libs/ardour/session_timefx.cc index aac77a59c7..115d3eeeec 100644 --- a/libs/ardour/session_timefx.cc +++ b/libs/ardour/session_timefx.cc @@ -85,7 +85,7 @@ Session::tempoize_region (TimeStretchRequest& tsr) rstr = names[i]; } - string path = path_from_region_name (PBD::basename_nosuffix (rstr), ident); + string path = path_from_region_name (DataType::AUDIO, PBD::basename_nosuffix (rstr), ident); if (path.length() == 0) { error << string_compose (_("tempoize: error creating name for new audio file based on %1"), tsr.region->name()) |