summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorZhou Song <zhous@codeaurora.org>2015-11-19 13:49:18 +0800
committerSteve Kondik <steve@cyngn.com>2016-04-13 13:54:55 -0700
commit0d34354e3e6e70ecce4cbef30d7dc6a1b9bcf328 (patch)
treeee5e2ce4bb86f2f511adb6b5688e2b393ce7512e /services
parent02d9acdc44c96db48f28e79fd60cfbfe8e6ddfd9 (diff)
downloadframeworks_av-0d34354e3e6e70ecce4cbef30d7dc6a1b9bcf328.zip
frameworks_av-0d34354e3e6e70ecce4cbef30d7dc6a1b9bcf328.tar.gz
frameworks_av-0d34354e3e6e70ecce4cbef30d7dc6a1b9bcf328.tar.bz2
audio: QTI resampler supports for 32 bit input format
Configure QTI resampler as 32 bit input format to avoid losing precision. audioflinger: add channel count check to use QTI resampler Change-Id: I8f76dd82b72a0dd8b77343e77e0d0545e1be2114 CRs-Fixed: 940287 Change-Id: I7e1b8582cd6bb106ab0bd25f9bc1bd9e4092318b
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/AudioMixer.cpp3
-rw-r--r--services/audioflinger/AudioResamplerQTI.cpp21
-rw-r--r--services/audioflinger/AudioResamplerQTI.h2
3 files changed, 16 insertions, 10 deletions
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp
index 806eaf1..bb9d4e5 100644
--- a/services/audioflinger/AudioMixer.cpp
+++ b/services/audioflinger/AudioMixer.cpp
@@ -781,7 +781,8 @@ bool AudioMixer::track_t::setResampler(uint32_t trackSampleRate, uint32_t devSam
#ifdef QTI_RESAMPLER
if ((trackSampleRate <= QTI_RESAMPLER_MAX_SAMPLERATE) &&
(trackSampleRate > devSampleRate * 2) &&
- ((devSampleRate == 48000)||(devSampleRate == 44100))) {
+ ((devSampleRate == 48000)||(devSampleRate == 44100)) &&
+ (resamplerChannelCount <= 2)) {
quality = AudioResampler::QTI_QUALITY;
}
#endif
diff --git a/services/audioflinger/AudioResamplerQTI.cpp b/services/audioflinger/AudioResamplerQTI.cpp
index 44b741e..0d57e09 100644
--- a/services/audioflinger/AudioResamplerQTI.cpp
+++ b/services/audioflinger/AudioResamplerQTI.cpp
@@ -51,8 +51,9 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount,
{
int16_t vl = mVolume[0];
int16_t vr = mVolume[1];
- int16_t *pBuf;
+ int32_t *pBuf;
+ int64_t tempL, tempR;
size_t inFrameRequest;
size_t inFrameCount = getNumInSample(outFrameCount);
size_t index = 0;
@@ -74,7 +75,7 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount,
if(mResamplerOutBuf) {
delete [] mResamplerOutBuf;
}
- mTmpBuf = new int16_t[inFrameRequest + 16];
+ mTmpBuf = new int32_t[inFrameRequest + 16];
mResamplerOutBuf = new int32_t[out_count];
}
@@ -95,7 +96,7 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount,
goto resample_exit;
}
- mTmpBuf[index++] = clamp16_from_float(*((float *)mBuffer.raw + frameIndex++));
+ mTmpBuf[index++] = clampq4_27_from_float(*((float *)mBuffer.raw + frameIndex++));
if (frameIndex >= mBuffer.frameCount) {
provider->releaseBuffer(&mBuffer);
@@ -121,8 +122,8 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount,
goto resample_exit;
}
- mTmpBuf[index] = clamp16_from_float(*((float *)mBuffer.raw + frameIndex++));
- pBuf[index++] = clamp16_from_float(*((float *)mBuffer.raw + frameIndex++));
+ mTmpBuf[index] = clampq4_27_from_float(*((float *)mBuffer.raw + frameIndex++));
+ pBuf[index++] = clampq4_27_from_float(*((float *)mBuffer.raw + frameIndex++));
if (frameIndex >= mBuffer.frameCount * 2) {
provider->releaseBuffer(&mBuffer);
}
@@ -133,8 +134,12 @@ size_t AudioResamplerQTI::resample(int32_t* out, size_t outFrameCount,
resample_exit:
for (int i = 0; i < out_count; i += 2) {
- fout[i] += float_from_q4_27(mResamplerOutBuf[i] * vl);
- fout[i+1] += float_from_q4_27(mResamplerOutBuf[i+1] * vr);
+ // Multiplying q4.27 data with u4.12 gain could result in 39 fractional bit data(27+12)
+ // To get back the 27 fractional bit format output data, do right shift by 12
+ tempL = (int64_t)mResamplerOutBuf[i] * vl;
+ tempR = (int64_t)mResamplerOutBuf[i+1] * vr;
+ fout[i] += float_from_q4_27((int32_t)(tempL>>12));
+ fout[i+1] += float_from_q4_27((int32_t)(tempR>>12));
}
mFrameIndex = frameIndex;
@@ -151,7 +156,7 @@ void AudioResamplerQTI::setSampleRate(int32_t inSampleRate)
void AudioResamplerQTI::init()
{
- QCT_Resampler::Init(mState, mChannelCount, mInSampleRate, mSampleRate);
+ QCT_Resampler::Init(mState, mChannelCount, mInSampleRate, mSampleRate, 1/*32bit in*/);
}
size_t AudioResamplerQTI::getNumInSample(size_t outFrameCount)
diff --git a/services/audioflinger/AudioResamplerQTI.h b/services/audioflinger/AudioResamplerQTI.h
index 0b30a9f..1cf93fc 100644
--- a/services/audioflinger/AudioResamplerQTI.h
+++ b/services/audioflinger/AudioResamplerQTI.h
@@ -35,7 +35,7 @@ public:
size_t getNumInSample(size_t outFrameCount);
int16_t *mState;
- int16_t *mTmpBuf;
+ int32_t *mTmpBuf;
int32_t *mResamplerOutBuf;
size_t mFrameIndex;
size_t stateSize;