Files
2025-12-03 11:12:34 +08:00

307 lines
8.3 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".pc_spk_player.data.bss")
#pragma data_seg(".pc_spk_player.data")
#pragma const_seg(".pc_spk_player.text.const")
#pragma code_seg(".pc_spk_player.text")
#endif
#include "jlstream.h"
#include "sdk_config.h"
#include "system/timer.h"
#include "system/includes.h"
#include "pc_spk_player.h"
#include "pc_spk_file.h"
#include "app_config.h"
#include "app_main.h"
#include "effects/audio_pitchspeed.h"
#include "effect/effects_default_param.h"
#include "audio_config.h"
#include "scene_switch.h"
#include "uac_stream.h"
#include "audio_cvp.h"
#if (LEA_BIG_CTRLER_TX_EN || LEA_BIG_CTRLER_RX_EN)
#include "le_broadcast.h"
#include "app_le_broadcast.h"
#endif
#if (TCFG_LE_AUDIO_APP_CONFIG & (LE_AUDIO_AURACAST_SOURCE_EN | LE_AUDIO_AURACAST_SINK_EN))
#include "app_le_auracast.h"
#endif
#define LOG_TAG_CONST USB
#define LOG_TAG "[pcspk]"
#define LOG_ERROR_ENABLE
#define LOG_DEBUG_ENABLE
/* #define LOG_INFO_ENABLE */
/* #define LOG_DUMP_ENABLE */
#define LOG_CLI_ENABLE
#include "debug.h"
#if TCFG_USB_SLAVE_AUDIO_SPK_ENABLE
typedef enum {
PC_SPK_STA_CLOSE,
PC_SPK_STA_WAIT_CLOSE,
PC_SPK_STA_OPEN,
PC_SPK_STA_WAIT_OPEN,
} pc_spk_state_t;
pc_spk_state_t g_pc_spk_state;
struct pc_spk_player {
struct jlstream *stream;
s8 pc_spk_pitch_mode;
};
static struct pc_spk_player *g_pc_spk_player = NULL;
extern void dac_try_power_on_task_delete();
static void pc_spk_player_callback(void *private_data, int event)
{
struct pc_spk_player *player = g_pc_spk_player;
struct jlstream *stream = (struct jlstream *)private_data;
switch (event) {
case STREAM_EVENT_START:
#if TCFG_AUDIO_CVP_OUTPUT_WAY_IIS_ENABLE && (defined TCFG_IIS_NODE_ENABLE)
//先开pc mic,后开spk,需要取消忽略外部数据,重启aec
if (audio_aec_status()) {
audio_aec_reboot(0);
audio_cvp_ref_data_align_reset();
}
#endif
if (app_get_current_mode()->name == APP_MODE_PC) {
s16 cur_vol = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
u16 l_vol = 0, r_vol = 0;
uac_speaker_stream_get_volume(&l_vol, &r_vol);
if (cur_vol != (r_vol + l_vol) / 2) {
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, (r_vol + l_vol) / 2, 1);
}
}
#if TCFG_VOCAL_REMOVER_NODE_ENABLE
musci_vocal_remover_update_parm();
#endif
break;
}
}
/*
* @description: 打开 pc spk 数据流
* @return0 - 成功。其它值失败
* @node:
*/
int pc_spk_player_open(void)
{
u32 rets_addr;
__asm__ volatile("%0 = rets ;" : "=r"(rets_addr));
int err = 0;
struct pc_spk_player *player = NULL;;
if (g_pc_spk_player || !app_in_mode(APP_MODE_PC)) {
return 0;
}
u16 uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"pc_spk");
if (uuid == 0) {
return -EFAULT;
}
player = zalloc(sizeof(*player));
if (!player) {
return -ENOMEM;
}
player->pc_spk_pitch_mode = PITCH_0;
player->stream = jlstream_pipeline_parse(uuid, NODE_UUID_PC_SPK);
if (!player->stream) {
err = -ENOMEM;
goto __exit0;
}
u16 l_vol = 0, r_vol = 0;
uac_speaker_stream_get_volume(&l_vol, &r_vol);
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, (r_vol + l_vol) / 2, 1);
jlstream_node_ioctl(player->stream, NODE_UUID_SOURCE, NODE_IOC_SET_PRIV_FMT, 192);
jlstream_set_callback(player->stream, player->stream, pc_spk_player_callback);
jlstream_set_scene(player->stream, STREAM_SCENE_PC_SPK);
err = jlstream_start(player->stream);
if (err) {
goto __exit1;
} else {
dac_try_power_on_task_delete();
}
g_pc_spk_state = PC_SPK_STA_OPEN;
g_pc_spk_player = player;
return 0;
__exit1:
jlstream_release(player->stream);
__exit0:
free(player);
return err;
}
// 返回1说明player 在运行
bool pc_spk_player_runing()
{
return g_pc_spk_player != NULL;
}
/*
* @description: 关闭spk 数据流
* @return
* @node:
*/
void pc_spk_player_close(void)
{
struct pc_spk_player *player = g_pc_spk_player;
if (!player) {
if (g_pc_spk_state == PC_SPK_STA_WAIT_OPEN || g_pc_spk_state == PC_SPK_STA_OPEN) {
//可能在切到其它模式瞬间有spk音频起来,打开spk采用的是信号量方式打开,导致关闭spk的动作比打开的动作更提前
log_debug("err, [%s], player_wait_open_flag:1!\n", __func__);
pcspk_close_player_by_taskq();
}
return;
}
#if 0//pc + bt 通过mixer叠加的环境, 因usbrx已经停止,无法驱动数据流。需手动提前将当前的mixer ch关闭
struct mixer_ch_pause pause = {0};
pause.ch_idx = 7;
jlstream_set_node_param(NODE_UUID_MIXER, "MIXER27", &pause, sizeof(pause));
#endif
jlstream_stop(player->stream, 0);
jlstream_release(player->stream);
free(player);
player = NULL;
g_pc_spk_player = NULL;
#if TCFG_AUDIO_CVP_OUTPUT_WAY_IIS_ENABLE && (defined TCFG_IIS_NODE_ENABLE)
if (audio_aec_status()) {
//忽略参考数据
audio_cvp_ioctl(CVP_OUTWAY_REF_IGNORE, 1, NULL);
audio_cvp_ref_data_align_reset();
}
#endif
jlstream_event_notify(STREAM_EVENT_CLOSE_PLAYER, (int)"pc_spk");
g_pc_spk_state = PC_SPK_STA_CLOSE;
}
static void pc_spk_player_restert(void)
{
#if (LEA_BIG_CTRLER_TX_EN || LEA_BIG_CTRLER_RX_EN)
if (!get_broadcast_role()) {
if (g_pc_spk_state == PC_SPK_STA_OPEN) {
pc_spk_player_close();
pc_spk_player_open();
}
} else { //广播模式则重启广播数据流
le_audio_scene_deal(LE_AUDIO_MUSIC_STOP);
le_audio_scene_deal(LE_AUDIO_MUSIC_START);
}
#elif (TCFG_LE_AUDIO_APP_CONFIG & (LE_AUDIO_AURACAST_SOURCE_EN | LE_AUDIO_AURACAST_SINK_EN))
if (!get_auracast_role()) {
if (g_pc_spk_state == PC_SPK_STA_OPEN) {
pc_spk_player_close();
pc_spk_player_open();
}
} else { //广播模式则重启广播数据流
le_audio_scene_deal(LE_AUDIO_MUSIC_STOP);
le_audio_scene_deal(LE_AUDIO_MUSIC_START);
}
#else
if (g_pc_spk_state == PC_SPK_STA_OPEN) {
pc_spk_player_close();
pc_spk_player_open();
}
#endif
}
int pcspk_close_player_by_taskq(void)
{
int msg[2];
int ret = 0;
if (g_pc_spk_state == PC_SPK_STA_OPEN ||
g_pc_spk_state == PC_SPK_STA_WAIT_OPEN) {
g_pc_spk_state = PC_SPK_STA_WAIT_CLOSE;
msg[0] = (int)pc_spk_player_close;
msg[1] = 0;
ret = os_taskq_post_type("app_core", Q_CALLBACK, 2, msg);
}
return ret;
}
int pcspk_open_player_by_taskq(void)
{
int msg[2];
int ret = 0;
#if (LEA_BIG_CTRLER_TX_EN || LEA_BIG_CTRLER_RX_EN) && !TCFG_KBOX_1T3_MODE_EN
if ((g_pc_spk_state == PC_SPK_STA_CLOSE ||
g_pc_spk_state == PC_SPK_STA_WAIT_CLOSE) && !get_broadcast_role()) {
#elif (TCFG_LE_AUDIO_APP_CONFIG & (LE_AUDIO_AURACAST_SOURCE_EN | LE_AUDIO_AURACAST_SINK_EN))
if ((g_pc_spk_state == PC_SPK_STA_CLOSE ||
g_pc_spk_state == PC_SPK_STA_WAIT_CLOSE) && !get_auracast_role()) {
#else
if (g_pc_spk_state == PC_SPK_STA_CLOSE ||
g_pc_spk_state == PC_SPK_STA_WAIT_CLOSE) {
#endif
g_pc_spk_state = PC_SPK_STA_WAIT_OPEN;
msg[0] = (int)pc_spk_player_open;
msg[1] = 0;
ret = os_taskq_post_type("app_core", Q_CALLBACK, 2, msg);
}
return ret;
}
int pcspk_restart_player_by_taskq(void)
{
int msg[2];
int ret = 0;
msg[0] = (int)pc_spk_player_restert;
msg[1] = 0;
ret = os_taskq_post_type("app_core", Q_CALLBACK, 2, msg);
return ret;
}
static void pc_spk_set_volume(void)
{
if (app_get_current_mode()->name == APP_MODE_PC) {
s16 cur_vol = app_audio_get_volume(APP_AUDIO_STATE_MUSIC);
u16 l_vol = 0, r_vol = 0;
uac_speaker_stream_get_volume(&l_vol, &r_vol);
if (cur_vol != ((l_vol + r_vol) / 2)) {
app_audio_set_volume(APP_AUDIO_STATE_MUSIC, ((l_vol + r_vol) / 2), 1);
log_debug(">>> pc vol: %d", app_audio_get_volume(APP_AUDIO_CURRENT_STATE));
}
}
}
int pcspk_set_volume_by_taskq(void)
{
int msg[2];
int ret = -1;
#if TCFG_USB_SLAVE_AUDIO_SPK_ENABLE
msg[0] = (int)pc_spk_set_volume;
msg[1] = 0;
ret = os_taskq_post_type("app_core", Q_CALLBACK, 2, msg);
#endif
return ret;
}
#else
bool pc_spk_player_runing()
{
return 0;
}
#endif