summaryrefslogtreecommitdiff
path: root/libs/ardour
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-05-16 20:54:50 +0000
committerCarl Hetherington <carl@carlh.net>2010-05-16 20:54:50 +0000
commitf1114dedeecf4279a4c19a85be0c11e9fde5610b (patch)
tree090a85771cda9f207a924e38c8f14290adbda033 /libs/ardour
parent50615cd17c06a5f4c8a196182407ceee7d182635 (diff)
Move FileManager code into libpbd. Use it for SMF read/write.
git-svn-id: svn://localhost/ardour2/branches/3.0@7108 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour')
-rw-r--r--libs/ardour/ardour/audiosource.h4
-rw-r--r--libs/ardour/ardour/debug.h1
-rw-r--r--libs/ardour/ardour/file_manager.h128
-rw-r--r--libs/ardour/ardour/sndfilesource.h4
-rw-r--r--libs/ardour/debug.cc1
-rw-r--r--libs/ardour/file_manager.cc327
-rw-r--r--libs/ardour/smf_source.cc1
-rw-r--r--libs/ardour/wscript1
8 files changed, 4 insertions, 463 deletions
diff --git a/libs/ardour/ardour/audiosource.h b/libs/ardour/ardour/audiosource.h
index 9879c75a8d..fa9e3439c1 100644
--- a/libs/ardour/ardour/audiosource.h
+++ b/libs/ardour/ardour/audiosource.h
@@ -32,7 +32,7 @@
#include "ardour/source.h"
#include "ardour/ardour.h"
#include "ardour/readable.h"
-#include "ardour/file_manager.h"
+#include "pbd/file_manager.h"
#include "pbd/stateful.h"
#include "pbd/xml++.h"
@@ -141,7 +141,7 @@ class AudioSource : virtual public Source,
framecnt_t frames_per_peak);
private:
- FdFileDescriptor* _peakfile_descriptor;
+ PBD::FdFileDescriptor* _peakfile_descriptor;
int _peakfile_fd;
framecnt_t peak_leftover_cnt;
framecnt_t peak_leftover_size;
diff --git a/libs/ardour/ardour/debug.h b/libs/ardour/ardour/debug.h
index 33d973389a..57b66a8793 100644
--- a/libs/ardour/ardour/debug.h
+++ b/libs/ardour/ardour/debug.h
@@ -46,7 +46,6 @@ namespace PBD {
extern uint64_t MidiClock;
extern uint64_t Monitor;
extern uint64_t Solo;
- extern uint64_t FileManager;
}
}
diff --git a/libs/ardour/ardour/file_manager.h b/libs/ardour/ardour/file_manager.h
deleted file mode 100644
index 86eb9676fa..0000000000
--- a/libs/ardour/ardour/file_manager.h
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- Copyright (C) 2010 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#ifndef __file_manager_h__
-#define __file_manager_h__
-
-#include <sys/types.h>
-#include <string>
-#include <map>
-#include <sndfile.h>
-#include <glibmm/thread.h>
-#include "pbd/signals.h"
-
-namespace ARDOUR {
-
-class FileManager;
-
-/** Parent class for FileDescriptors.
- *
- * When a subclass is instantiated, the file it describes is added to a
- * list. The FileDescriptor can be `allocated', meaning that its
- * file will be opened on the filesystem, and can then be `released'.
- * FileDescriptors are reference counted as they are allocated and
- * released. When a descriptor's refcount is 0, the file on the
- * filesystem is eligible to be closed if necessary to free up file
- * handles for other files.
- *
- * The upshot of all this is that Ardour can manage the number of
- * open files to stay within limits imposed by the operating system.
- */
-
-class FileDescriptor
-{
-public:
- FileDescriptor (std::string const &, bool);
- virtual ~FileDescriptor () {}
-
- void release ();
-
- /** Emitted when the file is closed */
- PBD::Signal0<void> Closed;
-
-protected:
-
- friend class FileManager;
-
- /* These methods and variables must be called / accessed
- with a lock held on the FileManager's mutex
- */
-
- /** @return false on success, true on failure */
- virtual bool open () = 0;
- virtual void close () = 0;
- virtual bool is_open () const = 0;
-
- int refcount; ///< number of active users of this file
- double last_used; ///< monotonic time that this file was last allocated
- std::string name; ///< filename
- bool writeable; ///< true if it should be opened writeable, otherwise false
-
- FileManager* manager ();
-
-private:
-
- static FileManager* _manager;
-};
-
-/** FileDescriptor for a file to be opened using libsndfile */
-class SndFileDescriptor : public FileDescriptor
-{
-public:
- SndFileDescriptor (std::string const &, bool, SF_INFO *);
- ~SndFileDescriptor ();
-
- SNDFILE* allocate ();
-
-private:
-
- friend class FileManager;
-
- bool open ();
- void close ();
- bool is_open () const;
-
- SNDFILE* _sndfile; ///< SNDFILE* pointer, or 0 if the file is closed
- SF_INFO* _info; ///< libsndfile's info for this file
-};
-
-/** FileDescriptor for a file to be opened using POSIX open */
-class FdFileDescriptor : public FileDescriptor
-{
-public:
- FdFileDescriptor (std::string const &, bool, mode_t);
- ~FdFileDescriptor ();
-
- int allocate ();
-
-private:
-
- friend class FileManager;
-
- bool open ();
- void close ();
- bool is_open () const;
-
- int _fd; ///< file descriptor, or -1 if the file is closed
- mode_t _mode; ///< mode to use when creating files
-};
-
-}
-
-#endif
diff --git a/libs/ardour/ardour/sndfilesource.h b/libs/ardour/ardour/sndfilesource.h
index 2338e35bb0..58cfbf5b4f 100644
--- a/libs/ardour/ardour/sndfilesource.h
+++ b/libs/ardour/ardour/sndfilesource.h
@@ -24,7 +24,7 @@
#include "ardour/audiofilesource.h"
#include "ardour/broadcast_info.h"
-#include "ardour/file_manager.h"
+#include "pbd/file_manager.h"
namespace ARDOUR {
@@ -73,7 +73,7 @@ class SndFileSource : public AudioFileSource {
framecnt_t write_float (Sample* data, framepos_t pos, framecnt_t cnt);
private:
- SndFileDescriptor* _descriptor;
+ PBD::SndFileDescriptor* _descriptor;
SF_INFO _info;
BroadcastInfo *_broadcast_info;
diff --git a/libs/ardour/debug.cc b/libs/ardour/debug.cc
index 35a30a00c4..268ec5d033 100644
--- a/libs/ardour/debug.cc
+++ b/libs/ardour/debug.cc
@@ -43,5 +43,4 @@ uint64_t PBD::DEBUG::MackieControl = PBD::new_debug_bit ("mackiecontrol");
uint64_t PBD::DEBUG::MidiClock = PBD::new_debug_bit ("midiclock");
uint64_t PBD::DEBUG::Monitor = PBD::new_debug_bit ("monitor");
uint64_t PBD::DEBUG::Solo = PBD::new_debug_bit ("solo");
-uint64_t PBD::DEBUG::FileManager = PBD::new_debug_bit ("filemanager");
diff --git a/libs/ardour/file_manager.cc b/libs/ardour/file_manager.cc
deleted file mode 100644
index bc27459230..0000000000
--- a/libs/ardour/file_manager.cc
+++ /dev/null
@@ -1,327 +0,0 @@
-/*
- Copyright (C) 2010 Paul Davis
-
- This program is free software; you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation; either version 2 of the License, or
- (at your option) any later version.
-
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-
-*/
-
-#include <sys/time.h>
-#include <sys/resource.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <cassert>
-#include <iostream>
-#include "pbd/compose.h"
-#include "ardour/file_manager.h"
-#include "ardour/debug.h"
-
-using namespace std;
-using namespace PBD;
-using namespace ARDOUR;
-
-FileManager* FileDescriptor::_manager;
-
-namespace ARDOUR {
-
-/** Class to limit the number of files held open */
-class FileManager
-{
-public:
- FileManager ();
-
- void add (FileDescriptor *);
- void remove (FileDescriptor *);
-
- void release (FileDescriptor *);
- bool allocate (FileDescriptor *);
-
-private:
-
- void close (FileDescriptor *);
-
- std::list<FileDescriptor*> _files; ///< files we know about
- Glib::Mutex _mutex; ///< mutex for _files, _open and FileDescriptor contents
- int _open; ///< number of open files
- int _max_open; ///< maximum number of open files
-};
-
-}
-
-FileManager::FileManager ()
- : _open (0)
-{
- struct rlimit rl;
- int const r = getrlimit (RLIMIT_NOFILE, &rl);
-
- /* XXX: this is a bit arbitrary */
- if (r == 0) {
- _max_open = rl.rlim_cur - 64;
- } else {
- _max_open = 256;
- }
-
- DEBUG_TRACE (DEBUG::FileManager, string_compose ("FileManager can open up to %1 files.\n", _max_open));
-}
-
-void
-FileManager::add (FileDescriptor* d)
-{
- Glib::Mutex::Lock lm (_mutex);
- _files.push_back (d);
-}
-
-/** @return true on error, otherwise false */
-bool
-FileManager::allocate (FileDescriptor* d)
-{
- Glib::Mutex::Lock lm (_mutex);
-
- if (!d->is_open()) {
-
- /* this file needs to be opened */
-
- if (_open == _max_open) {
-
- /* We already have the maximum allowed number of files opened, so we must try to close one.
- Find the unallocated, open file with the lowest last_used time.
- */
-
- double lowest_last_used = DBL_MAX;
- list<FileDescriptor*>::iterator oldest = _files.end ();
-
- for (list<FileDescriptor*>::iterator i = _files.begin(); i != _files.end(); ++i) {
- if ((*i)->is_open() && (*i)->refcount == 0) {
- if ((*i)->last_used < lowest_last_used) {
- lowest_last_used = (*i)->last_used;
- oldest = i;
- }
- }
- }
-
- if (oldest == _files.end()) {
- /* no unallocated and open files exist, so there's nothing we can do */
- return true;
- }
-
- close (*oldest);
- DEBUG_TRACE (
- DEBUG::FileManager,
- string_compose (
- "closed file for %1 to release file handle; now have %2 of %3 open\n",
- (*oldest)->name, _open, _max_open
- )
- );
- }
-
- if (d->open ()) {
- return true;
- }
-
- _open++;
-
- DEBUG_TRACE (DEBUG::FileManager, string_compose ("opened file for %1; now have %2 of %3 open.\n", d->name, _open, _max_open));
- }
-
- struct timespec t;
- clock_gettime (CLOCK_MONOTONIC, &t);
- d->last_used = t.tv_sec + (double) t.tv_nsec / 10e9;
-
- d->refcount++;
-
- return false;
-}
-
-/** Tell FileManager that a FileDescriptor is no longer needed for a given handle */
-void
-FileManager::release (FileDescriptor* d)
-{
- Glib::Mutex::Lock lm (_mutex);
-
- d->refcount--;
- assert (d->refcount >= 0);
-}
-
-/** Remove a file from our lists. It will be closed if it is currently open. */
-void
-FileManager::remove (FileDescriptor* d)
-{
- Glib::Mutex::Lock lm (_mutex);
-
- if (d->is_open ()) {
- close (d);
- DEBUG_TRACE (
- DEBUG::FileManager,
- string_compose ("closed file for %1; file is being removed; now have %2 of %3 open\n", d->name, _open, _max_open)
- );
- }
-
- _files.remove (d);
-}
-
-void
-FileManager::close (FileDescriptor* d)
-{
- /* we must have a lock on our mutex */
-
- d->close ();
- d->Closed (); /* EMIT SIGNAL */
- _open--;
-}
-
-FileDescriptor::FileDescriptor (string const & n, bool w)
- : refcount (0)
- , last_used (0)
- , name (n)
- , writeable (w)
-{
-
-}
-
-FileManager*
-FileDescriptor::manager ()
-{
- if (_manager == 0) {
- _manager = new FileManager;
- }
-
- return _manager;
-}
-
-/** Release a previously allocated handle to this file */
-void
-FileDescriptor::release ()
-{
- manager()->release (this);
-}
-
-/** @param n Filename.
- * @param w true to open writeable, otherwise false.
- * @param i SF_INFO for the file.
- */
-
-SndFileDescriptor::SndFileDescriptor (string const & n, bool w, SF_INFO* i)
- : FileDescriptor (n, w)
- , _sndfile (0)
- , _info (i)
-{
- manager()->add (this);
-}
-
-SndFileDescriptor::~SndFileDescriptor ()
-{
- manager()->remove (this);
-}
-
-/** @return SNDFILE*, or 0 on error */
-SNDFILE*
-SndFileDescriptor::allocate ()
-{
- bool const f = manager()->allocate (this);
- if (f) {
- return 0;
- }
-
- /* this is ok thread-wise because allocate () has incremented
- the Descriptor's refcount, so the file will not be closed
- */
- return _sndfile;
-}
-
-void
-SndFileDescriptor::close ()
-{
- /* we must have a lock on the FileManager's mutex */
-
- sf_close (_sndfile);
- _sndfile = 0;
-}
-
-bool
-SndFileDescriptor::is_open () const
-{
- /* we must have a lock on the FileManager's mutex */
-
- return _sndfile != 0;
-}
-
-bool
-SndFileDescriptor::open ()
-{
- /* we must have a lock on the FileManager's mutex */
-
- _sndfile = sf_open (name.c_str(), writeable ? SFM_RDWR : SFM_READ, _info);
- return (_sndfile == 0);
-}
-
-
-/** @param n Filename.
- * @param w true to open writeable, otherwise false.
- * @param m Open mode for the file.
- */
-
-FdFileDescriptor::FdFileDescriptor (string const & n, bool w, mode_t m)
- : FileDescriptor (n, w)
- , _fd (-1)
- , _mode (m)
-{
- manager()->add (this);
-}
-
-FdFileDescriptor::~FdFileDescriptor ()
-{
- manager()->remove (this);
-}
-
-bool
-FdFileDescriptor::is_open () const
-{
- /* we must have a lock on the FileManager's mutex */
-
- return _fd != -1;
-}
-
-bool
-FdFileDescriptor::open ()
-{
- /* we must have a lock on the FileManager's mutex */
-
- _fd = ::open (name.c_str(), writeable ? (O_RDWR | O_CREAT) : O_RDONLY, _mode);
- return (_fd == -1);
-}
-
-void
-FdFileDescriptor::close ()
-{
- /* we must have a lock on the FileManager's mutex */
-
- ::close (_fd);
- _fd = -1;
-}
-
-/** @return fd, or -1 on error */
-int
-FdFileDescriptor::allocate ()
-{
- bool const f = manager()->allocate (this);
- if (f) {
- return -1;
- }
-
- /* this is ok thread-wise because allocate () has incremented
- the Descriptor's refcount, so the file will not be closed
- */
- return _fd;
-}
diff --git a/libs/ardour/smf_source.cc b/libs/ardour/smf_source.cc
index f48fc301f7..e4727761b5 100644
--- a/libs/ardour/smf_source.cc
+++ b/libs/ardour/smf_source.cc
@@ -32,7 +32,6 @@
#include <glibmm/miscutils.h>
-#include "evoral/SMFReader.hpp"
#include "evoral/Control.hpp"
#include "ardour/audioengine.h"
diff --git a/libs/ardour/wscript b/libs/ardour/wscript
index 65d733e9b6..d12ab3cc94 100644
--- a/libs/ardour/wscript
+++ b/libs/ardour/wscript
@@ -92,7 +92,6 @@ libardour_sources = [
'export_profile_manager.cc',
'export_status.cc',
'export_timespan.cc',
- 'file_manager.cc',
'file_source.cc',
'filename_extensions.cc',
'filesystem_paths.cc',