X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsndfile_helpers.cc;h=32ff48f48595e4bf83e29f8e9a963b0c379e4e35;hb=db6706429643d80e68a050daa015d17f36d5321b;hp=4ea4a4b5b234b6ee7a8bbb90b16568d36652bd3c;hpb=e057db8057e77157b3370f9feb8bb4670b1854e7;p=ardour.git diff --git a/libs/ardour/sndfile_helpers.cc b/libs/ardour/sndfile_helpers.cc index 4ea4a4b5b2..32ff48f485 100644 --- a/libs/ardour/sndfile_helpers.cc +++ b/libs/ardour/sndfile_helpers.cc @@ -1,13 +1,30 @@ +/* + 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 #include #include -#include -#include +#include "pbd/convert.h" -#ifdef HAVE_COREAUDIO -#include -#include -#endif // HAVE_COREAUDIO +#include +#include "ardour/sndfile_helpers.h" #include "i18n.h" @@ -17,41 +34,41 @@ using namespace std; const char * const sndfile_header_formats_strings[SNDFILE_HEADER_FORMATS+1] = { N_("WAV"), N_("AIFF"), - N_("raw (no header)"), - N_("PAF (Ensoniq Paris)"), - N_("AU (Sun/NeXT)"), - N_("IRCAM"), + N_("CAF"), N_("W64 (64 bit WAV)"), + N_("FLAC"), + N_("Ogg/Vorbis"), + N_("raw (no header)"), 0 }; const char* const sndfile_file_endings_strings[SNDFILE_HEADER_FORMATS+1] = { N_(".wav"), N_(".aiff"), - N_(".raw"), - N_(".paf"), - N_(".au"), - N_(".ircam"), + N_(".caf"), N_(".w64"), + N_(".flac"), + N_(".ogg"), + N_(".raw"), 0 }; int sndfile_header_formats[SNDFILE_HEADER_FORMATS] = { SF_FORMAT_WAV, SF_FORMAT_AIFF, - SF_FORMAT_RAW, - SF_FORMAT_PAF, - SF_FORMAT_AU, - SF_FORMAT_IRCAM, - SF_FORMAT_W64 + SF_FORMAT_CAF, + SF_FORMAT_W64, + SF_FORMAT_FLAC, + SF_FORMAT_OGG, + SF_FORMAT_RAW }; const char * const sndfile_bitdepth_formats_strings[SNDFILE_BITDEPTH_FORMATS+1] = { - N_("16 bit"), - N_("24 bit"), - N_("32 bit"), - N_("8 bit"), - N_("float"), + 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 }; @@ -113,7 +130,7 @@ sndfile_file_ending_from_string (string str) static vector file_endings; if (file_endings.empty()) { - file_endings = internationalize((const char **) sndfile_file_endings_strings); + file_endings = I18N((const char **) sndfile_file_endings_strings); } for (int n = 0; sndfile_header_formats_strings[n]; ++n) { @@ -147,7 +164,7 @@ sndfile_data_width (int format) } } -string +string sndfile_major_format(int format) { static map m; @@ -158,12 +175,22 @@ sndfile_major_format(int format) 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, + sf_command (0, SFC_GET_FORMAT_MAJOR, &format_info, sizeof (format_info)); m[format_info.format & SF_FORMAT_TYPEMASK] = format_info.name; + + /* normalize a couple of names rather than use what libsndfile gives us */ + + if (strncasecmp (format_info.name, "OGG", 3) == 0) { + m[format_info.format & SF_FORMAT_TYPEMASK] = "Ogg"; + } else if (strncasecmp (format_info.name, "WAV", 3) == 0) { + m[format_info.format & SF_FORMAT_TYPEMASK] = "WAV"; + } else { + m[format_info.format & SF_FORMAT_TYPEMASK] = format_info.name; + } } } - + map::iterator p = m.find(format & SF_FORMAT_TYPEMASK); if(p != m.end()){ return m[format & SF_FORMAT_TYPEMASK]; @@ -183,12 +210,12 @@ sndfile_minor_format(int format) 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, + sf_command (0, SFC_GET_FORMAT_SUBTYPE, &format_info, sizeof (format_info)); m[format_info.format & SF_FORMAT_SUBMASK] = format_info.name; } } - + map::iterator p = m.find(format & SF_FORMAT_SUBMASK); if(p != m.end()){ return m[format & SF_FORMAT_SUBMASK]; @@ -197,101 +224,3 @@ sndfile_minor_format(int format) } } -#ifdef HAVE_COREAUDIO -std::string -CFStringRefToStdString(CFStringRef stringRef) -{ - CFIndex size = - CFStringGetMaximumSizeForEncoding(CFStringGetLength(stringRef) , - kCFStringEncodingASCII); - char *buf = new char[size]; - - std::string result; - - if(CFStringGetCString(stringRef, buf, size, kCFStringEncodingASCII)) { - result = buf; - } - delete [] buf; - return result; -} -#endif // HAVE_COREAUDIO - -bool -get_soundfile_info (string path, SoundFileInfo& _info) -{ -#ifdef HAVE_COREAUDIO - OSStatus err = noErr; - FSRef ref; - ExtAudioFileRef af = 0; - size_t size; - CFStringRef name; - - err = FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - err = ExtAudioFileOpen(&ref, &af); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - AudioStreamBasicDescription absd; - memset(&absd, 0, sizeof(absd)); - size = sizeof(AudioStreamBasicDescription); - err = ExtAudioFileGetProperty(af, - kExtAudioFileProperty_FileDataFormat, &size, &absd); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - _info.samplerate = absd.mSampleRate; - _info.channels = absd.mChannelsPerFrame; - - size = sizeof(_info.length); - err = ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - size = sizeof(CFStringRef); - err = AudioFormatGetProperty( - kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name); - if (err != noErr) { - ExtAudioFileDispose (af); - goto libsndfile; - } - - _info.format_name = CFStringRefToStdString(name); - - ExtAudioFileDispose (af); - return true; - -libsndfile: -#endif // HAVE_COREAUDIO - - SNDFILE *sf; - SF_INFO sf_info; - - sf_info.format = 0; // libsndfile says to clear this before sf_open(). - - if ((sf = sf_open ((char*) path.c_str(), SFM_READ, &sf_info)) == 0) { - return false; - } - - sf_close (sf); - - _info.samplerate = sf_info.samplerate; - _info.channels = sf_info.channels; - _info.length = sf_info.frames; - _info.format_name = string_compose("Format: %1, %2", - sndfile_major_format(sf_info.format), - sndfile_minor_format(sf_info.format)); - - return true; -} -