26 #include "ardour/utils.h"
28 #include <appleutility/CAAudioFile.h>
29 #include <appleutility/CAStreamBasicDescription.h>
31 #include <glibmm/fileutils.h>
35 #include <AudioToolbox/AudioFormat.h>
50 assert (Glib::file_test (
_path, Glib::FILE_TEST_EXISTS));
65 assert (Glib::file_test (
_path, Glib::FILE_TEST_EXISTS));
76 CAStreamBasicDescription file_format (
af.GetFileDataFormat());
86 CAStreamBasicDescription client_format (file_format);
92 client_format.SetCanonical(client_format.NumberChannels(),
true);
93 af.SetClientFormat (client_format);
95 }
catch (CAXException& cax) {
118 while (nread < cnt) {
121 af.Seek (start+nread);
122 }
catch (CAXException& cax) {
127 UInt32 new_cnt = cnt - nread;
130 abl.mBuffers[0].mData = dst + nread;
133 af.Read (new_cnt, &abl);
134 }
catch (CAXException& cax) {
165 abl.mNumberBuffers = 1;
174 }
else if (start + cnt >
_length) {
187 if (file_cnt != cnt) {
189 memset (dst+file_cnt, 0,
sizeof (
Sample) * delta);
195 if (
safe_read (dst, start, file_cnt, abl) == 0) {
204 if (
safe_read (interleave_buf, start, file_cnt, abl) != 0) {
223 CAStreamBasicDescription client_asbd;
226 client_asbd =
af.GetClientDataFormat ();
227 }
catch (CAXException& cax) {
232 return client_asbd.mSampleRate;
245 ExtAudioFileRef
af = 0;
250 if (FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0) != noErr) {
254 if (ExtAudioFileOpen(&ref, &af) != noErr) {
258 AudioStreamBasicDescription absd;
259 memset(&absd, 0,
sizeof(absd));
260 size =
sizeof(AudioStreamBasicDescription);
261 if (ExtAudioFileGetProperty (af, kExtAudioFileProperty_FileDataFormat, &size, &absd) != noErr) {
266 _info.
channels = absd.mChannelsPerFrame;
268 size =
sizeof(_info.
length);
269 if (ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.
length) != noErr) {
273 size =
sizeof(CFStringRef);
274 if (AudioFormatGetProperty(kAudioFormatProperty_FormatName,
sizeof(absd), &absd, &size, &
name) != noErr) {
280 if (absd.mFormatID == kAudioFormatLinearPCM) {
281 if (absd.mFormatFlags & kAudioFormatFlagIsBigEndian) {
288 snprintf (buf,
sizeof (buf),
" %" PRIu32
" bit", absd.mBitsPerChannel);
292 if (absd.mFormatFlags & kAudioFormatFlagIsFloat) {
295 if (absd.mFormatFlags & kAudioFormatFlagIsSignedInteger) {
304 if (absd.mFormatFlags & kAudioFormatFlagIsNonInterleaved) {
313 switch (absd.mFormatID) {
314 case kAudioFormatLinearPCM:
318 case kAudioFormatAC3:
322 case kAudioFormat60958AC3:
326 case kAudioFormatMPEGLayer1:
330 case kAudioFormatMPEGLayer2:
334 case kAudioFormatMPEGLayer3:
338 case kAudioFormatAppleIMA4:
342 case kAudioFormatMPEG4AAC:
346 case kAudioFormatMPEG4CELP:
350 case kAudioFormatMPEG4HVXC:
354 case kAudioFormatMPEG4TwinVQ:
363 case kAudioFormatTimeCode:
367 case kAudioFormatMIDIStream:
371 case kAudioFormatParameterValueStream:
382 ExtAudioFileDispose (af);
LIBPBD_API Transmitter error
int update_header(framepos_t when, struct tm &, time_t)
std::ostream & endmsg(std::ostream &ostr)
void set_path(const std::string &p)
LIBARDOUR_API PBD::PropertyDescriptor< framepos_t > start
CoreAudioSource(ARDOUR::Session &, const XMLNode &)
float sample_rate() const
PBD::Property< std::string > _name
static int get_soundfile_info(string path, SoundFileInfo &_info, string &error_msg)
framecnt_t read_unlocked(Sample *dst, framepos_t start, framecnt_t cnt) const
static Sample * get_interleave_buffer(framecnt_t size)
int safe_read(Sample *, framepos_t start, framecnt_t cnt, AudioBufferList &) const
virtual uint32_t n_channels() const
virtual void set_path(const std::string &)
std::string string_compose(const std::string &fmt, const T1 &o1)