major fixes to automation editing
[ardour.git] / libs / ardour / coreaudiosource.cc
index 83103a6bd47180b814b9fe5e9e7303089067caee..3c81b18fd4fb2ee129a8d230d4fb180f75e234b6 100644 (file)
@@ -185,3 +185,53 @@ CoreAudioSource::update_header (nframes_t when, struct tm&, time_t)
 {
        return 0;
 }
+
+int
+CoreAudioSource::get_soundfile_info (string path, SoundFileInfo& _info, string& error_msg)
+{
+       FSRef ref; 
+       ExtAudioFileRef af = 0;
+       size_t size;
+       CFStringRef name;
+       int ret = -1;
+
+       if (FSPathMakeRef ((UInt8*)path.c_str(), &ref, 0) != noErr) {
+               goto out;
+       }
+       
+       if (ExtAudioFileOpen(&ref, &af) != noErr) {
+               goto out;
+       }
+       
+       AudioStreamBasicDescription absd;
+       memset(&absd, 0, sizeof(absd));
+       size = sizeof(AudioStreamBasicDescription);
+       if (ExtAudioFileGetProperty (af, kExtAudioFileProperty_FileDataFormat, &size, &absd) != noErr) {
+               goto out;
+       }
+       
+       _info.samplerate = absd.mSampleRate;
+       _info.channels   = absd.mChannelsPerFrame;
+
+       size = sizeof(_info.length);
+       if (ExtAudioFileGetProperty(af, kExtAudioFileProperty_FileLengthFrames, &size, &_info.length) != noErr) {
+               goto out;
+       }
+       
+       size = sizeof(CFStringRef);
+       if (AudioFormatGetProperty(kAudioFormatProperty_FormatName, sizeof(absd), &absd, &size, &name) != noErr) {
+               goto out;
+       }
+
+       _info.format_name = CFStringRefToStdString(name);
+
+       // XXX it would be nice to find a way to get this information if it exists
+
+       _info.timecode = 0;
+       ret = 0;
+       
+  out:
+       ExtAudioFileDispose (af);
+       return ret;
+       
+}