Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b47fd661 authored by android-build-team Robot's avatar android-build-team Robot
Browse files

Snap for 7249665 from 8bf5ab87 to sc-v2-release

Change-Id: I6110cab5c23b7ed81cc1d3e2d8cd4203ced24ac3
parents bd7e3886 8bf5ab87
Loading
Loading
Loading
Loading
+30 −24
Original line number Diff line number Diff line
@@ -25,8 +25,6 @@

#include "util/EffectUtils.h"

#define ARRAY_SIZE(a) (sizeof(a) / sizeof(*(a)))

using ::android::hardware::audio::common::CPP_VERSION::implementation::HidlUtils;
using ::android::hardware::audio::common::CPP_VERSION::implementation::UuidUtils;
using ::android::hardware::audio::common::utils::EnumBitfield;
@@ -154,6 +152,29 @@ status_t EffectUtils::effectConfigToHal(const EffectConfig& config, effect_confi
    return result;
}

template <std::size_t N>
inline hidl_string charBufferFromHal(const char (&halBuf)[N]) {
    // Even if the original field contains a non-terminated string, hidl_string
    // adds a NUL terminator.
    return hidl_string(halBuf, strnlen(halBuf, N));
}

template <std::size_t N>
inline status_t charBufferToHal(const hidl_string& str, char (&halBuf)[N], const char* fieldName) {
    static_assert(N > 0);
    const size_t halBufChars = N - 1;  // Reserve one character for terminating NUL.
    status_t result = NO_ERROR;
    size_t strSize = str.size();
    if (strSize > halBufChars) {
        ALOGE("%s is too long: %zu (%zu max)", fieldName, strSize, halBufChars);
        strSize = halBufChars;
        result = BAD_VALUE;
    }
    strncpy(halBuf, str.c_str(), strSize);
    halBuf[strSize] = '\0';
    return result;
}

status_t EffectUtils::effectDescriptorFromHal(const effect_descriptor_t& halDescriptor,
                                              EffectDescriptor* descriptor) {
    UuidUtils::uuidFromHal(halDescriptor.type, &descriptor->type);
@@ -166,9 +187,8 @@ status_t EffectUtils::effectDescriptorFromHal(const effect_descriptor_t& halDesc
    memcpy(descriptor->implementor.data(), halDescriptor.implementor,
           descriptor->implementor.size());
#else
    descriptor->name = hidl_string(halDescriptor.name, ARRAY_SIZE(halDescriptor.name));
    descriptor->implementor =
            hidl_string(halDescriptor.implementor, ARRAY_SIZE(halDescriptor.implementor));
    descriptor->name = charBufferFromHal(halDescriptor.name);
    descriptor->implementor = charBufferFromHal(halDescriptor.implementor);
#endif
    return NO_ERROR;
}
@@ -186,25 +206,11 @@ status_t EffectUtils::effectDescriptorToHal(const EffectDescriptor& descriptor,
    memcpy(halDescriptor->implementor, descriptor.implementor.data(),
           descriptor.implementor.size());
#else
    // According to 'dumpEffectDescriptor' 'name' and 'implementor' must be NUL-terminated.
    size_t nameSize = descriptor.name.size();
    if (nameSize >= ARRAY_SIZE(halDescriptor->name)) {
        ALOGE("effect name is too long: %zu (%zu max)", nameSize,
              ARRAY_SIZE(halDescriptor->name) - 1);
        nameSize = ARRAY_SIZE(halDescriptor->name) - 1;
        result = BAD_VALUE;
    }
    strncpy(halDescriptor->name, descriptor.name.c_str(), nameSize);
    halDescriptor->name[nameSize] = '\0';
    size_t implementorSize = descriptor.implementor.size();
    if (implementorSize >= ARRAY_SIZE(halDescriptor->implementor)) {
        ALOGE("effect implementor is too long: %zu (%zu max)", implementorSize,
              ARRAY_SIZE(halDescriptor->implementor) - 1);
        implementorSize = ARRAY_SIZE(halDescriptor->implementor) - 1;
        result = BAD_VALUE;
    }
    strncpy(halDescriptor->implementor, descriptor.implementor.c_str(), implementorSize);
    halDescriptor->implementor[implementorSize] = '\0';
    // According to 'dumpEffectDescriptor', 'name' and 'implementor' must be NUL-terminated.
    CONVERT_CHECKED(charBufferToHal(descriptor.name, halDescriptor->name, "effect name"), result);
    CONVERT_CHECKED(charBufferToHal(descriptor.implementor, halDescriptor->implementor,
                                    "effect implementor"),
                    result);
#endif
    return result;
}
+17 −0
Original line number Diff line number Diff line
@@ -154,3 +154,20 @@ TEST(EffectUtils, ConvertDescriptor) {
    EXPECT_EQ(NO_ERROR, EffectUtils::effectDescriptorFromHal(halDesc, &descBack));
    EXPECT_EQ(desc, descBack);
}

TEST(EffectUtils, ConvertNameAndImplementor) {
    for (size_t i = 0; i < EFFECT_STRING_LEN_MAX; ++i) {
        effect_descriptor_t halDesc{};
        for (size_t c = 0; c < i; ++c) {  // '<' to accommodate NUL terminator.
            halDesc.name[c] = halDesc.implementor[c] = 'A' + static_cast<char>(c);
        }
        EffectDescriptor desc;
        EXPECT_EQ(NO_ERROR, EffectUtils::effectDescriptorFromHal(halDesc, &desc));
        effect_descriptor_t halDescBack;
        EXPECT_EQ(NO_ERROR, EffectUtils::effectDescriptorToHal(desc, &halDescBack));
        EXPECT_EQ(i, strlen(halDescBack.name));
        EXPECT_EQ(i, strlen(halDescBack.implementor));
        EXPECT_EQ(0, strcmp(halDesc.name, halDescBack.name));
        EXPECT_EQ(0, strcmp(halDesc.implementor, halDescBack.implementor));
    }
}
+1 −4
Original line number Diff line number Diff line
@@ -27,10 +27,8 @@ cc_binary {
    init_rc: ["audiocontrol-default.rc"],
    vintf_fragments: ["audiocontrol-default.xml"],
    vendor: true,
    generated_headers: ["audio_policy_configuration_V7_0"],
    generated_sources: ["audio_policy_configuration_V7_0"],
    header_libs: ["libxsdc-utils"],
    shared_libs: [
        "android.hardware.audio.common@7.0-enums",
        "android.frameworks.automotive.powerpolicy-V1-ndk_platform",
        "android.hardware.automotive.audiocontrol-V1-ndk_platform",
        "libbase",
@@ -38,7 +36,6 @@ cc_binary {
        "libcutils",
        "liblog",
        "libpowerpolicyclient",
        "libxml2",
    ],
    srcs: [
        "AudioControl.cpp",
+14 −8
Original line number Diff line number Diff line
@@ -14,6 +14,9 @@
 * limitations under the License.
 */

#define LOG_TAG "AudioControl"
// #define LOG_NDEBUG 0

#include "AudioControl.h"

#include <aidl/android/hardware/automotive/audiocontrol/AudioFocusChange.h>
@@ -24,7 +27,7 @@
#include <android-base/parseint.h>
#include <android-base/strings.h>

#include <android_audio_policy_configuration_V7_0.h>
#include <android_audio_policy_configuration_V7_0-enums.h>
#include <private/android_filesystem_config.h>

#include <stdio.h>
@@ -33,6 +36,7 @@ namespace aidl::android::hardware::automotive::audiocontrol {

using ::android::base::EqualsIgnoreCase;
using ::android::base::ParseInt;
using ::std::shared_ptr;
using ::std::string;

namespace xsd {
@@ -68,7 +72,7 @@ ndk::ScopedAStatus AudioControl::registerFocusListener(
        const shared_ptr<IFocusListener>& in_listener) {
    LOG(DEBUG) << "registering focus listener";

    if (in_listener.get()) {
    if (in_listener) {
        std::atomic_store(&mFocusListener, in_listener);
    } else {
        LOG(ERROR) << "Unexpected nullptr for listener resulting in no-op.";
@@ -80,9 +84,10 @@ ndk::ScopedAStatus AudioControl::setBalanceTowardRight(float value) {
    if (isValidValue(value)) {
        // Just log in this default mock implementation
        LOG(INFO) << "Balance set to " << value;
    } else {
        LOG(ERROR) << "Balance value out of range -1 to 1 at " << value;
        return ndk::ScopedAStatus::ok();
    }

    LOG(ERROR) << "Balance value out of range -1 to 1 at " << value;
    return ndk::ScopedAStatus::ok();
}

@@ -90,9 +95,10 @@ ndk::ScopedAStatus AudioControl::setFadeTowardFront(float value) {
    if (isValidValue(value)) {
        // Just log in this default mock implementation
        LOG(INFO) << "Fader set to " << value;
    } else {
        LOG(ERROR) << "Fader value out of range -1 to 1 at " << value;
        return ndk::ScopedAStatus::ok();
    }

    LOG(ERROR) << "Fader value out of range -1 to 1 at " << value;
    return ndk::ScopedAStatus::ok();
}

@@ -194,7 +200,7 @@ binder_status_t AudioControl::cmdRequestFocus(int fd, const char** args, uint32_
    }

    string usage = string(args[1]);
    if (xsd::stringToAudioUsage(usage) == xsd::AudioUsage::UNKNOWN) {
    if (xsd::isUnknownAudioUsage(usage)) {
        dprintf(fd,
                "Unknown usage provided: %s. Please see audio_policy_configuration.xsd V7_0 "
                "for supported values\n",
@@ -236,7 +242,7 @@ binder_status_t AudioControl::cmdAbandonFocus(int fd, const char** args, uint32_
    }

    string usage = string(args[1]);
    if (xsd::stringToAudioUsage(usage) == xsd::AudioUsage::UNKNOWN) {
    if (xsd::isUnknownAudioUsage(usage)) {
        dprintf(fd,
                "Unknown usage provided: %s. Please see audio_policy_configuration.xsd V7_0 "
                "for supported values\n",
+2 −4
Original line number Diff line number Diff line
@@ -23,8 +23,6 @@

namespace aidl::android::hardware::automotive::audiocontrol {

using ::std::shared_ptr;

class AudioControl : public BnAudioControl {
  public:
    ndk::ScopedAStatus onAudioFocusChange(const std::string& in_usage, int32_t in_zoneId,
@@ -34,7 +32,7 @@ class AudioControl : public BnAudioControl {
    ndk::ScopedAStatus onDevicesToMuteChange(
            const std::vector<MutingInfo>& in_mutingInfos) override;
    ndk::ScopedAStatus registerFocusListener(
            const shared_ptr<IFocusListener>& in_listener) override;
            const std::shared_ptr<IFocusListener>& in_listener) override;
    ndk::ScopedAStatus setBalanceTowardRight(float in_value) override;
    ndk::ScopedAStatus setFadeTowardFront(float in_value) override;
    binder_status_t dump(int fd, const char** args, uint32_t numArgs) override;
@@ -44,7 +42,7 @@ class AudioControl : public BnAudioControl {
    // a single instance of CarAudioService. As such, it doesn't have explicit serialization.
    // If a different AudioControl implementation were to have multiple threads leveraging this
    // listener, then it should also include mutexes or make the listener atomic.
    shared_ptr<IFocusListener> mFocusListener;
    std::shared_ptr<IFocusListener> mFocusListener;

    binder_status_t cmdHelp(int fd) const;
    binder_status_t cmdRequestFocus(int fd, const char** args, uint32_t numArgs);
Loading