Merge "audiohal: Fix volume changes handling"
diff --git a/audio/effect/2.0/IEffect.hal b/audio/effect/2.0/IEffect.hal
index 9027c68..9e10117 100644
--- a/audio/effect/2.0/IEffect.hal
+++ b/audio/effect/2.0/IEffect.hal
@@ -83,20 +83,17 @@
/*
* 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.
+ * effect engine. The effect implementation must set EFFECT_FLAG_VOLUME_CTRL
+ * flag in its descriptor to receive this command. 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.
+ * @return result updated volume values.
* @return retval operation completion status.
*/
@callflow(next={"*"})
@@ -104,6 +101,19 @@
generates (Result retval, vec<uint32_t> result);
/*
+ * Notify the effect of the volume change. The effect implementation must
+ * set EFFECT_FLAG_VOLUME_IND flag in its descriptor to receive this
+ * command.
+ *
+ * @param volumes vector containing volume for each channel defined in
+ * EffectConfig for output buffer expressed in 8.24 fixed
+ * point format.
+ * @return retval operation completion status.
+ */
+ volumeChangeNotification(vec<uint32_t> volumes)
+ generates (Result retval);
+
+ /*
* 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.
diff --git a/audio/effect/2.0/default/AcousticEchoCancelerEffect.cpp b/audio/effect/2.0/default/AcousticEchoCancelerEffect.cpp
index f6e72bf..7b9ca30 100644
--- a/audio/effect/2.0/default/AcousticEchoCancelerEffect.cpp
+++ b/audio/effect/2.0/default/AcousticEchoCancelerEffect.cpp
@@ -66,6 +66,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> AcousticEchoCancelerEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> AcousticEchoCancelerEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/AcousticEchoCancelerEffect.h b/audio/effect/2.0/default/AcousticEchoCancelerEffect.h
index c777b02..1ac925d 100644
--- a/audio/effect/2.0/default/AcousticEchoCancelerEffect.h
+++ b/audio/effect/2.0/default/AcousticEchoCancelerEffect.h
@@ -54,6 +54,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/AutomaticGainControlEffect.cpp b/audio/effect/2.0/default/AutomaticGainControlEffect.cpp
index 2c386d3..62fe5f7 100644
--- a/audio/effect/2.0/default/AutomaticGainControlEffect.cpp
+++ b/audio/effect/2.0/default/AutomaticGainControlEffect.cpp
@@ -81,6 +81,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> AutomaticGainControlEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> AutomaticGainControlEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/AutomaticGainControlEffect.h b/audio/effect/2.0/default/AutomaticGainControlEffect.h
index 73d94a5..5e1f279 100644
--- a/audio/effect/2.0/default/AutomaticGainControlEffect.h
+++ b/audio/effect/2.0/default/AutomaticGainControlEffect.h
@@ -56,6 +56,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/BassBoostEffect.cpp b/audio/effect/2.0/default/BassBoostEffect.cpp
index 4120e6e..8f35e5f 100644
--- a/audio/effect/2.0/default/BassBoostEffect.cpp
+++ b/audio/effect/2.0/default/BassBoostEffect.cpp
@@ -66,6 +66,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> BassBoostEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> BassBoostEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/BassBoostEffect.h b/audio/effect/2.0/default/BassBoostEffect.h
index 1861937..1e5053b 100644
--- a/audio/effect/2.0/default/BassBoostEffect.h
+++ b/audio/effect/2.0/default/BassBoostEffect.h
@@ -54,6 +54,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/DownmixEffect.cpp b/audio/effect/2.0/default/DownmixEffect.cpp
index 41497d0..92f15bd 100644
--- a/audio/effect/2.0/default/DownmixEffect.cpp
+++ b/audio/effect/2.0/default/DownmixEffect.cpp
@@ -66,6 +66,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> DownmixEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> DownmixEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/DownmixEffect.h b/audio/effect/2.0/default/DownmixEffect.h
index 1d4c3a9..125f34d 100644
--- a/audio/effect/2.0/default/DownmixEffect.h
+++ b/audio/effect/2.0/default/DownmixEffect.h
@@ -54,6 +54,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/Effect.cpp b/audio/effect/2.0/default/Effect.cpp
index 9ca5834..3c97fc4 100644
--- a/audio/effect/2.0/default/Effect.cpp
+++ b/audio/effect/2.0/default/Effect.cpp
@@ -533,6 +533,14 @@
return Void();
}
+Return<Result> Effect::volumeChangeNotification(const hidl_vec<uint32_t>& volumes) {
+ uint32_t halDataSize;
+ std::unique_ptr<uint8_t[]> halData = hidlVecToHal(volumes, &halDataSize);
+ return sendCommand(
+ EFFECT_CMD_SET_VOLUME, "SET_VOLUME",
+ halDataSize, &halData[0]);
+}
+
Return<Result> Effect::setAudioMode(AudioMode mode) {
uint32_t halMode = static_cast<uint32_t>(mode);
return sendCommand(
@@ -641,10 +649,13 @@
uint32_t halResultSize = resultMaxSize;
std::unique_ptr<uint8_t[]> halResult(new uint8_t[halResultSize]);
memset(&halResult[0], 0, halResultSize);
+
+ void* dataPtr = halDataSize > 0 ? &halData[0] : NULL;
+ void* resultPtr = halResultSize > 0 ? &halResult[0] : NULL;
status_t status = (*mHandle)->command(
- mHandle, commandId, halDataSize, &halData[0], &halResultSize, &halResult[0]);
+ mHandle, commandId, halDataSize, dataPtr, &halResultSize, resultPtr);
hidl_vec<uint8_t> result;
- if (status == OK) {
+ if (status == OK && resultPtr != NULL) {
result.setToExternal(&halResult[0], halResultSize);
}
_hidl_cb(status, result);
diff --git a/audio/effect/2.0/default/Effect.h b/audio/effect/2.0/default/Effect.h
index 8daffb8..13faec4 100644
--- a/audio/effect/2.0/default/Effect.h
+++ b/audio/effect/2.0/default/Effect.h
@@ -75,6 +75,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/EnvironmentalReverbEffect.cpp b/audio/effect/2.0/default/EnvironmentalReverbEffect.cpp
index 2c1fd68..86ff368 100644
--- a/audio/effect/2.0/default/EnvironmentalReverbEffect.cpp
+++ b/audio/effect/2.0/default/EnvironmentalReverbEffect.cpp
@@ -95,6 +95,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> EnvironmentalReverbEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> EnvironmentalReverbEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/EnvironmentalReverbEffect.h b/audio/effect/2.0/default/EnvironmentalReverbEffect.h
index d0c8962..794caac 100644
--- a/audio/effect/2.0/default/EnvironmentalReverbEffect.h
+++ b/audio/effect/2.0/default/EnvironmentalReverbEffect.h
@@ -66,6 +66,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/EqualizerEffect.cpp b/audio/effect/2.0/default/EqualizerEffect.cpp
index 833ea5b..223716c 100644
--- a/audio/effect/2.0/default/EqualizerEffect.cpp
+++ b/audio/effect/2.0/default/EqualizerEffect.cpp
@@ -86,6 +86,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> EqualizerEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> EqualizerEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/EqualizerEffect.h b/audio/effect/2.0/default/EqualizerEffect.h
index 200ca1a..c9bed4f 100644
--- a/audio/effect/2.0/default/EqualizerEffect.h
+++ b/audio/effect/2.0/default/EqualizerEffect.h
@@ -68,6 +68,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/LoudnessEnhancerEffect.cpp b/audio/effect/2.0/default/LoudnessEnhancerEffect.cpp
index 1f7124b..e58b42c 100644
--- a/audio/effect/2.0/default/LoudnessEnhancerEffect.cpp
+++ b/audio/effect/2.0/default/LoudnessEnhancerEffect.cpp
@@ -68,6 +68,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> LoudnessEnhancerEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> LoudnessEnhancerEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/LoudnessEnhancerEffect.h b/audio/effect/2.0/default/LoudnessEnhancerEffect.h
index 308c47f..039b8d6 100644
--- a/audio/effect/2.0/default/LoudnessEnhancerEffect.h
+++ b/audio/effect/2.0/default/LoudnessEnhancerEffect.h
@@ -64,6 +64,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/NoiseSuppressionEffect.cpp b/audio/effect/2.0/default/NoiseSuppressionEffect.cpp
index b0b929f..7c4e06d 100644
--- a/audio/effect/2.0/default/NoiseSuppressionEffect.cpp
+++ b/audio/effect/2.0/default/NoiseSuppressionEffect.cpp
@@ -79,6 +79,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> NoiseSuppressionEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> NoiseSuppressionEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/NoiseSuppressionEffect.h b/audio/effect/2.0/default/NoiseSuppressionEffect.h
index 5e3a5c1..5491201 100644
--- a/audio/effect/2.0/default/NoiseSuppressionEffect.h
+++ b/audio/effect/2.0/default/NoiseSuppressionEffect.h
@@ -66,6 +66,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/PresetReverbEffect.cpp b/audio/effect/2.0/default/PresetReverbEffect.cpp
index 803c9be..5f17791 100644
--- a/audio/effect/2.0/default/PresetReverbEffect.cpp
+++ b/audio/effect/2.0/default/PresetReverbEffect.cpp
@@ -66,6 +66,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> PresetReverbEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> PresetReverbEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/PresetReverbEffect.h b/audio/effect/2.0/default/PresetReverbEffect.h
index f6a900c..4eb074a 100644
--- a/audio/effect/2.0/default/PresetReverbEffect.h
+++ b/audio/effect/2.0/default/PresetReverbEffect.h
@@ -64,6 +64,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/VirtualizerEffect.cpp b/audio/effect/2.0/default/VirtualizerEffect.cpp
index 4f193e7..c1fe52f 100644
--- a/audio/effect/2.0/default/VirtualizerEffect.cpp
+++ b/audio/effect/2.0/default/VirtualizerEffect.cpp
@@ -78,6 +78,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> VirtualizerEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> VirtualizerEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/VirtualizerEffect.h b/audio/effect/2.0/default/VirtualizerEffect.h
index 5b0773d..536775f 100644
--- a/audio/effect/2.0/default/VirtualizerEffect.h
+++ b/audio/effect/2.0/default/VirtualizerEffect.h
@@ -65,6 +65,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,
diff --git a/audio/effect/2.0/default/VisualizerEffect.cpp b/audio/effect/2.0/default/VisualizerEffect.cpp
index 141817b..2cd3240 100644
--- a/audio/effect/2.0/default/VisualizerEffect.cpp
+++ b/audio/effect/2.0/default/VisualizerEffect.cpp
@@ -66,6 +66,11 @@
return mEffect->setAndGetVolume(volumes, _hidl_cb);
}
+Return<Result> VisualizerEffect::volumeChangeNotification(
+ const hidl_vec<uint32_t>& volumes) {
+ return mEffect->volumeChangeNotification(volumes);
+}
+
Return<Result> VisualizerEffect::setAudioMode(AudioMode mode) {
return mEffect->setAudioMode(mode);
}
diff --git a/audio/effect/2.0/default/VisualizerEffect.h b/audio/effect/2.0/default/VisualizerEffect.h
index b6dc768..fd40ca8 100644
--- a/audio/effect/2.0/default/VisualizerEffect.h
+++ b/audio/effect/2.0/default/VisualizerEffect.h
@@ -64,6 +64,7 @@
Return<Result> setDevice(AudioDevice device) override;
Return<void> setAndGetVolume(
const hidl_vec<uint32_t>& volumes, setAndGetVolume_cb _hidl_cb) override;
+ Return<Result> volumeChangeNotification(const hidl_vec<uint32_t>& volumes) override;
Return<Result> setAudioMode(AudioMode mode) override;
Return<Result> setConfigReverse(
const EffectConfig& config,