summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2006-12-21 18:38:00 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2006-12-21 18:38:00 +0000
commitafa29d319007ce20bd1546c343e9277c58c80c1a (patch)
tree0e1b3ec3bca91a16f3698077031d3872cdcbe96e /libs
parent2202912d355fc6f978bd3475c4c1b5cd1a435242 (diff)
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
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/configuration_vars.h2
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/ardour/utils.h9
-rw-r--r--libs/ardour/audio_diskstream.cc6
-rw-r--r--libs/ardour/globals.cc74
-rw-r--r--libs/ardour/import.cc14
-rw-r--r--libs/ardour/session.cc2
-rw-r--r--libs/ardour/utils.cc72
-rw-r--r--libs/pbd/basename.cc19
-rw-r--r--libs/pbd/pbd/basename.h6
-rw-r--r--libs/soundtouch/STTypes.h4
11 files changed, 129 insertions, 81 deletions
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<Glib::ustring> paths;
/* result */
std::vector<boost::shared_ptr<AudioRegion> > 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<AudioRegion> (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<AudioRegion> (RegionFactory::create (pending_sources, 0, first_fs->length(), region_name_from_path (first_fs->name())));
+ region = boost::dynamic_pointer_cast<AudioRegion> (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<AudioRegion> r (boost::dynamic_pointer_cast<AudioRegion> (RegionFactory::create (sources, 0, newfiles[0]->length(), region_name_from_path (Glib::path_get_basename (basepath)),
+ boost::shared_ptr<AudioRegion> r (boost::dynamic_pointer_cast<AudioRegion> (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<AudioRegion>
(RegionFactory::create (boost::static_pointer_cast<Source> (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<Region> 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 <pbd/error.h>
#include <pbd/stacktrace.h>
#include <pbd/xml++.h>
+#include <pbd/basename.h>
#include <ardour/utils.h>
#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 <iostream>
-#include <string.h>
#include <pbd/basename.h>
+#include <glibmm/miscutils.h>
+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 <string>
+#include <glibmm/ustring.h>
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_