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

Commit f764d05c authored by Andy Hung's avatar Andy Hung Committed by Android (Google) Code Review
Browse files

Merge "MediaMetrics: Accept elided second argument in string pair" into main

parents 8ceb9133 c04a820d
Loading
Loading
Loading
Loading
+16 −12
Original line number Diff line number Diff line
@@ -338,28 +338,32 @@ std::string IAfThreadBase::formatToString(audio_format_t format) {
// under  #ifdef __cplusplus #endif
static std::string patchSinksToString(const struct audio_patch *patch)
{
    std::stringstream ss;
    std::string s;
    for (size_t i = 0; i < patch->num_sinks; ++i) {
        if (i > 0) {
            ss << "|";
        if (i > 0) s.append("|");
        if (patch->sinks[i].ext.device.address[0]) {
            s.append("(").append(toString(patch->sinks[i].ext.device.type))
                    .append(", ").append(patch->sinks[i].ext.device.address).append(")");
        } else {
            s.append(toString(patch->sinks[i].ext.device.type));
        }
        ss << "(" << toString(patch->sinks[i].ext.device.type)
            << ", " << patch->sinks[i].ext.device.address << ")";
    }
    return ss.str();
    return s;
}

static std::string patchSourcesToString(const struct audio_patch *patch)
{
    std::stringstream ss;
    std::string s;
    for (size_t i = 0; i < patch->num_sources; ++i) {
        if (i > 0) {
            ss << "|";
        if (i > 0) s.append("|");
        if (patch->sources[i].ext.device.address[0]) {
            s.append("(").append(toString(patch->sources[i].ext.device.type))
                    .append(", ").append(patch->sources[i].ext.device.address).append(")");
        } else {
            s.append(toString(patch->sources[i].ext.device.type));
        }
        ss << "(" << toString(patch->sources[i].ext.device.type)
            << ", " << patch->sources[i].ext.device.address << ")";
    }
    return ss.str();
    return s;
}

static std::string toString(audio_latency_mode_t mode) {
+27 −20
Original line number Diff line number Diff line
@@ -80,33 +80,40 @@ std::vector<std::pair<std::string, std::string>> getDeviceAddressPairs(const std
{
    std::vector<std::pair<std::string, std::string>> result;

    // Currently, the device format is EXACTLY
    // (device1, addr1)|(device2, addr2)|...
    // Currently, the device format is
    //
    // devices = device_addr OR device_addr|devices
    // device_addr = device OR (device, addr)
    //
    // EXAMPLE:
    // device1|(device2, addr2)|...

    static constexpr char delim[] = "()|,";
    for (auto it = devices.begin(); ; ) {
        std::string address;
        std::string device = tokenizer(it, devices.end(), delim);
        if (device.empty()) return result;
        if (device == "(") {  // it is a pair otherwise we consider it a device
            device = tokenizer(it, devices.end(), delim); // get actual device
            auto token = tokenizer(it, devices.end(), delim);
        if (token != "(") return result;

        auto device = tokenizer(it, devices.end(), delim);
        if (device.empty() || !std::isalnum(device[0])) return result;

        token = tokenizer(it, devices.end(), delim);
        if (token != ",") return result;
            if (token != ",") return result;  // malformed, must have a comma

            // special handling here for empty addresses
        auto address = tokenizer(it, devices.end(), delim);
        if (address.empty() || !std::isalnum(device[0])) return result;
            address = tokenizer(it, devices.end(), delim);
            if (address.empty()) return result;
            if (address == ")") {  // no address, just the ")"
                address.clear();
            } else {
                token = tokenizer(it, devices.end(), delim);
                if (token != ")") return result;
            }
        }
        // misaligned token, device must start alphanumeric.
        if (!std::isalnum(device[0])) return result;

        result.emplace_back(std::move(device), std::move(address));

        token = tokenizer(it, devices.end(), delim);
        auto token = tokenizer(it, devices.end(), delim);
        if (token != "|") return result;  // this includes end of string detection
    }
}
+25 −0
Original line number Diff line number Diff line
@@ -963,6 +963,31 @@ TEST(mediametrics_tests, device_parsing) {
    ASSERT_EQ("B", devaddr[0].second);
    ASSERT_EQ("C", devaddr[1].first);
    ASSERT_EQ("D2", devaddr[1].second);

    devaddr = android::mediametrics::stringutils::getDeviceAddressPairs(
            " Z  ");
    ASSERT_EQ((size_t)1, devaddr.size());
    ASSERT_EQ("Z", devaddr[0].first);

    devaddr = android::mediametrics::stringutils::getDeviceAddressPairs(
            "  A | B|C  ");
    ASSERT_EQ((size_t)3, devaddr.size());
    ASSERT_EQ("A", devaddr[0].first);
    ASSERT_EQ("", devaddr[0].second);
    ASSERT_EQ("B", devaddr[1].first);
    ASSERT_EQ("", devaddr[1].second);
    ASSERT_EQ("C", devaddr[2].first);
    ASSERT_EQ("", devaddr[2].second);

    devaddr = android::mediametrics::stringutils::getDeviceAddressPairs(
            "  A | (B1, 10) |C  ");
    ASSERT_EQ((size_t)3, devaddr.size());
    ASSERT_EQ("A", devaddr[0].first);
    ASSERT_EQ("", devaddr[0].second);
    ASSERT_EQ("B1", devaddr[1].first);
    ASSERT_EQ("10", devaddr[1].second);
    ASSERT_EQ("C", devaddr[2].first);
    ASSERT_EQ("", devaddr[2].second);
}

TEST(mediametrics_tests, timed_action) {