13
0

Wrapper around SF_INFO and AudioFileBasicDescription.

git-svn-id: svn://localhost/trunk/ardour2@357 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Taybin Rutkin 2006-03-07 23:41:52 +00:00
parent 00c9cc9dde
commit be60137cfb
3 changed files with 115 additions and 2 deletions

View File

@ -163,8 +163,8 @@ if conf.CheckCHeader('/System/Library/Frameworks/CoreMIDI.framework/Headers/Core
ardour.Append(LINKFLAGS="-framework CoreMIDI")
if conf.CheckCHeader('/System/Library/Frameworks/AudioToolbox.framework/Headers/ExtendedAudioFile.h'):
ardour.Append(LINKFLAGS="-framework AudioToolbox")
extra_sources += coreaudio_files
ardour.Append(CXXFLAGS="-DHAVE_COREAUDIO")
extra_sources += coreaudio_files
ardour = conf.Finish ()

View File

@ -35,4 +35,13 @@ int sndfile_data_width (int format);
string sndfile_major_format(int);
string sndfile_minor_format(int);
struct SoundFileInfo {
float samplerate;
uint16_t channels;
int64_t length;
std::string format_name;
};
bool get_soundfile_info (string path, SoundFileInfo& _info);
#endif /* __sndfile_helpers_h__ */

View File

@ -4,6 +4,11 @@
#include <sndfile.h>
#include <ardour/sndfile_helpers.h>
#ifdef HAVE_COREAUDIO
#include <AudioToolbox/ExtendedAudioFile.h>
#include <AudioToolbox/AudioFormat.h>
#endif // HAVE_COREAUDIO
#include "i18n.h"
using std::map;
@ -191,3 +196,102 @@ sndfile_minor_format(int format)
return "-Unknown-";
}
}
#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;
}