d9e7aa563a6d23930e638fb4de3a0279a256190f
[ardour.git] / libs / ardour / sndfile_helpers.cc
1 #include <map>
2
3 #include <ardour/sndfile_helpers.h>
4
5 #include "i18n.h"
6
7 using std::map;
8
9 const char * const sndfile_header_formats_strings[SNDFILE_HEADER_FORMATS+1] = {
10         N_("WAV"),
11         N_("AIFF"),
12         N_("raw (no header)"),
13         N_("PAF (Ensoniq Paris)"),
14         N_("AU (Sun/NeXT)"),
15         N_("IRCAM"),
16         N_("W64 (64 bit WAV)"),
17         0
18 };
19
20 int sndfile_header_formats[SNDFILE_HEADER_FORMATS] = {
21         SF_FORMAT_WAV,
22         SF_FORMAT_AIFF,
23         SF_FORMAT_RAW,
24         SF_FORMAT_PAF,
25         SF_FORMAT_AU,
26         SF_FORMAT_IRCAM,
27         SF_FORMAT_W64
28 };
29
30 const char * const sndfile_bitdepth_formats_strings[SNDFILE_BITDEPTH_FORMATS+1] = {
31         N_("16 bit"),
32         N_("24 bit"),
33         N_("32 bit"),
34         N_("8 bit"),
35         N_("float"),
36         0
37 };
38
39 int sndfile_bitdepth_formats[SNDFILE_BITDEPTH_FORMATS] = {
40         SF_FORMAT_PCM_16,
41         SF_FORMAT_PCM_24,
42         SF_FORMAT_PCM_32,
43         SF_FORMAT_PCM_S8,
44         SF_FORMAT_FLOAT
45 };
46
47 const char * const sndfile_endian_formats_strings[SNDFILE_ENDIAN_FORMATS+1] = {
48         N_("Little-endian (Intel)"),
49         N_("Big-endian (Mac)"),
50         0
51 };
52
53 int sndfile_endian_formats[SNDFILE_ENDIAN_FORMATS] = {
54         SF_ENDIAN_LITTLE,
55         SF_ENDIAN_BIG
56 };
57
58 int
59 sndfile_header_format_from_string (string str)
60 {
61         for (int n = 0; sndfile_header_formats_strings[n]; ++n) {
62                 if (str == sndfile_header_formats_strings[n]) {
63                         return sndfile_header_formats[n];
64                 }
65         }
66         return -1;
67 }
68
69 int
70 sndfile_bitdepth_format_from_string (string str)
71 {
72         for (int n = 0; sndfile_bitdepth_formats_strings[n]; ++n) {
73                 if (str == sndfile_bitdepth_formats_strings[n]) {
74                         return sndfile_bitdepth_formats[n];
75                 }
76         }
77         return -1;
78 }
79
80 int
81 sndfile_endian_format_from_string (string str)
82 {
83         for (int n = 0; sndfile_endian_formats_strings[n]; ++n) {
84                 if (str == sndfile_endian_formats_strings[n]) {
85                         return sndfile_endian_formats[n];
86                 }
87         }
88         return -1;
89 }
90
91 int
92 sndfile_data_width (int format)
93 {
94         int tval = format & 0xf;
95
96         switch (tval) {
97           case SF_FORMAT_PCM_S8:
98           case SF_FORMAT_PCM_U8:
99                 return 8;
100           case SF_FORMAT_PCM_16:
101                 return 16;
102           case SF_FORMAT_PCM_24:
103                 return 24;
104           case SF_FORMAT_PCM_32:
105                 return 32;
106           case SF_FORMAT_FLOAT:
107                 return 1; // heh, heh
108           default:
109             // we don't handle anything else within ardour
110                 return 0;
111         }
112 }
113
114 string 
115 sndfile_major_format(int format)
116 {
117         static map<int, string> m;
118
119         if(m.empty()){
120                 SF_FORMAT_INFO format_info;
121                 int count;
122                 sf_command(0, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int));
123                 for (int i = 0; i < count; ++i){
124                         format_info.format = i;
125                         sf_command (0, SFC_GET_FORMAT_MAJOR, 
126                                         &format_info, sizeof (format_info));
127                         m[format_info.format & SF_FORMAT_TYPEMASK] = format_info.name;
128                 }
129         }
130         
131         map<int, string>::iterator p = m.find(format & SF_FORMAT_TYPEMASK);
132         if(p != m.end()){
133                 return m[format & SF_FORMAT_TYPEMASK];
134         } else {
135                 return "-Unknown-";
136         }
137 }
138
139 string
140 sndfile_minor_format(int format)
141 {
142         static map<int, string> m;
143
144         if(m.empty()){
145                 SF_FORMAT_INFO format_info;
146                 int count;
147                 sf_command(0, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int));
148                 for (int i = 0; i < count; ++i){
149                         format_info.format = i;
150                         sf_command (0, SFC_GET_FORMAT_SUBTYPE, 
151                                         &format_info, sizeof (format_info));
152                         m[format_info.format & SF_FORMAT_SUBMASK] = format_info.name;
153                 }
154         }
155         
156         map<int, string>::iterator p = m.find(format & SF_FORMAT_SUBMASK);
157         if(p != m.end()){
158                 return m[format & SF_FORMAT_SUBMASK];
159         } else {
160                 return "-Unknown-";
161         }
162 }