add seek to src/io/source*
authorPaul Brossier <piem@piem.org>
Fri, 22 Mar 2013 00:41:54 +0000 (19:41 -0500)
committerPaul Brossier <piem@piem.org>
Fri, 22 Mar 2013 00:41:54 +0000 (19:41 -0500)
src/io/source.c
src/io/source.h
src/io/source_apple_audio.c
src/io/source_apple_audio.h
src/io/source_sndfile.c
src/io/source_sndfile.h

index aa91cbb6ebbc3d786ed68988b7496a28695b6ddf..5e932913dfb5be7cfaa63aecbd79667a45632c0f 100644 (file)
@@ -81,3 +81,12 @@ uint_t aubio_source_get_samplerate(aubio_source_t * s) {
 #endif /* __APPLE__ */
 }
 
+uint_t aubio_source_seek (aubio_source_t * s, uint_t seek ) {
+#ifdef __APPLE__
+  return aubio_source_apple_audio_seek ((aubio_source_apple_audio_t *)s->source, seek);
+#else /* __APPLE__ */
+#if HAVE_SNDFILE
+  return aubio_source_sndfile_seek ((aubio_source_sndfile_t *)s->source, seek);
+#endif /* HAVE_SNDFILE */
+#endif /* __APPLE__ */
+}
index 76fa434cb926a6feeac2019303181b738973a783..d8ef74ece6f0acfa9eb787c768c46e5953b8b02d 100644 (file)
@@ -77,6 +77,18 @@ void aubio_source_do(aubio_source_t * s, fvec_t * read_to, uint_t * read);
 */
 uint_t aubio_source_get_samplerate(aubio_source_t * s);
 
+/**
+
+  seek source object
+
+  \param s source object, created with ::new_aubio_source
+  \param pos position to seek to, in frames
+
+  \return 0 if sucessful, non-zero on failure
+
+*/
+uint_t aubio_source_seek (aubio_source_t * s, uint_t pos);
+
 /**
 
   close source and cleanup memory
index 71f90aa9a09384506050f18c40290b6580f09469..fb310bfd46d150f8fa3c62368d4192ce2e2ee3fa 100644 (file)
@@ -36,7 +36,8 @@
 
 struct _aubio_source_apple_audio_t {
   uint_t channels;
-  uint_t samplerate;
+  uint_t samplerate;          //< requested samplerate
+  uint_t source_samplerate;   //< actual source samplerate
   uint_t block_size;
 
   char_t *path;
@@ -80,6 +81,7 @@ aubio_source_apple_audio_t * new_aubio_source_apple_audio(char_t * path, uint_t
     //AUBIO_DBG("sampling rate set to 0, automagically adjusting to %d\n", samplerate);
   }
   s->samplerate = samplerate;
+  s->source_samplerate = fileFormat.mSampleRate;
 
   AudioStreamBasicDescription clientFormat;
   propSize = sizeof(clientFormat);
@@ -143,7 +145,7 @@ beach:
 void aubio_source_apple_audio_do(aubio_source_apple_audio_t *s, fvec_t * read_to, uint_t * read) {
   UInt32 c, v, loadedPackets = s->block_size;
   OSStatus err = ExtAudioFileRead(s->audioFile, &loadedPackets, &s->bufferList);
-  if (err) { AUBIO_ERROR("error in ExtAudioFileRead, %d\n", (int)err); goto beach;}
+  if (err) { AUBIO_ERROR("error in ExtAudioFileRead %s %d\n", s->path, (int)err); goto beach;}
 
   short *data = (short*)s->bufferList.mBuffers[0].mData;
 
@@ -181,6 +183,13 @@ void del_aubio_source_apple_audio(aubio_source_apple_audio_t * s){
   return;
 }
 
+uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos) {
+  Float64 ratio = (Float64)(s->source_samplerate) / (Float64)(s->samplerate);
+  OSStatus err = ExtAudioFileSeek(s->audioFile, pos);
+  if (err) AUBIO_ERROR("source_apple_audio: error in ExtAudioFileSeek (%d)\n", (int)err);
+  return err;
+}
+
 uint_t aubio_source_apple_audio_get_samplerate(aubio_source_apple_audio_t * s) {
   return s->samplerate;
 }
index 7af7e085e507c57cbd230c60276691a0a69b0e73..ee2c625bed595f90888d6e1b3aac6cd5183d3329 100644 (file)
@@ -83,6 +83,18 @@ void aubio_source_apple_audio_do(aubio_source_apple_audio_t * s, fvec_t * read_t
 */
 uint_t aubio_source_apple_audio_get_samplerate(aubio_source_apple_audio_t * s);
 
+/**
+
+  seek source object
+
+  \param s source object, created with ::new_aubio_source
+  \param pos position to seek to, in frames
+
+  \return 0 if sucessful, non-zero on failure
+
+*/
+uint_t aubio_source_apple_audio_seek (aubio_source_apple_audio_t * s, uint_t pos);
+
 /**
 
   close source and cleanup memory
index 8472e2dd2b0db89357629e200dea068d7d70f254..a21cf60678f4b10f74153f713d64e38e5cfb7666 100644 (file)
@@ -176,6 +176,11 @@ uint_t aubio_source_sndfile_get_samplerate(aubio_source_sndfile_t * s) {
   return s->samplerate;
 }
 
+uint_t aubio_source_sndfile_seek (aubio_source_sndfile_t * s, uint_t pos) {
+  uint_t resampled_pos = (uint_t)ROUND(pos * s->input_samplerate * 1. / s->samplerate);
+  return sf_seek (s->handle, resampled_pos, SEEK_SET);
+}
+
 void del_aubio_source_sndfile(aubio_source_sndfile_t * s){
   if (!s) return;
   if (sf_close(s->handle)) {
index 80c891319637e2d313c7b66eb27b249e6dc2e951..3aec329109ee7685b05f3ff49237049c70c015a6 100644 (file)
@@ -82,6 +82,18 @@ void aubio_source_sndfile_do(aubio_source_sndfile_t * s, fvec_t * read_to, uint_
 */
 uint_t aubio_source_sndfile_get_samplerate(aubio_source_sndfile_t * s);
 
+/**
+
+  seek source object
+
+  \param s source object, created with ::new_aubio_source_sndfile
+  \param pos position to seek to, in frames
+
+  \return 0 if sucessful, non-zero on failure
+
+*/
+uint_t aubio_source_sndfile_seek (aubio_source_sndfile_t *s, uint_t pos);
+
 /**
 
   close source and cleanup memory