diff --git a/audio/aidl/Android.bp b/audio/aidl/Android.bp index e69306eb32..56ac510a53 100644 --- a/audio/aidl/Android.bp +++ b/audio/aidl/Android.bp @@ -109,7 +109,6 @@ aidl_interface { "android.hardware.audio_defaults", ], srcs: [ - "android/hardware/audio/core/AudioMode.aidl", "android/hardware/audio/core/AudioPatch.aidl", "android/hardware/audio/core/AudioRoute.aidl", "android/hardware/audio/core/IBluetooth.aidl", diff --git a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/AudioMode.aidl b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/AudioMode.aidl deleted file mode 100644 index 336f9b528d..0000000000 --- a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/AudioMode.aidl +++ /dev/null @@ -1,42 +0,0 @@ -/* - * Copyright (C) 2022 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. - */ -/////////////////////////////////////////////////////////////////////////////// -// THIS FILE IS IMMUTABLE. DO NOT EDIT IN ANY CASE. // -/////////////////////////////////////////////////////////////////////////////// - -// This file is a snapshot of an AIDL file. Do not edit it manually. There are -// two cases: -// 1). this is a frozen version file - do not edit this in any case. -// 2). this is a 'current' file. If you make a backwards compatible change to -// the interface (from the latest frozen version), the build system will -// prompt you to update this file with `m -update-api`. -// -// You must not make a backward incompatible change to any AIDL file built -// with the aidl_interface module type with versions property set. The module -// type is used to build AIDL files in a way that they can be used across -// independently updatable components of the system. If a device is shipped -// with such a backward incompatible change, it has a high risk of breaking -// later when a module using the interface is updated, e.g., Mainline modules. - -package android.hardware.audio.core; -@Backing(type="int") @VintfStability -enum AudioMode { - NORMAL = 0, - RINGTONE = 1, - IN_CALL = 2, - IN_COMMUNICATION = 3, - CALL_SCREEN = 4, -} diff --git a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetooth.aidl b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetooth.aidl index 289c0c238e..9357a1587e 100644 --- a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetooth.aidl +++ b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IBluetooth.aidl @@ -44,10 +44,10 @@ interface IBluetooth { @nullable @utf8InCpp String debugName; @VintfStability enum Mode { - UNSPECIFIED = 0, - SCO = 1, - SCO_WB = 2, - SCO_SWB = 3, + UNSPECIFIED, + SCO, + SCO_WB, + SCO_SWB, } } @JavaDerive(equals=true, toString=true) @VintfStability diff --git a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IModule.aidl b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IModule.aidl index 4486b661b2..960e69fa41 100644 --- a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IModule.aidl +++ b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/IModule.aidl @@ -59,7 +59,7 @@ interface IModule { boolean getMicMute(); void setMicMute(boolean mute); android.hardware.audio.core.MicrophoneInfo[] getMicrophones(); - void updateAudioMode(android.hardware.audio.core.AudioMode mode); + void updateAudioMode(android.media.audio.common.AudioMode mode); void updateScreenRotation(android.hardware.audio.core.IModule.ScreenRotation rotation); void updateScreenState(boolean isTurnedOn); @nullable android.hardware.audio.core.sounddose.ISoundDose getSoundDose(); diff --git a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/ITelephony.aidl b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/ITelephony.aidl index 77063df19b..001d07461e 100644 --- a/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/ITelephony.aidl +++ b/audio/aidl/aidl_api/android.hardware.audio.core/current/android/hardware/audio/core/ITelephony.aidl @@ -34,8 +34,8 @@ package android.hardware.audio.core; @VintfStability interface ITelephony { - android.hardware.audio.core.AudioMode[] getSupportedAudioModes(); - void switchAudioMode(android.hardware.audio.core.AudioMode mode); + android.media.audio.common.AudioMode[] getSupportedAudioModes(); + void switchAudioMode(android.media.audio.common.AudioMode mode); android.hardware.audio.core.ITelephony.TelecomConfig setTelecomConfig(in android.hardware.audio.core.ITelephony.TelecomConfig config); @JavaDerive(equals=true, toString=true) @VintfStability parcelable TelecomConfig { diff --git a/audio/aidl/android/hardware/audio/core/AudioMode.aidl b/audio/aidl/android/hardware/audio/core/AudioMode.aidl deleted file mode 100644 index 0943a55c0f..0000000000 --- a/audio/aidl/android/hardware/audio/core/AudioMode.aidl +++ /dev/null @@ -1,38 +0,0 @@ -/* - * Copyright (C) 2022 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.core; - -/** - * The audio mode describes states of the audio system of the device that - * can significantly affect the rules of audio routing, volume control, etc. - * The audio mode is controlled by the framework, however the HAL has some - * flexibility in the choice of modes to support, see 'IModule.updateAudioMode'. - */ -@VintfStability -@Backing(type="int") -enum AudioMode { - /** No active calls. */ - NORMAL = 0, - /** The device is playing the ringtone. */ - RINGTONE = 1, - /** The call is handled by the telephony stack ("voice call"). */ - IN_CALL = 2, - /** The call is handled by an application ("VoIP call"). */ - IN_COMMUNICATION = 3, - /** Call screening is in progress. */ - CALL_SCREEN = 4, -} diff --git a/audio/aidl/android/hardware/audio/core/IModule.aidl b/audio/aidl/android/hardware/audio/core/IModule.aidl index 7bc1b9cba5..2c478f2951 100644 --- a/audio/aidl/android/hardware/audio/core/IModule.aidl +++ b/audio/aidl/android/hardware/audio/core/IModule.aidl @@ -18,7 +18,6 @@ package android.hardware.audio.core; import android.hardware.audio.common.SinkMetadata; import android.hardware.audio.common.SourceMetadata; -import android.hardware.audio.core.AudioMode; import android.hardware.audio.core.AudioPatch; import android.hardware.audio.core.AudioRoute; import android.hardware.audio.core.IBluetooth; @@ -33,6 +32,7 @@ import android.hardware.audio.core.StreamDescriptor; import android.hardware.audio.core.VendorParameter; import android.hardware.audio.core.sounddose.ISoundDose; import android.hardware.audio.effect.IEffect; +import android.media.audio.common.AudioMode; import android.media.audio.common.AudioOffloadInfo; import android.media.audio.common.AudioPort; import android.media.audio.common.AudioPortConfig; @@ -684,6 +684,7 @@ interface IModule { * method. * * @param mode The current mode. + * @throws EX_ILLEGAL_ARGUMENT If the mode is out of range of valid values. */ void updateAudioMode(AudioMode mode); diff --git a/audio/aidl/android/hardware/audio/core/ITelephony.aidl b/audio/aidl/android/hardware/audio/core/ITelephony.aidl index a817032ed1..7fc1ace7ae 100644 --- a/audio/aidl/android/hardware/audio/core/ITelephony.aidl +++ b/audio/aidl/android/hardware/audio/core/ITelephony.aidl @@ -16,7 +16,7 @@ package android.hardware.audio.core; -import android.hardware.audio.core.AudioMode; +import android.media.audio.common.AudioMode; import android.media.audio.common.Boolean; import android.media.audio.common.Float; @@ -52,6 +52,7 @@ interface ITelephony { * * @param mode The mode to switch to. * @throws EX_UNSUPPORTED_OPERATION If the HAL does not support the specified mode. + * @throws EX_ILLEGAL_ARGUMENT If the mode is out of range of valid values. * @throws EX_ILLEGAL_STATE If there was an error during switching. */ void switchAudioMode(AudioMode mode); diff --git a/audio/aidl/common/include/Utils.h b/audio/aidl/common/include/Utils.h index 8f0c986c11..2aaa78162c 100644 --- a/audio/aidl/common/include/Utils.h +++ b/audio/aidl/common/include/Utils.h @@ -16,6 +16,8 @@ #pragma once +#include +#include #include #include @@ -23,11 +25,22 @@ #include #include #include +#include #include #include namespace android::hardware::audio::common { +// Some values are reserved for use by the system code only. +// HALs must not accept or emit values outside from the provided list. +constexpr std::array<::aidl::android::media::audio::common::AudioMode, 5> kValidAudioModes = { + ::aidl::android::media::audio::common::AudioMode::NORMAL, + ::aidl::android::media::audio::common::AudioMode::RINGTONE, + ::aidl::android::media::audio::common::AudioMode::IN_CALL, + ::aidl::android::media::audio::common::AudioMode::IN_COMMUNICATION, + ::aidl::android::media::audio::common::AudioMode::CALL_SCREEN, +}; + constexpr size_t getPcmSampleSizeInBytes(::aidl::android::media::audio::common::PcmType pcm) { using ::aidl::android::media::audio::common::PcmType; switch (pcm) { @@ -91,6 +104,11 @@ constexpr bool isTelephonyDeviceType( device == ::aidl::android::media::audio::common::AudioDeviceType::OUT_TELEPHONY_TX; } +constexpr bool isValidAudioMode(::aidl::android::media::audio::common::AudioMode mode) { + return std::find(kValidAudioModes.begin(), kValidAudioModes.end(), mode) != + kValidAudioModes.end(); +} + // The helper functions defined below are only applicable to the case when an enum type // specifies zero-based bit positions, not bit masks themselves. This is why instantiation // is restricted to certain enum types. diff --git a/audio/aidl/default/Module.cpp b/audio/aidl/default/Module.cpp index acad70f52d..a6e1d0dcd8 100644 --- a/audio/aidl/default/Module.cpp +++ b/audio/aidl/default/Module.cpp @@ -41,6 +41,7 @@ using aidl::android::media::audio::common::AudioFormatDescription; using aidl::android::media::audio::common::AudioFormatType; using aidl::android::media::audio::common::AudioInputFlags; using aidl::android::media::audio::common::AudioIoFlags; +using aidl::android::media::audio::common::AudioMode; using aidl::android::media::audio::common::AudioOffloadInfo; using aidl::android::media::audio::common::AudioOutputFlags; using aidl::android::media::audio::common::AudioPort; @@ -52,6 +53,7 @@ using aidl::android::media::audio::common::Int; using aidl::android::media::audio::common::PcmType; using android::hardware::audio::common::getFrameSizeInBytes; using android::hardware::audio::common::isBitPositionFlagSet; +using android::hardware::audio::common::isValidAudioMode; namespace aidl::android::hardware::audio::core { @@ -952,6 +954,10 @@ ndk::ScopedAStatus Module::getMicrophones(std::vector* _aidl_ret } ndk::ScopedAStatus Module::updateAudioMode(AudioMode in_mode) { + if (!isValidAudioMode(in_mode)) { + LOG(ERROR) << __func__ << ": invalid mode " << toString(in_mode); + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } // No checks for supported audio modes here, it's an informative notification. LOG(DEBUG) << __func__ << ": " << toString(in_mode); return ndk::ScopedAStatus::ok(); diff --git a/audio/aidl/default/Telephony.cpp b/audio/aidl/default/Telephony.cpp index d873178a00..ad2247015a 100644 --- a/audio/aidl/default/Telephony.cpp +++ b/audio/aidl/default/Telephony.cpp @@ -14,14 +14,18 @@ * limitations under the License. */ -#include #define LOG_TAG "AHAL_Telephony" #include +#include +#include + #include "core-impl/Telephony.h" +using aidl::android::media::audio::common::AudioMode; using aidl::android::media::audio::common::Boolean; using aidl::android::media::audio::common::Float; +using android::hardware::audio::common::isValidAudioMode; namespace aidl::android::hardware::audio::core { @@ -38,6 +42,10 @@ ndk::ScopedAStatus Telephony::getSupportedAudioModes(std::vector* _ai } ndk::ScopedAStatus Telephony::switchAudioMode(AudioMode in_mode) { + if (!isValidAudioMode(in_mode)) { + LOG(ERROR) << __func__ << ": invalid mode " << toString(in_mode); + return ndk::ScopedAStatus::fromExceptionCode(EX_ILLEGAL_ARGUMENT); + } if (std::find(mSupportedAudioModes.begin(), mSupportedAudioModes.end(), in_mode) != mSupportedAudioModes.end()) { LOG(DEBUG) << __func__ << ": " << toString(in_mode); diff --git a/audio/aidl/default/include/core-impl/Module.h b/audio/aidl/default/include/core-impl/Module.h index 9e4499b085..3cce7692bb 100644 --- a/audio/aidl/default/include/core-impl/Module.h +++ b/audio/aidl/default/include/core-impl/Module.h @@ -92,7 +92,7 @@ class Module : public BnModule { ndk::ScopedAStatus setMicMute(bool in_mute) override; ndk::ScopedAStatus getMicrophones(std::vector* _aidl_return) override; ndk::ScopedAStatus updateAudioMode( - ::aidl::android::hardware::audio::core::AudioMode in_mode) override; + ::aidl::android::media::audio::common::AudioMode in_mode) override; ndk::ScopedAStatus updateScreenRotation( ::aidl::android::hardware::audio::core::IModule::ScreenRotation in_rotation) override; ndk::ScopedAStatus updateScreenState(bool in_isTurnedOn) override; diff --git a/audio/aidl/default/include/core-impl/Telephony.h b/audio/aidl/default/include/core-impl/Telephony.h index 09361722ff..0f8e93f10a 100644 --- a/audio/aidl/default/include/core-impl/Telephony.h +++ b/audio/aidl/default/include/core-impl/Telephony.h @@ -27,13 +27,20 @@ class Telephony : public BnTelephony { Telephony(); private: - ndk::ScopedAStatus getSupportedAudioModes(std::vector* _aidl_return) override; - ndk::ScopedAStatus switchAudioMode(AudioMode in_mode) override; + ndk::ScopedAStatus getSupportedAudioModes( + std::vector<::aidl::android::media::audio::common::AudioMode>* _aidl_return) override; + ndk::ScopedAStatus switchAudioMode( + ::aidl::android::media::audio::common::AudioMode in_mode) override; ndk::ScopedAStatus setTelecomConfig(const TelecomConfig& in_config, TelecomConfig* _aidl_return) override; - const std::vector mSupportedAudioModes = {::ndk::enum_range().begin(), - ::ndk::enum_range().end()}; + const std::vector<::aidl::android::media::audio::common::AudioMode> mSupportedAudioModes = { + ::aidl::android::media::audio::common::AudioMode::NORMAL, + ::aidl::android::media::audio::common::AudioMode::RINGTONE, + ::aidl::android::media::audio::common::AudioMode::IN_CALL, + ::aidl::android::media::audio::common::AudioMode::IN_COMMUNICATION, + // Omit CALL_SCREEN for a better VTS coverage. + }; TelecomConfig mTelecomConfig; }; diff --git a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp index d4f281115e..a8febc5b57 100644 --- a/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp +++ b/audio/aidl/vts/VtsHalAudioCoreModuleTargetTest.cpp @@ -54,7 +54,6 @@ using aidl::android::hardware::audio::common::PlaybackTrackMetadata; using aidl::android::hardware::audio::common::RecordTrackMetadata; using aidl::android::hardware::audio::common::SinkMetadata; using aidl::android::hardware::audio::common::SourceMetadata; -using aidl::android::hardware::audio::core::AudioMode; using aidl::android::hardware::audio::core::AudioPatch; using aidl::android::hardware::audio::core::AudioRoute; using aidl::android::hardware::audio::core::IBluetooth; @@ -78,6 +77,7 @@ using aidl::android::media::audio::common::AudioDualMonoMode; using aidl::android::media::audio::common::AudioFormatType; using aidl::android::media::audio::common::AudioIoFlags; using aidl::android::media::audio::common::AudioLatencyMode; +using aidl::android::media::audio::common::AudioMode; using aidl::android::media::audio::common::AudioOutputFlags; using aidl::android::media::audio::common::AudioPlaybackRate; using aidl::android::media::audio::common::AudioPort; @@ -93,6 +93,7 @@ using aidl::android::media::audio::common::Void; using android::hardware::audio::common::getChannelCount; using android::hardware::audio::common::isBitPositionFlagSet; using android::hardware::audio::common::isTelephonyDeviceType; +using android::hardware::audio::common::isValidAudioMode; using android::hardware::audio::common::StreamLogic; using android::hardware::audio::common::StreamWorker; using ndk::enum_range; @@ -1805,7 +1806,11 @@ TEST_P(AudioCoreModule, GetMicrophones) { TEST_P(AudioCoreModule, UpdateAudioMode) { for (const auto mode : ::ndk::enum_range()) { - EXPECT_IS_OK(module->updateAudioMode(mode)) << toString(mode); + if (isValidAudioMode(mode)) { + EXPECT_IS_OK(module->updateAudioMode(mode)) << toString(mode); + } else { + EXPECT_STATUS(EX_ILLEGAL_ARGUMENT, module->updateAudioMode(mode)) << toString(mode); + } } EXPECT_IS_OK(module->updateAudioMode(AudioMode::NORMAL)); } @@ -1994,6 +1999,9 @@ TEST_P(AudioCoreTelephony, GetSupportedAudioModes) { } std::vector modes1; ASSERT_IS_OK(telephony->getSupportedAudioModes(&modes1)); + for (const auto mode : modes1) { + EXPECT_TRUE(isValidAudioMode(mode)) << toString(mode); + } const std::vector kMandatoryModes = {AudioMode::NORMAL, AudioMode::RINGTONE, AudioMode::IN_CALL, AudioMode::IN_COMMUNICATION}; @@ -2025,7 +2033,9 @@ TEST_P(AudioCoreTelephony, SwitchAudioMode) { unsupportedModes.erase(mode); } for (const auto mode : unsupportedModes) { - EXPECT_STATUS(EX_UNSUPPORTED_OPERATION, telephony->switchAudioMode(mode)) << toString(mode); + EXPECT_STATUS(isValidAudioMode(mode) ? EX_UNSUPPORTED_OPERATION : EX_ILLEGAL_ARGUMENT, + telephony->switchAudioMode(mode)) + << toString(mode); } }