summaryrefslogtreecommitdiff
path: root/libs/ardour/sndfile_helpers.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-06-02 21:41:35 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-06-02 21:41:35 +0000
commit449aab3c465bbbf66d221fac3d7ea559f1720357 (patch)
tree6843cc40c88250a132acac701271f1504cd2df04 /libs/ardour/sndfile_helpers.cc
parent9c0d7d72d70082a54f823cd44c0ccda5da64bb6f (diff)
rollback to 3428, before the mysterious removal of libs/* at 3431/3432
git-svn-id: svn://localhost/ardour2/branches/3.0@3435 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'libs/ardour/sndfile_helpers.cc')
-rw-r--r--libs/ardour/sndfile_helpers.cc209
1 files changed, 209 insertions, 0 deletions
diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc
new file mode 100644
index 0000000000..58a51f8bbe
--- /dev/null
+++ b/libs/ardour/sndfile_helpers.cc
@@ -0,0 +1,209 @@
+/*
+ Copyright (C) 2000-2007 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 <map>
+#include <vector>
+
+#include <pbd/convert.h>
+
+#include <sndfile.h>
+#include <ardour/sndfile_helpers.h>
+
+#include "i18n.h"
+
+using std::map;
+using namespace std;
+
+const char * const sndfile_header_formats_strings[SNDFILE_HEADER_FORMATS+1] = {
+ N_("WAV"),
+ N_("AIFF"),
+ N_("CAF"),
+ N_("W64 (64 bit WAV)"),
+ N_("raw (no header)"),
+ 0
+};
+
+const char* const sndfile_file_endings_strings[SNDFILE_HEADER_FORMATS+1] = {
+ N_(".wav"),
+ N_(".aiff"),
+ N_(".caf"),
+ N_(".w64"),
+ N_(".raw"),
+ 0
+};
+
+int sndfile_header_formats[SNDFILE_HEADER_FORMATS] = {
+ SF_FORMAT_WAV,
+ SF_FORMAT_AIFF,
+ SF_FORMAT_CAF,
+ SF_FORMAT_W64,
+ SF_FORMAT_RAW
+};
+
+const char * const sndfile_bitdepth_formats_strings[SNDFILE_BITDEPTH_FORMATS+1] = {
+ N_("Signed 16 bit PCM"),
+ N_("Signed 24 bit PCM"),
+ N_("Signed 32 bit PCM"),
+ N_("Signed 8 bit PCM"),
+ N_("32 bit float"),
+ 0
+};
+
+int sndfile_bitdepth_formats[SNDFILE_BITDEPTH_FORMATS] = {
+ SF_FORMAT_PCM_16,
+ SF_FORMAT_PCM_24,
+ SF_FORMAT_PCM_32,
+ SF_FORMAT_PCM_S8,
+ SF_FORMAT_FLOAT
+};
+
+const char * const sndfile_endian_formats_strings[SNDFILE_ENDIAN_FORMATS+1] = {
+ N_("Little-endian (Intel)"),
+ N_("Big-endian (Mac)"),
+ 0
+};
+
+int sndfile_endian_formats[SNDFILE_ENDIAN_FORMATS] = {
+ SF_ENDIAN_LITTLE,
+ SF_ENDIAN_BIG
+};
+
+int
+sndfile_header_format_from_string (string str)
+{
+ for (int n = 0; sndfile_header_formats_strings[n]; ++n) {
+ if (str == sndfile_header_formats_strings[n]) {
+ return sndfile_header_formats[n];
+ }
+ }
+ return -1;
+}
+
+int
+sndfile_bitdepth_format_from_string (string str)
+{
+ for (int n = 0; sndfile_bitdepth_formats_strings[n]; ++n) {
+ if (str == sndfile_bitdepth_formats_strings[n]) {
+ return sndfile_bitdepth_formats[n];
+ }
+ }
+ return -1;
+}
+
+int
+sndfile_endian_format_from_string (string str)
+{
+ for (int n = 0; sndfile_endian_formats_strings[n]; ++n) {
+ if (str == sndfile_endian_formats_strings[n]) {
+ return sndfile_endian_formats[n];
+ }
+ }
+ return -1;
+}
+
+string
+sndfile_file_ending_from_string (string str)
+{
+ static vector<string> file_endings;
+
+ if (file_endings.empty()) {
+ file_endings = I18N((const char **) sndfile_file_endings_strings);
+ }
+
+ for (int n = 0; sndfile_header_formats_strings[n]; ++n) {
+ if (str == sndfile_header_formats_strings[n]) {
+ return file_endings[n];
+ }
+ }
+ return 0;
+}
+
+int
+sndfile_data_width (int format)
+{
+ int tval = format & 0xf;
+
+ switch (tval) {
+ case SF_FORMAT_PCM_S8:
+ case SF_FORMAT_PCM_U8:
+ return 8;
+ case SF_FORMAT_PCM_16:
+ return 16;
+ case SF_FORMAT_PCM_24:
+ return 24;
+ case SF_FORMAT_PCM_32:
+ return 32;
+ case SF_FORMAT_FLOAT:
+ return 1; // heh, heh
+ default:
+ // we don't handle anything else within ardour
+ return 0;
+ }
+}
+
+string
+sndfile_major_format(int format)
+{
+ static map<int, string> m;
+
+ if(m.empty()){
+ SF_FORMAT_INFO format_info;
+ int count;
+ sf_command(0, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int));
+ for (int i = 0; i < count; ++i){
+ format_info.format = i;
+ sf_command (0, SFC_GET_FORMAT_MAJOR,
+ &format_info, sizeof (format_info));
+ m[format_info.format & SF_FORMAT_TYPEMASK] = format_info.name;
+ }
+ }
+
+ map<int, string>::iterator p = m.find(format & SF_FORMAT_TYPEMASK);
+ if(p != m.end()){
+ return m[format & SF_FORMAT_TYPEMASK];
+ } else {
+ return "-Unknown-";
+ }
+}
+
+string
+sndfile_minor_format(int format)
+{
+ static map<int, string> m;
+
+ if(m.empty()){
+ SF_FORMAT_INFO format_info;
+ int count;
+ sf_command(0, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int));
+ for (int i = 0; i < count; ++i){
+ format_info.format = i;
+ sf_command (0, SFC_GET_FORMAT_SUBTYPE,
+ &format_info, sizeof (format_info));
+ m[format_info.format & SF_FORMAT_SUBMASK] = format_info.name;
+ }
+ }
+
+ map<int, string>::iterator p = m.find(format & SF_FORMAT_SUBMASK);
+ if(p != m.end()){
+ return m[format & SF_FORMAT_SUBMASK];
+ } else {
+ return "-Unknown-";
+ }
+}
+