Define HAL for audio effects

Created after hardware/audio_effect.h with the following changes:

 - names changed to satisfy HAL style guide;

 - defined an interface per effect, an interface method
   per command, and getter / setter methods for properties;

 - retained methods for executing proprietary commands
   and accessing proprietary properties, only to be used
   for third-party software effects;

 - HIDL vector type is used instead of count / array pairs;

 - provider callback changed to be used over RPC;

 - 'dump' is method is already defined by generated code.

Note that audio data is currently transferred using AudioBuffers,
which is not effective due to memory copy and HwBinder transaction
involved. The transfer method will be changed to FastMessageQueue.

Bug: 30222631
Test: make
Change-Id: Ic8ea5c19688610ebe642c7597d2bcfa3226977e7
This commit is contained in:
Mikhail Naganov 2016-09-27 17:01:34 -07:00
parent 4d2f157ffc
commit 40be06cdf3
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
};