Merge "Define HAL for audio effects"

This commit is contained in:
Mikhail Naganov
2016-10-10 18:17:35 +00:00
committed by Android (Google) Code Review
17 changed files with 1631 additions and 1 deletions

View File

@@ -1,6 +1,7 @@
// This is an autogenerated file, do not edit.
subdirs = [
"audio/common/2.0",
"audio/effect/2.0",
"benchmarks/msgq/1.0",
"nfc/1.0",
"nfc/1.0/default",
@@ -14,5 +15,4 @@ subdirs = [
"vibrator/1.0",
"wifi/1.0",
"wifi/supplicant/1.0",
"vibrator/1.0",
]

151
audio/effect/2.0/Android.bp Normal file
View File

@@ -0,0 +1,151 @@
// This file is autogenerated by hidl-gen. Do not edit manually.
genrule {
name: "android.hardware.audio.effect@2.0_genc++",
tool: "hidl-gen",
cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.audio.effect@2.0",
srcs: [
"types.hal",
"IAcousticEchoCancelerEffect.hal",
"IAutomaticGainControlEffect.hal",
"IBassBoostEffect.hal",
"IDownmixEffect.hal",
"IEffect.hal",
"IEffectBufferProviderCallback.hal",
"IEffectsFactory.hal",
"IEnvironmentalReverbEffect.hal",
"IEqualizerEffect.hal",
"ILoudnessEnhancerEffect.hal",
"INoiseSuppressionEffect.hal",
"IPresetReverbEffect.hal",
"IVirtualizerEffect.hal",
"IVisualizerEffect.hal",
],
out: [
"android/hardware/audio/effect/2.0/types.cpp",
"android/hardware/audio/effect/2.0/AcousticEchoCancelerEffectAll.cpp",
"android/hardware/audio/effect/2.0/AutomaticGainControlEffectAll.cpp",
"android/hardware/audio/effect/2.0/BassBoostEffectAll.cpp",
"android/hardware/audio/effect/2.0/DownmixEffectAll.cpp",
"android/hardware/audio/effect/2.0/EffectAll.cpp",
"android/hardware/audio/effect/2.0/EffectBufferProviderCallbackAll.cpp",
"android/hardware/audio/effect/2.0/EffectsFactoryAll.cpp",
"android/hardware/audio/effect/2.0/EnvironmentalReverbEffectAll.cpp",
"android/hardware/audio/effect/2.0/EqualizerEffectAll.cpp",
"android/hardware/audio/effect/2.0/LoudnessEnhancerEffectAll.cpp",
"android/hardware/audio/effect/2.0/NoiseSuppressionEffectAll.cpp",
"android/hardware/audio/effect/2.0/PresetReverbEffectAll.cpp",
"android/hardware/audio/effect/2.0/VirtualizerEffectAll.cpp",
"android/hardware/audio/effect/2.0/VisualizerEffectAll.cpp",
],
}
genrule {
name: "android.hardware.audio.effect@2.0_genc++_headers",
tool: "hidl-gen",
cmd: "$tool -o $genDir -Lc++ -randroid.hardware:hardware/interfaces android.hardware.audio.effect@2.0",
srcs: [
"types.hal",
"IAcousticEchoCancelerEffect.hal",
"IAutomaticGainControlEffect.hal",
"IBassBoostEffect.hal",
"IDownmixEffect.hal",
"IEffect.hal",
"IEffectBufferProviderCallback.hal",
"IEffectsFactory.hal",
"IEnvironmentalReverbEffect.hal",
"IEqualizerEffect.hal",
"ILoudnessEnhancerEffect.hal",
"INoiseSuppressionEffect.hal",
"IPresetReverbEffect.hal",
"IVirtualizerEffect.hal",
"IVisualizerEffect.hal",
],
out: [
"android/hardware/audio/effect/2.0/types.h",
"android/hardware/audio/effect/2.0/IAcousticEchoCancelerEffect.h",
"android/hardware/audio/effect/2.0/IHwAcousticEchoCancelerEffect.h",
"android/hardware/audio/effect/2.0/BnAcousticEchoCancelerEffect.h",
"android/hardware/audio/effect/2.0/BpAcousticEchoCancelerEffect.h",
"android/hardware/audio/effect/2.0/BsAcousticEchoCancelerEffect.h",
"android/hardware/audio/effect/2.0/IAutomaticGainControlEffect.h",
"android/hardware/audio/effect/2.0/IHwAutomaticGainControlEffect.h",
"android/hardware/audio/effect/2.0/BnAutomaticGainControlEffect.h",
"android/hardware/audio/effect/2.0/BpAutomaticGainControlEffect.h",
"android/hardware/audio/effect/2.0/BsAutomaticGainControlEffect.h",
"android/hardware/audio/effect/2.0/IBassBoostEffect.h",
"android/hardware/audio/effect/2.0/IHwBassBoostEffect.h",
"android/hardware/audio/effect/2.0/BnBassBoostEffect.h",
"android/hardware/audio/effect/2.0/BpBassBoostEffect.h",
"android/hardware/audio/effect/2.0/BsBassBoostEffect.h",
"android/hardware/audio/effect/2.0/IDownmixEffect.h",
"android/hardware/audio/effect/2.0/IHwDownmixEffect.h",
"android/hardware/audio/effect/2.0/BnDownmixEffect.h",
"android/hardware/audio/effect/2.0/BpDownmixEffect.h",
"android/hardware/audio/effect/2.0/BsDownmixEffect.h",
"android/hardware/audio/effect/2.0/IEffect.h",
"android/hardware/audio/effect/2.0/IHwEffect.h",
"android/hardware/audio/effect/2.0/BnEffect.h",
"android/hardware/audio/effect/2.0/BpEffect.h",
"android/hardware/audio/effect/2.0/BsEffect.h",
"android/hardware/audio/effect/2.0/IEffectBufferProviderCallback.h",
"android/hardware/audio/effect/2.0/IHwEffectBufferProviderCallback.h",
"android/hardware/audio/effect/2.0/BnEffectBufferProviderCallback.h",
"android/hardware/audio/effect/2.0/BpEffectBufferProviderCallback.h",
"android/hardware/audio/effect/2.0/BsEffectBufferProviderCallback.h",
"android/hardware/audio/effect/2.0/IEffectsFactory.h",
"android/hardware/audio/effect/2.0/IHwEffectsFactory.h",
"android/hardware/audio/effect/2.0/BnEffectsFactory.h",
"android/hardware/audio/effect/2.0/BpEffectsFactory.h",
"android/hardware/audio/effect/2.0/BsEffectsFactory.h",
"android/hardware/audio/effect/2.0/IEnvironmentalReverbEffect.h",
"android/hardware/audio/effect/2.0/IHwEnvironmentalReverbEffect.h",
"android/hardware/audio/effect/2.0/BnEnvironmentalReverbEffect.h",
"android/hardware/audio/effect/2.0/BpEnvironmentalReverbEffect.h",
"android/hardware/audio/effect/2.0/BsEnvironmentalReverbEffect.h",
"android/hardware/audio/effect/2.0/IEqualizerEffect.h",
"android/hardware/audio/effect/2.0/IHwEqualizerEffect.h",
"android/hardware/audio/effect/2.0/BnEqualizerEffect.h",
"android/hardware/audio/effect/2.0/BpEqualizerEffect.h",
"android/hardware/audio/effect/2.0/BsEqualizerEffect.h",
"android/hardware/audio/effect/2.0/ILoudnessEnhancerEffect.h",
"android/hardware/audio/effect/2.0/IHwLoudnessEnhancerEffect.h",
"android/hardware/audio/effect/2.0/BnLoudnessEnhancerEffect.h",
"android/hardware/audio/effect/2.0/BpLoudnessEnhancerEffect.h",
"android/hardware/audio/effect/2.0/BsLoudnessEnhancerEffect.h",
"android/hardware/audio/effect/2.0/INoiseSuppressionEffect.h",
"android/hardware/audio/effect/2.0/IHwNoiseSuppressionEffect.h",
"android/hardware/audio/effect/2.0/BnNoiseSuppressionEffect.h",
"android/hardware/audio/effect/2.0/BpNoiseSuppressionEffect.h",
"android/hardware/audio/effect/2.0/BsNoiseSuppressionEffect.h",
"android/hardware/audio/effect/2.0/IPresetReverbEffect.h",
"android/hardware/audio/effect/2.0/IHwPresetReverbEffect.h",
"android/hardware/audio/effect/2.0/BnPresetReverbEffect.h",
"android/hardware/audio/effect/2.0/BpPresetReverbEffect.h",
"android/hardware/audio/effect/2.0/BsPresetReverbEffect.h",
"android/hardware/audio/effect/2.0/IVirtualizerEffect.h",
"android/hardware/audio/effect/2.0/IHwVirtualizerEffect.h",
"android/hardware/audio/effect/2.0/BnVirtualizerEffect.h",
"android/hardware/audio/effect/2.0/BpVirtualizerEffect.h",
"android/hardware/audio/effect/2.0/BsVirtualizerEffect.h",
"android/hardware/audio/effect/2.0/IVisualizerEffect.h",
"android/hardware/audio/effect/2.0/IHwVisualizerEffect.h",
"android/hardware/audio/effect/2.0/BnVisualizerEffect.h",
"android/hardware/audio/effect/2.0/BpVisualizerEffect.h",
"android/hardware/audio/effect/2.0/BsVisualizerEffect.h",
],
}
cc_library_shared {
name: "android.hardware.audio.effect@2.0",
generated_sources: ["android.hardware.audio.effect@2.0_genc++"],
generated_headers: ["android.hardware.audio.effect@2.0_genc++_headers"],
export_generated_headers: ["android.hardware.audio.effect@2.0_genc++_headers"],
shared_libs: [
"libhidl",
"libhwbinder",
"libutils",
"libcutils",
"android.hardware.audio.common@2.0",
],
}

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IAcousticEchoCancelerEffect extends IEffect {
/*
* Sets echo delay value in milliseconds.
*/
setEchoDelay(uint32_t echoDelayMs) generates (Result retval);
/*
* Gets echo delay value in milliseconds.
*/
getEchoDelay() generates (Result retval, uint32_t echoDelayMs);
};

View File

@@ -0,0 +1,68 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IAutomaticGainControlEffect extends IEffect {
/*
* Sets target level in millibels.
*/
setTargetLevel(int16_t targetLevelMb) generates (Result retval);
/*
* Gets target level.
*/
getTargetLevel() generates (Result retval, int16_t targetLevelMb);
/*
* Sets gain in the compression range in millibels.
*/
setCompGain(int16_t compGainMb) generates (Result retval);
/*
* Gets gain in the compression range.
*/
getCompGain() generates (Result retval, int16_t compGainMb);
/*
* Enables or disables limiter.
*/
setLimiterEnabled(bool enabled) generates (Result retval);
/*
* Returns whether limiter is enabled.
*/
isLimiterEnabled() generates (Result retval, bool enabled);
struct AllProperties {
int16_t targetLevelMb;
int16_t compGainMb;
bool limiterEnabled;
};
/*
* Sets all properties at once.
*/
setAllProperties(AllProperties properties) generates (Result retval);
/*
* Gets all properties at once.
*/
getAllProperties() generates (Result retval, AllProperties properties);
};

View File

@@ -0,0 +1,48 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IBassBoostEffect extends IEffect {
/*
* Returns whether setting bass boost strength is supported.
*/
isStrengthSupported() generates (Result retval, bool strengthSupported);
enum StrengthRange : uint16_t {
MIN = 0,
MAX = 1000
};
/*
* Sets bass boost strength.
*
* @param strength strength of the effect. The valid range for strength
* strength is [0, 1000], where 0 per mille designates the
* mildest effect and 1000 per mille designates the
* strongest.
* @return retval operation completion status.
*/
setStrength(uint16_t strength) generates (Result retval);
/*
* Gets virtualization strength.
*/
getStrength() generates (Result retval, uint16_t strength);
};

View File

@@ -0,0 +1,31 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IDownmixEffect extends IEffect {
enum Type {
STRIP, // throw away the extra channels
FOLD // mix the extra channels with FL/FR
};
setType(Type preset) generates (Result retval);
getType() generates (Result retval, Type preset);
};

View File

@@ -0,0 +1,311 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffectBufferProviderCallback;
interface IEffect {
/*
* Initialize effect engine--all configurations return to default.
*
* @return retval operation completion status.
*/
@entry
@callflow(next={"*"})
init() generates (Result retval);
/*
* Apply new audio parameters configurations for input and output buffers.
* The provider callbacks may be empty, but in this case the buffer
* must be provided in the EffectConfig structure.
*
* @param config configuration descriptor.
* @param inputBufferProvider optional buffer provider reference.
* @param outputBufferProvider optional buffer provider reference.
* @return retval operation completion status.
*/
@callflow(next={"*"})
setConfig(EffectConfig config,
IEffectBufferProviderCallback inputBufferProvider,
IEffectBufferProviderCallback outputBufferProvider)
generates (Result retval);
/*
* Reset the effect engine. Keep configuration but resets state and buffer
* content.
*/
@callflow(next={"*"})
reset();
/*
* Enable processing.
*
* @return retval operation completion status.
*/
@callflow(next={"process"})
enable() generates (Result retval);
/*
* Disable processing.
*
* @return retval operation completion status.
*/
@exit
disable() generates (Result retval);
/*
* Set the rendering device the audio output path is connected to. The
* effect implementation must set EFFECT_FLAG_DEVICE_IND flag in its
* descriptor to receive this command when the device changes.
*
* @param device output device specification.
*/
@callflow(next={"*"})
setDevice(AudioDevice device);
/*
* Set and get volume. Used by audio framework to delegate volume control to
* effect engine. The effect implementation must set EFFECT_FLAG_VOLUME_IND
* or EFFECT_FLAG_VOLUME_CTRL flag in its descriptor to receive this command
* before every call to 'process' function If EFFECT_FLAG_VOLUME_CTRL flag
* is set in the effect descriptor, the effect engine must return the volume
* that should be applied before the effect is processed. The overall volume
* (the volume actually applied by the effect engine multiplied by the
* returned value) should match the value indicated in the command.
*
* @param volumes vector containing volume for each channel defined in
* EffectConfig for output buffer expressed in 8.24 fixed
* point format.
* @return result updated volume values. It is OK to receive an empty vector
* as a result in which case the effect framework has
* delegated volume control to another effect.
*/
@callflow(next={"*"})
setAndGetVolume(vec<int32_t> volumes) generates (vec<int32_t> result);
/*
* Set the audio mode. The effect implementation must set
* EFFECT_FLAG_AUDIO_MODE_IND flag in its descriptor to receive this command
* when the audio mode changes.
*
* @param mode desired audio mode.
*/
@callflow(next={"*"})
setAudioMode(AudioMode mode);
/*
* Apply new audio parameters configurations for input and output buffers of
* reverse stream. An example of reverse stream is the echo reference
* supplied to an Acoustic Echo Canceler.
*
* @param config configuration descriptor.
* @param inputBufferProvider optional buffer provider reference.
* @param outputBufferProvider optional buffer provider reference.
* @return retval operation completion status.
*/
@callflow(next={"*"})
setConfigReverse(EffectConfig config,
IEffectBufferProviderCallback inputBufferProvider,
IEffectBufferProviderCallback outputBufferProvider)
generates (Result retval);
/*
* Set the capture device the audio input path is connected to. The effect
* implementation must set EFFECT_FLAG_DEVICE_IND flag in its descriptor to
* receive this command when the device changes.
*
* @param device input device specification.
*/
@callflow(next={"*"})
setInputDevice(AudioDevice device);
/*
* Read audio parameters configurations for input and output buffers.
*
* @return config configuration descriptor.
*/
@callflow(next={"*"})
getConfig() generates (EffectConfig config);
/*
* Read audio parameters configurations for input and output buffers of
* reverse stream.
*
* @return config configuration descriptor.
*/
@callflow(next={"*"})
getConfigReverse() generates (EffectConfig config);
/*
* Queries for supported configurations for a particular feature (e.g. get
* the supported combinations of main and auxiliary channels for a noise
* suppressor). The command parameter is a list of the feature identifiers.
*
* @return retval absence of the feature support is indicated using
* NOT_SUPPORTED code.
* @return result list of configuration descriptors.
*/
@callflow(next={"*"})
getFeatureSupportedConfigs(vec<EffectFeature> features)
generates (Result retval, vec<EffectFeatureConfig> result);
/*
* Retrieves current configuration for a given feature.
*
* @return retval absence of the feature support is indicated using
* NOT_SUPPORTED code.
* @return result configuration descriptor.
*/
@callflow(next={"*"})
getFeatureConfig(EffectFeature feature)
generates (Result retval, EffectFeatureConfig result);
/*
* Sets current configuration for a given feature.
*
* @return retval operation completion status.
*/
@callflow(next={"*"})
setFeatureConfig(EffectFeatureConfig featureConfig)
generates (Result retval);
/*
* Set the audio source the capture path is configured for (Camcorder, voice
* recognition...).
*
* @param source source descriptor.
*/
@callflow(next={"*"})
setAudioSource(AudioSource source);
/*
* This command indicates if the playback thread the effect is attached to
* is offloaded or not, and updates the I/O handle of the playback thread
* the effect is attached to.
*
* @param param effect offload descriptor.
* @return retval operation completion status.
*/
@callflow(next={"*"})
offload(EffectOffloadParameter param) generates (Result retval);
/*
* Returns the effect descriptor.
*
* @return descriptor effect descriptor.
*/
@callflow(next={"*"})
getDescriptor() generates (EffectDescriptor descriptor);
/*
* Effect process function. Takes input samples as specified (count and
* location) in input buffer and returns processed samples as specified in
* output buffer. If the buffer descriptor is empty the function must use
* either the buffer or the buffer provider callback installed by the
* setConfig command. The effect framework must call the 'process' function
* after the 'enable' command is received and until the 'disable' is
* received. When the engine receives the 'disable' command it should turn
* off the effect gracefully and when done indicate that it is OK to stop
* calling the 'process' function by returning the INVALID_STATE status.
*
* @param inBuffer input audio buffer.
* @return retval operation completion status.
* @return outBuffer output audio buffer.
*/
// TODO(mnaganov): replace with FMQ version.
@callflow(next={"*"})
process(AudioBuffer inBuffer)
generates (Result retval, AudioBuffer outBuffer);
/*
* Process reverse stream function. This function is used to pass a
* reference stream to the effect engine. If the engine does not need a
* reference stream, this function MUST return NOT_SUPPORTED. For example,
* this function would typically implemented by an Echo Canceler.
*
* @param inBuffer input audio buffer.
* @return retval operation completion status.
* @return outBuffer output audio buffer.
*/
// TODO(mnaganov): replace with FMQ version.
@callflow(next={"*"})
processReverse(AudioBuffer inBuffer)
generates (Result retval, AudioBuffer outBuffer);
/*
* Execute a vendor specific command on the effect. The command code
* and data, as well as result data are not interpreted by Android
* Framework and are passed as-is between the application and the effect.
*
* The effect must use standard POSIX.1-2001 error codes for the operation
* completion status.
*
* Use this method only if the effect is provided by a third party, and
* there is no interface defined for it. This method only works for effects
* implemented in software.
*
* @param commandId the ID of the command.
* @param data command data.
* @return status command completion status.
* @return result result data.
*/
command(uint32_t commandId, vec<uint8_t> data)
generates (int32_t status, vec<uint8_t> result);
/*
* Set a vendor-specific parameter and apply it immediately. The parameter
* code and data are not interpreted by Android Framework and are passed
* as-is between the application and the effect.
*
* The effect must use INVALID_ARGUMENTS return code if the parameter ID is
* unknown or if provided parameter data is invalid. If the effect does not
* support setting vendor-specific parameters, it must return NOT_SUPPORTED.
*
* Use this method only if the effect is provided by a third party, and
* there is no interface defined for it. This method only works for effects
* implemented in software.
*
* @param parameter identifying data of the parameter.
* @param value the value of the parameter.
* @return retval operation completion status.
*/
@callflow(next={"*"})
setParameter(vec<uint8_t> parameter, vec<uint8_t> value)
generates (Result retval);
/*
* Get a vendor-specific parameter value. The parameter code and returned
* data are not interpreted by Android Framework and are passed as-is
* between the application and the effect.
*
* The effect must use INVALID_ARGUMENTS return code if the parameter ID is
* unknown. If the effect does not support setting vendor-specific
* parameters, it must return NOT_SUPPORTED.
*
* Use this method only if the effect is provided by a third party, and
* there is no interface defined for it. This method only works for effects
* implemented in software.
*
* @param parameter identifying data of the parameter.
* @return retval operation completion status.
* @return result the value of the parameter.
*/
@callflow(next={"*"})
getParameter(vec<uint8_t> parameter)
generates (Result retval, vec<uint8_t> value);
};

View File

@@ -0,0 +1,40 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
/*
* This callback interface contains functions that can be used by the effect
* engine 'process' function to exchange input and output audio buffers.
*/
interface IEffectBufferProviderCallback {
/*
* Called to retrieve a buffer where data should read from by 'process'
* function.
*
* @return buffer audio buffer for processing
*/
// TODO(mnaganov): replace with FMQ version.
getBuffer() generates (AudioBuffer buffer);
/*
* Called to provide a buffer with the data written by 'process' function.
*
* @param buffer audio buffer for processing
*/
// TODO(mnaganov): replace with FMQ version.
putBuffer(AudioBuffer buffer);
};

View File

@@ -0,0 +1,64 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IEffectsFactory {
/*
* Returns descriptors of different effects in all loaded libraries.
*
* @return retval operation completion status.
* @return result list of effect descriptors.
*/
getAllDescriptors() generates(Result retval, vec<EffectDescriptor> result);
/*
* Returns a descriptor of a particular effect.
*
* @return retval operation completion status.
* @return result effect descriptor.
*/
getDescriptor(Uuid uid) generates(Result retval, EffectDescriptor result);
/*
* Creates an effect engine of the specified type. To release the effect
* engine, it is necessary to release references to the returned effect
* object.
*
* @param uid effect uuid.
* @param session audio session to which this effect instance will be
* attached. All effects created with the same session ID
* are connected in series and process the same signal
* stream.
* @param ioHandle identifies the output or input stream this effect is
* directed to in audio HAL.
* @return retval operation completion status.
* @return result the interface for the created effect.
*/
createEffect(Uuid uid, AudioSession session, AudioIoHandle ioHandle)
generates (Result retval, IEffect result);
/*
* Dumps information about effects into the provided file descriptor.
* This is used for the dumpsys facility.
*
* @param fd dump file descriptor.
*/
debugDump(handle fd);
};

View File

@@ -0,0 +1,168 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IEnvironmentalReverbEffect extends IEffect {
/*
* Sets whether the effect should be bypassed.
*/
setBypass(bool bypass) generates (Result retval);
/*
* Gets whether the effect should be bypassed.
*/
getBypass() generates (Result retval, bool bypass);
enum ParamRange : int16_t {
ROOM_LEVEL_MIN = -6000,
ROOM_LEVEL_MAX = 0,
ROOM_HF_LEVEL_MIN = -4000,
ROOM_HF_LEVEL_MAX = 0,
DECAY_TIME_MIN = 100,
DECAY_TIME_MAX = 20000,
DECAY_HF_RATIO_MIN = 100,
DECAY_HF_RATIO_MAX = 1000,
REFLECTIONS_LEVEL_MIN = -6000,
REFLECTIONS_LEVEL_MAX = 0,
REFLECTIONS_DELAY_MIN = 0,
REFLECTIONS_DELAY_MAX = 65,
REVERB_LEVEL_MIN = -6000,
REVERB_LEVEL_MAX = 0,
REVERB_DELAY_MIN = 0,
REVERB_DELAY_MAX = 65,
DIFFUSION_MIN = 0,
DIFFUSION_MAX = 1000,
DENSITY_MIN = 0,
DENSITY_MAX = 1000
};
/*
* Sets the room level.
*/
setRoomLevel(int16_t roomLevel) generates (Result retval);
/*
* Gets the room level.
*/
getRoomLevel() generates (Result retval, int16_t roomLevel);
/*
* Sets the room high frequences level.
*/
setRoomHfLevel(int16_t roomHfLevel) generates (Result retval);
/*
* Gets the room high frequences level.
*/
getRoomHfLevel() generates (Result retval, int16_t roomHfLevel);
/*
* Sets the room decay time.
*/
setDecayTime(uint32_t decayTime) generates (Result retval);
/*
* Gets the room decay time.
*/
getDecayTime() generates (Result retval, uint32_t decayTime);
/*
* Sets the ratio of high frequences decay.
*/
setDecayHfRatio(int16_t decayHfRatio) generates (Result retval);
/*
* Gets the ratio of high frequences decay.
*/
getDecayHfRatio() generates (Result retval, int16_t decayHfRatio);
/*
* Sets the level of reflections in the room.
*/
setReflectionsLevel(int16_t reflectionsLevel) generates (Result retval);
/*
* Gets the level of reflections in the room.
*/
getReflectionsLevel() generates (Result retval, int16_t reflectionsLevel);
/*
* Sets the reflections delay in the room.
*/
setReflectionsDelay(uint32_t reflectionsDelay) generates (Result retval);
/*
* Gets the reflections delay in the room.
*/
getReflectionsDelay() generates (Result retval, uint32_t reflectionsDelay);
/*
* Sets the reverb level of the room.
*/
setReverbLevel(int16_t reverbLevel) generates (Result retval);
/*
* Gets the reverb level of the room.
*/
getReverbLevel() generates (Result retval, int16_t reverbLevel);
/*
* Sets room diffusion.
*/
setDiffusion(int16_t diffusion) generates (Result retval);
/*
* Gets room diffusion.
*/
getDiffusion() generates (Result retval, int16_t diffusion);
/*
* Sets room wall density.
*/
setDensity(int16_t density) generates (Result retval);
/*
* Gets room wall density.
*/
getDensity() generates (Result retval, int16_t density);
struct AllProperties {
int16_t roomLevel; // in millibels, range -6000 to 0
int16_t roomHfLevel; // in millibels, range -4000 to 0
uint32_t decayTime; // in milliseconds, range 100 to 20000
int16_t decayHfRatio; // in permilles, range 100 to 1000
int16_t reflectionsLevel; // in millibels, range -6000 to 0
uint32_t reflectionsDelay; // in milliseconds, range 0 to 65
int16_t reverbLevel; // in millibels, range -6000 to 0
uint32_t reverbDelay; // in milliseconds, range 0 to 65
int16_t diffusion; // in permilles, range 0 to 1000
int16_t density; // in permilles, range 0 to 1000
};
/*
* Sets all properties at once.
*/
setAllProperties(AllProperties properties) generates (Result retval);
/*
* Gets all properties at once.
*/
getAllProperties() generates (Result retval, AllProperties properties);
};

View File

@@ -0,0 +1,91 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IEqualizerEffect extends IEffect {
/*
* Gets the number of frequency bands that the equalizer supports.
*/
getNumBands() generates (Result retval, uint16_t numBands);
/*
* Returns the minimum and maximum band levels supported.
*/
getLevelRange()
generates (Result retval, uint16_t minLevel, uint16_t maxLevel);
/*
* Sets the gain for the given equalizer band.
*/
setBandLevel(uint16_t band, uint16_t level) generates (Result retval);
/*
* Gets the gain for the given equalizer band.
*/
getBandLevel(uint16_t band) generates (Result retval, uint16_t level);
/*
* Gets the center frequency of the given band.
*/
getBandCenterFrequency(uint16_t band)
generates (Result retval, uint32_t centerFreq);
/*
* Gets the frequency range of the given frequency band.
*/
getBandFrequencyRange(uint16_t band)
generates (Result retval, uint32_t minFreqHz, uint32_t maxFreqHz);
/*
* Gets the band that has the most effect on the given frequency.
*/
getBandForFrequency(uint32_t freq) generates (Result retval, uint16_t band);
/*
* Gets the names of all presets the equalizer supports.
*/
getPresetNames() generates (Result retval, vec<string> names);
/*
* Sets the current preset using the index of the preset in the names
* vector returned via 'getPresetNames'.
*/
setCurrentPreset(uint16_t preset) generates (Result retval);
/*
* Gets the current preset.
*/
getCurrentPreset() generates (Result retval, uint16_t preset);
struct AllProperties {
uint16_t curPreset;
vec<uint16_t> bandLevels;
};
/*
* Sets all properties at once.
*/
setAllProperties(AllProperties properties) generates (Result retval);
/*
* Gets all properties at once.
*/
getAllProperties() generates (Result retval, AllProperties properties);
};

View File

@@ -0,0 +1,32 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface ILoudnessEnhancerEffect extends IEffect {
/*
* Sets target gain expressed in millibels.
*/
setTargetGain(int32_t targetGainMb) generates (Result retval);
/*
* Gets target gain expressed in millibels.
*/
getTargetGain() generates (Result retval, int32_t targetGainMb);
};

View File

@@ -0,0 +1,68 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface INoiseSuppressionEffect extends IEffect {
enum Level {
LOW,
MEDIUM,
HIGH
};
/*
* Sets suppression level.
*/
setSuppressionLevel(Level level) generates (Result retval);
/*
* Gets suppression level.
*/
getSuppressionLevel() generates (Result retval, Level level);
enum Type {
SINGLE_CHANNEL,
MULTI_CHANNEL
};
/*
* Set suppression type.
*/
setSuppressionType(Type type) generates (Result retval);
/*
* Get suppression type.
*/
getSuppressionType() generates (Result retval, Type type);
struct AllProperties {
Level level;
Type type;
};
/*
* Sets all properties at once.
*/
setAllProperties(AllProperties properties) generates (Result retval);
/*
* Gets all properties at once.
*/
getAllProperties() generates (Result retval, AllProperties properties);
};

View File

@@ -0,0 +1,37 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IPresetReverbEffect extends IEffect {
enum Preset {
NONE, // no reverb or reflections
SMALLROOM, // a small room less than five meters in length
MEDIUMROOM, // a medium room with a length of ten meters or less
LARGEROOM, // a large-sized room suitable for live performances
MEDIUMHALL, // a medium-sized hall
LARGEHALL, // a large-sized hall suitable for a full orchestra
PLATE, // synthesis of the traditional plate reverb
LAST = PLATE
};
setPreset(Preset preset) generates (Result retval);
getPreset() generates (Result retval, Preset preset);
};

View File

@@ -0,0 +1,76 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IVirtualizerEffect extends IEffect {
/*
* Returns whether setting virtualization strength is supported.
*/
isStrengthSupported() generates (bool strengthSupported);
enum StrengthRange : uint16_t {
MIN = 0,
MAX = 1000
};
/*
* Sets virtualization strength.
*
* @param strength strength of the effect. The valid range for strength
* strength is [0, 1000], where 0 per mille designates the
* mildest effect and 1000 per mille designates the
* strongest.
* @return retval operation completion status.
*/
setStrength(uint16_t strength) generates (Result retval);
/*
* Gets virtualization strength.
*/
getStrength() generates (Result retval, uint16_t strength);
struct SpeakerAngle {
AudioChannelMask mask; // speaker channel mask (1 bit set).
// all angles are expressed in degrees and
// are relative to the listener.
int16_t azimuth; // 0 is the direction the listener faces
// 180 is behind the listener
// -90 is to their left
int16_t elevation; // 0 is the horizontal plane
// +90 is above the listener, -90 is below
};
/*
* Retrieves virtual speaker angles for the given channel mask on the
* specified device.
*/
getVirtualSpeakerAngles(AudioChannelMask mask, AudioDevice device)
generates (Result retval, vec<SpeakerAngle> speakerAngles);
/*
* Forces the virtualizer effect for the given output device.
*/
forceVirtualizationMode(AudioDevice device) generates (Result retval);
/*
* Returns audio device reflecting the current virtualization mode,
* AUDIO_DEVICE_NONE when not virtualizing.
*/
getVirtualizationMode() generates (Result retval, AudioDevice device);
};

View File

@@ -0,0 +1,110 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
import IEffect;
interface IVisualizerEffect extends IEffect {
enum CaptureSizeRange {
MAX = 1024, // maximum capture size in samples
MIN = 128 // minimum capture size in samples
};
/*
* Sets the number PCM samples in the capture.
*/
setCaptureSize(uint16_t captureSize) generates (Result retval);
/*
* Gets the number PCM samples in the capture.
*/
getCaptureSize() generates (Result retval, uint16_t captureSize);
enum ScalingMode {
// Keep in sync with
// frameworks/base/media/java/android/media/audiofx/Visualizer.java
SCALING_MODE_NORMALIZED = 0,
SCALING_MODE_AS_PLAYED = 1
};
/*
* Specifies the way the captured data is scaled.
*/
setScalingMode(ScalingMode scalingMode) generates (Result retval);
/*
* Retrieves the way the captured data is scaled.
*/
getScalingMode() generates (Result retval, ScalingMode scalingMode);
/*
* Informs the visualizer about the downstream latency.
*/
setLatency(uint32_t latencyMs) generates (Result retval);
/*
* Gets the downstream latency.
*/
getLatency() generates (Result retval, uint32_t latencyMs);
enum MeasurementMode {
// Keep in sync with
// frameworks/base/media/java/android/media/audiofx/Visualizer.java
MEASUREMENT_MODE_NONE = 0x0,
MEASUREMENT_MODE_PEAK_RMS = 0x1
};
/*
* Specifies which measurements are to be made.
*/
setMeasurementMode(MeasurementMode measurementMode)
generates (Result retval);
/*
* Retrieves which measurements are to be made.
*/
getMeasurementMode() generates (
Result retval, MeasurementMode measurementMode);
/*
* Retrieves the latest PCM snapshot captured by the visualizer engine. The
* number of samples to capture is specified by 'setCaptureSize' parameter.
*
* @return retval operation completion status.
* @return samples samples in 8 bit unsigned format (0 = 0x80)
*/
capture() generates (Result retval, vec<uint8_t> samples);
struct Measurement {
MeasurementMode mode; // discriminator
union Values {
struct PeakAndRms {
int32_t peakMb; // millibels
int32_t rmsMb; // millibels
} peakAndRms;
};
};
/*
* Retrieves the lastest measurements. The measurements to be made
* are specified by 'setMeasurementMode' parameter.
*
* @return retval operation completion status.
* @return result measurement.
*/
measure() generates (Result retval, Measurement result);
};

303
audio/effect/2.0/types.hal Normal file
View File

@@ -0,0 +1,303 @@
/*
* Copyright (C) 2016 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.
*/
package android.hardware.audio.effect@2.0;
import android.hardware.audio.common@2.0;
enum Result {
OK,
NOT_INITIALIZED,
INVALID_ARGUMENTS,
INVALID_STATE,
NOT_SUPPORTED
};
/*
* Effect engine capabilities/requirements flags.
*
* Definitions for flags field of effect descriptor.
*
* +----------------+--------+--------------------------------------------------
* | description | bits | values
* +----------------+--------+--------------------------------------------------
* | connection | 0..2 | 0 insert: after track process
* | mode | | 1 auxiliary: connect to track auxiliary
* | | | output and use send level
* | | | 2 replace: replaces track process function;
* | | | must implement SRC, volume and mono to stereo.
* | | | 3 pre processing: applied below audio HAL on in
* | | | 4 post processing: applied below audio HAL on out
* | | | 5 - 7 reserved
* +----------------+--------+--------------------------------------------------
* | insertion | 3..5 | 0 none
* | preference | | 1 first of the chain
* | | | 2 last of the chain
* | | | 3 exclusive (only effect in the insert chain)
* | | | 4..7 reserved
* +----------------+--------+--------------------------------------------------
* | Volume | 6..8 | 0 none
* | management | | 1 implements volume control
* | | | 2 requires volume indication
* | | | 4 reserved
* +----------------+--------+--------------------------------------------------
* | Device | 9..11 | 0 none
* | indication | | 1 requires device updates
* | | | 2, 4 reserved
* +----------------+--------+--------------------------------------------------
* | Sample input | 12..13 | 1 direct: process() function or
* | mode | | EFFECT_CMD_SET_CONFIG command must specify
* | | | a buffer descriptor
* | | | 2 provider: process() function uses the
* | | | bufferProvider indicated by the
* | | | EFFECT_CMD_SET_CONFIG command to request input.
* | | | buffers.
* | | | 3 both: both input modes are supported
* +----------------+--------+--------------------------------------------------
* | Sample output | 14..15 | 1 direct: process() function or
* | mode | | EFFECT_CMD_SET_CONFIG command must specify
* | | | a buffer descriptor
* | | | 2 provider: process() function uses the
* | | | bufferProvider indicated by the
* | | | EFFECT_CMD_SET_CONFIG command to request output
* | | | buffers.
* | | | 3 both: both output modes are supported
* +----------------+--------+--------------------------------------------------
* | Hardware | 16..17 | 0 No hardware acceleration
* | acceleration | | 1 non tunneled hw acceleration: the process()
* | | | function reads the samples, send them to HW
* | | | accelerated effect processor, reads back
* | | | the processed samples and returns them
* | | | to the output buffer.
* | | | 2 tunneled hw acceleration: the process()
* | | | function is transparent. The effect interface
* | | | is only used to control the effect engine.
* | | | This mode is relevant for global effects
* | | | actually applied by the audio hardware on
* | | | the output stream.
* +----------------+--------+--------------------------------------------------
* | Audio Mode | 18..19 | 0 none
* | indication | | 1 requires audio mode updates
* | | | 2..3 reserved
* +----------------+--------+--------------------------------------------------
* | Audio source | 20..21 | 0 none
* | indication | | 1 requires audio source updates
* | | | 2..3 reserved
* +----------------+--------+--------------------------------------------------
* | Effect offload | 22 | 0 The effect cannot be offloaded to an audio DSP
* | supported | | 1 The effect can be offloaded to an audio DSP
* +----------------+--------+--------------------------------------------------
* | Process | 23 | 0 The effect implements a process function.
* | function | | 1 The effect does not implement a process
* | not | | function: enabling the effect has no impact
* | implemented | | on latency or CPU load.
* | | | Effect implementations setting this flag do not
* | | | have to implement a process function.
* +----------------+--------+--------------------------------------------------
*/
// TODO(mnaganov): Consider if "EFFECT_FLAG_" prefix can be dropped.
enum EffectFlags {
// Insert mode
EFFECT_FLAG_TYPE_SHIFT = 0,
EFFECT_FLAG_TYPE_SIZE = 3,
EFFECT_FLAG_TYPE_MASK =
((1 << EFFECT_FLAG_TYPE_SIZE) -1) << EFFECT_FLAG_TYPE_SHIFT,
EFFECT_FLAG_TYPE_INSERT = 0 << EFFECT_FLAG_TYPE_SHIFT,
EFFECT_FLAG_TYPE_AUXILIARY = 1 << EFFECT_FLAG_TYPE_SHIFT,
EFFECT_FLAG_TYPE_REPLACE = 2 << EFFECT_FLAG_TYPE_SHIFT,
EFFECT_FLAG_TYPE_PRE_PROC = 3 << EFFECT_FLAG_TYPE_SHIFT,
EFFECT_FLAG_TYPE_POST_PROC = 4 << EFFECT_FLAG_TYPE_SHIFT,
// Insert preference
EFFECT_FLAG_INSERT_SHIFT = EFFECT_FLAG_TYPE_SHIFT + EFFECT_FLAG_TYPE_SIZE,
EFFECT_FLAG_INSERT_SIZE = 3,
EFFECT_FLAG_INSERT_MASK =
((1 << EFFECT_FLAG_INSERT_SIZE) -1) << EFFECT_FLAG_INSERT_SHIFT,
EFFECT_FLAG_INSERT_ANY = 0 << EFFECT_FLAG_INSERT_SHIFT,
EFFECT_FLAG_INSERT_FIRST = 1 << EFFECT_FLAG_INSERT_SHIFT,
EFFECT_FLAG_INSERT_LAST = 2 << EFFECT_FLAG_INSERT_SHIFT,
EFFECT_FLAG_INSERT_EXCLUSIVE = 3 << EFFECT_FLAG_INSERT_SHIFT,
// Volume control
EFFECT_FLAG_VOLUME_SHIFT =
EFFECT_FLAG_INSERT_SHIFT + EFFECT_FLAG_INSERT_SIZE,
EFFECT_FLAG_VOLUME_SIZE = 3,
EFFECT_FLAG_VOLUME_MASK =
((1 << EFFECT_FLAG_VOLUME_SIZE) -1) << EFFECT_FLAG_VOLUME_SHIFT,
EFFECT_FLAG_VOLUME_CTRL = 1 << EFFECT_FLAG_VOLUME_SHIFT,
EFFECT_FLAG_VOLUME_IND = 2 << EFFECT_FLAG_VOLUME_SHIFT,
EFFECT_FLAG_VOLUME_NONE = 0 << EFFECT_FLAG_VOLUME_SHIFT,
// Device indication
EFFECT_FLAG_DEVICE_SHIFT =
EFFECT_FLAG_VOLUME_SHIFT + EFFECT_FLAG_VOLUME_SIZE,
EFFECT_FLAG_DEVICE_SIZE = 3,
EFFECT_FLAG_DEVICE_MASK =
((1 << EFFECT_FLAG_DEVICE_SIZE) -1) << EFFECT_FLAG_DEVICE_SHIFT,
EFFECT_FLAG_DEVICE_IND = 1 << EFFECT_FLAG_DEVICE_SHIFT,
EFFECT_FLAG_DEVICE_NONE = 0 << EFFECT_FLAG_DEVICE_SHIFT,
// Sample input modes
EFFECT_FLAG_INPUT_SHIFT =
EFFECT_FLAG_DEVICE_SHIFT + EFFECT_FLAG_DEVICE_SIZE,
EFFECT_FLAG_INPUT_SIZE = 2,
EFFECT_FLAG_INPUT_MASK =
((1 << EFFECT_FLAG_INPUT_SIZE) -1) << EFFECT_FLAG_INPUT_SHIFT,
EFFECT_FLAG_INPUT_DIRECT = 1 << EFFECT_FLAG_INPUT_SHIFT,
EFFECT_FLAG_INPUT_PROVIDER = 2 << EFFECT_FLAG_INPUT_SHIFT,
EFFECT_FLAG_INPUT_BOTH = 3 << EFFECT_FLAG_INPUT_SHIFT,
// Sample output modes
EFFECT_FLAG_OUTPUT_SHIFT = EFFECT_FLAG_INPUT_SHIFT + EFFECT_FLAG_INPUT_SIZE,
EFFECT_FLAG_OUTPUT_SIZE = 2,
EFFECT_FLAG_OUTPUT_MASK =
((1 << EFFECT_FLAG_OUTPUT_SIZE) -1) << EFFECT_FLAG_OUTPUT_SHIFT,
EFFECT_FLAG_OUTPUT_DIRECT = 1 << EFFECT_FLAG_OUTPUT_SHIFT,
EFFECT_FLAG_OUTPUT_PROVIDER = 2 << EFFECT_FLAG_OUTPUT_SHIFT,
EFFECT_FLAG_OUTPUT_BOTH = 3 << EFFECT_FLAG_OUTPUT_SHIFT,
// Hardware acceleration mode
EFFECT_FLAG_HW_ACC_SHIFT =
EFFECT_FLAG_OUTPUT_SHIFT + EFFECT_FLAG_OUTPUT_SIZE,
EFFECT_FLAG_HW_ACC_SIZE = 2,
EFFECT_FLAG_HW_ACC_MASK =
((1 << EFFECT_FLAG_HW_ACC_SIZE) -1) << EFFECT_FLAG_HW_ACC_SHIFT,
EFFECT_FLAG_HW_ACC_SIMPLE = 1 << EFFECT_FLAG_HW_ACC_SHIFT,
EFFECT_FLAG_HW_ACC_TUNNEL = 2 << EFFECT_FLAG_HW_ACC_SHIFT,
// Audio mode indication
EFFECT_FLAG_AUDIO_MODE_SHIFT =
EFFECT_FLAG_HW_ACC_SHIFT + EFFECT_FLAG_HW_ACC_SIZE,
EFFECT_FLAG_AUDIO_MODE_SIZE = 2,
EFFECT_FLAG_AUDIO_MODE_MASK =
((1 << EFFECT_FLAG_AUDIO_MODE_SIZE) -1) << EFFECT_FLAG_AUDIO_MODE_SHIFT,
EFFECT_FLAG_AUDIO_MODE_IND = 1 << EFFECT_FLAG_AUDIO_MODE_SHIFT,
EFFECT_FLAG_AUDIO_MODE_NONE = 0 << EFFECT_FLAG_AUDIO_MODE_SHIFT,
// Audio source indication
EFFECT_FLAG_AUDIO_SOURCE_SHIFT =
EFFECT_FLAG_AUDIO_MODE_SHIFT + EFFECT_FLAG_AUDIO_MODE_SIZE,
EFFECT_FLAG_AUDIO_SOURCE_SIZE = 2,
EFFECT_FLAG_AUDIO_SOURCE_MASK = ((1 << EFFECT_FLAG_AUDIO_SOURCE_SIZE) -1)
<< EFFECT_FLAG_AUDIO_SOURCE_SHIFT,
EFFECT_FLAG_AUDIO_SOURCE_IND = 1 << EFFECT_FLAG_AUDIO_SOURCE_SHIFT,
EFFECT_FLAG_AUDIO_SOURCE_NONE = 0 << EFFECT_FLAG_AUDIO_SOURCE_SHIFT,
// Effect offload indication
EFFECT_FLAG_OFFLOAD_SHIFT =
EFFECT_FLAG_AUDIO_SOURCE_SHIFT + EFFECT_FLAG_AUDIO_SOURCE_SIZE,
EFFECT_FLAG_OFFLOAD_SIZE = 1,
EFFECT_FLAG_OFFLOAD_MASK =
((1 << EFFECT_FLAG_OFFLOAD_SIZE) -1) << EFFECT_FLAG_OFFLOAD_SHIFT,
EFFECT_FLAG_OFFLOAD_SUPPORTED = 1 << EFFECT_FLAG_OFFLOAD_SHIFT,
// Effect has no process indication
EFFECT_FLAG_NO_PROCESS_SHIFT =
EFFECT_FLAG_OFFLOAD_SHIFT + EFFECT_FLAG_OFFLOAD_SIZE,
EFFECT_FLAG_NO_PROCESS_SIZE = 1,
EFFECT_FLAG_NO_PROCESS_MASK =
((1 << EFFECT_FLAG_NO_PROCESS_SIZE) -1) << EFFECT_FLAG_NO_PROCESS_SHIFT,
EFFECT_FLAG_NO_PROCESS = 1 << EFFECT_FLAG_NO_PROCESS_SHIFT
};
/*
* The effect descriptor contains necessary information to facilitate the
* enumeration of the effect engines present in a library.
*/
struct EffectDescriptor {
Uuid type; // UUID of to the OpenSL ES interface implemented
// by this effect
Uuid uuid; // UUID for this particular implementation
EffectFlags flags; // effect engine capabilities/requirements flags
uint16_t cpuLoad; // CPU load indication expressed in 0.1 MIPS units
// as estimated on an ARM9E core (ARMv5TE) with 0 WS
uint16_t memoryUsage; // data memory usage expressed in KB and includes
// only dynamically allocated memory
string name; // human readable effect name
string implementor; // human readable effect implementor name
};
/*
* A buffer is a chunk of audio data for processing. Multi-channel audio is
* always interleaved. The channel order is from LSB to MSB with regard to the
* channel mask definition in audio.h, audio_channel_mask_t, e.g.:
* Stereo: L, R; 5.1: FL, FR, FC, LFE, BL, BR.
*
* The buffer size is expressed in frame count, a frame being composed of
* samples for all channels at a given time. Frame size for unspecified format
* (AUDIO_FORMAT_OTHER) is 8 bit by definition.
*/
// TODO(mnaganov): replace with FMQ version.
struct AudioBuffer {
uint32_t frameCount;
vec<uint8_t> data;
};
enum EffectBufferAccess {
EFFECT_BUFFER_ACCESS_WRITE,
EFFECT_BUFFER_ACCESS_READ,
EFFECT_BUFFER_ACCESS_ACCUMULATE
};
/*
* Determines what fields of EffectBufferConfig need to be considered.
*/
enum EffectConfigParameters {
EFFECT_CONFIG_BUFFER = 0x0001, // buffer field
EFFECT_CONFIG_SMP_RATE = 0x0002, // samplingRate
EFFECT_CONFIG_CHANNELS = 0x0004, // channels
EFFECT_CONFIG_FORMAT = 0x0008, // format
EFFECT_CONFIG_ACC_MODE = 0x0010, // accessMode
EFFECT_CONFIG_ALL = EFFECT_CONFIG_BUFFER | EFFECT_CONFIG_SMP_RATE |
EFFECT_CONFIG_CHANNELS | EFFECT_CONFIG_FORMAT |
EFFECT_CONFIG_ACC_MODE
};
/*
* The buffer config structure specifies the input or output audio format
* to be used by the effect engine.
*/
struct EffectBufferConfig {
AudioBuffer buffer;
uint32_t samplingRateHz;
AudioChannelMask channels;
AudioFormat format;
EffectBufferAccess accessMode;
EffectConfigParameters mask;
};
struct EffectConfig {
EffectBufferConfig inputCfg;
EffectBufferConfig outputCfg;
};
enum EffectFeature {
EFFECT_FEATURE_AUX_CHANNELS, // supports auxiliary channels
// (e.g. dual mic noise suppressor)
EFFECT_FEATURE_CNT
};
struct EffectFeatureConfig {
EffectFeature feature;
EffectConfig config;
};
struct EffectOffloadParameter {
bool isOffload; // true if the playback thread the effect
// is attached to is offloaded
AudioIoHandle ioHandle; // io handle of the playback thread
// the effect is attached to
};