Loading system/bta/vc/vc.cc +17 −6 Original line number Diff line number Diff line Loading @@ -753,7 +753,7 @@ class VolumeControlImpl : public VolumeControl { devices_control_point_helper(op->devices_, op->opcode_, &(op->arguments_)); } void PrepareVolumeControlOperation(std::vector<RawAddress>& devices, void PrepareVolumeControlOperation(std::vector<RawAddress> devices, int group_id, bool is_autonomous, uint8_t opcode, std::vector<uint8_t>& arguments) { Loading @@ -764,11 +764,22 @@ class VolumeControlImpl : public VolumeControl { arguments.size()); if (std::find_if(ongoing_operations_.begin(), ongoing_operations_.end(), [opcode, &arguments](const VolumeOperation& op) { return (op.opcode_ == opcode) && std::equal(op.arguments_.begin(), op.arguments_.end(), arguments.begin()); [opcode, &devices, &arguments](const VolumeOperation& op) { if (op.opcode_ != opcode) return false; if (!std::equal(op.arguments_.begin(), op.arguments_.end(), arguments.begin())) return false; // Filter out all devices which have the exact operation // already scheduled devices.erase( std::remove_if(devices.begin(), devices.end(), [&op](auto d) { return find(op.devices_.begin(), op.devices_.end(), d) != op.devices_.end(); }), devices.end()); return devices.empty(); }) == ongoing_operations_.end()) { ongoing_operations_.emplace_back(latest_operation_id_++, group_id, is_autonomous, opcode, arguments, Loading system/bta/vc/vc_test.cc +17 −0 Original line number Diff line number Diff line Loading @@ -1087,6 +1087,23 @@ TEST_F(VolumeControlCsis, test_set_volume) { std::vector<uint8_t> value({0x03, 0x01, 0x02}); GetNotificationEvent(conn_id_1, test_address_1, 0x0021, value); GetNotificationEvent(conn_id_2, test_address_2, 0x0021, value); /* Verify exactly one operation with this exact value is queued for each * device */ EXPECT_CALL(gatt_queue, WriteCharacteristic(conn_id_1, 0x0024, _, GATT_WRITE, _, _)) .Times(1); EXPECT_CALL(gatt_queue, WriteCharacteristic(conn_id_2, 0x0024, _, GATT_WRITE, _, _)) .Times(1); VolumeControl::Get()->SetVolume(test_address_1, 20); VolumeControl::Get()->SetVolume(test_address_2, 20); VolumeControl::Get()->SetVolume(test_address_1, 20); VolumeControl::Get()->SetVolume(test_address_2, 20); std::vector<uint8_t> value2({20, 0x00, 0x03}); GetNotificationEvent(conn_id_1, test_address_1, 0x0021, value2); GetNotificationEvent(conn_id_2, test_address_2, 0x0021, value2); } TEST_F(VolumeControlCsis, test_set_volume_device_not_ready) { Loading Loading
system/bta/vc/vc.cc +17 −6 Original line number Diff line number Diff line Loading @@ -753,7 +753,7 @@ class VolumeControlImpl : public VolumeControl { devices_control_point_helper(op->devices_, op->opcode_, &(op->arguments_)); } void PrepareVolumeControlOperation(std::vector<RawAddress>& devices, void PrepareVolumeControlOperation(std::vector<RawAddress> devices, int group_id, bool is_autonomous, uint8_t opcode, std::vector<uint8_t>& arguments) { Loading @@ -764,11 +764,22 @@ class VolumeControlImpl : public VolumeControl { arguments.size()); if (std::find_if(ongoing_operations_.begin(), ongoing_operations_.end(), [opcode, &arguments](const VolumeOperation& op) { return (op.opcode_ == opcode) && std::equal(op.arguments_.begin(), op.arguments_.end(), arguments.begin()); [opcode, &devices, &arguments](const VolumeOperation& op) { if (op.opcode_ != opcode) return false; if (!std::equal(op.arguments_.begin(), op.arguments_.end(), arguments.begin())) return false; // Filter out all devices which have the exact operation // already scheduled devices.erase( std::remove_if(devices.begin(), devices.end(), [&op](auto d) { return find(op.devices_.begin(), op.devices_.end(), d) != op.devices_.end(); }), devices.end()); return devices.empty(); }) == ongoing_operations_.end()) { ongoing_operations_.emplace_back(latest_operation_id_++, group_id, is_autonomous, opcode, arguments, Loading
system/bta/vc/vc_test.cc +17 −0 Original line number Diff line number Diff line Loading @@ -1087,6 +1087,23 @@ TEST_F(VolumeControlCsis, test_set_volume) { std::vector<uint8_t> value({0x03, 0x01, 0x02}); GetNotificationEvent(conn_id_1, test_address_1, 0x0021, value); GetNotificationEvent(conn_id_2, test_address_2, 0x0021, value); /* Verify exactly one operation with this exact value is queued for each * device */ EXPECT_CALL(gatt_queue, WriteCharacteristic(conn_id_1, 0x0024, _, GATT_WRITE, _, _)) .Times(1); EXPECT_CALL(gatt_queue, WriteCharacteristic(conn_id_2, 0x0024, _, GATT_WRITE, _, _)) .Times(1); VolumeControl::Get()->SetVolume(test_address_1, 20); VolumeControl::Get()->SetVolume(test_address_2, 20); VolumeControl::Get()->SetVolume(test_address_1, 20); VolumeControl::Get()->SetVolume(test_address_2, 20); std::vector<uint8_t> value2({20, 0x00, 0x03}); GetNotificationEvent(conn_id_1, test_address_1, 0x0021, value2); GetNotificationEvent(conn_id_2, test_address_2, 0x0021, value2); } TEST_F(VolumeControlCsis, test_set_volume_device_not_ready) { Loading