From afa29d319007ce20bd1546c343e9277c58c80c1a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Thu, 21 Dec 2006 18:38:00 +0000 Subject: use ustring more; handle embedding of "paired" files as per mantis #1362 git-svn-id: svn://localhost/ardour2/trunk@1241 d708f5d6-7413-0410-9779-e7cbd77b26cf --- libs/ardour/ardour/configuration_vars.h | 2 +- libs/ardour/ardour/session.h | 2 +- libs/ardour/ardour/utils.h | 9 ++-- libs/ardour/audio_diskstream.cc | 6 +-- libs/ardour/globals.cc | 74 ++++++++++++++++++--------------- libs/ardour/import.cc | 14 +++---- libs/ardour/session.cc | 2 +- libs/ardour/utils.cc | 72 +++++++++++++++++++++++++------- libs/pbd/basename.cc | 19 +++------ libs/pbd/pbd/basename.h | 6 +-- libs/soundtouch/STTypes.h | 4 ++ 11 files changed, 129 insertions(+), 81 deletions(-) (limited to 'libs') diff --git a/libs/ardour/ardour/configuration_vars.h b/libs/ardour/ardour/configuration_vars.h index b0e79af388..67f4362095 100644 --- a/libs/ardour/ardour/configuration_vars.h +++ b/libs/ardour/ardour/configuration_vars.h @@ -124,4 +124,4 @@ CONFIG_VARIABLE (string, bwf_organization_code, "bwf-organization-code", "US") /* these variables have custom set() methods (e.g. path globbing) */ -CONFIG_VARIABLE_SPECIAL(std::string, raid_path, "raid-path", "", path_expand) +CONFIG_VARIABLE_SPECIAL(Glib::ustring, raid_path, "raid-path", "", path_expand) diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h index 6987698167..a10cbfff95 100644 --- a/libs/ardour/ardour/session.h +++ b/libs/ardour/ardour/session.h @@ -566,7 +566,7 @@ class Session : public PBD::StatefulDestructible bool multichan; bool sample_convert; volatile bool freeze; - string pathname; + std::vector paths; /* result */ std::vector > new_regions; diff --git a/libs/ardour/ardour/utils.h b/libs/ardour/ardour/utils.h index d926f52f82..0167036667 100644 --- a/libs/ardour/ardour/utils.h +++ b/libs/ardour/ardour/utils.h @@ -34,7 +34,7 @@ class XMLNode; void elapsed_time_to_str (char *buf, uint32_t seconds); -std::string legalize_for_path (std::string str); +Glib::ustring legalize_for_path (Glib::ustring str); std::ostream& operator<< (std::ostream& o, const ARDOUR::BBT_Time& bbt); XMLNode* find_named_node (const XMLNode& node, std::string name); std::string placement_as_string (ARDOUR::Placement); @@ -52,10 +52,11 @@ int cmp_nocase (const std::string& s, const std::string& s2); int tokenize_fullpath (std::string fullpath, std::string& path, std::string& name); -int touch_file(std::string path); +int touch_file(Glib::ustring path); -std::string region_name_from_path (std::string path); -std::string path_expand (std::string); +Glib::ustring path_expand (Glib::ustring); +Glib::ustring region_name_from_path (Glib::ustring path, bool strip_channels); +bool path_is_paired (Glib::ustring path, Glib::ustring& pair_base); void compute_equal_power_fades (nframes_t nframes, float* in, float* out); diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index e3b4c2b61b..4ff810df1d 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -1551,7 +1551,7 @@ AudioDiskstream::transport_stopped (struct tm& when, time_t twhen, bool abort_ca } else { string whole_file_region_name; - whole_file_region_name = region_name_from_path (channels[0].write_source->name()); + whole_file_region_name = region_name_from_path (channels[0].write_source->name(), true); /* Register a new region with the Session that describes the entire source. Do this first @@ -2214,7 +2214,7 @@ AudioDiskstream::use_pending_capture_data (XMLNode& node) try { region = boost::dynamic_pointer_cast (RegionFactory::create (pending_sources, 0, first_fs->length(), - region_name_from_path (first_fs->name()), + region_name_from_path (first_fs->name(), true), 0, AudioRegion::Flag (AudioRegion::DefaultFlags|AudioRegion::Automatic|AudioRegion::WholeFile))); region->special_set_position (0); } @@ -2228,7 +2228,7 @@ AudioDiskstream::use_pending_capture_data (XMLNode& node) } try { - region = boost::dynamic_pointer_cast (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name()))); + region = boost::dynamic_pointer_cast (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name(), true))); } catch (failed_constructor& err) { diff --git a/libs/ardour/globals.cc b/libs/ardour/globals.cc index e87633083b..74e396bac8 100644 --- a/libs/ardour/globals.cc +++ b/libs/ardour/globals.cc @@ -191,42 +191,11 @@ setup_midi () return 0; } -int -ARDOUR::init (bool use_vst, bool try_optimization) +void +setup_hardware_optimization (bool try_optimization) { bool generic_mix_functions = true; - (void) bindtextdomain(PACKAGE, LOCALEDIR); - - PBD::ID::init (); - - lrdf_init(); - Library = new AudioLibrary; - - Config = new Configuration; - - if (Config->load_state ()) { - return -1; - } - - Config->set_use_vst (use_vst); - - if (setup_midi ()) { - return -1; - } - -#ifdef HAVE_LIBLO - if (setup_osc ()) { - return -1; - } -#endif - -#ifdef VST_SUPPORT - if (Config->get_use_vst() && fst_init ()) { - return -1; - } -#endif - if (try_optimization) { #if defined (ARCH_X86) && defined (BUILD_SSE_OPTIMIZATIONS) @@ -260,7 +229,7 @@ ARDOUR::init (bool use_vst, bool try_optimization) #endif /* USE_X86_64_ASM */ if (use_sse) { - cerr << "Enabling SSE optimized routines" << endl; + info << "Using SSE optimized routines" << endmsg; // SSE SET Session::compute_peak = x86_sse_compute_peak; @@ -300,6 +269,43 @@ ARDOUR::init (bool use_vst, bool try_optimization) info << "No H/W specific optimizations in use" << endmsg; } +} + +int +ARDOUR::init (bool use_vst, bool try_optimization) +{ + (void) bindtextdomain(PACKAGE, LOCALEDIR); + + PBD::ID::init (); + + lrdf_init(); + Library = new AudioLibrary; + + Config = new Configuration; + + if (Config->load_state ()) { + return -1; + } + + Config->set_use_vst (use_vst); + + if (setup_midi ()) { + return -1; + } + +#ifdef HAVE_LIBLO + if (setup_osc ()) { + return -1; + } +#endif + +#ifdef VST_SUPPORT + if (Config->get_use_vst() && fst_init ()) { + return -1; + } +#endif + + setup_hardware_optimization (try_optimization); /* singleton - first object is "it" */ new PluginManager (); diff --git a/libs/ardour/import.cc b/libs/ardour/import.cc index 0d0a73c7a0..015b34c1b4 100644 --- a/libs/ardour/import.cc +++ b/libs/ardour/import.cc @@ -73,22 +73,22 @@ Session::import_audiofile (import_status& status) status.new_regions.clear (); - if ((in = sf_open (status.pathname.c_str(), SFM_READ, &info)) == 0) { - error << string_compose(_("Import: cannot open input sound file \"%1\""), status.pathname) << endmsg; + if ((in = sf_open (status.paths.front().c_str(), SFM_READ, &info)) == 0) { + error << string_compose(_("Import: cannot open input sound file \"%1\""), status.paths.front()) << endmsg; return -1; } else { if ((uint32_t) info.samplerate != frame_rate()) { sf_close(in); status.doing_what = _("resampling audio"); // resample to session frame_rate - if (sample_rate_convert(status, status.pathname, tmp_convert_file)) { + if (sample_rate_convert(status, status.paths.front(), tmp_convert_file)) { if ((in = sf_open (tmp_convert_file.c_str(), SFM_READ, &info)) == 0) { error << string_compose(_("Import: cannot open converted sound file \"%1\""), tmp_convert_file) << endmsg; return -1; } } else if (!status.cancel){ // error - error << string_compose(_("Import: error while resampling sound file \"%1\""), status.pathname) << endmsg; + error << string_compose(_("Import: error while resampling sound file \"%1\""), status.paths.front()) << endmsg; return -1; } else { // canceled @@ -102,7 +102,7 @@ Session::import_audiofile (import_status& status) } sounds_dir = discover_best_sound_dir (); - basepath = PBD::basename_nosuffix (status.pathname); + basepath = PBD::basename_nosuffix (status.paths.front()); for (n = 0; n < info.channels; ++n) { @@ -215,7 +215,7 @@ Session::import_audiofile (import_status& status) sources.push_back(newfiles[n]); } - boost::shared_ptr r (boost::dynamic_pointer_cast (RegionFactory::create (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)), + boost::shared_ptr r (boost::dynamic_pointer_cast (RegionFactory::create (sources, 0, newfiles[0]->length(), region_name_from_path (basepath, true), 0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile)))); status.new_regions.push_back (r); @@ -233,7 +233,7 @@ Session::import_audiofile (import_status& status) status.new_regions.push_back (boost::dynamic_pointer_cast (RegionFactory::create (boost::static_pointer_cast (newfiles[n]), 0, newfiles[n]->length(), - region_name_from_path (Glib::path_get_basename (newfiles[n]->name())), + region_name_from_path (newfiles[n]->name(), true), 0, AudioRegion::Flag (AudioRegion::DefaultFlags | AudioRegion::WholeFile | AudioRegion::Import)))); } } diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc index 932db17909..962e8487bf 100644 --- a/libs/ardour/session.cc +++ b/libs/ardour/session.cc @@ -3768,7 +3768,7 @@ Session::write_one_audio_track (AudioTrack& track, nframes_t start, nframes_t le /* construct a region to represent the bounced material */ boost::shared_ptr aregion = RegionFactory::create (srcs, 0, srcs.front()->length(), - region_name_from_path (srcs.front()->name())); + region_name_from_path (srcs.front()->name(), true)); ret = 0; } diff --git a/libs/ardour/utils.cc b/libs/ardour/utils.cc index 269a78bf4b..fbea468682 100644 --- a/libs/ardour/utils.cc +++ b/libs/ardour/utils.cc @@ -37,6 +37,7 @@ #include #include #include +#include #include #include "i18n.h" @@ -44,6 +45,7 @@ using namespace ARDOUR; using namespace std; using namespace PBD; +using Glib::ustring; void elapsed_time_to_str (char *buf, uint32_t seconds) @@ -87,6 +89,24 @@ elapsed_time_to_str (char *buf, uint32_t seconds) } } +ustring +legalize_for_path (ustring str) +{ + ustring::size_type pos; + ustring legal_chars = "abcdefghijklmnopqrtsuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_+=: "; + ustring legal; + + legal = str; + pos = 0; + + while ((pos = legal.find_first_not_of (legal_chars, pos)) != string::npos) { + legal.replace (pos, 1, "_"); + pos += 1; + } + + return legal; +} +#if 0 string legalize_for_path (string str) { @@ -104,6 +124,7 @@ legalize_for_path (string str) return legal; } +#endif ostream& operator<< (ostream& o, const BBT_Time& bbt) @@ -177,7 +198,7 @@ tokenize_fullpath (string fullpath, string& path, string& name) } int -touch_file (string path) +touch_file (ustring path) { int fd = open (path.c_str(), O_RDWR|O_CREAT, 0660); if (fd >= 0) { @@ -199,10 +220,31 @@ placement_as_string (Placement p) } } -string -region_name_from_path (string path) +ustring +region_name_from_path (ustring path, bool strip_channels) { - string::size_type pos; + path = PBD::basename_nosuffix (path); + + if (strip_channels) { + + /* remove any "?R", "?L" or "?[a-z]" channel identifier */ + + ustring::size_type len = path.length(); + + if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') && + (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) { + + path = path.substr (0, path.length() - 2); + } + } + + return path; +} + +bool +path_is_paired (ustring path, ustring& pair_base) +{ + ustring::size_type pos; /* remove filename suffixes etc. */ @@ -210,21 +252,23 @@ region_name_from_path (string path) path = path.substr (0, pos); } - /* remove any "?R", "?L" or "?[a-z]" channel identifier */ - - string::size_type len = path.length(); + ustring::size_type len = path.length(); + + /* look for possible channel identifier: "?R", "%R", ".L" etc. */ - if (len > 3 && (path[len-2] == '%' || path[len-2] == '?') && + if (len > 3 && (path[len-2] == '%' || path[len-2] == '?' || path[len-2] == '.') && (path[len-1] == 'R' || path[len-1] == 'L' || (islower (path[len-1])))) { - path = path.substr (0, path.length() - 2); - } + pair_base = path.substr (0, len-2); + return true; - return path; -} + } -string -path_expand (string path) + return false; +} + +ustring +path_expand (ustring path) { #ifdef HAVE_WORDEXP /* Handle tilde and environment variable expansion in session path */ diff --git a/libs/pbd/basename.cc b/libs/pbd/basename.cc index a51e393b78..9beed93625 100644 --- a/libs/pbd/basename.cc +++ b/libs/pbd/basename.cc @@ -1,20 +1,13 @@ -#include -#include #include +#include +using Glib::ustring; -// implement this using Glib::path_get_basename -std::string -PBD::basename_nosuffix (const std::string& str) +ustring +PBD::basename_nosuffix (ustring str) { - std::string::size_type slash = str.find_last_of ('/'); - std::string noslash; + ustring base = Glib::path_get_basename (str); - if (slash == std::string::npos) { - noslash = str; - } else { - noslash = str.substr (slash+1); - } + return base.substr (0, base.find_last_of ('.')); - return noslash.substr (0, noslash.find_last_of ('.')); } diff --git a/libs/pbd/pbd/basename.h b/libs/pbd/pbd/basename.h index a7e36acff0..a622643541 100644 --- a/libs/pbd/pbd/basename.h +++ b/libs/pbd/pbd/basename.h @@ -1,13 +1,13 @@ #ifndef __stupid_basename_h__ #define __stupid_basename_h__ -#include +#include namespace PBD { -extern std::string basename_nosuffix (const std::string&); +Glib::ustring basename_nosuffix (Glib::ustring); -} // namespace PBD +} #endif // __stupid_basename_h__ diff --git a/libs/soundtouch/STTypes.h b/libs/soundtouch/STTypes.h index c404675ecd..e1ea90d428 100644 --- a/libs/soundtouch/STTypes.h +++ b/libs/soundtouch/STTypes.h @@ -47,8 +47,12 @@ typedef unsigned long ulong; typedef unsigned int BOOL; +#ifndef FALSE #define FALSE 0 +#endif +#ifndef TRUE #define TRUE 1 +#endif #endif // _WINDEF_ -- cgit v1.2.3