From f097cae65bfce7200938c5bd89e7e9b61cba78b3 Mon Sep 17 00:00:00 2001 From: Ricardo Garcia Date: Mon, 13 Apr 2015 12:17:21 -0700 Subject: TimestretchBufferProvider integration with Sonic Library Using Sonic as backbone for time stretching algorithm. Adding libsonic to needed makefiles. bug: 19196501 Change-Id: I1ea9221d2f56e4e79fba8746ce0ad350b5079e82 --- services/audioflinger/Android.mk | 4 +++- services/audioflinger/BufferProviders.cpp | 38 ++++++++++++++++++++++--------- services/audioflinger/BufferProviders.h | 2 ++ services/audioflinger/tests/Android.mk | 6 +++-- 4 files changed, 36 insertions(+), 14 deletions(-) (limited to 'services') diff --git a/services/audioflinger/Android.mk b/services/audioflinger/Android.mk index f8446ac..c359be5 100644 --- a/services/audioflinger/Android.mk +++ b/services/audioflinger/Android.mk @@ -50,6 +50,7 @@ LOCAL_SRC_FILES:= \ LOCAL_C_INCLUDES := \ $(TOPDIR)frameworks/av/services/audiopolicy \ + $(TOPDIR)external/sonic \ $(call include-path-for, audio-effects) \ $(call include-path-for, audio-utils) @@ -68,7 +69,8 @@ LOCAL_SHARED_LIBRARIES := \ libhardware_legacy \ libeffects \ libpowermanager \ - libserviceutility + libserviceutility \ + libsonic LOCAL_STATIC_LIBRARIES := \ libscheduling_policy \ diff --git a/services/audioflinger/BufferProviders.cpp b/services/audioflinger/BufferProviders.cpp index e058e6c..dcae5e7 100644 --- a/services/audioflinger/BufferProviders.cpp +++ b/services/audioflinger/BufferProviders.cpp @@ -370,16 +370,22 @@ TimestretchBufferProvider::TimestretchBufferProvider(int32_t channelCount, mPitch(pitch), mLocalBufferFrameCount(0), mLocalBufferData(NULL), - mRemaining(0) + mRemaining(0), + mSonicStream(sonicCreateStream(sampleRate, mChannelCount)) { ALOGV("TimestretchBufferProvider(%p)(%u, %#x, %u %f %f)", this, channelCount, format, sampleRate, speed, pitch); mBuffer.frameCount = 0; + + LOG_ALWAYS_FATAL_IF(mSonicStream == NULL, + "TimestretchBufferProvider can't allocate Sonic stream"); + sonicSetSpeed(mSonicStream, speed); } TimestretchBufferProvider::~TimestretchBufferProvider() { ALOGV("~TimestretchBufferProvider(%p)", this); + sonicDestroyStream(mSonicStream); if (mBuffer.frameCount != 0) { mTrackBufferProvider->releaseBuffer(&mBuffer); } @@ -489,6 +495,9 @@ status_t TimestretchBufferProvider::setPlaybackRate(float speed, float pitch) { mSpeed = speed; mPitch = pitch; + + sonicSetSpeed(mSonicStream, speed); + //TODO: pitch is ignored for now return OK; } @@ -506,17 +515,24 @@ void TimestretchBufferProvider::processFrames(void *dstBuffer, size_t *dstFrames *srcFrames = targetSrc + 1; } - // Do the time stretch by memory copy without any local buffer. - if (*dstFrames <= *srcFrames) { - size_t copySize = mFrameSize * *dstFrames; - memcpy(dstBuffer, srcBuffer, copySize); - } else { - // cyclically repeat the source. - for (size_t count = 0; count < *dstFrames; count += *srcFrames) { - size_t remaining = min(*srcFrames, *dstFrames - count); - memcpy((uint8_t*)dstBuffer + mFrameSize * count, - srcBuffer, mFrameSize * *srcFrames); + switch (mFormat) { + case AUDIO_FORMAT_PCM_FLOAT: + if (sonicWriteFloatToStream(mSonicStream, (float*)srcBuffer, *srcFrames) != 1) { + ALOGE("sonicWriteFloatToStream cannot realloc"); + *srcFrames = 0; // cannot consume all of srcBuffer } + *dstFrames = sonicReadFloatFromStream(mSonicStream, (float*)dstBuffer, *dstFrames); + break; + case AUDIO_FORMAT_PCM_16_BIT: + if (sonicWriteShortToStream(mSonicStream, (short*)srcBuffer, *srcFrames) != 1) { + ALOGE("sonicWriteShortToStream cannot realloc"); + *srcFrames = 0; // cannot consume all of srcBuffer + } + *dstFrames = sonicReadShortFromStream(mSonicStream, (short*)dstBuffer, *dstFrames); + break; + default: + // could also be caught on construction + LOG_ALWAYS_FATAL("invalid format %#x for TimestretchBufferProvider", mFormat); } } diff --git a/services/audioflinger/BufferProviders.h b/services/audioflinger/BufferProviders.h index 2b6ea47..42030c0 100644 --- a/services/audioflinger/BufferProviders.h +++ b/services/audioflinger/BufferProviders.h @@ -23,6 +23,7 @@ #include #include #include +#include namespace android { @@ -183,6 +184,7 @@ private: size_t mLocalBufferFrameCount; void *mLocalBufferData; size_t mRemaining; + sonicStream mSonicStream; }; // ---------------------------------------------------------------------------- diff --git a/services/audioflinger/tests/Android.mk b/services/audioflinger/tests/Android.mk index 76997be..536eb93 100644 --- a/services/audioflinger/tests/Android.mk +++ b/services/audioflinger/tests/Android.mk @@ -44,7 +44,8 @@ LOCAL_SRC_FILES:= \ LOCAL_C_INCLUDES := \ $(call include-path-for, audio-effects) \ $(call include-path-for, audio-utils) \ - frameworks/av/services/audioflinger + frameworks/av/services/audioflinger \ + external/sonic LOCAL_STATIC_LIBRARIES := \ libsndfile @@ -58,7 +59,8 @@ LOCAL_SHARED_LIBRARIES := \ libdl \ libcutils \ libutils \ - liblog + liblog \ + libsonic LOCAL_MODULE:= test-mixer -- cgit v1.1