summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2015-04-20 16:31:06 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2015-04-20 16:31:06 -0400
commitd5be54080fa25e45e8bf441e9c72e53ffa3daa72 (patch)
treeefec66f75e66c64b8e36a2625c04b8a0b798ddf9 /libs/ardour
parentd263cf7ded76d510addd90b036befd4bb7eea9d1 (diff)
add a pure virtual FileSource::close() method so that FileSource::set_path() can ensure we no longer have a handle open
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/coreaudiosource.h1
-rw-r--r--libs/ardour/ardour/file_source.h4
-rw-r--r--libs/ardour/ardour/silentfilesource.h1
-rw-r--r--libs/ardour/ardour/smf_source.h1
-rw-r--r--libs/ardour/ardour/sndfilesource.h2
-rw-r--r--libs/ardour/ardour/srcfilesource.h1
-rw-r--r--libs/ardour/coreaudiosource.cc6
-rw-r--r--libs/ardour/file_source.cc1
-rw-r--r--libs/ardour/smf_source.cc6
-rw-r--r--libs/ardour/sndfilesource.cc22
-rw-r--r--libs/ardour/srcfilesource.cc9
11 files changed, 44 insertions, 10 deletions
diff --git a/libs/ardour/ardour/coreaudiosource.h b/libs/ardour/ardour/coreaudiosource.h
index f12a67ded7..5e8e696bf9 100644
--- a/libs/ardour/ardour/coreaudiosource.h
+++ b/libs/ardour/ardour/coreaudiosource.h
@@ -48,6 +48,7 @@ class LIBARDOUR_API CoreAudioSource : public AudioFileSource {
static int get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg);
protected:
+ void close ();
framecnt_t read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) const;
framecnt_t write_unlocked (Sample *, framecnt_t) { return 0; }
diff --git a/libs/ardour/ardour/file_source.h b/libs/ardour/ardour/file_source.h
index 4f313c5eac..0929c3303f 100644
--- a/libs/ardour/ardour/file_source.h
+++ b/libs/ardour/ardour/file_source.h
@@ -89,9 +89,9 @@ public:
*/
int rename (const std::string& name);
- virtual void release_descriptor () {}
+ virtual void close () = 0;
-protected:
+ protected:
FileSource (Session& session, DataType type,
const std::string& path,
const std::string& origin,
diff --git a/libs/ardour/ardour/silentfilesource.h b/libs/ardour/ardour/silentfilesource.h
index cf6462247a..80f4b361b2 100644
--- a/libs/ardour/ardour/silentfilesource.h
+++ b/libs/ardour/ardour/silentfilesource.h
@@ -40,6 +40,7 @@ public:
bool clamped_at_unity() const { return false; }
protected:
+ void close() {}
friend class SourceFactory;
SilentFileSource (Session& s, const XMLNode& x, framecnt_t len, float srate)
diff --git a/libs/ardour/ardour/smf_source.h b/libs/ardour/ardour/smf_source.h
index d088f2d867..35e0c89297 100644
--- a/libs/ardour/ardour/smf_source.h
+++ b/libs/ardour/ardour/smf_source.h
@@ -72,6 +72,7 @@ public:
void prevent_deletion ();
protected:
+ void close ();
void set_path (const std::string& newpath);
void flush_midi (const Lock& lock);
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index 11ec6fe33c..5a4a11515c 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -75,6 +75,8 @@ class LIBARDOUR_API SndFileSource : public AudioFileSource {
static int get_soundfile_info (const std::string& path, SoundFileInfo& _info, std::string& error_msg);
protected:
+ void close ();
+
void set_path (const std::string& p);
void set_header_timeline_position ();
diff --git a/libs/ardour/ardour/srcfilesource.h b/libs/ardour/ardour/srcfilesource.h
index 78564c8b88..073329cc29 100644
--- a/libs/ardour/ardour/srcfilesource.h
+++ b/libs/ardour/ardour/srcfilesource.h
@@ -52,6 +52,7 @@ public:
bool clamped_at_unity() const { return false; }
protected:
+ void close ();
framecnt_t read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) const;
framecnt_t write_unlocked (Sample */*dst*/, framecnt_t /*cnt*/) { return 0; }
diff --git a/libs/ardour/coreaudiosource.cc b/libs/ardour/coreaudiosource.cc
index 010905d120..33753f481f 100644
--- a/libs/ardour/coreaudiosource.cc
+++ b/libs/ardour/coreaudiosource.cc
@@ -104,6 +104,12 @@ CoreAudioSource::~CoreAudioSource ()
{
}
+void
+CoreAudioSource::close ()
+{
+ af.Close ();
+}
+
int
CoreAudioSource::safe_read (Sample* dst, framepos_t start, framecnt_t cnt, AudioBufferList& abl) const
{
diff --git a/libs/ardour/file_source.cc b/libs/ardour/file_source.cc
index b4ecb157c5..507f0df49c 100644
--- a/libs/ardour/file_source.cc
+++ b/libs/ardour/file_source.cc
@@ -544,6 +544,7 @@ FileSource::set_within_session_from_path (const std::string& path)
void
FileSource::set_path (const std::string& newpath)
{
+ close ();
_path = newpath;
set_within_session_from_path (newpath);
if (_within_session) {
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index d2d96247fc..cc547ed9f5 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -202,6 +202,12 @@ SMFSource::open_for_write ()
return 0;
}
+void
+SMFSource::close ()
+{
+ /* nothing to do: file descriptor is never kept open */
+}
+
/** All stamps in audio frames */
framecnt_t
SMFSource::read_unlocked (const Lock& lock,
diff --git a/libs/ardour/sndfilesource.cc b/libs/ardour/sndfilesource.cc
index cc6cfdb4be..5acfe7b119 100644
--- a/libs/ardour/sndfilesource.cc
+++ b/libs/ardour/sndfilesource.cc
@@ -180,7 +180,7 @@ SndFileSource::SndFileSource (Session& s, const string& path, const string& orig
throw failed_constructor();
}
} else {
- /* normal mode: do not open the file here - do that in write_unlocked() as needed
+ /* normal mode: do not open the file here - do that in {read,write}_unlocked() as needed
*/
}
}
@@ -230,6 +230,15 @@ SndFileSource::init_sndfile ()
AudioFileSource::HeaderPositionOffsetChanged.connect_same_thread (header_position_connection, boost::bind (&SndFileSource::handle_header_position_change, this));
}
+void
+SndFileSource::close ()
+{
+ if (_sndfile) {
+ sf_close (_sndfile);
+ _sndfile = 0;
+ }
+}
+
int
SndFileSource::open ()
{
@@ -334,10 +343,7 @@ SndFileSource::open ()
SndFileSource::~SndFileSource ()
{
- if (_sndfile) {
- sf_close (_sndfile);
- _sndfile = 0;
- }
+ close ();
delete _broadcast_info;
delete [] xfade_buf;
}
@@ -364,10 +370,10 @@ SndFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) con
return cnt;
}
- if (_sndfile == 0) {
- error << string_compose (_("could not allocate file %1 for reading."), _path) << endmsg;
+ if (const_cast<SndFileSource*>(this)->open()) {
+ error << string_compose (_("could not open file %1 for reading."), _path) << endmsg;
return 0;
- }
+ }
if (start > _length) {
diff --git a/libs/ardour/srcfilesource.cc b/libs/ardour/srcfilesource.cc
index e54afbfaba..276a31e46b 100644
--- a/libs/ardour/srcfilesource.cc
+++ b/libs/ardour/srcfilesource.cc
@@ -84,6 +84,15 @@ SrcFileSource::~SrcFileSource ()
delete [] _src_buffer;
}
+void
+SrcFileSource::close ()
+{
+ boost::shared_ptr<FileSource> fs = boost::dynamic_pointer_cast<FileSource> (_source);
+ if (fs) {
+ fs->close ();
+ }
+}
+
framecnt_t
SrcFileSource::read_unlocked (Sample *dst, framepos_t start, framecnt_t cnt) const
{