summaryrefslogtreecommitdiff
path: root/libs/pbd
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2010-05-25 16:45:21 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2010-05-25 16:45:21 +0000
commit6b19aee3b511eaae2800837175e9b9a931d325e7 (patch)
tree884dfd55ed65e94c1b713d51b366bfe14909e200 /libs/pbd
parent2881a495ef8aa020a86ee761cac7a3ba74bcfc58 (diff)
split out sndfile manager code into its own file; move a couple of utility functions into gtkmm2ext ; add knob PNG generating tool ; break appearance of monitor section for now
git-svn-id: svn://localhost/ardour2/branches/3.0@7160 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/pbd')
-rw-r--r--libs/pbd/file_manager.cc85
-rw-r--r--libs/pbd/pbd/file_manager.h45
-rw-r--r--libs/pbd/pbd/sndfile_manager.h56
-rw-r--r--libs/pbd/sndfile_manager.cc92
-rw-r--r--libs/pbd/wscript1
5 files changed, 174 insertions, 105 deletions
diff --git a/libs/pbd/file_manager.cc b/libs/pbd/file_manager.cc
index 25d171b959..1ababb79bb 100644
--- a/libs/pbd/file_manager.cc
+++ b/libs/pbd/file_manager.cc
@@ -24,6 +24,7 @@
#include <fcntl.h>
#include <cassert>
#include <iostream>
+#include <cstdio>
#include "pbd/compose.h"
#include "pbd/file_manager.h"
#include "pbd/debug.h"
@@ -33,32 +34,6 @@ using namespace PBD;
FileManager* FileDescriptor::_manager;
-namespace PBD {
-
-/** 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)
{
@@ -207,64 +182,6 @@ 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.
diff --git a/libs/pbd/pbd/file_manager.h b/libs/pbd/pbd/file_manager.h
index 3f708eb44e..2d3650c2c5 100644
--- a/libs/pbd/pbd/file_manager.h
+++ b/libs/pbd/pbd/file_manager.h
@@ -23,7 +23,7 @@
#include <sys/types.h>
#include <string>
#include <map>
-#include <sndfile.h>
+#include <list>
#include <glibmm/thread.h>
#include "pbd/signals.h"
@@ -81,26 +81,6 @@ 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
@@ -144,6 +124,29 @@ private:
std::string _mode;
};
+
+/** 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
+};
+
}
#endif
diff --git a/libs/pbd/pbd/sndfile_manager.h b/libs/pbd/pbd/sndfile_manager.h
new file mode 100644
index 0000000000..a73f8cfd44
--- /dev/null
+++ b/libs/pbd/pbd/sndfile_manager.h
@@ -0,0 +1,56 @@
+/*
+ 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 __pbd_sndfile_manager_h__
+#define __pbd_sndfile_manager_h__
+
+#include <sys/types.h>
+#include <string>
+#include <map>
+#include <sndfile.h>
+#include <glibmm/thread.h>
+#include "pbd/signals.h"
+#include "pbd/file_manager.h"
+
+namespace PBD {
+
+/** 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
+};
+
+}
+
+#endif /* __pbd_sndfile_manager_h__ */
diff --git a/libs/pbd/sndfile_manager.cc b/libs/pbd/sndfile_manager.cc
new file mode 100644
index 0000000000..5637de26ee
--- /dev/null
+++ b/libs/pbd/sndfile_manager.cc
@@ -0,0 +1,92 @@
+/*
+ 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 "pbd/sndfile_manager.h"
+#include "pbd/debug.h"
+
+using namespace std;
+using namespace PBD;
+
+/** @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);
+}
+
diff --git a/libs/pbd/wscript b/libs/pbd/wscript
index 73d6c3023c..7052ad98ca 100644
--- a/libs/pbd/wscript
+++ b/libs/pbd/wscript
@@ -83,6 +83,7 @@ def build(bld):
search_path.cc
shortpath.cc
signals.cc
+ sndfile_manager.cc
stacktrace.cc
stateful_diff_command.cc
stateful.cc