summaryrefslogtreecommitdiff
path: root/libs
diff options
context:
space:
mode:
authorMathias Buhr <napcode@apparatus.de>2015-08-29 13:48:05 +0200
committerMathias Buhr <mathias.buhr@citrix.com>2015-09-03 09:54:23 +0200
commit624f76b229b8e71f9c57aa60da1ac2046b0578cd (patch)
treea16708eee0c4590f08b9899c9ec7c46e218ca533 /libs
parent95b144ee583e49d8532749a1e820f93c5f701381 (diff)
Fixes case where audiofiles used wrong peakfiles
Diffstat (limited to 'libs')
-rw-r--r--libs/ardour/ardour/audio_playlist_source.h2
-rw-r--r--libs/ardour/ardour/audiofilesource.h2
-rw-r--r--libs/ardour/ardour/audiosource.h4
-rw-r--r--libs/ardour/ardour/session.h2
-rw-r--r--libs/ardour/audio_playlist_source.cc2
-rw-r--r--libs/ardour/audiofilesource.cc23
-rw-r--r--libs/ardour/audiosource.cc2
-rw-r--r--libs/ardour/file_source.cc8
-rw-r--r--libs/ardour/session.cc39
-rw-r--r--libs/ardour/session_state.cc2
10 files changed, 46 insertions, 40 deletions
diff --git a/libs/ardour/ardour/audio_playlist_source.h b/libs/ardour/ardour/audio_playlist_source.h
index ad278bad0d..85f29bd79a 100644
--- a/libs/ardour/ardour/audio_playlist_source.h
+++ b/libs/ardour/ardour/audio_playlist_source.h
@@ -37,7 +37,7 @@ public:
virtual ~AudioPlaylistSource ();
bool empty() const;
- std::string generate_peak_path (const std::string& audio_path);
+ std::string construct_peak_filepath (const std::string& audio_path) const;
uint32_t n_channels() const;
bool clamped_at_unity () const { return false; }
diff --git a/libs/ardour/ardour/audiofilesource.h b/libs/ardour/ardour/audiofilesource.h
index 45b465c27f..da4f9aaea5 100644
--- a/libs/ardour/ardour/audiofilesource.h
+++ b/libs/ardour/ardour/audiofilesource.h
@@ -39,7 +39,7 @@ class LIBARDOUR_API AudioFileSource : public AudioSource, public FileSource {
public:
virtual ~AudioFileSource ();
- std::string generate_peak_path (const std::string& audio_path);
+ std::string construct_peak_filepath (const std::string& audio_filepath) const;
std::string find_broken_peakfile (const std::string& missing_peak_path,
const std::string& audio_path);
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h
index 6503aa7f73..4c6463e5b3 100644
--- a/libs/ardour/ardour/audiosource.h
+++ b/libs/ardour/ardour/audiosource.h
@@ -136,9 +136,9 @@ class LIBARDOUR_API AudioSource : virtual public Source,
virtual framecnt_t read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) const = 0;
virtual framecnt_t write_unlocked (Sample *dst, framecnt_t cnt) = 0;
- virtual std::string generate_peak_path(const std::string& audio_path) = 0;
+ virtual std::string construct_peak_filepath(const std::string& audio_filepath) const = 0;
virtual std::string find_broken_peakfile (std::string /* missing_peak_path */,
- std::string audio_path) { return generate_peak_path (audio_path); }
+ std::string audio_path) { return construct_peak_filepath (audio_path); }
virtual int read_peaks_with_fpp (PeakData *peaks,
framecnt_t npeaks, framepos_t start, framecnt_t cnt,
diff --git a/libs/ardour/ardour/session.h b/libs/ardour/ardour/session.h
index 1ab53606ee..2e223beba7 100644
--- a/libs/ardour/ardour/session.h
+++ b/libs/ardour/ardour/session.h
@@ -198,7 +198,7 @@ class LIBARDOUR_API Session : public PBD::StatefulDestructible, public PBD::Scop
std::string plugins_dir () const; ///< Plugin state
std::string externals_dir () const; ///< Links to external files
- std::string peak_path (const std::string&) const;
+ std::string construct_peak_filepath (const std::string&) const;
bool audio_source_name_is_unique (const std::string& name);
std::string format_audio_source_name (const std::string& legalized_base, uint32_t nchan, uint32_t chan, bool destructive, bool take_required, uint32_t cnt, bool related_exists);
diff --git a/libs/ardour/audio_playlist_source.cc b/libs/ardour/audio_playlist_source.cc
index 9415065b8f..82917aaa7a 100644
--- a/libs/ardour/audio_playlist_source.cc
+++ b/libs/ardour/audio_playlist_source.cc
@@ -217,7 +217,7 @@ AudioPlaylistSource::setup_peakfile ()
}
string
-AudioPlaylistSource::generate_peak_path (const string& /*audio_path_IGNORED*/)
+AudioPlaylistSource::construct_peak_filepath (const string& /*audio_path_IGNORED*/) const
{
return _peak_path;
}
diff --git a/libs/ardour/audiofilesource.cc b/libs/ardour/audiofilesource.cc
index 0fd7ec9ec3..a6942e678b 100644
--- a/libs/ardour/audiofilesource.cc
+++ b/libs/ardour/audiofilesource.cc
@@ -164,26 +164,9 @@ AudioFileSource::init (const string& pathstr, bool must_exist)
}
string
-AudioFileSource::generate_peak_path (const string& audio_path)
+AudioFileSource::construct_peak_filepath (const string& audio_path) const
{
- string base;
-
- string::size_type suffix = audio_path.find_last_of ('.');
-
- if (suffix != string::npos) {
- base = audio_path.substr (0, suffix);
- } else {
- warning << string_compose (_("Odd audio file path: %1"), audio_path) << endmsg;
- base = audio_path;
- }
-
- base += '%';
- base += (char) ('A' + _channel);
-
- /* pass in the name/path of the source, with no audio file type suffix
- */
-
- return _session.peak_path (base);
+ return _session.construct_peak_filepath (audio_path);
}
string
@@ -230,7 +213,7 @@ AudioFileSource::find_broken_peakfile (const string& peak_path, const string& au
string
AudioFileSource::broken_peak_path (const string& audio_path)
{
- return _session.peak_path (basename_nosuffix (audio_path));
+ return _session.construct_peak_filepath (basename_nosuffix (audio_path));
}
string
diff --git a/libs/ardour/audiosource.cc b/libs/ardour/audiosource.cc
index 51c17b5905..01a030914d 100644
--- a/libs/ardour/audiosource.cc
+++ b/libs/ardour/audiosource.cc
@@ -239,7 +239,7 @@ AudioSource::initialize_peakfile (const string& audio_path)
{
GStatBuf statbuf;
- _peakpath = generate_peak_path (audio_path);
+ _peakpath = construct_peak_filepath (audio_path);
DEBUG_TRACE(DEBUG::Peaks, string_compose ("Initialize Peakfile %1 for Audio file %2\n", _peakpath, audio_path));
diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc
index 507f0df49c..43763cf2f9 100644
--- a/libs/ardour/file_source.cc
+++ b/libs/ardour/file_source.cc
@@ -58,7 +58,7 @@ FileSource::FileSource (Session& session, DataType type, const string& path, con
, _path (path)
, _file_is_new (!origin.empty()) // if origin is left unspecified (empty string) then file must exist
, _channel (0)
- , _origin (origin)
+ , _origin (origin)
{
set_within_session_from_path (path);
}
@@ -148,9 +148,9 @@ FileSource::set_state (const XMLNode& node, int /*version*/)
_channel = 0;
}
- if ((prop = node.property (X_("origin"))) != 0) {
- _origin = prop->value();
- }
+ if ((prop = node.property (X_("origin"))) != 0) {
+ _origin = prop->value();
+ }
return 0;
}
diff --git a/libs/ardour/session.cc b/libs/ardour/session.cc
index ad97781c89..d382077827 100644
--- a/libs/ardour/session.cc
+++ b/libs/ardour/session.cc
@@ -107,6 +107,8 @@
#include "i18n.h"
+#include <glibmm/checksum.h>
+
namespace ARDOUR {
class MidiSource;
class Processor;
@@ -4362,19 +4364,20 @@ Session::count_sources_by_origin (const string& path)
}
string
-Session::peak_path (const string& base) const
+Session::construct_peak_filepath (const string& filepath) const
{
- if (Glib::path_is_absolute (base)) {
+ string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
+
+ if (Glib::path_is_absolute (filepath)) {
/* rip the session dir from the audiofile source */
string session_path;
- string interchange_dir_string = string (interchange_dir_name) + G_DIR_SEPARATOR;
bool in_another_session = true;
- if (base.find (interchange_dir_string) != string::npos) {
+ if (filepath.find (interchange_dir_string) != string::npos) {
- session_path = Glib::path_get_dirname (base); /* now ends in audiofiles */
+ session_path = Glib::path_get_dirname (filepath); /* now ends in audiofiles */
session_path = Glib::path_get_dirname (session_path); /* now ends in session name */
session_path = Glib::path_get_dirname (session_path); /* now ends in interchange */
session_path = Glib::path_get_dirname (session_path); /* now has session path */
@@ -4394,12 +4397,32 @@ Session::peak_path (const string& base) const
if (in_another_session) {
SessionDirectory sd (session_path);
- return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (base) + peakfile_suffix);
+ return Glib::build_filename (sd.peak_path(), Glib::path_get_basename (filepath) + peakfile_suffix);
}
}
- std::string basename = Glib::path_get_basename (base);
- return Glib::build_filename (_session_dir->peak_path(), basename + peakfile_suffix);
+ std::string filename = Glib::path_get_basename (filepath);
+ std::string path;
+ /* file is within our session: just use the filename for checksumming and leave path empty */
+
+ if (filepath.find (interchange_dir_string) == string::npos) {
+ /* the file is outside our session: add the filepath for checksummming */
+ path = Glib::path_get_dirname (filepath);
+ }
+
+ string::size_type suffix = filename.find_last_of ('.');
+
+ std::string filename_unsuffixed;
+ if (suffix != string::npos) {
+ filename_unsuffixed = filename.substr (0, suffix);
+ } else {
+ warning << string_compose (_("Odd audio file path: %1"), filepath) << endmsg;
+ filename_unsuffixed = filename;
+ }
+
+ std::string checksum = "_" + Glib::Checksum::compute_checksum(Glib::Checksum::CHECKSUM_MD5, path + G_DIR_SEPARATOR + filename);
+
+ return Glib::build_filename (_session_dir->peak_path(), filename_unsuffixed + checksum + peakfile_suffix);
}
string
diff --git a/libs/ardour/session_state.cc b/libs/ardour/session_state.cc
index 2880b2c368..0562d1801c 100644
--- a/libs/ardour/session_state.cc
+++ b/libs/ardour/session_state.cc
@@ -3052,7 +3052,7 @@ Session::cleanup_sources (CleanupReport& rep)
or for the first channel of embedded files. it will miss
some peakfiles for other channels
*/
- string peakpath = peak_path (base);
+ string peakpath = construct_peak_filepath (base);
if (Glib::file_test (peakpath.c_str(), Glib::FILE_TEST_EXISTS)) {
if (::g_unlink (peakpath.c_str()) != 0) {