Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3d638b30 authored by Andy Hung's avatar Andy Hung Committed by Android (Google) Code Review
Browse files

Merge "Replace int bitDepth with audio_format_t in Resampler"

parents 0ea8fa4c 3348e36c
Loading
Loading
Loading
Loading
+1 −13
Original line number Diff line number Diff line
@@ -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);
+30 −25
Original line number Diff line number Diff line
@@ -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,34 +216,41 @@ 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,
        if (format == AUDIO_FORMAT_PCM_FLOAT) {
            resampler = new AudioResamplerDyn<float, float, float>(inChannelCount,
                    sampleRate, quality);
        } else if (quality == DYN_HIGH_QUALITY) {
            resampler = new AudioResamplerDyn<int32_t, int16_t, int32_t>(bitDepth, inChannelCount,
        } else {
            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>(bitDepth, inChannelCount,
                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),
        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

    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() {
+3 −3
Original line number Diff line number Diff line
@@ -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;
+2 −2
Original line number Diff line number Diff line
@@ -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);
+2 −2
Original line number Diff line number Diff line
@@ -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)
{
Loading