19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifndef ANDROID_AUDIO_RESAMPLER_H 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define ANDROID_AUDIO_RESAMPLER_H 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdint.h> 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/types.h> 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "AudioBufferProvider.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass AudioResampler { 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Determines quality of SRC. 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // LOW_QUALITY: linear interpolator (1st order) 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // MED_QUALITY: cubic interpolator (3rd order) 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // HIGH_QUALITY: fixed multi-tap FIR (e.g. 48KHz->44.1KHz) 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // NOTE: high quality SRC will only be supported for 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // certain fixed rate conversions. Sample rate cannot be 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // changed dynamically. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum src_quality { 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DEFAULT=0, 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LOW_QUALITY=1, 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project MED_QUALITY=2, 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project HIGH_QUALITY=3 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static AudioResampler* create(int bitDepth, int inChannelCount, 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t sampleRate, int quality=DEFAULT); 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~AudioResampler(); 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void init() = 0; 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setSampleRate(int32_t inSampleRate); 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void setVolume(int16_t left, int16_t right); 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual void resample(int32_t* out, size_t outFrameCount, 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider* provider) = 0; 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 564bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent virtual void reset(); 574bb21c496b2c9427c18b8370dd631339e4e11094Eric Laurent 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // number of bits for phase fraction - 30 bits allows nearly 2x downsampling 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const int kNumPhaseBits = 30; 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // phase mask for fraction 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const uint32_t kPhaseMask = (1LU<<kNumPhaseBits)-1; 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // multiplier to calculate fixed point phase increment 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static const double kPhaseMultiplier = 1L << kNumPhaseBits; 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project enum format {MONO_16_BIT, STEREO_16_BIT}; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResampler(int bitDepth, int inChannelCount, int32_t sampleRate); 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // prevent copying 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResampler(const AudioResampler&); 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioResampler& operator=(const AudioResampler&); 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mBitDepth; 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mChannelCount; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mSampleRate; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mInSampleRate; 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AudioBufferProvider::Buffer mBuffer; 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project union { 81871c16cec850c042c61aa06a7ffc0e1965867bcfGlenn Kasten int16_t mVolume[2]; 82871c16cec850c042c61aa06a7ffc0e1965867bcfGlenn Kasten uint32_t mVolumeRL; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int16_t mTargetVolume[2]; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project format mFormat; 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project size_t mInputIndex; 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int32_t mPhaseIncrement; 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t mPhaseFraction; 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project; // namespace android 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif // ANDROID_AUDIO_RESAMPLER_H 96