From 944c7e1e85e52cb1826716f8a0d58bca6f33d7d1 Mon Sep 17 00:00:00 2001 From: Paul Brossier Date: Sat, 9 Feb 2013 23:12:28 -0500 Subject: [PATCH] src/io/source_apple_audio.c: automagically set samplerate if 0 was requested, add _get_samplerate --- src/io/source.c | 10 ++++++++++ src/io/source.h | 2 ++ src/io/source_apple_audio.c | 37 +++++++++++++++++++++++-------------- src/io/source_apple_audio.h | 2 ++ 4 files changed, 37 insertions(+), 14 deletions(-) diff --git a/src/io/source.c b/src/io/source.c index 9ed3bf7e..b4da594b 100644 --- a/src/io/source.c +++ b/src/io/source.c @@ -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__ */ +} + diff --git a/src/io/source.h b/src/io/source.h index 2500c215..fa985379 100644 --- a/src/io/source.h +++ b/src/io/source.h @@ -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 diff --git a/src/io/source_apple_audio.c b/src/io/source_apple_audio.c index e5dede1c..770474c9 100644 --- a/src/io/source_apple_audio.c +++ b/src/io/source_apple_audio.c @@ -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__ */ diff --git a/src/io/source_apple_audio.h b/src/io/source_apple_audio.h index 39e47dff..983e2116 100644 --- a/src/io/source_apple_audio.h +++ b/src/io/source_apple_audio.h @@ -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 */ -- 2.11.0