diff --git a/Android.bp b/Android.bp index 1b68a09676..7ba06adc36 100644 --- a/Android.bp +++ b/Android.bp @@ -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", ] diff --git a/audio/effect/2.0/Android.bp b/audio/effect/2.0/Android.bp new file mode 100644 index 0000000000..4dd2b1ea1b --- /dev/null +++ b/audio/effect/2.0/Android.bp @@ -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", + ], +} diff --git a/audio/effect/2.0/IAcousticEchoCancelerEffect.hal b/audio/effect/2.0/IAcousticEchoCancelerEffect.hal new file mode 100644 index 0000000000..9e2e0c399d --- /dev/null +++ b/audio/effect/2.0/IAcousticEchoCancelerEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IAutomaticGainControlEffect.hal b/audio/effect/2.0/IAutomaticGainControlEffect.hal new file mode 100644 index 0000000000..a02002d64b --- /dev/null +++ b/audio/effect/2.0/IAutomaticGainControlEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IBassBoostEffect.hal b/audio/effect/2.0/IBassBoostEffect.hal new file mode 100644 index 0000000000..bcf7b7d942 --- /dev/null +++ b/audio/effect/2.0/IBassBoostEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IDownmixEffect.hal b/audio/effect/2.0/IDownmixEffect.hal new file mode 100644 index 0000000000..817e14c5a9 --- /dev/null +++ b/audio/effect/2.0/IDownmixEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IEffect.hal b/audio/effect/2.0/IEffect.hal new file mode 100644 index 0000000000..f1cc79506d --- /dev/null +++ b/audio/effect/2.0/IEffect.hal @@ -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 volumes) generates (vec 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 features) + generates (Result retval, vec 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 data) + generates (int32_t status, vec 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 parameter, vec 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 parameter) + generates (Result retval, vec value); +}; diff --git a/audio/effect/2.0/IEffectBufferProviderCallback.hal b/audio/effect/2.0/IEffectBufferProviderCallback.hal new file mode 100644 index 0000000000..545e2e515e --- /dev/null +++ b/audio/effect/2.0/IEffectBufferProviderCallback.hal @@ -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); +}; diff --git a/audio/effect/2.0/IEffectsFactory.hal b/audio/effect/2.0/IEffectsFactory.hal new file mode 100644 index 0000000000..6763825665 --- /dev/null +++ b/audio/effect/2.0/IEffectsFactory.hal @@ -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 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); +}; diff --git a/audio/effect/2.0/IEnvironmentalReverbEffect.hal b/audio/effect/2.0/IEnvironmentalReverbEffect.hal new file mode 100644 index 0000000000..bd7aeeba29 --- /dev/null +++ b/audio/effect/2.0/IEnvironmentalReverbEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IEqualizerEffect.hal b/audio/effect/2.0/IEqualizerEffect.hal new file mode 100644 index 0000000000..afcc4b6c3e --- /dev/null +++ b/audio/effect/2.0/IEqualizerEffect.hal @@ -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 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 bandLevels; + }; + + /* + * Sets all properties at once. + */ + setAllProperties(AllProperties properties) generates (Result retval); + + /* + * Gets all properties at once. + */ + getAllProperties() generates (Result retval, AllProperties properties); +}; diff --git a/audio/effect/2.0/ILoudnessEnhancerEffect.hal b/audio/effect/2.0/ILoudnessEnhancerEffect.hal new file mode 100644 index 0000000000..3e1ee4e29b --- /dev/null +++ b/audio/effect/2.0/ILoudnessEnhancerEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/INoiseSuppressionEffect.hal b/audio/effect/2.0/INoiseSuppressionEffect.hal new file mode 100644 index 0000000000..58e439f930 --- /dev/null +++ b/audio/effect/2.0/INoiseSuppressionEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IPresetReverbEffect.hal b/audio/effect/2.0/IPresetReverbEffect.hal new file mode 100644 index 0000000000..58dfd4083c --- /dev/null +++ b/audio/effect/2.0/IPresetReverbEffect.hal @@ -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); +}; diff --git a/audio/effect/2.0/IVirtualizerEffect.hal b/audio/effect/2.0/IVirtualizerEffect.hal new file mode 100644 index 0000000000..2b7116c03d --- /dev/null +++ b/audio/effect/2.0/IVirtualizerEffect.hal @@ -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 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); +}; diff --git a/audio/effect/2.0/IVisualizerEffect.hal b/audio/effect/2.0/IVisualizerEffect.hal new file mode 100644 index 0000000000..2a7ddb8b44 --- /dev/null +++ b/audio/effect/2.0/IVisualizerEffect.hal @@ -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 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); +}; diff --git a/audio/effect/2.0/types.hal b/audio/effect/2.0/types.hal new file mode 100644 index 0000000000..3560382f27 --- /dev/null +++ b/audio/effect/2.0/types.hal @@ -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 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 +};