TWS声道切换说明
📎 原始文档:https://www.kdocs.cn/l/cjGjGFsUlqjp TWS声道切换说明
TWS音频流程介绍
- 单声道流程(对应流程框图: 单声道和单声道Pro)
- TWS L播放左声道,TWS R播放右声道
- 只有单箱播放 (L+R)/2
- 立体声流程(对应流程框图: 立体声和立体声Pro)
- TWS L和 TWS R都是播放立体声
在TWS连接成功时会获取当前声道并存储。
立体声对箱区分左右声道方法
如果在双声道的情况下要自己设置主机和从机的声道区分左右输出,可以手动改,下面给一个例子:
①首先在需要的音频流中加入一个STereoMix节点
②打开TCFG_TWS_DUAL_CHANNEL使能
③自己设置一个声道切换的函数,通过tws_api_set_local_channel(channel)切换声道,然后使用 a2dp_player_update_steromix_param(struct a2dp_player *player, int channel)函数去设置STereoMix节点的参数
u8 tws_channel_cnt = 0; // 初始化计数为0
/**
* @brief 切换TWS通道模式并打印当前主从机声道类型
* @param mode 0: 主左从右 1: 主右从左 2: Party混合(单声道)
* @note 需在主从机都调用本函数,或主机同步调用从机
*/
void tws_channel_switch(int mode)
{
struct a2dp_player *g_a2dp_player = NULL;
struct a2dp_player *player = g_a2dp_player;
char channel = 'L';
const char *role_str = (tws_api_get_role() == TWS_ROLE_MASTER) ? "主机" : "从机";
switch (mode) {
case 0: // 主左从右
channel = (tws_api_get_role() == TWS_ROLE_MASTER) ? 'L' : 'R';
break;
case 1: // 主右从左
channel = (tws_api_get_role() == TWS_ROLE_MASTER) ? 'R' : 'L';
break;
case 2: // Party混合(单声道)
channel = 'M'; // 'M' 代表混合/单声道,需确保音频输出支持
break;
default:
return;
}
tws_api_set_local_channel(channel);
if(channel == 'L'){
a2dp_player_update_steromix_param(g_a2dp_player, AUDIO_CH_L);
}
else if(channel == 'R'){
a2dp_player_update_steromix_param(g_a2dp_player, AUDIO_CH_R);
}
else if(channel == 'M'){
a2dp_player_update_steromix_param(g_a2dp_player, AUDIO_CH_MIX);
}
// 打印当前主从机声道类型
switch (channel) {
case 'L':
printf("[%s] 当前声道: 左声道\n", role_str);
break;
case 'R':
printf("[%s] 当前声道: 右声道\n", role_str);
break;
case 'M':
printf("[%s] 当前声道: Party混合(单声道)\n", role_str);
break;
default:
printf("[%s] 当前声道: 未知类型(%c)\n", role_str, channel);
break;
}
}
④a2dp_player_update_steromix_param(struct a2dp_player *player, int channel)函数按照下入修改,jlstream_set_node_param的第二个参数为音频流节点的名称: