Skip to content

Commit e757a30

Browse files
committed
[fromtree] tests: bluetooth: tester: Fix VCS tests
Zephyr automatically sets the persisted flag for VCS if the volume is changed after the service is registered. As some of these PTS tests require a set volume with the flag cleared, the initial volume needs to be set before registering VCS. (cherry picked from commit 48f82d1) Signed-off-by: Frode van der Meeren <[email protected]>
1 parent 6150e07 commit e757a30

File tree

5 files changed

+84
-21
lines changed

5 files changed

+84
-21
lines changed

tests/bluetooth/tester/src/audio/btp/btp_vcs.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88

99
#include <stdint.h>
1010

11+
#define BTP_VCS_REGISTER_FLAG_MUTED BIT(0)
12+
1113
#define BTP_VCS_READ_SUPPORTED_COMMANDS 0x01
1214
struct btp_vcs_read_supported_commands_rp {
1315
uint8_t data[0];
@@ -22,3 +24,10 @@ struct btp_vcs_set_vol_cmd {
2224
#define BTP_VCS_VOL_DOWN 0x04
2325
#define BTP_VCS_MUTE 0x05
2426
#define BTP_VCS_UNMUTE 0x06
27+
28+
#define BTP_VCS_REGISTER 0x07
29+
struct btp_vcs_register_cmd {
30+
uint8_t step;
31+
uint8_t flags;
32+
uint8_t volume;
33+
} __packed;

tests/bluetooth/tester/src/audio/btp_vcp.c

Lines changed: 51 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,43 @@ static uint8_t unmute(const void *cmd, uint16_t cmd_len,
140140
return BTP_STATUS_SUCCESS;
141141
}
142142

143+
static void set_register_params(uint8_t gain_mode, uint8_t step,
144+
bool muted, uint8_t volume);
145+
146+
static uint8_t register_vcs(const void *cmd, uint16_t cmd_len,
147+
void *rsp, uint16_t *rsp_len)
148+
{
149+
static bool vcs_registered_flag;
150+
const struct btp_vcs_register_cmd *cp = cmd;
151+
int err;
152+
153+
LOG_DBG("Registering VCS");
154+
155+
if (vcs_registered_flag) {
156+
return BTP_STATUS_FAILED;
157+
}
158+
159+
bool muted = (cp->flags & BTP_VCS_REGISTER_FLAG_MUTED) != 0;
160+
161+
set_register_params(BT_AICS_MODE_MANUAL, cp->step, muted, cp->volume);
162+
163+
err = bt_vcp_vol_rend_register(&vcp_register_param);
164+
if (err != 0) {
165+
return BTP_STATUS_FAILED;
166+
}
167+
168+
err = bt_vcp_vol_rend_included_get(&included);
169+
if (err != 0) {
170+
return BTP_STATUS_FAILED;
171+
}
172+
173+
aics_server_instance.aics_cnt = included.aics_cnt;
174+
aics_server_instance.aics = included.aics;
175+
vcs_registered_flag = true;
176+
177+
return BTP_STATUS_SUCCESS;
178+
}
179+
143180
static void vcs_state_cb(struct bt_conn *conn, int err, uint8_t volume, uint8_t mute)
144181
{
145182
LOG_DBG("VCP state cb err (%d)", err);
@@ -187,6 +224,11 @@ static const struct btp_handler vcs_handlers[] = {
187224
.expect_len = 0,
188225
.func = unmute,
189226
},
227+
{
228+
.opcode = BTP_VCS_REGISTER,
229+
.expect_len = sizeof(struct btp_vcs_register_cmd),
230+
.func = register_vcs,
231+
},
190232
};
191233

192234
/* Volume Offset Control Service */
@@ -463,7 +505,8 @@ struct bt_aics_cb aics_server_cb = {
463505
};
464506

465507
/* General profile handling */
466-
static void set_register_params(uint8_t gain_mode)
508+
static void set_register_params(uint8_t gain_mode, uint8_t step,
509+
bool muted, uint8_t volume)
467510
{
468511
char input_desc[CONFIG_BT_VCP_VOL_REND_AICS_INSTANCE_COUNT]
469512
[BT_AICS_MAX_INPUT_DESCRIPTION_SIZE];
@@ -495,31 +538,18 @@ static void set_register_params(uint8_t gain_mode)
495538
vcp_register_param.aics_param[i].cb = &aics_server_cb;
496539
}
497540

498-
vcp_register_param.step = 1;
499-
vcp_register_param.mute = BT_VCP_STATE_UNMUTED;
500-
vcp_register_param.volume = 100;
541+
vcp_register_param.step = step;
542+
if (muted) {
543+
vcp_register_param.mute = BT_VCP_STATE_MUTED;
544+
} else {
545+
vcp_register_param.mute = BT_VCP_STATE_UNMUTED;
546+
}
547+
vcp_register_param.volume = volume;
501548
vcp_register_param.cb = &vcs_cb;
502549
}
503550

504551
uint8_t tester_init_vcs(void)
505552
{
506-
int err;
507-
508-
set_register_params(BT_AICS_MODE_MANUAL);
509-
510-
err = bt_vcp_vol_rend_register(&vcp_register_param);
511-
if (err) {
512-
return BTP_STATUS_FAILED;
513-
}
514-
515-
err = bt_vcp_vol_rend_included_get(&included);
516-
if (err) {
517-
return BTP_STATUS_FAILED;
518-
}
519-
520-
aics_server_instance.aics_cnt = included.aics_cnt;
521-
aics_server_instance.aics = included.aics;
522-
523553
tester_register_command_handlers(BTP_SERVICE_ID_VCS, vcs_handlers,
524554
ARRAY_SIZE(vcs_handlers));
525555

tests/bsim/bluetooth/tester/src/audio/vcp_peripheral.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ static void test_vcp_peripheral(void)
3535
bsim_btp_core_register(BTP_SERVICE_ID_AICS);
3636

3737
bsim_btp_gap_set_discoverable(BTP_GAP_GENERAL_DISCOVERABLE);
38+
bsim_btp_vcs_register(1U, 0U, 100U);
3839
bsim_btp_gap_start_advertising(0U, 0U, NULL, BT_HCI_OWN_ADDR_PUBLIC);
3940
bsim_btp_wait_for_gap_device_connected(&remote_addr);
4041
bt_addr_le_to_str(&remote_addr, addr_str, sizeof(addr_str));

tests/bsim/bluetooth/tester/src/bsim_btp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -873,6 +873,8 @@ static bool is_valid_vcs_packet_len(const struct btp_hdr *hdr, struct net_buf_si
873873
return buf_simple->len == 0U;
874874
case BTP_VCS_UNMUTE:
875875
return buf_simple->len == 0U;
876+
case BTP_VCS_REGISTER:
877+
return buf_simple->len == 0U;
876878

877879
/* no events */
878880
default:

tests/bsim/bluetooth/tester/src/bsim_btp.h

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -563,6 +563,27 @@ static inline void bsim_btp_wait_for_tmap_discovery_complete(void)
563563
net_buf_unref(buf);
564564
}
565565

566+
static inline void bsim_btp_vcs_register(uint8_t step, uint8_t flags, uint8_t vol)
567+
{
568+
struct btp_vcs_register_cmd *cmd;
569+
struct btp_hdr *cmd_hdr;
570+
571+
NET_BUF_SIMPLE_DEFINE(cmd_buffer, BTP_MTU);
572+
573+
cmd_hdr = net_buf_simple_add(&cmd_buffer, sizeof(*cmd_hdr));
574+
cmd_hdr->service = BTP_SERVICE_ID_VCS;
575+
cmd_hdr->opcode = BTP_VCS_REGISTER;
576+
cmd_hdr->index = BTP_INDEX;
577+
cmd = net_buf_simple_add(&cmd_buffer, sizeof(*cmd));
578+
cmd->step = step;
579+
cmd->flags = flags;
580+
cmd->volume = vol;
581+
582+
cmd_hdr->len = sys_cpu_to_le16(cmd_buffer.len - sizeof(*cmd_hdr));
583+
584+
bsim_btp_send_to_tester(cmd_buffer.data, cmd_buffer.len);
585+
}
586+
566587
static inline void bsim_btp_vcp_discover(const bt_addr_le_t *address)
567588
{
568589
struct btp_vcp_discover_cmd *cmd;

0 commit comments

Comments
 (0)