93 lines
3.2 KiB
C
Raw Normal View History

Various fixes and improvements in audio effects implementation Effect API: - Use different definitions for audio device, channels, formats... in AudioSystem and EffectApi: Removed media/AudioCommon.h file created for initial version of EffectApi - Indicate audio session and output ID to effect library when calling EffectCreate(). Session ID can be useful to optimize the implementation of effect chains in the same audio session. Output ID can be used for effects implemented in audio hardware. - Renamed EffectQueryNext() function to EffectQueryEffect() and changed operating mode: now an index is passed for the queried effect instead of implicitly querying the next one. - Added CPU load and memory usage indication in effects descriptor - Added flags and commands to indicate changes in audio mode (ring tone, in call...) to effect engine - Added flag to indicate hardware accelerated effect implementation. - Renamed EffectFactoryApi.h to EffectsFactoryApi.h for consistency with EffectsFactory.c/h Effect libraries: - Reflected changes in Effect API - Several fixes in reverb implementation - Added build option TEST_EFFECT_LIBRARIES in makefile to prepare integration of actual effect library. - Replaced pointer by integer identifier for library handle returned by effects factory Audio effect framework: - Added support for audio session -1 in preparation of output stage effects configuration. - Reflected changes in Effect API - Removed volume ramp up/down when effect is inserted/removed: this has to be taken care of by effect engines. - Added some overflow verification on indexes used for deferred parameter updates via shared memory - Added hardcoded CPU and memory limit check when creating a new effect instance Change-Id: I43fee5182ee201384ea3479af6d0acb95092901d
2010-06-23 17:38:20 -07:00
/*
**
** Copyright 2009, The Android Open Source Project
**
** Licensed under the Apache License, Version 2.0 (the "License");
** you may not use this file except in compliance with the License.
** You may obtain a copy of the License at
**
** http://www.apache.org/licenses/LICENSE-2.0
**
** Unless required by applicable law or agreed to in writing, software
** distributed under the License is distributed on an "AS IS" BASIS,
** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
** See the License for the specific language governing permissions and
** limitations under the License.
*/
#ifndef ANDROID_AUDIO_COMMON_H
#define ANDROID_AUDIO_COMMON_H
#include <stdint.h>
#include <stddef.h>
namespace android {
// Audio coefficient type.
typedef int32_t audio_coef_t;
// Audio sample type.
typedef int32_t audio_sample_t;
// Accumulator type for coef x sample.
typedef int64_t audio_coef_sample_acc_t;
// Number of fraction bits for audio coefficient.
static const int AUDIO_COEF_PRECISION = 24;
// Audio coefficient with the value of 1.0
static const audio_coef_t AUDIO_COEF_ONE = 1 << AUDIO_COEF_PRECISION;
// Audio coefficient with the value of 0.5
static const audio_coef_t AUDIO_COEF_HALF = 1 << (AUDIO_COEF_PRECISION - 1);
// Number of fraction bits for audio sample.
static const int AUDIO_SAMPLE_PRECISION = 24;
// Audio sample with the value of 1.0
static const audio_sample_t AUDIO_SAMPLE_ONE = 1 << AUDIO_SAMPLE_PRECISION;
// TODO: These are just temporary naive implementations of the necessary
// arithmetic operations needed for the filter. They should be moved to a more
// generic location and implemented more efficiently.
// Multiply a sample by a coefficient to return an accumulator.
inline audio_coef_sample_acc_t mul_coef_sample(audio_coef_t x, audio_sample_t y) {
return ((audio_coef_sample_acc_t) (x)) * y;
}
// Multiply and accumulate sample by a coefficient to return an accumulator.
inline audio_coef_sample_acc_t mac_coef_sample(audio_coef_t x, audio_sample_t y, audio_coef_sample_acc_t acc) {
return acc + ((audio_coef_sample_acc_t) (x)) * y;
}
// Convert a sample-coefficient accumulator to a sample.
inline audio_sample_t coef_sample_acc_to_sample(audio_coef_sample_acc_t acc) {
if (acc < 0) {
acc += AUDIO_COEF_ONE - 1;
}
return (audio_sample_t) (acc >> AUDIO_COEF_PRECISION);
}
// Convert a S15 sample to audio_sample_t
inline audio_sample_t s15_to_audio_sample_t(int16_t s15) {
return audio_sample_t(s15) << 9;
}
// Convert a audio_sample_t sample to S15 (no clipping)
inline int16_t audio_sample_t_to_s15(audio_sample_t sample) {
return int16_t((sample + (1 << 8)) >> 9);
}
// Convert a audio_sample_t sample to S15 (with clipping)
inline int16_t audio_sample_t_to_s15_clip(audio_sample_t sample) {
// TODO: optimize for targets supporting this as an atomic operation.
if (__builtin_expect(sample >= (0x7FFF << 9), 0)) {
return 0x7FFF;
} else if (__builtin_expect(sample <= -(0x8000 << 9), 0)) {
return 0x8000;
} else {
return audio_sample_t_to_s15(sample);
}
}
////////////////////////////////////////////////////////////////////////////////
}
#endif // ANDROID_AUDIO_COMMON_H