Add a missing #define to our MSVC project (portaudio_backend)
[ardour.git] / libs / ardour / audiofilesource.cc
index 45ec162f094ec6fcb8dac21af8497b67d77b7198..2edd06282b1129b80927b5e9129c88ade9ee0660 100644 (file)
@@ -30,6 +30,7 @@
 #include <fcntl.h>
 #include <errno.h>
 
+#include "pbd/gstdio_compat.h"
 #include "pbd/convert.h"
 #include "pbd/basename.h"
 #include "pbd/file_utils.h"
@@ -42,7 +43,6 @@
 
 #include <sndfile.h>
 
-#include <glib/gstdio.h>
 #include <glibmm/miscutils.h>
 #include <glibmm/fileutils.h>
 #include <glibmm/threads.h>
 #include <AudioToolbox/AudioFormat.h>
 #endif // HAVE_COREAUDIO
 
-#include "i18n.h"
+#include "pbd/i18n.h"
 
 using namespace std;
 using namespace ARDOUR;
 using namespace PBD;
 using namespace Glib;
 
-string AudioFileSource::peak_dir = "";
-
 PBD::Signal0<void> AudioFileSource::HeaderPositionOffsetChanged;
 framecnt_t         AudioFileSource::header_position_offset = 0;
 
@@ -133,7 +131,12 @@ AudioFileSource::AudioFileSource (Session& s, const string& path, Source::Flag f
 }
 
 
-/** Constructor used for existing internal-to-session files via XML.  File must exist. */
+/** Constructor used for sources listed in session-files (XML)
+ * and missing sources (SilentFileSource).
+ *
+ * If _origin is an absolute path after ::set_state(), then the
+ * file is external to the session.
+ */
 AudioFileSource::AudioFileSource (Session& s, const XMLNode& node, bool must_exist)
        : Source (s, node)
        , AudioSource (s, node)
@@ -143,6 +146,10 @@ AudioFileSource::AudioFileSource (Session& s, const XMLNode& node, bool must_exi
                throw failed_constructor ();
        }
 
+       if (Glib::path_is_absolute (_origin)) {
+               _path = _origin;
+       }
+
        if (init (_path, must_exist)) {
                throw failed_constructor ();
        }
@@ -164,9 +171,17 @@ AudioFileSource::init (const string& pathstr, bool must_exist)
 }
 
 string
-AudioFileSource::construct_peak_filepath (const string& audio_path) const
+AudioFileSource::construct_peak_filepath (const string& audio_path, const bool in_session, const bool old_peak_name) const
 {
-       return _session.construct_peak_filepath (audio_path);
+       string base;
+       if (old_peak_name) {
+               base = audio_path.substr (0, audio_path.find_last_of ('.'));
+       } else {
+               base = audio_path;
+       }
+       base += '%';
+       base += (char) ('A' + _channel);
+       return _session.construct_peak_filepath (base, in_session, old_peak_name);
 }
 
 bool
@@ -192,11 +207,14 @@ AudioFileSource::get_soundfile_info (const string& path, SoundFileInfo& _info, s
 XMLNode&
 AudioFileSource::get_state ()
 {
+       LocaleGuard lg;
        XMLNode& root (AudioSource::get_state());
        char buf[32];
        snprintf (buf, sizeof (buf), "%u", _channel);
        root.add_property (X_("channel"), buf);
-        root.add_property (X_("origin"), _origin);
+       root.add_property (X_("origin"), _origin);
+       snprintf (buf, sizeof (buf), "%f", _gain);
+       root.add_property (X_("gain"), buf);
        return root;
 }
 
@@ -262,12 +280,26 @@ AudioFileSource::setup_peakfile ()
                return 0;
        }
        if (!(_flags & NoPeakFile)) {
-               return initialize_peakfile (_path);
+               return initialize_peakfile (_path, within_session());
        } else {
                return 0;
        }
 }
 
+void
+AudioFileSource::set_gain (float g, bool temporarily)
+{
+       if (_gain == g) {
+               return;
+       }
+       _gain = g;
+       if (temporarily) {
+               return;
+       }
+       close_peakfile();
+       setup_peakfile ();
+}
+
 bool
 AudioFileSource::safe_audio_file_extension(const string& file)
 {
@@ -337,4 +369,4 @@ AudioFileSource::get_interleave_buffer (framecnt_t size)
 
        return ssb->buf;
 }
-       
+