Audacity  2.2.2
FileFormats.cpp
Go to the documentation of this file.
1 /**********************************************************************
2 
3  Audacity: A Digital Audio Editor
4 
5  FileFormats.cpp
6 
7  Dominic Mazzoni
8 
9 *******************************************************************//*******************************************************************/
16 
17 
18 #include "Audacity.h"
19 #include "MemoryX.h"
20 #include <wx/arrstr.h>
21 #include <wx/intl.h>
22 #include "sndfile.h"
23 #include "widgets/ErrorDialog.h"
24 
25 #ifndef SNDFILE_1
26 #error Requires libsndfile 1.0 or higher
27 #endif
28 
29 #include "FileFormats.h"
30 
31 #include "Internat.h"
32 
33 //
34 // enumerating headers
35 //
36 
38 {
39  int count;
40 
41  sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT,
42  &count, sizeof(count));
43 
44  return count;
45 }
46 
48 {
49  SF_FORMAT_INFO format_info;
50 
51  memset(&format_info, 0, sizeof(format_info));
52  format_info.format = format;
53  sf_command(NULL, SFC_GET_FORMAT_MAJOR,
54  &format_info, sizeof (format_info)) ;
55 
56  return LAT1CTOWX(format_info.name);
57 }
58 
59 unsigned int sf_header_index_to_type(int i)
60 {
61  SF_FORMAT_INFO format_info ;
62 
63  memset(&format_info, 0, sizeof(format_info));
64  format_info.format = i;
65  sf_command (NULL, SFC_GET_FORMAT_MAJOR,
66  &format_info, sizeof (format_info));
67 
68  return format_info.format & SF_FORMAT_TYPEMASK;
69 }
70 
71 //
72 // enumerating encodings
73 //
74 
76 {
77  int count ;
78 
79  sf_command (NULL, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int)) ;
80 
81  return count;
82 }
83 
84 wxString sf_encoding_index_name(int i)
85 {
86  SF_FORMAT_INFO format_info ;
87 
88  memset(&format_info, 0, sizeof(format_info));
89  format_info.format = i;
90  sf_command (NULL, SFC_GET_FORMAT_SUBTYPE,
91  &format_info, sizeof (format_info));
92  return sf_normalize_name(format_info.name);
93 }
94 
95 unsigned int sf_encoding_index_to_subtype(int i)
96 {
97  SF_FORMAT_INFO format_info ;
98 
99  memset(&format_info, 0, sizeof(format_info));
100  format_info.format = i;
101  sf_command (NULL, SFC_GET_FORMAT_SUBTYPE,
102  &format_info, sizeof (format_info));
103 
104  return format_info.format & SF_FORMAT_SUBMASK;
105 }
106 
107 //
108 // getting info about an actual SF format
109 //
110 
111 wxString sf_header_name(int format)
112 {
113  SF_FORMAT_INFO format_info;
114 
115  memset(&format_info, 0, sizeof(format_info));
116  format_info.format = (format & SF_FORMAT_TYPEMASK);
117  sf_command(NULL, SFC_GET_FORMAT_INFO, &format_info, sizeof(format_info));
118 
119  return LAT1CTOWX(format_info.name);
120 }
121 
123 {
124  SF_FORMAT_INFO format_info;
125  int i;
126  wxString s;
127 
128  memset(&format_info, 0, sizeof(format_info));
129  format_info.format = (format & SF_FORMAT_TYPEMASK);
130  sf_command(NULL, SFC_GET_FORMAT_INFO, &format_info, sizeof(format_info));
131 
132  MallocString<> tmp { strdup( format_info.name ) };
133  i = 0;
134  while(tmp[i]) {
135  if (tmp[i]==' ')
136  tmp[i] = 0;
137  else
138  i++;
139  }
140 
141  s = LAT1CTOWX(tmp.get());
142 
143  return s;
144 }
145 
147 {
148  SF_FORMAT_INFO format_info;
149 
150  memset(&format_info, 0, sizeof(format_info));
151  format_info.format = (format & SF_FORMAT_TYPEMASK);
152  sf_command(NULL, SFC_GET_FORMAT_INFO, &format_info, sizeof(format_info));
153 
154  return LAT1CTOWX(format_info.extension);
155 }
156 
157 wxString sf_encoding_name(int encoding)
158 {
159  SF_FORMAT_INFO format_info;
160 
161  memset(&format_info, 0, sizeof(format_info));
162  format_info.format = (encoding & SF_FORMAT_SUBMASK);
163  sf_command(NULL, SFC_GET_FORMAT_INFO, &format_info, sizeof(format_info));
164 
165  return sf_normalize_name(format_info.name);
166 }
167 
169 {
170  int count ;
171 
172  sf_command (NULL, SFC_GET_SIMPLE_FORMAT_COUNT, &count, sizeof (int)) ;
173 
174  return count;
175 }
176 
177 static SF_FORMAT_INFO g_format_info;
178 
179 SF_FORMAT_INFO *sf_simple_format(int i)
180 {
181  memset(&g_format_info, 0, sizeof(g_format_info));
182 
183  g_format_info.format = i;
184  sf_command (NULL, SFC_GET_SIMPLE_FORMAT,
185  &g_format_info, sizeof(g_format_info));
186 
187  return &g_format_info;
188 }
189 
191 {
192  unsigned int subtype = format & SF_FORMAT_SUBMASK;
193  return (subtype == SF_FORMAT_FLOAT ||
194  subtype == SF_FORMAT_DOUBLE ||
195  subtype == SF_FORMAT_PCM_24 ||
196  subtype == SF_FORMAT_PCM_32);
197 }
198 
199 bool sf_subtype_is_integer(unsigned int format)
200 {
201  unsigned int subtype = format & SF_FORMAT_SUBMASK;
202  return (subtype == SF_FORMAT_PCM_16 ||
203  subtype == SF_FORMAT_PCM_24 ||
204  subtype == SF_FORMAT_PCM_32);
205 }
206 
207 wxArrayString sf_get_all_extensions()
208 {
209  wxArrayString exts;
210  SF_FORMAT_INFO format_info;
211  int count, k;
212 
213  memset(&format_info, 0, sizeof(format_info));
214 
215  sf_command(NULL, SFC_GET_FORMAT_MAJOR_COUNT,
216  &count, sizeof(count));
217 
218  for(k=0; k<count; k++) {
219  format_info.format = k;
220  sf_command(NULL, SFC_GET_FORMAT_MAJOR,
221  &format_info, sizeof (format_info)) ;
222 
223  exts.Add(LAT1CTOWX(format_info.extension));
224  }
225 
226  // Some other extensions that are often sound files
227  // but aren't included by libsndfile
228 
229  exts.Add(wxT("aif")); // AIFF file with a DOS-style extension
230  exts.Add(wxT("ircam"));
231  exts.Add(wxT("snd"));
232  exts.Add(wxT("svx"));
233  exts.Add(wxT("svx8"));
234  exts.Add(wxT("sv16"));
235 
236  return exts;
237 }
238 
239 wxString sf_normalize_name(const char *name)
240 {
241  wxString n = LAT1CTOWX(name);
242 
243  n.Replace(wxT("8 bit"), wxT("8-bit"));
244  n.Replace(wxT("16 bit"), wxT("16-bit"));
245  n.Replace(wxT("24 bit"), wxT("24-bit"));
246  n.Replace(wxT("32 bit"), wxT("32-bit"));
247  n.Replace(wxT("64 bit"), wxT("64-bit"));
248 
249  return n;
250 }
251 
252 #ifdef __WXMAC__
253 
254 // TODO: find out the appropriate OSType
255 // for the ones with an '????'. The others
256 // are at least the same type used by
257 // SoundApp.
258 
259 #define NUM_HEADERS 13
260 
261 OSType MacNames[NUM_HEADERS] = {
262  'WAVE', // WAVE
263  'AIFF', // AIFF
264  'NeXT', // Sun/NeXT AU
265  'BINA', // RAW i.e. binary
266  'PAR ', // ??? Ensoniq PARIS
267  '8SVX', // Amiga IFF / SVX8
268  'NIST', // ??? NIST/Sphere
269  'VOC ', // VOC
270  '\?\?\?\?', // ?? Propellorheads Rex
271  'SF ', // ?? IRCAM
272  'W64 ', // ?? Wave64
273  'MAT4', // ?? Matlab 4
274  'MAT5', // ?? Matlab 5
275 };
276 
277 OSType sf_header_mactype(int format)
278 {
279  if (format >= 0x10000)
280  return MacNames[(format/0x10000)-1];
281  else if (format>=0 && format<NUM_HEADERS)
282  return MacNames[format];
283  else
284  return '\?\?\?\?';
285 }
286 
287 #endif // __WXMAC__
288 
290 
291 int SFFileCloser::operator() (SNDFILE *sf) const
292 {
293  auto err = SFCall<int>(sf_close, sf);
294  if (err) {
295  char buffer[1000];
296  sf_error_str(sf, buffer, 1000);
297  AudacityMessageBox(wxString::Format
298  /* i18n-hint: %s will be the error message from libsndfile */
299  (_("Error (file may not have been written): %s"),
300  buffer));
301  }
302  return err;
303 }
static const wxChar * exts[]
Definition: ImportFLAC.cpp:53
wxString sf_encoding_index_name(int i)
Get the string name of the data encoding of the requested format.
Definition: FileFormats.cpp:84
wxString sf_header_index_name(int format)
Get the name of a container format from libsndfile.
Definition: FileFormats.cpp:47
int operator()(SNDFILE *) const
bool sf_subtype_more_than_16_bits(unsigned int format)
SF_FORMAT_INFO * sf_simple_format(int i)
int AudacityMessageBox(const wxString &message, const wxString &caption=AudacityMessageBoxCaptionStr(), long style=wxOK|wxCENTRE, wxWindow *parent=NULL, int x=wxDefaultCoord, int y=wxDefaultCoord)
Definition: ErrorDialog.h:92
wxString sf_encoding_name(int encoding)
Get the string name of the specified data encoding.
std::unique_ptr< Character[], freer > MallocString
Definition: MemoryX.h:417
int format
Definition: ExportPCM.cpp:56
wxString sf_normalize_name(const char *name)
int sf_num_encodings()
Get the number of data encodings libsndfile supports (in any container or none.
Definition: FileFormats.cpp:75
wxString sf_header_name(int format)
Get the string name of the specified container format.
bool sf_subtype_is_integer(unsigned int format)
wxString sf_header_extension(int format)
Get the most common file extension for the given format.
#define LAT1CTOWX(X)
Definition: Internat.h:180
ODLock libSndFileMutex
unsigned int sf_encoding_index_to_subtype(int i)
Definition: FileFormats.cpp:95
_("Move Track &Down")+wxT("\t")+(GetActiveProject() -> GetCommandManager() ->GetKeyFromName(wxT("TrackMoveDown")).Raw()), OnMoveTrack) POPUP_MENU_ITEM(OnMoveTopID, _("Move Track to &Top")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveTop")).Raw()), OnMoveTrack) POPUP_MENU_ITEM(OnMoveBottomID, _("Move Track to &Bottom")+wxT("\t")+(GetActiveProject() ->GetCommandManager() ->GetKeyFromName(wxT("TrackMoveBottom")).Raw()), OnMoveTrack)#define SET_TRACK_NAME_PLUGIN_SYMBOLclass SetTrackNameCommand:public AudacityCommand
wxArrayString sf_get_all_extensions()
wxString sf_header_shortname(int format)
Get an abbreviated form of the string name of the specified format.
const wxChar * name
Definition: Distortion.cpp:94
static SF_FORMAT_INFO g_format_info
unsigned int sf_header_index_to_type(int i)
Definition: FileFormats.cpp:59
int sf_num_simple_formats()
int sf_num_headers()
Get the number of container formats supported by libsndfile.
Definition: FileFormats.cpp:37