summaryrefslogtreecommitdiffstats
path: root/services
diff options
context:
space:
mode:
authorAndy Hung <hunga@google.com>2014-07-07 10:21:44 -0700
committerAndy Hung <hunga@google.com>2014-07-07 10:29:36 -0700
commit3348e36c51e91e78020bcc6578eda83d97c31bec (patch)
treeee3df8ed9f79863fc34589813710896a7e08af86 /services
parent075abae2a954bf3edf18ad1705c2c0f188454ae0 (diff)
downloadframeworks_av-3348e36c51e91e78020bcc6578eda83d97c31bec.zip
frameworks_av-3348e36c51e91e78020bcc6578eda83d97c31bec.tar.gz
frameworks_av-3348e36c51e91e78020bcc6578eda83d97c31bec.tar.bz2
Replace int bitDepth with audio_format_t in Resampler
Remove mBitDepth from class (not used). Replace with audio_format_t in factory method to distinguish between float and pcm 16-bit. Change-Id: I166860796c68285077ef4458d8758d19b82523f9
Diffstat (limited to 'services')
-rw-r--r--services/audioflinger/AudioMixer.cpp14
-rw-r--r--services/audioflinger/AudioResampler.cpp55
-rw-r--r--services/audioflinger/AudioResampler.h6
-rw-r--r--services/audioflinger/AudioResamplerCubic.h4
-rw-r--r--services/audioflinger/AudioResamplerDyn.cpp4
-rw-r--r--services/audioflinger/AudioResamplerDyn.h2
-rw-r--r--services/audioflinger/AudioResamplerSinc.cpp4
-rw-r--r--services/audioflinger/AudioResamplerSinc.h2
-rw-r--r--services/audioflinger/Tracks.cpp3
-rw-r--r--services/audioflinger/test-resample.cpp10
-rw-r--r--services/audioflinger/tests/resampler_tests.cpp9
11 files changed, 54 insertions, 59 deletions
diff --git a/services/audioflinger/AudioMixer.cpp b/services/audioflinger/AudioMixer.cpp
index af312c4..4dbbc43 100644
--- a/services/audioflinger/AudioMixer.cpp
+++ b/services/audioflinger/AudioMixer.cpp
@@ -763,21 +763,9 @@ bool AudioMixer::track_t::setResampler(uint32_t value, uint32_t devSampleRate)
quality = AudioResampler::DEFAULT_QUALITY;
}
- int bits;
- switch (mMixerInFormat) {
- case AUDIO_FORMAT_PCM_16_BIT:
- bits = 16;
- break;
- case AUDIO_FORMAT_PCM_FLOAT:
- bits = 32; // 32 bits to the AudioResampler::create() indicates float.
- break;
- default:
- LOG_ALWAYS_FATAL("Invalid mMixerInFormat: %#x", mMixerInFormat);
- break;
- }
ALOGVV("Creating resampler with %d bits\n", bits);
resampler = AudioResampler::create(
- bits,
+ mMixerInFormat,
// the resampler sees the number of channels after the downmixer, if any
(int) (downmixerBufferProvider != NULL ? MAX_NUM_CHANNELS : channelCount),
devSampleRate, quality);
diff --git a/services/audioflinger/AudioResampler.cpp b/services/audioflinger/AudioResampler.cpp
index b8a0357..38c9061 100644
--- a/services/audioflinger/AudioResampler.cpp
+++ b/services/audioflinger/AudioResampler.cpp
@@ -40,8 +40,8 @@ namespace android {
class AudioResamplerOrder1 : public AudioResampler {
public:
- AudioResamplerOrder1(int bitDepth, int inChannelCount, int32_t sampleRate) :
- AudioResampler(bitDepth, inChannelCount, sampleRate, LOW_QUALITY), mX0L(0), mX0R(0) {
+ AudioResamplerOrder1(int inChannelCount, int32_t sampleRate) :
+ AudioResampler(inChannelCount, sampleRate, LOW_QUALITY), mX0L(0), mX0R(0) {
}
virtual void resample(int32_t* out, size_t outFrameCount,
AudioBufferProvider* provider);
@@ -145,7 +145,7 @@ static const uint32_t maxMHz = 130; // an arbitrary number that permits 3 VHQ, s
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
static uint32_t currentMHz = 0;
-AudioResampler* AudioResampler::create(int bitDepth, int inChannelCount,
+AudioResampler* AudioResampler::create(audio_format_t format, int inChannelCount,
int32_t sampleRate, src_quality quality) {
bool atFinalQuality;
@@ -216,33 +216,40 @@ AudioResampler* AudioResampler::create(int bitDepth, int inChannelCount,
default:
case LOW_QUALITY:
ALOGV("Create linear Resampler");
- resampler = new AudioResamplerOrder1(bitDepth, inChannelCount, sampleRate);
+ LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT);
+ resampler = new AudioResamplerOrder1(inChannelCount, sampleRate);
break;
case MED_QUALITY:
ALOGV("Create cubic Resampler");
- resampler = new AudioResamplerCubic(bitDepth, inChannelCount, sampleRate);
+ LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT);
+ resampler = new AudioResamplerCubic(inChannelCount, sampleRate);
break;
case HIGH_QUALITY:
ALOGV("Create HIGH_QUALITY sinc Resampler");
- resampler = new AudioResamplerSinc(bitDepth, inChannelCount, sampleRate);
+ LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT);
+ resampler = new AudioResamplerSinc(inChannelCount, sampleRate);
break;
case VERY_HIGH_QUALITY:
ALOGV("Create VERY_HIGH_QUALITY sinc Resampler = %d", quality);
- resampler = new AudioResamplerSinc(bitDepth, inChannelCount, sampleRate, quality);
+ LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT);
+ resampler = new AudioResamplerSinc(inChannelCount, sampleRate, quality);
break;
case DYN_LOW_QUALITY:
case DYN_MED_QUALITY:
case DYN_HIGH_QUALITY:
ALOGV("Create dynamic Resampler = %d", quality);
- if (bitDepth == 32) { /* bitDepth == 32 signals float precision */
- resampler = new AudioResamplerDyn<float, float, float>(bitDepth, inChannelCount,
- sampleRate, quality);
- } else if (quality == DYN_HIGH_QUALITY) {
- resampler = new AudioResamplerDyn<int32_t, int16_t, int32_t>(bitDepth, inChannelCount,
+ if (format == AUDIO_FORMAT_PCM_FLOAT) {
+ resampler = new AudioResamplerDyn<float, float, float>(inChannelCount,
sampleRate, quality);
} else {
- resampler = new AudioResamplerDyn<int16_t, int16_t, int32_t>(bitDepth, inChannelCount,
- sampleRate, quality);
+ LOG_ALWAYS_FATAL_IF(format != AUDIO_FORMAT_PCM_16_BIT);
+ if (quality == DYN_HIGH_QUALITY) {
+ resampler = new AudioResamplerDyn<int32_t, int16_t, int32_t>(inChannelCount,
+ sampleRate, quality);
+ } else {
+ resampler = new AudioResamplerDyn<int16_t, int16_t, int32_t>(inChannelCount,
+ sampleRate, quality);
+ }
}
break;
}
@@ -252,18 +259,17 @@ AudioResampler* AudioResampler::create(int bitDepth, int inChannelCount,
return resampler;
}
-AudioResampler::AudioResampler(int bitDepth, int inChannelCount,
+AudioResampler::AudioResampler(int inChannelCount,
int32_t sampleRate, src_quality quality) :
- mBitDepth(bitDepth), mChannelCount(inChannelCount),
- mSampleRate(sampleRate), mInSampleRate(sampleRate), mInputIndex(0),
- mPhaseFraction(0), mLocalTimeFreq(0),
- mPTS(AudioBufferProvider::kInvalidPTS), mQuality(quality) {
- // sanity check on format
- if ((bitDepth != 16 && (quality < DYN_LOW_QUALITY || bitDepth != 32))
- || inChannelCount < 1
+ mChannelCount(inChannelCount),
+ mSampleRate(sampleRate), mInSampleRate(sampleRate), mInputIndex(0),
+ mPhaseFraction(0), mLocalTimeFreq(0),
+ mPTS(AudioBufferProvider::kInvalidPTS), mQuality(quality) {
+
+ if (inChannelCount < 1
|| inChannelCount > (quality < DYN_LOW_QUALITY ? 2 : 8)) {
- LOG_ALWAYS_FATAL("Unsupported sample format %d quality %d bits, %d channels",
- quality, bitDepth, inChannelCount);
+ LOG_ALWAYS_FATAL("Unsupported sample format %d quality %d channels",
+ quality, inChannelCount);
}
if (sampleRate <= 0) {
LOG_ALWAYS_FATAL("Unsupported sample rate %d Hz", sampleRate);
@@ -272,7 +278,6 @@ AudioResampler::AudioResampler(int bitDepth, int inChannelCount,
// initialize common members
mVolume[0] = mVolume[1] = 0;
mBuffer.frameCount = 0;
-
}
AudioResampler::~AudioResampler() {
diff --git a/services/audioflinger/AudioResampler.h b/services/audioflinger/AudioResampler.h
index b84567e..be747f6 100644
--- a/services/audioflinger/AudioResampler.h
+++ b/services/audioflinger/AudioResampler.h
@@ -22,6 +22,7 @@
#include <cutils/compiler.h>
#include <media/AudioBufferProvider.h>
+#include <system/audio.h>
namespace android {
// ----------------------------------------------------------------------------
@@ -46,7 +47,7 @@ public:
DYN_HIGH_QUALITY=7,
};
- static AudioResampler* create(int bitDepth, int inChannelCount,
+ static AudioResampler* create(audio_format_t format, int inChannelCount,
int32_t sampleRate, src_quality quality=DEFAULT_QUALITY);
virtual ~AudioResampler();
@@ -86,7 +87,7 @@ protected:
// multiplier to calculate fixed point phase increment
static const double kPhaseMultiplier;
- AudioResampler(int bitDepth, int inChannelCount, int32_t sampleRate, src_quality quality);
+ AudioResampler(int inChannelCount, int32_t sampleRate, src_quality quality);
// prevent copying
AudioResampler(const AudioResampler&);
@@ -94,7 +95,6 @@ protected:
int64_t calculateOutputPTS(int outputFrameIndex);
- const int32_t mBitDepth;
const int32_t mChannelCount;
const int32_t mSampleRate;
int32_t mInSampleRate;
diff --git a/services/audioflinger/AudioResamplerCubic.h b/services/audioflinger/AudioResamplerCubic.h
index 203b933..b315da5 100644
--- a/services/audioflinger/AudioResamplerCubic.h
+++ b/services/audioflinger/AudioResamplerCubic.h
@@ -28,8 +28,8 @@ namespace android {
class AudioResamplerCubic : public AudioResampler {
public:
- AudioResamplerCubic(int bitDepth, int inChannelCount, int32_t sampleRate) :
- AudioResampler(bitDepth, inChannelCount, sampleRate, MED_QUALITY) {
+ AudioResamplerCubic(int inChannelCount, int32_t sampleRate) :
+ AudioResampler(inChannelCount, sampleRate, MED_QUALITY) {
}
virtual void resample(int32_t* out, size_t outFrameCount,
AudioBufferProvider* provider);
diff --git a/services/audioflinger/AudioResamplerDyn.cpp b/services/audioflinger/AudioResamplerDyn.cpp
index 7ca10c1..043c803 100644
--- a/services/audioflinger/AudioResamplerDyn.cpp
+++ b/services/audioflinger/AudioResamplerDyn.cpp
@@ -162,9 +162,9 @@ void AudioResamplerDyn<TC, TI, TO>::Constants::set(
}
template<typename TC, typename TI, typename TO>
-AudioResamplerDyn<TC, TI, TO>::AudioResamplerDyn(int bitDepth,
+AudioResamplerDyn<TC, TI, TO>::AudioResamplerDyn(
int inChannelCount, int32_t sampleRate, src_quality quality)
- : AudioResampler(bitDepth, inChannelCount, sampleRate, quality),
+ : AudioResampler(inChannelCount, sampleRate, quality),
mResampleFunc(0), mFilterSampleRate(0), mFilterQuality(DEFAULT_QUALITY),
mCoefBuffer(NULL)
{
diff --git a/services/audioflinger/AudioResamplerDyn.h b/services/audioflinger/AudioResamplerDyn.h
index 3dced8a..3044bfb 100644
--- a/services/audioflinger/AudioResamplerDyn.h
+++ b/services/audioflinger/AudioResamplerDyn.h
@@ -41,7 +41,7 @@ namespace android {
template<typename TC, typename TI, typename TO>
class AudioResamplerDyn: public AudioResampler {
public:
- AudioResamplerDyn(int bitDepth, int inChannelCount,
+ AudioResamplerDyn(int inChannelCount,
int32_t sampleRate, src_quality quality);
virtual ~AudioResamplerDyn();
diff --git a/services/audioflinger/AudioResamplerSinc.cpp b/services/audioflinger/AudioResamplerSinc.cpp
index 35553ef..60ff88e 100644
--- a/services/audioflinger/AudioResamplerSinc.cpp
+++ b/services/audioflinger/AudioResamplerSinc.cpp
@@ -452,9 +452,9 @@ int32_t mulAddRL(int left, uint32_t inRL, int32_t v, int32_t a)
// ----------------------------------------------------------------------------
-AudioResamplerSinc::AudioResamplerSinc(int bitDepth,
+AudioResamplerSinc::AudioResamplerSinc(
int inChannelCount, int32_t sampleRate, src_quality quality)
- : AudioResampler(bitDepth, inChannelCount, sampleRate, quality),
+ : AudioResampler(inChannelCount, sampleRate, quality),
mState(0), mImpulse(0), mRingFull(0), mFirCoefs(0)
{
/*
diff --git a/services/audioflinger/AudioResamplerSinc.h b/services/audioflinger/AudioResamplerSinc.h
index 1ea4474..97ae3d0 100644
--- a/services/audioflinger/AudioResamplerSinc.h
+++ b/services/audioflinger/AudioResamplerSinc.h
@@ -34,7 +34,7 @@ typedef int32_t (*readResampleFirLerpIntBitsFn)();
class AudioResamplerSinc : public AudioResampler {
public:
- AudioResamplerSinc(int bitDepth, int inChannelCount, int32_t sampleRate,
+ AudioResamplerSinc(int inChannelCount, int32_t sampleRate,
src_quality quality = HIGH_QUALITY);
virtual ~AudioResamplerSinc();
diff --git a/services/audioflinger/Tracks.cpp b/services/audioflinger/Tracks.cpp
index 4fbb973..0ef9fe5 100644
--- a/services/audioflinger/Tracks.cpp
+++ b/services/audioflinger/Tracks.cpp
@@ -1895,7 +1895,8 @@ AudioFlinger::RecordThread::RecordTrack::RecordTrack(
if (thread->mSampleRate != sampleRate && thread->mChannelCount <= FCC_2 &&
channelCount <= FCC_2) {
// sink SR
- mResampler = AudioResampler::create(16, thread->mChannelCount, sampleRate);
+ mResampler = AudioResampler::create(AUDIO_FORMAT_PCM_16_BIT,
+ thread->mChannelCount, sampleRate);
// source SR
mResampler->setSampleRate(thread->mSampleRate);
mResampler->setVolume(AudioMixer::UNITY_GAIN_INT, AudioMixer::UNITY_GAIN_INT);
diff --git a/services/audioflinger/test-resample.cpp b/services/audioflinger/test-resample.cpp
index e14b4ae..78c9927 100644
--- a/services/audioflinger/test-resample.cpp
+++ b/services/audioflinger/test-resample.cpp
@@ -14,8 +14,6 @@
* limitations under the License.
*/
-#include "AudioResampler.h"
-#include <media/AudioBufferProvider.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
@@ -30,6 +28,8 @@
#include <audio_utils/primitives.h>
#include <audio_utils/sndfile.h>
#include <utils/Vector.h>
+#include <media/AudioBufferProvider.h>
+#include "AudioResampler.h"
using namespace android;
@@ -329,7 +329,7 @@ int main(int argc, char* argv[]) {
printf("%zu input frames\n", input_frames);
}
- int bit_depth = useFloat ? 32 : 16;
+ audio_format_t format = useFloat ? AUDIO_FORMAT_PCM_FLOAT : AUDIO_FORMAT_PCM_16_BIT;
int output_channels = channels > 2 ? channels : 2; // output is at least stereo samples
size_t output_framesize = output_channels * (useFloat ? sizeof(float) : sizeof(int32_t));
size_t output_frames = ((int64_t) input_frames * output_freq) / input_freq;
@@ -342,7 +342,7 @@ int main(int argc, char* argv[]) {
//
// On fast devices, filters should be generated between 0.1ms - 1ms.
// (single threaded).
- AudioResampler* resampler = AudioResampler::create(bit_depth, channels,
+ AudioResampler* resampler = AudioResampler::create(format, channels,
8000, quality);
int looplimit = 100;
timespec start, end;
@@ -380,7 +380,7 @@ int main(int argc, char* argv[]) {
}
void* output_vaddr = malloc(output_size);
- AudioResampler* resampler = AudioResampler::create(bit_depth, channels,
+ AudioResampler* resampler = AudioResampler::create(format, channels,
output_freq, quality);
diff --git a/services/audioflinger/tests/resampler_tests.cpp b/services/audioflinger/tests/resampler_tests.cpp
index d76c376..987162c 100644
--- a/services/audioflinger/tests/resampler_tests.cpp
+++ b/services/audioflinger/tests/resampler_tests.cpp
@@ -69,7 +69,7 @@ void testBufferIncrement(size_t channels, bool useFloat,
unsigned inputFreq, unsigned outputFreq,
enum android::AudioResampler::src_quality quality)
{
- const int bits = useFloat ? 32 : 16;
+ const audio_format_t format = useFloat ? AUDIO_FORMAT_PCM_FLOAT : AUDIO_FORMAT_PCM_16_BIT;
// create the provider
std::vector<int> inputIncr;
SignalProvider provider;
@@ -92,7 +92,7 @@ void testBufferIncrement(size_t channels, bool useFloat,
const int volumePrecision = 12; /* typical unity gain */
android::AudioResampler* resampler;
- resampler = android::AudioResampler::create(bits, channels, outputFreq, quality);
+ resampler = android::AudioResampler::create(format, channels, outputFreq, quality);
resampler->setSampleRate(inputFreq);
resampler->setVolume(1 << volumePrecision, 1 << volumePrecision);
@@ -109,7 +109,7 @@ void testBufferIncrement(size_t channels, bool useFloat,
resampler->reset();
#else
delete resampler;
- resampler = android::AudioResampler::create(bits, channels, outputFreq, quality);
+ resampler = android::AudioResampler::create(format, channels, outputFreq, quality);
resampler->setSampleRate(inputFreq);
resampler->setVolume(1 << volumePrecision, 1 << volumePrecision);
#endif
@@ -174,7 +174,8 @@ void testStopbandDownconversion(size_t channels,
const int volumePrecision = 12; /* typical unity gain */
android::AudioResampler* resampler;
- resampler = android::AudioResampler::create(16, channels, outputFreq, quality);
+ resampler = android::AudioResampler::create(AUDIO_FORMAT_PCM_16_BIT,
+ channels, outputFreq, quality);
resampler->setSampleRate(inputFreq);
resampler->setVolume(1 << volumePrecision, 1 << volumePrecision);