Audio HAL: A volume/gain outside of [0,1] is an error
Hals are supposed to received normalized volumes, between 0 and 1.
Previously volumes outside [0,1] were clamp to this range.
This clamping has the capability to hide bugs thus return an error if
such volume is received.
Test: vts-tradefed run vts --module VtsHalAudioV2_0Target
Test: call/play music/record/video...
Bug: 36311550
Change-Id: Ia4880bdff6111cbcdae6a4ebee921eddae141ee4
Signed-off-by: Kevin Rocard <krocard@google.com>
diff --git a/audio/2.0/default/Device.cpp b/audio/2.0/default/Device.cpp
index 9246f8b..280d320 100644
--- a/audio/2.0/default/Device.cpp
+++ b/audio/2.0/default/Device.cpp
@@ -30,6 +30,7 @@
#include "HidlUtils.h"
#include "StreamIn.h"
#include "StreamOut.h"
+#include "Util.h"
namespace android {
namespace hardware {
@@ -141,12 +142,15 @@
}
Return<Result> Device::setMasterVolume(float volume) {
- Result retval(Result::NOT_SUPPORTED);
- if (mDevice->set_master_volume != NULL) {
- retval = analyzeStatus("set_master_volume",
- mDevice->set_master_volume(mDevice, volume));
+ if (mDevice->set_master_volume == NULL) {
+ return Result::NOT_SUPPORTED;
}
- return retval;
+ if (!isGainNormalized(volume)) {
+ ALOGW("Can not set a master volume (%f) outside [0,1]", volume);
+ return Result::INVALID_ARGUMENTS;
+ }
+ return analyzeStatus("set_master_volume",
+ mDevice->set_master_volume(mDevice, volume));
}
Return<void> Device::getMasterVolume(getMasterVolume_cb _hidl_cb) {
diff --git a/audio/2.0/default/StreamIn.cpp b/audio/2.0/default/StreamIn.cpp
index 9feef15..abd0497 100644
--- a/audio/2.0/default/StreamIn.cpp
+++ b/audio/2.0/default/StreamIn.cpp
@@ -24,6 +24,7 @@
#include <memory>
#include "StreamIn.h"
+#include "Util.h"
using ::android::hardware::audio::V2_0::MessageQueueFlagBits;
@@ -311,6 +312,10 @@
}
Return<Result> StreamIn::setGain(float gain) {
+ if (!isGainNormalized(gain)) {
+ ALOGW("Can not set a stream input gain (%f) outside [0,1]", gain);
+ return Result::INVALID_ARGUMENTS;
+ }
return Stream::analyzeStatus("set_gain", mStream->set_gain(mStream, gain));
}
diff --git a/audio/2.0/default/StreamOut.cpp b/audio/2.0/default/StreamOut.cpp
index eb53259..e48497f 100644
--- a/audio/2.0/default/StreamOut.cpp
+++ b/audio/2.0/default/StreamOut.cpp
@@ -25,6 +25,7 @@
#include <utils/Trace.h>
#include "StreamOut.h"
+#include "Util.h"
namespace android {
namespace hardware {
@@ -282,12 +283,16 @@
}
Return<Result> StreamOut::setVolume(float left, float right) {
- Result retval(Result::NOT_SUPPORTED);
- if (mStream->set_volume != NULL) {
- retval = Stream::analyzeStatus(
- "set_volume", mStream->set_volume(mStream, left, right));
+ if (mStream->set_volume == NULL) {
+ return Result::NOT_SUPPORTED;
}
- return retval;
+ if (!isGainNormalized(left)) {
+ ALOGW("Can not set a stream output volume {%f, %f} outside [0,1]", left,
+ right);
+ return Result::INVALID_ARGUMENTS;
+ }
+ return Stream::analyzeStatus("set_volume",
+ mStream->set_volume(mStream, left, right));
}
Return<void> StreamOut::prepareForWriting(uint32_t frameSize,
diff --git a/audio/2.0/default/Util.h b/audio/2.0/default/Util.h
new file mode 100644
index 0000000..72eea50
--- /dev/null
+++ b/audio/2.0/default/Util.h
@@ -0,0 +1,37 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef ANDROID_HARDWARE_AUDIO_V2_0_UTIL_H
+#define ANDROID_HARDWARE_AUDIO_V2_0_UTIL_H
+
+namespace android {
+namespace hardware {
+namespace audio {
+namespace V2_0 {
+namespace implementation {
+
+/** @return true if gain is between 0 and 1 included. */
+constexpr bool isGainNormalized(float gain) {
+ return gain >= 0.0 && gain <= 1.0;
+}
+
+} // namespace implementation
+} // namespace V2_0
+} // namespace audio
+} // namespace hardware
+} // namespace android
+
+#endif // ANDROID_HARDWARE_AUDIO_V2_0_UTIL_H