5 #include <ardour/sndfile_helpers.h>
8 #include <AudioToolbox/ExtendedAudioFile.h>
9 #include <AudioToolbox/AudioFormat.h>
10 #endif // HAVE_COREAUDIO
17 const char * const sndfile_header_formats_strings[SNDFILE_HEADER_FORMATS+1] = {
20 N_("raw (no header)"),
21 N_("PAF (Ensoniq Paris)"),
24 N_("W64 (64 bit WAV)"),
28 const char* const sndfile_file_endings_strings[SNDFILE_HEADER_FORMATS+1] = {
39 int sndfile_header_formats[SNDFILE_HEADER_FORMATS] = {
49 const char * const sndfile_bitdepth_formats_strings[SNDFILE_BITDEPTH_FORMATS+1] = {
58 int sndfile_bitdepth_formats[SNDFILE_BITDEPTH_FORMATS] = {
66 const char * const sndfile_endian_formats_strings[SNDFILE_ENDIAN_FORMATS+1] = {
67 N_("Little-endian (Intel)"),
68 N_("Big-endian (Mac)"),
72 int sndfile_endian_formats[SNDFILE_ENDIAN_FORMATS] = {
78 sndfile_header_format_from_string (string str)
80 for (int n = 0; sndfile_header_formats_strings[n]; ++n) {
81 if (str == sndfile_header_formats_strings[n]) {
82 return sndfile_header_formats[n];
89 sndfile_bitdepth_format_from_string (string str)
91 for (int n = 0; sndfile_bitdepth_formats_strings[n]; ++n) {
92 if (str == sndfile_bitdepth_formats_strings[n]) {
93 return sndfile_bitdepth_formats[n];
100 sndfile_endian_format_from_string (string str)
102 for (int n = 0; sndfile_endian_formats_strings[n]; ++n) {
103 if (str == sndfile_endian_formats_strings[n]) {
104 return sndfile_endian_formats[n];
111 sndfile_file_ending_from_string (string str)
113 static vector<string> file_endings;
115 if (file_endings.empty()) {
116 file_endings = internationalize((const char **) sndfile_file_endings_strings);
119 for (int n = 0; sndfile_header_formats_strings[n]; ++n) {
120 if (str == sndfile_header_formats_strings[n]) {
121 return file_endings[n];
128 sndfile_data_width (int format)
130 int tval = format & 0xf;
133 case SF_FORMAT_PCM_S8:
134 case SF_FORMAT_PCM_U8:
136 case SF_FORMAT_PCM_16:
138 case SF_FORMAT_PCM_24:
140 case SF_FORMAT_PCM_32:
142 case SF_FORMAT_FLOAT:
143 return 1; // heh, heh
145 // we don't handle anything else within ardour
151 sndfile_major_format(int format)
153 static map<int, string> m;
156 SF_FORMAT_INFO format_info;
158 sf_command(0, SFC_GET_FORMAT_MAJOR_COUNT, &count, sizeof (int));
159 for (int i = 0; i < count; ++i){
160 format_info.format = i;
161 sf_command (0, SFC_GET_FORMAT_MAJOR,
162 &format_info, sizeof (format_info));
163 m[format_info.format & SF_FORMAT_TYPEMASK] = format_info.name;
167 map<int, string>::iterator p = m.find(format & SF_FORMAT_TYPEMASK);
169 return m[format & SF_FORMAT_TYPEMASK];
176 sndfile_minor_format(int format)
178 static map<int, string> m;
181 SF_FORMAT_INFO format_info;
183 sf_command(0, SFC_GET_FORMAT_SUBTYPE_COUNT, &count, sizeof (int));
184 for (int i = 0; i < count; ++i){
185 format_info.format = i;
186 sf_command (0, SFC_GET_FORMAT_SUBTYPE,
187 &format_info, sizeof (format_info));
188 m[format_info.format & SF_FORMAT_SUBMASK] = format_info.name;
192 map<int, string>::iterator p = m.find(format & SF_FORMAT_SUBMASK);
194 return m[format & SF_FORMAT_SUBMASK];
200 #ifdef HAVE_COREAUDIO
202 CFStringRefToStdString(CFStringRef stringRef)
205 CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) ,
206 kCFStringEncodingASCII);
207 char *buf = new char[size];
211 if(CFStringGetCString(stringRef, buf, size, kCFStringEncodingASCII)) {
217 #endif // HAVE_COREAUDIO
220 get_soundfile_info (string path, SoundFileInfo& _info)
222 #ifdef HAVE_COREAUDIO
223 OSStatus err = noErr;
225 ExtAudioFileRef af = 0;
229 err = FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0);
231 ExtAudioFileDispose (af);
235 err = ExtAudioFileOpen(&ref, &af);
237 ExtAudioFileDispose (af);
241 AudioStreamBasicDescription absd;
242 memset(&absd, 0, sizeof(absd));
243 size = sizeof(AudioStreamBasicDescription);
244 err = ExtAudioFileGetProperty(af,
245 kExtAudioFileProperty_FileDataFormat, &size, &absd);
247 ExtAudioFileDispose (af);
251 _info.samplerate = absd.mSampleRate;
252 _info.channels = absd.mChannelsPerFrame;
254 size = sizeof(_info.length);
255 err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length);
257 ExtAudioFileDispose (af);
261 size = sizeof(CFStringRef);
262 err = AudioFormatGetProperty(
263 kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name);
265 ExtAudioFileDispose (af);
269 _info.format_name = CFStringRefToStdString(name);
271 ExtAudioFileDispose (af);
275 #endif // HAVE_COREAUDIO
280 sf_info.format = 0; // libsndfile says to clear this before sf_open().
282 if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) {
288 _info.samplerate = sf_info.samplerate;
289 _info.channels = sf_info.channels;
290 _info.length = sf_info.frames;
291 _info.format_name = string_compose("Format: %1, %2",
292 sndfile_major_format(sf_info.format),
293 sndfile_minor_format(sf_info.format));