diff options
author | Eric Laurent <elaurent@google.com> | 2011-10-10 19:50:46 -0700 |
---|---|---|
committer | Eric Laurent <elaurent@google.com> | 2011-10-10 19:50:46 -0700 |
commit | 523b06a7521dfb53179191681fa83d6c591f7eda (patch) | |
tree | 2362eaca11c64e1e979ecd1fd0f82bc68a05ee3b /libaudio | |
parent | 32e19f3fd71505c1c48e4412131b912310998bae (diff) | |
download | device_samsung_crespo-523b06a7521dfb53179191681fa83d6c591f7eda.zip device_samsung_crespo-523b06a7521dfb53179191681fa83d6c591f7eda.tar.gz device_samsung_crespo-523b06a7521dfb53179191681fa83d6c591f7eda.tar.bz2 |
audio HWL: removed unused code.
Removed C++ implementations of echo reference and resampler not needed
anymore now that libaudioutils is used.
Change-Id: Ibedf96fbaeeb38ea06b35adf7c95ed49cbafa916
Diffstat (limited to 'libaudio')
-rw-r--r-- | libaudio/EchoReference.cpp | 376 | ||||
-rw-r--r-- | libaudio/EchoReference.h | 118 | ||||
-rw-r--r-- | libaudio/ReSampler.cpp | 171 | ||||
-rw-r--r-- | libaudio/ReSampler.h | 80 |
4 files changed, 0 insertions, 745 deletions
diff --git a/libaudio/EchoReference.cpp b/libaudio/EchoReference.cpp deleted file mode 100644 index 2c10062..0000000 --- a/libaudio/EchoReference.cpp +++ /dev/null @@ -1,376 +0,0 @@ -/* -** Copyright 2011, The Android Open-Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "EchoReference" - -#include <utils/Log.h> -#include "EchoReference.h" - -namespace android_audio_legacy { - -//------------------------------------------------------------------------------ -// Echo reference buffer -//------------------------------------------------------------------------------ - -EchoReference::EchoReference(audio_format_t rdFormat, - uint32_t rdChannelCount, - uint32_t rdSamplingRate, - audio_format_t wrFormat, - uint32_t wrChannelCount, - uint32_t wrSamplingRate) -: mStatus (NO_INIT), mState(ECHOREF_IDLE), - mRdFormat(rdFormat), mRdChannelCount(rdChannelCount), mRdSamplingRate(rdSamplingRate), - mWrFormat(wrFormat), mWrChannelCount(wrChannelCount), mWrSamplingRate(wrSamplingRate), - mBuffer(NULL), mBufSize(0), mFramesIn(0), mWrBuf(NULL), mWrBufSize(0), mWrFramesIn(0), - mDownSampler(NULL) -{ - LOGV("EchoReference cstor"); - if (rdFormat != AUDIO_FORMAT_PCM_16_BIT || - rdFormat != wrFormat) { - LOGW("EchoReference cstor bad format rd %d, wr %d", rdFormat, wrFormat); - mStatus = BAD_VALUE; - return; - } - if ((rdChannelCount != 1 && rdChannelCount != 2) || - wrChannelCount != 2) { - LOGW("EchoReference cstor bad channel count rd %d, wr %d", rdChannelCount, wrChannelCount); - mStatus = BAD_VALUE; - return; - } - - if (wrSamplingRate < rdSamplingRate) { - LOGW("EchoReference cstor bad smp rate rd %d, wr %d", rdSamplingRate, wrSamplingRate); - mStatus = BAD_VALUE; - return; - } - - mRdFrameSize = audio_bytes_per_sample(rdFormat) * rdChannelCount; - mWrFrameSize = audio_bytes_per_sample(wrFormat) * wrChannelCount; - mStatus = NO_ERROR; -} - - -EchoReference::~EchoReference() { - LOGV("EchoReference dstor"); - reset_l(); - delete mDownSampler; -} - -status_t EchoReference::write(Buffer *buffer) -{ - if (mStatus != NO_ERROR) { - LOGV("EchoReference::write() ERROR, exiting early"); - return mStatus; - } - - AutoMutex _l(mLock); - - if (buffer == NULL) { - LOGV("EchoReference::write() stop write"); - mState &= ~ECHOREF_WRITING; - reset_l(); - return NO_ERROR; - } - - LOGV("EchoReference::write() START trying to write %d frames", buffer->frameCount); - LOGV("EchoReference::write() playbackTimestamp:[%lld].[%lld], mPlaybackDelay:[%ld]", - (int64_t)buffer->timeStamp.tv_sec, - (int64_t)buffer->timeStamp.tv_nsec, mPlaybackDelay); - - //LOGV("EchoReference::write() %d frames", buffer->frameCount); - // discard writes until a valid time stamp is provided. - - if ((buffer->timeStamp.tv_sec == 0) && (buffer->timeStamp.tv_nsec == 0) && - (mWrRenderTime.tv_sec == 0) && (mWrRenderTime.tv_nsec == 0)) { - return NO_ERROR; - } - - if ((mState & ECHOREF_WRITING) == 0) { - LOGV("EchoReference::write() start write"); - if (mDownSampler != NULL) { - mDownSampler->reset(); - } - mState |= ECHOREF_WRITING; - } - - if ((mState & ECHOREF_READING) == 0) { - return NO_ERROR; - } - - mWrRenderTime.tv_sec = buffer->timeStamp.tv_sec; - mWrRenderTime.tv_nsec = buffer->timeStamp.tv_nsec; - - mPlaybackDelay = buffer->delayNs; - - void *srcBuf; - size_t inFrames; - // do stereo to mono and down sampling if necessary - if (mRdChannelCount != mWrChannelCount || - mRdSamplingRate != mWrSamplingRate) { - if (mWrBufSize < buffer->frameCount) { - mWrBufSize = buffer->frameCount; - //max buffer size is normally function of read sampling rate but as write sampling rate - //is always more than read sampling rate this works - mWrBuf = realloc(mWrBuf, mWrBufSize * mRdFrameSize); - } - - inFrames = buffer->frameCount; - if (mRdChannelCount != mWrChannelCount) { - // must be stereo to mono - int16_t *src16 = (int16_t *)buffer->raw; - int16_t *dst16 = (int16_t *)mWrBuf; - size_t frames = buffer->frameCount; - while (frames--) { - *dst16++ = (int16_t)(((int32_t)*src16 + (int32_t)*(src16 + 1)) >> 1); - src16 += 2; - } - } - if (mWrSamplingRate != mRdSamplingRate) { - if (mDownSampler == NULL) { - LOGV("EchoReference::write() new ReSampler(%d, %d)", - mWrSamplingRate, mRdSamplingRate); - mDownSampler = new ReSampler(mWrSamplingRate, - mRdSamplingRate, - mRdChannelCount, - this); - - } - // mWrSrcBuf and mWrFramesIn are used by getNexBuffer() called by the resampler - // to get new frames - if (mRdChannelCount != mWrChannelCount) { - mWrSrcBuf = mWrBuf; - } else { - mWrSrcBuf = buffer->raw; - } - mWrFramesIn = buffer->frameCount; - // inFrames is always more than we need here to get frames remaining from previous runs - // inFrames is updated by resample() with the number of frames produced - LOGV("EchoReference::write() ReSampling(%d, %d)", - mWrSamplingRate, mRdSamplingRate); - mDownSampler->resample((int16_t *)mWrBuf, &inFrames); - LOGV_IF(mWrFramesIn != 0, - "EchoReference::write() mWrFramesIn not 0 (%d) after resampler", - mWrFramesIn); - } - srcBuf = mWrBuf; - } else { - inFrames = buffer->frameCount; - srcBuf = buffer->raw; - } - - if (mFramesIn + inFrames > mBufSize) { - LOGV("EchoReference::write() increasing buffer size from %d to %d", - mBufSize, mFramesIn + inFrames); - mBufSize = mFramesIn + inFrames; - mBuffer = realloc(mBuffer, mBufSize * mRdFrameSize); - } - memcpy((char *)mBuffer + mFramesIn * mRdFrameSize, - srcBuf, - inFrames * mRdFrameSize); - mFramesIn += inFrames; - - LOGV("EchoReference::write_log() inFrames:[%d], mFramesInOld:[%d], "\ - "mFramesInNew:[%d], mBufSize:[%d], mWrRenderTime:[%lld].[%lld], mPlaybackDelay:[%ld]", - inFrames, mFramesIn - inFrames, mFramesIn, mBufSize, (int64_t)mWrRenderTime.tv_sec, - (int64_t)mWrRenderTime.tv_nsec, mPlaybackDelay); - - mCond.signal(); - LOGV("EchoReference::write() END"); - return NO_ERROR; -} - -status_t EchoReference::read(EchoReference::Buffer *buffer) -{ - if (mStatus != NO_ERROR) { - return mStatus; - } - AutoMutex _l(mLock); - - if (buffer == NULL) { - LOGV("EchoReference::read() stop read"); - mState &= ~ECHOREF_READING; - return NO_ERROR; - } - - LOGV("EchoReference::read() START, delayCapture:[%ld],mFramesIn:[%d],buffer->frameCount:[%d]", - buffer->delayNs, mFramesIn, buffer->frameCount); - - if ((mState & ECHOREF_READING) == 0) { - LOGV("EchoReference::read() start read"); - reset_l(); - mState |= ECHOREF_READING; - } - - if ((mState & ECHOREF_WRITING) == 0) { - memset(buffer->raw, 0, mRdFrameSize * buffer->frameCount); - buffer->delayNs = 0; - return NO_ERROR; - } - -// LOGV("EchoReference::read() %d frames", buffer->frameCount); - - // allow some time for new frames to arrive if not enough frames are ready for read - if (mFramesIn < buffer->frameCount) { - uint32_t timeoutMs = (uint32_t)((1000 * buffer->frameCount) / mRdSamplingRate / 2); - - mCond.waitRelative(mLock, milliseconds(timeoutMs)); - if (mFramesIn < buffer->frameCount) { - LOGV("EchoReference::read() waited %d ms but still not enough frames"\ - " mFramesIn: %d, buffer->frameCount = %d", - timeoutMs, mFramesIn, buffer->frameCount); - buffer->frameCount = mFramesIn; - } - } - - int64_t timeDiff; - struct timespec tmp; - - if ((mWrRenderTime.tv_sec == 0 && mWrRenderTime.tv_nsec == 0) || - (buffer->timeStamp.tv_sec == 0 && buffer->timeStamp.tv_nsec == 0)) { - LOGV("read: NEW:timestamp is zero---------setting timeDiff = 0, "\ - "not updating delay this time"); - timeDiff = 0; - } else { - if (buffer->timeStamp.tv_nsec < mWrRenderTime.tv_nsec) { - tmp.tv_sec = buffer->timeStamp.tv_sec - mWrRenderTime.tv_sec - 1; - tmp.tv_nsec = 1000000000 + buffer->timeStamp.tv_nsec - mWrRenderTime.tv_nsec; - } else { - tmp.tv_sec = buffer->timeStamp.tv_sec - mWrRenderTime.tv_sec; - tmp.tv_nsec = buffer->timeStamp.tv_nsec - mWrRenderTime.tv_nsec; - } - timeDiff = (((int64_t)tmp.tv_sec * 1000000000 + tmp.tv_nsec)); - - int64_t expectedDelayNs = mPlaybackDelay + buffer->delayNs - timeDiff; - - LOGV("expectedDelayNs[%lld] = mPlaybackDelay[%ld] + delayCapture[%ld] - timeDiff[%lld]", - expectedDelayNs, mPlaybackDelay, buffer->delayNs, timeDiff); - - if (expectedDelayNs > 0) { - int64_t delayNs = ((int64_t)mFramesIn * 1000000000) / mRdSamplingRate; - - delayNs -= expectedDelayNs; - - if (abs(delayNs) >= sMinDelayUpdate) { - if (delayNs < 0) { - size_t previousFrameIn = mFramesIn; - mFramesIn = (expectedDelayNs * mRdSamplingRate)/1000000000; - int offset = mFramesIn - previousFrameIn; - LOGV("EchoReference::readlog: delayNs = NEGATIVE and ENOUGH : "\ - "setting %d frames to zero mFramesIn: %d, previousFrameIn = %d", - offset, mFramesIn, previousFrameIn); - - if (mFramesIn > mBufSize) { - mBufSize = mFramesIn; - mBuffer = realloc(mBuffer, mFramesIn * mRdFrameSize); - LOGV("EchoReference::read: increasing buffer size to %d", mBufSize); - } - - if (offset > 0) - memset((char *)mBuffer + previousFrameIn * mRdFrameSize, - 0, offset * mRdFrameSize); - } else { - size_t previousFrameIn = mFramesIn; - int framesInInt = (int)(((int64_t)expectedDelayNs * - (int64_t)mRdSamplingRate)/1000000000); - int offset = previousFrameIn - framesInInt; - - LOGV("EchoReference::readlog: delayNs = POSITIVE/ENOUGH :previousFrameIn: %d,"\ - "framesInInt: [%d], offset:[%d], buffer->frameCount:[%d]", - previousFrameIn, framesInInt, offset, buffer->frameCount); - - if (framesInInt < (int)buffer->frameCount) { - if (framesInInt > 0) { - memset((char *)mBuffer + framesInInt * mRdFrameSize, - 0, (buffer->frameCount-framesInInt) * mRdFrameSize); - LOGV("EchoReference::read: pushing [%d] zeros into ref buffer", - (buffer->frameCount-framesInInt)); - } else { - LOGV("framesInInt = %d", framesInInt); - } - framesInInt = buffer->frameCount; - } else { - if (offset > 0) { - memcpy(mBuffer, (char *)mBuffer + (offset * mRdFrameSize), - framesInInt * mRdFrameSize); - LOGV("EchoReference::read: shifting ref buffer by [%d]",framesInInt); - } - } - mFramesIn = (size_t)framesInInt; - } - } else { - LOGV("EchoReference::read: NOT ENOUGH samples to update %lld", delayNs); - } - } else { - LOGV("NEGATIVE expectedDelayNs[%lld] = "\ - "mPlaybackDelay[%ld] + delayCapture[%ld] - timeDiff[%lld]", - expectedDelayNs, mPlaybackDelay, buffer->delayNs, timeDiff); - } - } - - memcpy(buffer->raw, - (char *)mBuffer, - buffer->frameCount * mRdFrameSize); - - mFramesIn -= buffer->frameCount; - memcpy(mBuffer, - (char *)mBuffer + buffer->frameCount * mRdFrameSize, - mFramesIn * mRdFrameSize); - - // As the reference buffer is now time aligned to the microphone signal there is a zero delay - buffer->delayNs = 0; - - LOGV("EchoReference::read() END %d frames, total frames in %d", - buffer->frameCount, mFramesIn); - - mCond.signal(); - return NO_ERROR; -} - -void EchoReference::reset_l() { - LOGV("EchoReference::reset_l()"); - free(mBuffer); - mBuffer = NULL; - mBufSize = 0; - mFramesIn = 0; - free(mWrBuf); - mWrBuf = NULL; - mWrBufSize = 0; - mWrRenderTime.tv_sec = 0; - mWrRenderTime.tv_nsec = 0; -} - -status_t EchoReference::getNextBuffer(ReSampler::BufferProvider::Buffer* buffer) -{ - if (mWrSrcBuf == NULL || mWrFramesIn == 0) { - buffer->raw = NULL; - buffer->frameCount = 0; - return NOT_ENOUGH_DATA; - } - - buffer->frameCount = (buffer->frameCount > mWrFramesIn) ? mWrFramesIn : buffer->frameCount; - // this is mRdChannelCount here as we resample after stereo to mono conversion if any - buffer->i16 = (int16_t *)mWrSrcBuf + (mWrBufSize - mWrFramesIn) * mRdChannelCount; - - return 0; -} - -void EchoReference::releaseBuffer(ReSampler::BufferProvider::Buffer* buffer) -{ - mWrFramesIn -= buffer->frameCount; -} - -}; // namespace android_audio_legacy diff --git a/libaudio/EchoReference.h b/libaudio/EchoReference.h deleted file mode 100644 index b82cd11..0000000 --- a/libaudio/EchoReference.h +++ /dev/null @@ -1,118 +0,0 @@ -/* -** Copyright 2011, The Android Open-Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#ifndef ANDROID_ECHO_REFERENCE_H -#define ANDROID_ECHO_REFERENCE_H - -#include <stdint.h> -#include <sys/types.h> -#include <utils/threads.h> -#include <hardware_legacy/AudioSystemLegacy.h> -#include "ReSampler.h" - -namespace android_audio_legacy { -using android::Mutex; -using android::AutoMutex; - -class EchoReference : public ReSampler::BufferProvider { - -public: - - EchoReference(audio_format_t rdFormat, - uint32_t rdChannelCount, - uint32_t rdSamplingRate, - audio_format_t wrFormat, - uint32_t wrChannelCount, - uint32_t wrSamplingRate); - virtual ~EchoReference(); - - // echo reference state: it field indicating if read, write or both are active. - enum state { - ECHOREF_IDLE = 0x00, // idle - ECHOREF_READING = 0x01, // reading is active - ECHOREF_WRITING = 0x02 // writing is active - }; - - // Buffer descriptor used by read() and write() methods, including the time stamp and delay. - class Buffer { - public: - void *raw; // pointer to audio frame - size_t frameCount; // number of frames in buffer - int32_t delayNs; // delay for this buffer (see comment below) - struct timespec timeStamp; // time stamp for this buffer (see comment below) - }; - // when used for EchoReference::write(): - // + as input: - // - delayNs is the delay introduced by playback buffers - // - timeStamp is the time stamp corresponding to the delay calculation - // + as output: - // unused - // when used for EchoReference::read(): - // + as input: - // - delayNs is the delay introduced by capture buffers - // - timeStamp is the time stamp corresponding to the delay calculation - // + as output: - // - delayNs is the delay between the returned frames and the capture time derived from - // delay and time stamp indicated as input. This delay is to be communicated to the AEC. - // - frameCount is updated with the actual number of frames returned - - - // BufferProvider - status_t getNextBuffer(ReSampler::BufferProvider::Buffer* buffer); - void releaseBuffer(ReSampler::BufferProvider::Buffer* buffer); - - status_t initCheck() { return mStatus; } - - status_t read(Buffer *buffer); - status_t write(Buffer *buffer); - - -private: - - void reset_l(); - - status_t mStatus; // init status - uint32_t mState; // active state: reading, writing or both - audio_format_t mRdFormat; // read sample format - uint32_t mRdChannelCount; // read number of channels - uint32_t mRdSamplingRate; // read sampling rate - size_t mRdFrameSize; // read frame size (bytes per sample) - audio_format_t mWrFormat; // write sample format - uint32_t mWrChannelCount; // write number of channels - uint32_t mWrSamplingRate; // write sampling rate - size_t mWrFrameSize; // write frame size (bytes per sample) - void *mBuffer; // main buffer - size_t mBufSize; // main buffer size in frames - size_t mFramesIn; // number of frames in main buffer - void *mWrBuf; // buffer for input conversions - size_t mWrBufSize; // size of conversion buffer in frames - size_t mWrFramesIn; // number of frames in conversion buffer - void *mWrSrcBuf; // resampler input buf (either mWrBuf or buffer used by write() - struct timespec mWrRenderTime; // latest render time indicated by write() - int32_t mPlaybackDelay; - - uint32_t mRdDurationUs; // Duration of last buffer read (used for mCond wait timeout) - android::Mutex mLock; // Mutex protecting read/write concurrency - android::Condition mCond; // Condition signaled when data is ready to read - ReSampler *mDownSampler; // input resampler - - static const int sMinDelayUpdate = 62500; // delay jump threshold to update ref buffer - // 0.5 samples at 8kHz in nsecs -}; - -}; // namespace android - -#endif // ANDROID_ECHO_REFERENCE_H diff --git a/libaudio/ReSampler.cpp b/libaudio/ReSampler.cpp deleted file mode 100644 index aa1d5e0..0000000 --- a/libaudio/ReSampler.cpp +++ /dev/null @@ -1,171 +0,0 @@ -/* -** Copyright 2011, The Android Open-Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -//#define LOG_NDEBUG 0 -#define LOG_TAG "ReSampler" - -#include <utils/Log.h> -#include "ReSampler.h" - -namespace android_audio_legacy { - - -//------------------------------------------------------------------------------ -// speex based resampler -//------------------------------------------------------------------------------ - -#define RESAMPLER_QUALITY 2 - -ReSampler::ReSampler(uint32_t inSampleRate, - uint32_t outSampleRate, - uint32_t channelCount, - BufferProvider* provider) - : mStatus(NO_INIT), mSpeexResampler(NULL), mProvider(provider), - mInSampleRate(inSampleRate), mOutSampleRate(outSampleRate), mChannelCount(channelCount), - mInBuf(NULL), mInBufSize(0) -{ - LOGV("ReSampler() cstor %p In SR %d Out SR %d channels %d", - this, mInSampleRate, mOutSampleRate, mChannelCount); - - if (mProvider == NULL) { - return; - } - - int error; - mSpeexResampler = speex_resampler_init(channelCount, - inSampleRate, - outSampleRate, - RESAMPLER_QUALITY, - &error); - if (mSpeexResampler == NULL) { - LOGW("ReSampler: Cannot create speex resampler: %s", speex_resampler_strerror(error)); - return; - } - - reset(); - - int frames = speex_resampler_get_input_latency(mSpeexResampler); - mSpeexDelayNs = (int32_t)((1000000000 * (int64_t)frames) / mInSampleRate); - frames = speex_resampler_get_output_latency(mSpeexResampler); - mSpeexDelayNs += (int32_t)((1000000000 * (int64_t)frames) / mOutSampleRate); - - mStatus = NO_ERROR; -} - -ReSampler::~ReSampler() -{ - free(mInBuf); - - if (mSpeexResampler != NULL) { - speex_resampler_destroy(mSpeexResampler); - } -} - -void ReSampler::reset() -{ - mFramesIn = 0; - mFramesRq = 0; - - if (mSpeexResampler != NULL) { - speex_resampler_reset_mem(mSpeexResampler); - } -} - -int32_t ReSampler::delayNs() -{ - int32_t delay = (int32_t)((1000000000 * (int64_t)mFramesIn) / mInSampleRate); - delay += mSpeexDelayNs; - - return delay; -} - -// outputs a number of frames less or equal to *outFrameCount and updates *outFrameCount -// with the actual number of frames produced. -int ReSampler::resample(int16_t *out, size_t *outFrameCount) -{ - if (mStatus != NO_ERROR) { - return mStatus; - } - - if (out == NULL || outFrameCount == NULL) { - return BAD_VALUE; - } - - size_t framesRq = *outFrameCount; - // update and cache the number of frames needed at the input sampling rate to produce - // the number of frames requested at the output sampling rate - if (framesRq != mFramesRq) { - mFramesNeeded = (framesRq * mOutSampleRate) / mInSampleRate + 1; - mFramesRq = framesRq; - } - - size_t framesWr = 0; - size_t inFrames = 0; - while (framesWr < framesRq) { - if (mFramesIn < mFramesNeeded) { - // make sure that the number of frames present in mInBuf (mFramesIn) is at least - // the number of frames needed to produce the number of frames requested at - // the output sampling rate - if (mInBufSize < mFramesNeeded) { - mInBufSize = mFramesNeeded; - mInBuf = (int16_t *)realloc(mInBuf, mInBufSize * mChannelCount * sizeof(int16_t)); - } - BufferProvider::Buffer buf; - buf.frameCount = mFramesNeeded - mFramesIn; - mProvider->getNextBuffer(&buf); - if (buf.raw == NULL) { - break; - } - memcpy(mInBuf + mFramesIn * mChannelCount, - buf.raw, - buf.frameCount * mChannelCount * sizeof(int16_t)); - mFramesIn += buf.frameCount; - mProvider->releaseBuffer(&buf); - } - - size_t outFrames = framesRq - framesWr; - inFrames = mFramesIn; - if (mChannelCount == 1) { - speex_resampler_process_int(mSpeexResampler, - 0, - mInBuf, - &inFrames, - out + framesWr * mChannelCount, - &outFrames); - } else { - speex_resampler_process_interleaved_int(mSpeexResampler, - mInBuf, - &inFrames, - out + framesWr * mChannelCount, - &outFrames); - } - framesWr += outFrames; - mFramesIn -= inFrames; - LOGW_IF((framesWr != framesRq) && (mFramesIn != 0), - "ReSampler::resample() remaining %d frames in and %d frames out", - mFramesIn, (framesRq - framesWr)); - } - if (mFramesIn) { - memmove(mInBuf, - mInBuf + inFrames * mChannelCount, - mFramesIn * mChannelCount * sizeof(int16_t)); - } - *outFrameCount = framesWr; - - return NO_ERROR; -} - -}; // namespace android_audio_legacy diff --git a/libaudio/ReSampler.h b/libaudio/ReSampler.h deleted file mode 100644 index f531900..0000000 --- a/libaudio/ReSampler.h +++ /dev/null @@ -1,80 +0,0 @@ -/* -** Copyright 2008, The Android Open-Source Project -** -** Licensed under the Apache License, Version 2.0 (the "License"); -** you may not use this file except in compliance with the License. -** You may obtain a copy of the License at -** -** http://www.apache.org/licenses/LICENSE-2.0 -** -** Unless required by applicable law or agreed to in writing, software -** distributed under the License is distributed on an "AS IS" BASIS, -** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -** See the License for the specific language governing permissions and -** limitations under the License. -*/ - -#ifndef ANDROID_RESAMPLER_H -#define ANDROID_RESAMPLER_H - -#include <stdint.h> -#include <sys/types.h> -#include <hardware_legacy/AudioSystemLegacy.h> -#include "speex/speex_resampler.h" - -namespace android_audio_legacy { - -class ReSampler { -public: - - class BufferProvider - { - public: - - struct Buffer { - union { - void* raw; - short* i16; - int8_t* i8; - }; - size_t frameCount; - }; - - virtual ~BufferProvider() {} - - virtual status_t getNextBuffer(Buffer* buffer) = 0; - virtual void releaseBuffer(Buffer* buffer) = 0; - }; - - ReSampler(uint32_t inSampleRate, - uint32_t outSampleRate, - uint32_t channelCount, - BufferProvider* provider); - - virtual ~ReSampler(); - - status_t initCheck() { return mStatus; } - void reset(); - int resample(int16_t* out, size_t *outFrameCount); - int32_t delayNs(); - - -private: - status_t mStatus; // init status - SpeexResamplerState *mSpeexResampler; // handle on speex resampler - BufferProvider* mProvider; // buffer provider installed by client - uint32_t mInSampleRate; // input sampling rate - uint32_t mOutSampleRate; // output sampling rate - uint32_t mChannelCount; // number of channels - int16_t *mInBuf; // input buffer - size_t mInBufSize; // input buffer size - size_t mFramesIn; // number of frames in input buffer - size_t mFramesRq; // cached number of output frames - size_t mFramesNeeded; // minimum number of input frames to produce mFramesRq - // output frames - int32_t mSpeexDelayNs; // delay introduced by speex resampler in ns -}; - -}; // namespace android_audio_legacy - -#endif // ANDROID_RESAMPLER_H |