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

166 lines
4.0 KiB
C

#ifdef SUPPORT_MS_EXTENSIONS
#pragma bss_seg(".esco_player.data.bss")
#pragma data_seg(".esco_player.data")
#pragma const_seg(".esco_player.text.const")
#pragma code_seg(".esco_player.text")
#endif
#include "jlstream.h"
#include "esco_player.h"
#include "app_config.h"
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
#include "icsd_adt_app.h"
#endif /*TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN*/
struct esco_player {
u8 bt_addr[6];
u8 suspend;
struct jlstream *stream;
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
u8 icsd_adt_state;
#endif
};
static struct esco_player *g_esco_player = NULL;
static void esco_player_callback(void *private_data, int event)
{
struct esco_player *player = g_esco_player;
struct jlstream *stream = (struct jlstream *)private_data;
switch (event) {
case STREAM_EVENT_START:
break;
}
}
int esco_player_open(u8 *bt_addr)
{
int err;
struct esco_player *player;
u16 uuid = jlstream_event_notify(STREAM_EVENT_GET_PIPELINE_UUID, (int)"esco");
if (uuid == 0) {
return -EFAULT;
}
player = malloc(sizeof(*player));
if (!player) {
return -ENOMEM;
}
player->stream = jlstream_pipeline_parse(uuid, NODE_UUID_ESCO_RX);
if (!player->stream) {
err = -ENOMEM;
goto __exit0;
}
#if TCFG_ESCO_DL_CVSD_SR_USE_16K
jlstream_node_ioctl(player->stream, NODE_UUID_BT_AUDIO_SYNC, NODE_IOC_SET_PRIV_FMT, TCFG_ESCO_DL_CVSD_SR_USE_16K);
#endif /*TCFG_ESCO_DL_CVSD_SR_USE_16K*/
jlstream_set_callback(player->stream, player->stream, esco_player_callback);
jlstream_set_scene(player->stream, STREAM_SCENE_ESCO);
jlstream_node_ioctl(player->stream, NODE_UUID_SOURCE, NODE_IOC_SET_BTADDR, (int)bt_addr);
err = jlstream_start(player->stream);
if (err) {
goto __exit1;
}
memcpy(player->bt_addr, bt_addr, 6);
g_esco_player = player;
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
/*通话前关闭adt*/
player->icsd_adt_state = audio_icsd_adt_is_running();
if (player->icsd_adt_state) {
audio_icsd_adt_close(0, 1);
}
#endif /*TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN*/
return 0;
__exit1:
jlstream_release(player->stream);
__exit0:
free(player);
return err;
}
bool esco_player_runing()
{
return g_esco_player != NULL;
}
int esco_player_get_btaddr(u8 *btaddr)
{
if (g_esco_player) {
memcpy(btaddr, g_esco_player->bt_addr, 6);
return 1;
}
return 0;
}
int esco_player_suspend(u8 *bt_addr)
{
if (g_esco_player && (memcmp(g_esco_player->bt_addr, bt_addr, 6) == 0)) {
/*jlstream_ioctl(g_esco_player->stream, NODE_IOC_SUSPEND, 0);*/
if (!g_esco_player->suspend) {
jlstream_stop(g_esco_player->stream, 0);
jlstream_release(g_esco_player->stream);
lmp_private_esco_suspend_resume(1);
}
}
return 0;
}
int esco_player_start(u8 *bt_addr)
{
if (g_esco_player && (memcmp(g_esco_player->bt_addr, bt_addr, 6) == 0)) {
/*jlstream_ioctl(g_esco_player->stream, NODE_IOC_START, 0);*/
if (g_esco_player->suspend) {
esco_player_close();
esco_player_open(bt_addr);
}
}
return 0;
}
/*
ESCO状态检测,
param:btaddr 目标蓝牙地址, 传NULL则只检查耳机状态
*/
int esco_player_is_playing(u8 *btaddr)
{
int cur_addr = 1;
if (btaddr && g_esco_player) { //当前蓝牙地址检测
cur_addr = (!memcmp(btaddr, g_esco_player->bt_addr, 6));
}
if (g_esco_player && cur_addr) {
return true;
}
return false;
}
void esco_player_close()
{
struct esco_player *player = g_esco_player;
if (!player) {
return;
}
jlstream_stop(player->stream, 0);
jlstream_release(player->stream);
#if TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN
if (player->icsd_adt_state) {
audio_icsd_adt_open(0);
}
#endif /*TCFG_AUDIO_ANC_ACOUSTIC_DETECTOR_EN*/
free(player);
g_esco_player = NULL;
jlstream_event_notify(STREAM_EVENT_CLOSE_PLAYER, (int)"esco");
}