src/io/source_apple_audio.c: automagically set samplerate if 0 was requested, add...
authorPaul Brossier <piem@piem.org>
Sun, 10 Feb 2013 04:12:28 +0000 (23:12 -0500)
committerPaul Brossier <piem@piem.org>
Sun, 10 Feb 2013 04:12:28 +0000 (23:12 -0500)
src/io/source.c
src/io/source.h
src/io/source_apple_audio.c
src/io/source_apple_audio.h

index 9ed3bf7e7d3a0582062b2a1be4cd94fcf531099a..b4da594bfa1b972f540bb5bede2cc682d2a9a650 100644 (file)
@@ -71,3 +71,13 @@ void del_aubio_source(aubio_source_t * s) {
   AUBIO_FREE(s);
 }
 
+uint_t aubio_source_get_samplerate(aubio_source_t * s) {
+#ifdef __APPLE__
+  return aubio_source_apple_audio_get_samplerate((aubio_source_apple_audio_t *)s->source);
+#else /* __APPLE__ */
+#if HAVE_SNDFILE
+  return aubio_source_sndfile_get_samplerate((aubio_source_sndfile_t *)s->source);
+#endif /* HAVE_SNDFILE */
+#endif /* __APPLE__ */
+}
+
index 2500c215c021fdbd86fef345f09b6b9924d738cf..fa9853795cbc3e6232a2b2539ce3566e00f9729a 100644 (file)
@@ -36,6 +36,8 @@ aubio_source_t * new_aubio_source(char_t * uri, uint_t samplerate, uint_t hop_si
 void aubio_source_do(aubio_source_t * s, fvec_t * read_data, uint_t * read);
 void del_aubio_source(aubio_source_t * s);
 
+uint_t aubio_source_get_samplerate(aubio_source_t * s);
+
 #ifdef __cplusplus
 }
 #endif
index e5dede1cfaef5700b782f3a8dfc0fd9f491d140d..770474c9341510e1d822f2b6abfb4bf857a9c7f0 100644 (file)
@@ -54,26 +54,12 @@ aubio_source_apple_audio_t * new_aubio_source_apple_audio(char_t * path, uint_t
   aubio_source_apple_audio_t * s = AUBIO_NEW(aubio_source_apple_audio_t);
 
   s->path = path;
-  s->samplerate = samplerate;
   s->block_size = block_size;
   s->channels = 1;
 
   OSStatus err = noErr;
   UInt32 propSize;
 
-  AudioStreamBasicDescription clientFormat;
-  propSize = sizeof(clientFormat);
-  memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription));
-  clientFormat.mFormatID         = kAudioFormatLinearPCM;
-  clientFormat.mSampleRate       = (Float64)(s->samplerate);
-  clientFormat.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
-  clientFormat.mChannelsPerFrame = s->channels;
-  clientFormat.mBitsPerChannel   = sizeof(short) * 8;
-  clientFormat.mFramesPerPacket  = 1;
-  clientFormat.mBytesPerFrame    = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8;
-  clientFormat.mBytesPerPacket   = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame;
-  clientFormat.mReserved         = 0;
-
   // open the resource url
   CFURLRef fileURL = getURLFromPath(path);
   err = ExtAudioFileOpenURL(fileURL, &s->audioFile);
@@ -89,6 +75,25 @@ aubio_source_apple_audio_t * new_aubio_source_apple_audio(char_t * path, uint_t
       kExtAudioFileProperty_FileDataFormat, &propSize, &fileFormat);
   if (err) { AUBIO_ERROR("error in ExtAudioFileGetProperty, %d\n", (int)err); goto beach;}
 
+  if (samplerate == 0) {
+    samplerate = fileFormat.mSampleRate;
+    AUBIO_WRN("sampling rate set to 0, automagically adjusting to %d", samplerate);
+  }
+  s->samplerate = samplerate;
+
+  AudioStreamBasicDescription clientFormat;
+  propSize = sizeof(clientFormat);
+  memset(&clientFormat, 0, sizeof(AudioStreamBasicDescription));
+  clientFormat.mFormatID         = kAudioFormatLinearPCM;
+  clientFormat.mSampleRate       = (Float64)(s->samplerate);
+  clientFormat.mFormatFlags      = kAudioFormatFlagIsSignedInteger | kAudioFormatFlagIsPacked;
+  clientFormat.mChannelsPerFrame = s->channels;
+  clientFormat.mBitsPerChannel   = sizeof(short) * 8;
+  clientFormat.mFramesPerPacket  = 1;
+  clientFormat.mBytesPerFrame    = clientFormat.mBitsPerChannel * clientFormat.mChannelsPerFrame / 8;
+  clientFormat.mBytesPerPacket   = clientFormat.mFramesPerPacket * clientFormat.mBytesPerFrame;
+  clientFormat.mReserved         = 0;
+
   // set the client format description
   err = ExtAudioFileSetProperty(s->audioFile, kExtAudioFileProperty_ClientDataFormat,
       propSize, &clientFormat);
@@ -175,4 +180,8 @@ void del_aubio_source_apple_audio(aubio_source_apple_audio_t * s){
   return;
 }
 
+uint_t aubio_source_apple_audio_get_samplerate(aubio_source_apple_audio_t * s) {
+  return s->samplerate;
+}
+
 #endif /* __APPLE__ */
index 39e47dff50e1e54818979d4abca19e9ca3a576f3..983e2116862ac2a19a798edde5ad7e3c00cdd6e4 100644 (file)
@@ -26,4 +26,6 @@ aubio_source_apple_audio_t * new_aubio_source_apple_audio(char_t * path, uint_t
 void aubio_source_apple_audio_do(aubio_source_apple_audio_t * s, fvec_t * read_to, uint_t * read);
 void del_aubio_source_apple_audio(aubio_source_apple_audio_t * s);
 
+uint_t aubio_source_apple_audio_get_samplerate(aubio_source_apple_audio_t * s);
+
 #endif /* _AUBIO_SOURCE_APPLE_AUDIO_H */