mirror of
https://github.com/Evolution-X/hardware_interfaces
synced 2026-02-02 10:05:19 +00:00
Merge changes from topic "upstream-hal-v7_1-p3"
* changes: audio: Remove IStreamIn@7.1 audio: Add IDevice.setConnectedState_7_1 method audio: Add recommended mute duration attribute to APM XSD Audio: Add memory leak checking for HAL
This commit is contained in:
@@ -17,7 +17,6 @@ hidl_interface {
|
||||
"IDevice.hal",
|
||||
"IDevicesFactory.hal",
|
||||
"IPrimaryDevice.hal",
|
||||
"IStreamIn.hal",
|
||||
"IStreamOut.hal",
|
||||
"IStreamOutLatencyModeCallback.hal",
|
||||
],
|
||||
|
||||
@@ -20,7 +20,6 @@ import android.hardware.audio.common@7.0;
|
||||
import @7.0::AudioInOutFlag;
|
||||
import @7.0::IDevice;
|
||||
import @7.0::Result;
|
||||
import IStreamIn;
|
||||
import IStreamOut;
|
||||
|
||||
interface IDevice extends @7.0::IDevice {
|
||||
@@ -56,33 +55,14 @@ interface IDevice extends @7.0::IDevice {
|
||||
AudioConfig suggestedConfig);
|
||||
|
||||
/**
|
||||
* This method creates and opens the audio hardware input stream.
|
||||
* If the stream can not be opened with the proposed audio config,
|
||||
* HAL must provide suggested values for the audio config.
|
||||
* Notifies the device module about the connection state of an input/output
|
||||
* device attached to it. The devicePort identifies the device and may also
|
||||
* provide extra information such as raw audio descriptors.
|
||||
*
|
||||
* Note: INVALID_ARGUMENTS is returned both in the case when the
|
||||
* HAL can not use the provided config and in the case when
|
||||
* the value of any argument is invalid. In the latter case the
|
||||
* HAL must provide a default initialized suggested config.
|
||||
*
|
||||
* @param ioHandle handle assigned by AudioFlinger.
|
||||
* @param device device type and (if needed) address.
|
||||
* @param config stream configuration.
|
||||
* @param flags additional flags.
|
||||
* @param sinkMetadata Description of the audio that is suggested by the client.
|
||||
* May be used by implementations to configure processing effects.
|
||||
* @param devicePort audio device port.
|
||||
* @param connected whether the device is connected.
|
||||
* @return retval operation completion status.
|
||||
* @return inStream in case of success, created input stream.
|
||||
* @return suggestedConfig in the case of rejection of the proposed config,
|
||||
* a config suggested by the HAL.
|
||||
*/
|
||||
openInputStream_7_1(
|
||||
AudioIoHandle ioHandle,
|
||||
DeviceAddress device,
|
||||
AudioConfig config,
|
||||
vec<AudioInOutFlag> flags,
|
||||
SinkMetadata sinkMetadata) generates (
|
||||
Result retval,
|
||||
IStreamIn inStream,
|
||||
AudioConfig suggestedConfig);
|
||||
setConnectedState_7_1(AudioPort devicePort, bool connected)
|
||||
generates (Result retval);
|
||||
};
|
||||
|
||||
@@ -1,22 +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@7.1;
|
||||
|
||||
import @7.0::IStreamIn;
|
||||
|
||||
interface IStreamIn extends @7.0::IStreamIn {
|
||||
};
|
||||
@@ -462,6 +462,7 @@ package android.audio.policy.configuration.V7_1 {
|
||||
method @Nullable public String getName();
|
||||
method @Nullable public java.util.List<android.audio.policy.configuration.V7_1.AudioUsage> getPreferredUsage();
|
||||
method @Nullable public java.util.List<android.audio.policy.configuration.V7_1.Profile> getProfile();
|
||||
method @Nullable public long getRecommendedMuteDurationMs();
|
||||
method @Nullable public android.audio.policy.configuration.V7_1.Role getRole();
|
||||
method public void setFlags(@Nullable java.util.List<android.audio.policy.configuration.V7_1.AudioInOutFlag>);
|
||||
method public void setGains(@Nullable android.audio.policy.configuration.V7_1.Gains);
|
||||
@@ -469,6 +470,7 @@ package android.audio.policy.configuration.V7_1 {
|
||||
method public void setMaxOpenCount(@Nullable long);
|
||||
method public void setName(@Nullable String);
|
||||
method public void setPreferredUsage(@Nullable java.util.List<android.audio.policy.configuration.V7_1.AudioUsage>);
|
||||
method public void setRecommendedMuteDurationMs(@Nullable long);
|
||||
method public void setRole(@Nullable android.audio.policy.configuration.V7_1.Role);
|
||||
}
|
||||
|
||||
|
||||
@@ -226,6 +226,7 @@
|
||||
</xs:documentation>
|
||||
</xs:annotation>
|
||||
</xs:attribute>
|
||||
<xs:attribute name="recommendedMuteDurationMs" type="xs:unsignedInt"/>
|
||||
</xs:complexType>
|
||||
<xs:unique name="mixPortProfileUniqueness">
|
||||
<xs:selector xpath="profile"/>
|
||||
|
||||
@@ -48,6 +48,8 @@ cc_defaults {
|
||||
"libhidlbase",
|
||||
"liblog",
|
||||
"libmedia_helper",
|
||||
"libmediautils_vendor",
|
||||
"libmemunreachable",
|
||||
"libutils",
|
||||
"android.hardware.audio.common-util",
|
||||
],
|
||||
|
||||
@@ -30,6 +30,8 @@
|
||||
#include <algorithm>
|
||||
|
||||
#include <android/log.h>
|
||||
#include <mediautils/MemoryLeakTrackUtil.h>
|
||||
#include <memunreachable/memunreachable.h>
|
||||
|
||||
#include <HidlUtils.h>
|
||||
|
||||
@@ -346,16 +348,6 @@ Return<void> Device::openOutputStream_7_1(int32_t ioHandle, const DeviceAddress&
|
||||
_hidl_cb(result, streamOut, suggestedConfig);
|
||||
return Void();
|
||||
}
|
||||
|
||||
Return<void> Device::openInputStream_7_1(int32_t ioHandle, const DeviceAddress& device,
|
||||
const AudioConfig& config, const AudioInputFlags& flags,
|
||||
const SinkMetadata& sinkMetadata,
|
||||
openInputStream_7_1_cb _hidl_cb) {
|
||||
auto [result, streamIn, suggestedConfig] =
|
||||
openInputStreamImpl(ioHandle, device, config, flags, sinkMetadata);
|
||||
_hidl_cb(result, streamIn, suggestedConfig);
|
||||
return Void();
|
||||
}
|
||||
#endif // V7.1
|
||||
|
||||
Return<bool> Device::supportsAudioPatches() {
|
||||
@@ -501,9 +493,32 @@ Return<void> Device::debugDump(const hidl_handle& fd) {
|
||||
}
|
||||
#endif
|
||||
|
||||
Return<void> Device::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& /* options */) {
|
||||
Return<void> Device::debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) {
|
||||
if (fd.getNativeHandle() != nullptr && fd->numFds == 1) {
|
||||
analyzeStatus("dump", mDevice->dump(mDevice, fd->data[0]));
|
||||
const int fd0 = fd->data[0];
|
||||
bool dumpMem = false;
|
||||
bool unreachableMemory = false;
|
||||
for (const auto& option : options) {
|
||||
if (option == "-m") {
|
||||
dumpMem = true;
|
||||
} else if (option == "--unreachable") {
|
||||
unreachableMemory = true;
|
||||
}
|
||||
}
|
||||
|
||||
if (dumpMem) {
|
||||
dprintf(fd0, "\nDumping memory:\n");
|
||||
std::string s = dumpMemoryAddresses(100 /* limit */);
|
||||
write(fd0, s.c_str(), s.size());
|
||||
}
|
||||
if (unreachableMemory) {
|
||||
dprintf(fd0, "\nDumping unreachable memory:\n");
|
||||
// TODO - should limit be an argument parameter?
|
||||
std::string s = GetUnreachableMemoryString(true /* contents */, 100 /* limit */);
|
||||
write(fd0, s.c_str(), s.size());
|
||||
}
|
||||
|
||||
analyzeStatus("dump", mDevice->dump(mDevice, fd0));
|
||||
}
|
||||
return Void();
|
||||
}
|
||||
@@ -591,6 +606,21 @@ Return<void> Device::updateAudioPatch(int32_t previousPatch,
|
||||
|
||||
#endif
|
||||
|
||||
#if MAJOR_VERSION == 7 && MINOR_VERSION == 1
|
||||
Return<Result> Device::setConnectedState_7_1(const AudioPort& devicePort, bool connected) {
|
||||
if (version() >= AUDIO_DEVICE_API_VERSION_3_2 &&
|
||||
mDevice->set_device_connected_state_v7 != nullptr) {
|
||||
audio_port_v7 halPort;
|
||||
if (status_t status = HidlUtils::audioPortToHal(devicePort, &halPort); status != NO_ERROR) {
|
||||
return analyzeStatus("audioPortToHal", status);
|
||||
}
|
||||
return analyzeStatus("set_device_connected_state_v7",
|
||||
mDevice->set_device_connected_state_v7(mDevice, &halPort, connected));
|
||||
}
|
||||
return Result::NOT_SUPPORTED;
|
||||
}
|
||||
#endif
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace CPP_VERSION
|
||||
} // namespace audio
|
||||
|
||||
@@ -123,10 +123,6 @@ struct Device : public IDevice, public ParametersUtil {
|
||||
const AudioConfig& config, const AudioOutputFlags& flags,
|
||||
const SourceMetadata& sourceMetadata,
|
||||
openOutputStream_7_1_cb _hidl_cb) override;
|
||||
Return<void> openInputStream_7_1(int32_t ioHandle, const DeviceAddress& device,
|
||||
const AudioConfig& config, const AudioInputFlags& flags,
|
||||
const SinkMetadata& sinkMetadata,
|
||||
openInputStream_7_1_cb _hidl_cb) override;
|
||||
#endif
|
||||
|
||||
Return<bool> supportsAudioPatches() override;
|
||||
@@ -162,6 +158,9 @@ struct Device : public IDevice, public ParametersUtil {
|
||||
Return<void> updateAudioPatch(int32_t previousPatch, const hidl_vec<AudioPortConfig>& sources,
|
||||
const hidl_vec<AudioPortConfig>& sinks,
|
||||
createAudioPatch_cb _hidl_cb) override;
|
||||
#endif
|
||||
#if MAJOR_VERSION == 7 && MINOR_VERSION == 1
|
||||
Return<Result> setConnectedState_7_1(const AudioPort& devicePort, bool connected) override;
|
||||
#endif
|
||||
Return<void> debug(const hidl_handle& fd, const hidl_vec<hidl_string>& options) override;
|
||||
|
||||
|
||||
@@ -17,7 +17,9 @@
|
||||
#ifndef ANDROID_HARDWARE_AUDIO_STREAMIN_H
|
||||
#define ANDROID_HARDWARE_AUDIO_STREAMIN_H
|
||||
|
||||
#include PATH(android/hardware/audio/FILE_VERSION/IStreamIn.h)
|
||||
// clang-format off
|
||||
#include PATH(android/hardware/audio/CORE_TYPES_FILE_VERSION/IStreamIn.h)
|
||||
// clang-format on
|
||||
|
||||
#include "Device.h"
|
||||
#include "Stream.h"
|
||||
|
||||
@@ -15,9 +15,9 @@
|
||||
*/
|
||||
|
||||
// clang-format off
|
||||
#include PATH(android/hardware/audio/FILE_VERSION/IStreamIn.h)
|
||||
#include PATH(android/hardware/audio/FILE_VERSION/IStreamOut.h)
|
||||
#include PATH(android/hardware/audio/CORE_TYPES_FILE_VERSION/IStreamIn.h)
|
||||
#include PATH(android/hardware/audio/CORE_TYPES_FILE_VERSION/types.h)
|
||||
#include PATH(android/hardware/audio/FILE_VERSION/IStreamOut.h)
|
||||
#include PATH(android/hardware/audio/common/COMMON_TYPES_FILE_VERSION/types.h)
|
||||
// clang-format on
|
||||
#include <hidl/HidlSupport.h>
|
||||
|
||||
@@ -16,3 +16,34 @@
|
||||
|
||||
// pull in all the <= 7.0 tests
|
||||
#include "7.0/AudioPrimaryHidlHalTest.cpp"
|
||||
|
||||
TEST_P(AudioHidlDeviceTest, SetConnectedState_7_1) {
|
||||
doc::test("Check that the HAL can be notified of device connection and disconnection");
|
||||
using AD = xsd::AudioDevice;
|
||||
for (auto deviceType : {AD::AUDIO_DEVICE_OUT_HDMI, AD::AUDIO_DEVICE_OUT_WIRED_HEADPHONE,
|
||||
AD::AUDIO_DEVICE_IN_USB_HEADSET}) {
|
||||
SCOPED_TRACE("device=" + toString(deviceType));
|
||||
for (bool state : {true, false}) {
|
||||
SCOPED_TRACE("state=" + ::testing::PrintToString(state));
|
||||
DeviceAddress address = {};
|
||||
address.deviceType = toString(deviceType);
|
||||
if (deviceType == AD::AUDIO_DEVICE_IN_USB_HEADSET) {
|
||||
address.address.alsa({0, 0});
|
||||
}
|
||||
AudioPort devicePort;
|
||||
devicePort.ext.device(address);
|
||||
auto ret = getDevice()->setConnectedState_7_1(devicePort, state);
|
||||
ASSERT_TRUE(ret.isOk());
|
||||
if (ret == Result::NOT_SUPPORTED) {
|
||||
doc::partialTest("setConnectedState_7_1 is not supported");
|
||||
break; // other deviceType might be supported
|
||||
}
|
||||
ASSERT_OK(ret);
|
||||
}
|
||||
}
|
||||
|
||||
// Because there is no way of knowing if the devices were connected before
|
||||
// calling setConnectedState, there is no way to restore the HAL to its
|
||||
// initial state. To workaround this, destroy the HAL at the end of this test.
|
||||
ASSERT_TRUE(resetDevice());
|
||||
}
|
||||
|
||||
@@ -91,8 +91,9 @@ using ::android::hardware::details::toHexString;
|
||||
using namespace ::android::hardware::audio::common::COMMON_TYPES_CPP_VERSION;
|
||||
using namespace ::android::hardware::audio::common::test::utility;
|
||||
using namespace ::android::hardware::audio::CPP_VERSION;
|
||||
using ReadParameters = ::android::hardware::audio::CPP_VERSION::IStreamIn::ReadParameters;
|
||||
using ReadStatus = ::android::hardware::audio::CPP_VERSION::IStreamIn::ReadStatus;
|
||||
using ReadParameters =
|
||||
::android::hardware::audio::CORE_TYPES_CPP_VERSION::IStreamIn::ReadParameters;
|
||||
using ReadStatus = ::android::hardware::audio::CORE_TYPES_CPP_VERSION::IStreamIn::ReadStatus;
|
||||
using WriteCommand = ::android::hardware::audio::CPP_VERSION::IStreamOut::WriteCommand;
|
||||
using WriteStatus = ::android::hardware::audio::CPP_VERSION::IStreamOut::WriteStatus;
|
||||
#if MAJOR_VERSION >= 7
|
||||
@@ -1089,7 +1090,7 @@ GTEST_ALLOW_UNINSTANTIATED_PARAMETERIZED_TEST(OutputStreamTest);
|
||||
|
||||
class StreamReader : public StreamWorker<StreamReader> {
|
||||
public:
|
||||
using IStreamIn = ::android::hardware::audio::CPP_VERSION::IStreamIn;
|
||||
using IStreamIn = ::android::hardware::audio::CORE_TYPES_CPP_VERSION::IStreamIn;
|
||||
|
||||
StreamReader(IStreamIn* stream, size_t bufferSize)
|
||||
: mStream(stream), mBufferSize(bufferSize), mData(mBufferSize) {}
|
||||
@@ -1204,7 +1205,8 @@ class StreamReader : public StreamWorker<StreamReader> {
|
||||
EventFlag* mEfGroup = nullptr;
|
||||
};
|
||||
|
||||
class InputStreamTest : public OpenStreamTest<::android::hardware::audio::CPP_VERSION::IStreamIn> {
|
||||
class InputStreamTest
|
||||
: public OpenStreamTest<::android::hardware::audio::CORE_TYPES_CPP_VERSION::IStreamIn> {
|
||||
void SetUp() override {
|
||||
ASSERT_NO_FATAL_FAILURE(OpenStreamTest::SetUp()); // setup base
|
||||
#if MAJOR_VERSION <= 6
|
||||
@@ -1226,13 +1228,8 @@ class InputStreamTest : public OpenStreamTest<::android::hardware::audio::CPP_VE
|
||||
auto flags = getInputFlags();
|
||||
testOpen(
|
||||
[&](AudioIoHandle handle, AudioConfig config, auto cb) {
|
||||
#if MAJOR_VERSION < 7 || (MAJOR_VERSION == 7 && MINOR_VERSION == 0)
|
||||
return getDevice()->openInputStream(handle, address, config, flags,
|
||||
initMetadata, cb);
|
||||
#elif MAJOR_VERSION == 7 && MINOR_VERSION == 1
|
||||
return getDevice()->openInputStream_7_1(handle, address, config, flags,
|
||||
initMetadata, cb);
|
||||
#endif
|
||||
},
|
||||
config);
|
||||
}
|
||||
@@ -1605,8 +1602,9 @@ TEST_P(InputStreamTest, SetGain) {
|
||||
"InputStream::setGain");
|
||||
}
|
||||
|
||||
static void testPrepareForReading(::android::hardware::audio::CPP_VERSION::IStreamIn* stream,
|
||||
uint32_t frameSize, uint32_t framesCount) {
|
||||
static void testPrepareForReading(
|
||||
::android::hardware::audio::CORE_TYPES_CPP_VERSION::IStreamIn* stream, uint32_t frameSize,
|
||||
uint32_t framesCount) {
|
||||
Result res;
|
||||
// Ignore output parameters as the call should fail
|
||||
ASSERT_OK(stream->prepareForReading(frameSize, framesCount,
|
||||
|
||||
Reference in New Issue
Block a user