Merge changes from topic "upstream-hal-v6"

* changes:
  Rename of the Vendor HAL
  Support Audio HAL V6
  libaudioHAL: reduce version specific code
  Avoid querying the audio service twice
gugelfrei
Treehugger Robot 5 years ago committed by Gerrit Code Review
commit 82d6654ade

@ -6,10 +6,10 @@ service audioserver /system/bin/audioserver
capabilities BLOCK_SUSPEND
ioprio rt 4
writepid /dev/cpuset/foreground/tasks /dev/stune/foreground/tasks
onrestart restart vendor.audio-hal-2-0
onrestart restart vendor.audio-hal
onrestart restart vendor.audio-hal-4-0-msd
# Keep the original service name for backward compatibility when upgrading
# O-MR1 devices with framework-only.
# Keep the original service names for backward compatibility
onrestart restart vendor.audio-hal-2-0
onrestart restart audio-hal-2-0
on property:vts.native_server.on=1

@ -13,20 +13,16 @@ cc_library_shared {
],
shared_libs: [
"android.hardware.audio.effect@2.0",
"android.hardware.audio.effect@4.0",
"android.hardware.audio.effect@5.0",
"android.hardware.audio@2.0",
"android.hardware.audio@4.0",
"android.hardware.audio@5.0",
"libaudiohal@2.0",
"libaudiohal@4.0",
"libaudiohal@5.0",
"libaudiohal@6.0",
"libutils",
],
header_libs: [
"libaudiohal_headers"
"libaudiohal_headers",
"libbase_headers",
]
}

@ -14,26 +14,16 @@
* limitations under the License.
*/
#include <android/hardware/audio/2.0/IDevicesFactory.h>
#include <android/hardware/audio/4.0/IDevicesFactory.h>
#include <android/hardware/audio/5.0/IDevicesFactory.h>
#include <libaudiohal/FactoryHalHidl.h>
#include <media/audiohal/DevicesFactoryHalInterface.h>
namespace android {
// static
sp<DevicesFactoryHalInterface> DevicesFactoryHalInterface::create() {
if (hardware::audio::V5_0::IDevicesFactory::getService() != nullptr) {
return V5_0::createDevicesFactoryHal();
}
if (hardware::audio::V4_0::IDevicesFactory::getService() != nullptr) {
return V4_0::createDevicesFactoryHal();
}
if (hardware::audio::V2_0::IDevicesFactory::getService() != nullptr) {
return V2_0::createDevicesFactoryHal();
}
return nullptr;
return createPreferedImpl<DevicesFactoryHalInterface>();
}
} // namespace android

@ -1,5 +1,5 @@
/*
* Copyright (C) 2016 The Android Open Source Project
* 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.
@ -14,26 +14,15 @@
* limitations under the License.
*/
#include <android/hardware/audio/effect/2.0/IEffectsFactory.h>
#include <android/hardware/audio/effect/4.0/IEffectsFactory.h>
#include <android/hardware/audio/effect/5.0/IEffectsFactory.h>
#include <libaudiohal/FactoryHalHidl.h>
#include <media/audiohal/EffectsFactoryHalInterface.h>
namespace android {
// static
sp<EffectsFactoryHalInterface> EffectsFactoryHalInterface::create() {
if (hardware::audio::effect::V5_0::IEffectsFactory::getService() != nullptr) {
return effect::V5_0::createEffectsFactoryHal();
}
if (hardware::audio::effect::V4_0::IEffectsFactory::getService() != nullptr) {
return effect::V4_0::createEffectsFactoryHal();
}
if (hardware::audio::effect::V2_0::IEffectsFactory::getService() != nullptr) {
return effect::V2_0::createEffectsFactoryHal();
}
return nullptr;
return createPreferedImpl<EffectsFactoryHalInterface>();
}
// static

@ -99,3 +99,20 @@ cc_library_shared {
"-include common/all-versions/VersionMacro.h",
]
}
cc_library_shared {
name: "libaudiohal@6.0",
defaults: ["libaudiohal_default"],
shared_libs: [
"android.hardware.audio.common@6.0",
"android.hardware.audio.common@6.0-util",
"android.hardware.audio.effect@6.0",
"android.hardware.audio@6.0",
],
cflags: [
"-DMAJOR_VERSION=6",
"-DMINOR_VERSION=0",
"-include common/all-versions/VersionMacro.h",
]
}

@ -35,13 +35,10 @@ using ::android::hardware::Return;
namespace android {
namespace CPP_VERSION {
DevicesFactoryHalHidl::DevicesFactoryHalHidl() {
sp<IDevicesFactory> defaultFactory{IDevicesFactory::getService()};
if (!defaultFactory) {
ALOGE("Failed to obtain IDevicesFactory/default service, terminating process.");
exit(1);
}
mDeviceFactories.push_back(defaultFactory);
DevicesFactoryHalHidl::DevicesFactoryHalHidl(sp<IDevicesFactory> devicesFactory) {
ALOG_ASSERT(devicesFactory != nullptr, "Provided IDevicesFactory service is NULL");
mDeviceFactories.push_back(devicesFactory);
if (MAJOR_VERSION >= 4) {
// The MSD factory is optional and only available starting at HAL 4.0
sp<IDevicesFactory> msdFactory{IDevicesFactory::getService(AUDIO_HAL_SERVICE_NAME_MSD)};

@ -32,18 +32,14 @@ namespace CPP_VERSION {
class DevicesFactoryHalHidl : public DevicesFactoryHalInterface
{
public:
DevicesFactoryHalHidl(sp<IDevicesFactory> devicesFactory);
// Opens a device with the specified name. To close the device, it is
// necessary to release references to the returned object.
virtual status_t openDevice(const char *name, sp<DeviceHalInterface> *device);
private:
friend class DevicesFactoryHalHybrid;
std::vector<sp<IDevicesFactory>> mDeviceFactories;
// Can not be constructed directly by clients.
DevicesFactoryHalHidl();
virtual ~DevicesFactoryHalHidl() = default;
};

@ -17,16 +17,17 @@
#define LOG_TAG "DevicesFactoryHalHybrid"
//#define LOG_NDEBUG 0
#include "DevicesFactoryHalHidl.h"
#include "DevicesFactoryHalHybrid.h"
#include "DevicesFactoryHalLocal.h"
#include "DevicesFactoryHalHidl.h"
#include <libaudiohal/FactoryHalHidl.h>
namespace android {
namespace CPP_VERSION {
DevicesFactoryHalHybrid::DevicesFactoryHalHybrid()
DevicesFactoryHalHybrid::DevicesFactoryHalHybrid(sp<IDevicesFactory> hidlFactory)
: mLocalFactory(new DevicesFactoryHalLocal()),
mHidlFactory(new DevicesFactoryHalHidl()) {
mHidlFactory(new DevicesFactoryHalHidl(hidlFactory)) {
}
status_t DevicesFactoryHalHybrid::openDevice(const char *name, sp<DeviceHalInterface> *device) {
@ -36,6 +37,12 @@ status_t DevicesFactoryHalHybrid::openDevice(const char *name, sp<DeviceHalInter
}
return mLocalFactory->openDevice(name, device);
}
} // namespace CPP_VERSION
template <>
sp<DevicesFactoryHalInterface> createFactoryHal<AudioHALVersion::CPP_VERSION>() {
auto service = hardware::audio::CPP_VERSION::IDevicesFactory::getService();
return service ? new CPP_VERSION::DevicesFactoryHalHybrid(service) : nullptr;
}
} // namespace android

@ -17,17 +17,20 @@
#ifndef ANDROID_HARDWARE_DEVICES_FACTORY_HAL_HYBRID_H
#define ANDROID_HARDWARE_DEVICES_FACTORY_HAL_HYBRID_H
#include PATH(android/hardware/audio/FILE_VERSION/IDevicesFactory.h)
#include <media/audiohal/DevicesFactoryHalInterface.h>
#include <utils/Errors.h>
#include <utils/RefBase.h>
using ::android::hardware::audio::CPP_VERSION::IDevicesFactory;
namespace android {
namespace CPP_VERSION {
class DevicesFactoryHalHybrid : public DevicesFactoryHalInterface
{
public:
DevicesFactoryHalHybrid();
DevicesFactoryHalHybrid(sp<IDevicesFactory> hidlFactory);
// Opens a device with the specified name. To close the device, it is
// necessary to release references to the returned object.
@ -38,10 +41,6 @@ class DevicesFactoryHalHybrid : public DevicesFactoryHalInterface
sp<DevicesFactoryHalInterface> mHidlFactory;
};
sp<DevicesFactoryHalInterface> createDevicesFactoryHal() {
return new DevicesFactoryHalHybrid();
}
} // namespace CPP_VERSION
} // namespace android

@ -19,11 +19,12 @@
#include <cutils/native_handle.h>
#include "EffectsFactoryHalHidl.h"
#include "ConversionHelperHidl.h"
#include "EffectBufferHalHidl.h"
#include "EffectHalHidl.h"
#include "EffectsFactoryHalHidl.h"
#include "HidlUtils.h"
#include <libaudiohal/FactoryHalHidl.h>
using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils;
using ::android::hardware::Return;
@ -35,12 +36,10 @@ namespace CPP_VERSION {
using namespace ::android::hardware::audio::common::CPP_VERSION;
using namespace ::android::hardware::audio::effect::CPP_VERSION;
EffectsFactoryHalHidl::EffectsFactoryHalHidl() : ConversionHelperHidl("EffectsFactory") {
mEffectsFactory = IEffectsFactory::getService();
if (mEffectsFactory == 0) {
ALOGE("Failed to obtain IEffectsFactory service, terminating process.");
exit(1);
}
EffectsFactoryHalHidl::EffectsFactoryHalHidl(sp<IEffectsFactory> effectsFactory)
: ConversionHelperHidl("EffectsFactory") {
ALOG_ASSERT(effectsFactory != nullptr, "Provided IDevicesFactory service is NULL");
mEffectsFactory = effectsFactory;
}
status_t EffectsFactoryHalHidl::queryAllDescriptors() {
@ -147,4 +146,11 @@ status_t EffectsFactoryHalHidl::mirrorBuffer(void* external, size_t size,
} // namespace CPP_VERSION
} // namespace effect
template<>
sp<EffectsFactoryHalInterface> createFactoryHal<AudioHALVersion::CPP_VERSION>() {
auto service = hardware::audio::effect::CPP_VERSION::IEffectsFactory::getService();
return service ? new effect::CPP_VERSION::EffectsFactoryHalHidl(service) : nullptr;
}
} // namespace android

@ -18,7 +18,6 @@
#define ANDROID_HARDWARE_EFFECTS_FACTORY_HAL_HIDL_H
#include PATH(android/hardware/audio/effect/FILE_VERSION/IEffectsFactory.h)
#include PATH(android/hardware/audio/effect/FILE_VERSION/types.h)
#include <media/audiohal/EffectsFactoryHalInterface.h>
#include "ConversionHelperHidl.h"
@ -34,7 +33,7 @@ using namespace ::android::hardware::audio::effect::CPP_VERSION;
class EffectsFactoryHalHidl : public EffectsFactoryHalInterface, public ConversionHelperHidl
{
public:
EffectsFactoryHalHidl();
EffectsFactoryHalHidl(sp<IEffectsFactory> effectsFactory);
// Returns the number of different effects in all loaded libraries.
virtual status_t queryNumberEffects(uint32_t *pNumEffects);
@ -66,10 +65,6 @@ class EffectsFactoryHalHidl : public EffectsFactoryHalInterface, public Conversi
status_t queryAllDescriptors();
};
sp<EffectsFactoryHalInterface> createEffectsFactoryHal() {
return new EffectsFactoryHalHidl();
}
} // namespace CPP_VERSION
} // namespace effect
} // namespace android

@ -23,33 +23,43 @@
#include <media/audiohal/EffectsFactoryHalInterface.h>
#include <utils/StrongPointer.h>
namespace android {
#include <array>
#include <utility>
namespace effect {
namespace V2_0 {
sp<EffectsFactoryHalInterface> createEffectsFactoryHal();
} // namespace V2_0
namespace android {
namespace V4_0 {
sp<EffectsFactoryHalInterface> createEffectsFactoryHal();
} // namespace V4_0
/** Supported HAL versions, in order of preference.
* Implementation should use specialize the `create*FactoryHal` for their version.
* Client should use `createPreferedImpl<*FactoryHal>()` to instantiate
* the preferred available impl.
*/
enum class AudioHALVersion {
V6_0,
V5_0,
V4_0,
V2_0,
end, // used for iterating over supported versions
};
namespace V5_0 {
sp<EffectsFactoryHalInterface> createEffectsFactoryHal();
} // namespace V5_0
} // namespace effect
/** Template function to fully specialized for each version and each Interface. */
template <AudioHALVersion, class Interface>
sp<Interface> createFactoryHal();
namespace V2_0 {
sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
} // namespace V2_0
/** @Return the preferred available implementation or nullptr if none are available. */
template <class Interface, AudioHALVersion version = AudioHALVersion{}>
static sp<Interface> createPreferedImpl() {
if constexpr (version == AudioHALVersion::end) {
return nullptr; // tried all version, all returned nullptr
} else {
if (auto created = createFactoryHal<version, Interface>(); created != nullptr) {
return created;
}
namespace V4_0 {
sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
} // namespace V4_0
using Raw = std::underlying_type_t<AudioHALVersion>; // cast as enum class do not support ++
return createPreferedImpl<Interface, AudioHALVersion(Raw(version) + 1)>();
}
}
namespace V5_0 {
sp<DevicesFactoryHalInterface> createDevicesFactoryHal();
} // namespace V5_0
} // namespace android

Loading…
Cancel
Save