Wrapper around SF_INFO and AudioFileBasicDescription.
git-svn-id: svn://localhost/trunk/ardour2@357 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
parent
00c9cc9dde
commit
be60137cfb
@ -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 ()
|
||||
|
||||
|
@ -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__ */
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user