diff options
author | Andy Hung <hunga@google.com> | 2014-07-07 10:21:44 -0700 |
---|---|---|
committer | Andy Hung <hunga@google.com> | 2014-07-07 10:29:36 -0700 |
commit | 3348e36c51e91e78020bcc6578eda83d97c31bec (patch) | |
tree | ee3df8ed9f79863fc34589813710896a7e08af86 /services | |
parent | 075abae2a954bf3edf18ad1705c2c0f188454ae0 (diff) | |
download | frameworks_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.cpp | 14 | ||||
-rw-r--r-- | services/audioflinger/AudioResampler.cpp | 55 | ||||
-rw-r--r-- | services/audioflinger/AudioResampler.h | 6 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerCubic.h | 4 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerDyn.cpp | 4 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerDyn.h | 2 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerSinc.cpp | 4 | ||||
-rw-r--r-- | services/audioflinger/AudioResamplerSinc.h | 2 | ||||
-rw-r--r-- | services/audioflinger/Tracks.cpp | 3 | ||||
-rw-r--r-- | services/audioflinger/test-resample.cpp | 10 | ||||
-rw-r--r-- | services/audioflinger/tests/resampler_tests.cpp | 9 |
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); |