diff options
author | Ricardo Garcia <rago@google.com> | 2015-04-14 00:23:59 +0000 |
---|---|---|
committer | Android (Google) Code Review <android-gerrit@google.com> | 2015-04-14 00:24:01 +0000 |
commit | cf31941ef4cf1a882cc23743ada41e49f8e1be03 (patch) | |
tree | efeb057430dea9922e6421e65a76a963c76a57c4 /services | |
parent | af52793677e26d76788fc63d2df08d0c141013bc (diff) | |
parent | f097cae65bfce7200938c5bd89e7e9b61cba78b3 (diff) | |
download | frameworks_av-cf31941ef4cf1a882cc23743ada41e49f8e1be03.zip frameworks_av-cf31941ef4cf1a882cc23743ada41e49f8e1be03.tar.gz frameworks_av-cf31941ef4cf1a882cc23743ada41e49f8e1be03.tar.bz2 |
Merge "TimestretchBufferProvider integration with Sonic Library"
Diffstat (limited to 'services')
-rw-r--r-- | services/audioflinger/Android.mk | 4 | ||||
-rw-r--r-- | services/audioflinger/BufferProviders.cpp | 38 | ||||
-rw-r--r-- | services/audioflinger/BufferProviders.h | 2 | ||||
-rw-r--r-- | services/audioflinger/tests/Android.mk | 6 |
4 files changed, 36 insertions, 14 deletions
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 <hardware/audio_effect.h> #include <media/AudioBufferProvider.h> #include <system/audio.h> +#include <sonic.h> 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 |