完成MP05_SABRINA固件
This commit is contained in:
parent
c9b9be8d07
commit
72e8e6ef3b
4
.vscode/c_cpp_properties.json
vendored
4
.vscode/c_cpp_properties.json
vendored
@ -78,6 +78,7 @@
|
||||
"${workspaceFolder}/apps/soundbox/include/task_manager",
|
||||
"${workspaceFolder}/apps/soundbox/include/task_manager/bt",
|
||||
"${workspaceFolder}/apps/soundbox/include/user_api",
|
||||
"${workspaceFolder}/apps/kaotings",
|
||||
"${workspaceFolder}/apps/common",
|
||||
"${workspaceFolder}/apps/common/device",
|
||||
"${workspaceFolder}/apps/common/audio",
|
||||
@ -99,7 +100,8 @@
|
||||
"${workspaceFolder}/apps/common/music",
|
||||
"${workspaceFolder}/apps/common/include",
|
||||
"${workspaceFolder}/apps/common/config/include",
|
||||
"${workspaceFolder}/apps/soundbox/board/br23",
|
||||
"${workspaceFolder}/apps/soundbox/board/br23",
|
||||
"${workspaceFolder}/apps/soundbox/board/br23/board_ac695x_demo",
|
||||
"${workspaceFolder}/cpu/br23",
|
||||
"${workspaceFolder}/cpu/br23/audio_common",
|
||||
"${workspaceFolder}/cpu/br23/audio_dec",
|
||||
|
||||
5
.vscode/settings.json
vendored
Normal file
5
.vscode/settings.json
vendored
Normal file
@ -0,0 +1,5 @@
|
||||
{
|
||||
"files.associations": {
|
||||
"avctp_user.h": "c"
|
||||
}
|
||||
}
|
||||
Binary file not shown.
BIN
FW/MP05/KT25-1015_MP05_SABRINA/jl_isd.fw
Normal file
BIN
FW/MP05/KT25-1015_MP05_SABRINA/jl_isd.fw
Normal file
Binary file not shown.
BIN
FW/MP05/KT25-1015_MP05_SABRINA/update.ufw
Normal file
BIN
FW/MP05/KT25-1015_MP05_SABRINA/update.ufw
Normal file
Binary file not shown.
2
Makefile
2
Makefile
@ -178,6 +178,7 @@ INCLUDES := \
|
||||
-Iapps/common/include \
|
||||
-Iapps/common/config/include \
|
||||
-Iapps/soundbox/board/br23 \
|
||||
-Iapps/kaotings \
|
||||
-Icpu/br23 \
|
||||
-Icpu/br23/audio_common \
|
||||
-Icpu/br23/audio_dec \
|
||||
@ -374,6 +375,7 @@ c_SRC_FILES := \
|
||||
apps/common/usb/host/usb_storage.c \
|
||||
apps/common/usb/usb_config.c \
|
||||
apps/common/usb/usb_host_config.c \
|
||||
apps/kaotings/kt.c \
|
||||
apps/soundbox/aec/br23/audio_aec.c \
|
||||
apps/soundbox/aec/br23/audio_aec_demo.c \
|
||||
apps/soundbox/app_main.c \
|
||||
|
||||
@ -32,7 +32,7 @@ u8 ad_get_key_value(void)
|
||||
|
||||
/* ad_data = adc_get_voltage(__this->ad_channel); */
|
||||
ad_data = adc_get_value(__this->ad_channel);
|
||||
/* printf("ad_value = %d \n", ad_data); */
|
||||
// printf("ad_value = %d \n", ad_data); /* */
|
||||
for (i = 0; i < ADKEY_MAX_NUM; i++) {
|
||||
if ((ad_data <= __this->ad_value[i]) && (__this->ad_value[i] < 0x3ffL)) {
|
||||
return __this->key_value[i];
|
||||
|
||||
128
apps/kaotings/kt.c
Normal file
128
apps/kaotings/kt.c
Normal file
@ -0,0 +1,128 @@
|
||||
#include "kt.h"
|
||||
#include "avctp_user.h"
|
||||
#include "key_event_deal.h"
|
||||
|
||||
typedef struct _kts_
|
||||
{
|
||||
int timer;
|
||||
u32 t_cnt; // 上电标志
|
||||
u8 led_flag;
|
||||
// u8 conn_flag;
|
||||
} _kts;
|
||||
|
||||
static _kts kts_var;
|
||||
#define __this (&kts_var)
|
||||
|
||||
void kt_boot_init(void)
|
||||
{
|
||||
gpio_set_pull_up(KTCFG_PA_MUTE_PIN, 0);
|
||||
gpio_set_pull_down(KTCFG_PA_MUTE_PIN, 0);
|
||||
gpio_set_direction(KTCFG_PA_MUTE_PIN, 0);
|
||||
|
||||
PA_MUTE();
|
||||
|
||||
gpio_set_pull_up(KTCFG_PWR_LED_PIN, 0);
|
||||
gpio_set_pull_down(KTCFG_PWR_LED_PIN, 0);
|
||||
gpio_set_direction(KTCFG_PWR_LED_PIN, 0);
|
||||
gpio_set_output_value(KTCFG_PWR_LED_PIN, 1);
|
||||
|
||||
gpio_set_pull_up(KTCFG_BAK_LED_PIN, 0);
|
||||
gpio_set_pull_down(KTCFG_BAK_LED_PIN, 0);
|
||||
gpio_set_direction(KTCFG_BAK_LED_PIN, 0);
|
||||
gpio_set_output_value(KTCFG_BAK_LED_PIN, 0);
|
||||
|
||||
gpio_set_pull_up(KTCFG_BT_LED_PIN, 0);
|
||||
gpio_set_pull_down(KTCFG_BT_LED_PIN, 0);
|
||||
gpio_set_direction(KTCFG_BT_LED_PIN, 0);
|
||||
gpio_set_output_value(KTCFG_BT_LED_PIN, 0);
|
||||
}
|
||||
|
||||
static void led_tim_callback(void)
|
||||
{
|
||||
/* if (get_call_status() == BT_CALL_ACTIVE)
|
||||
{
|
||||
user_send_cmd_prepare(USER_CTRL_DISCONN_SCO, 0, NULL);
|
||||
} */
|
||||
|
||||
if (get_bt_connect_status() < BT_STATUS_CONNECTING)
|
||||
{
|
||||
|
||||
if (__this->led_flag == 0)
|
||||
{
|
||||
__this->led_flag = 1;
|
||||
BT_LED_ON();
|
||||
}
|
||||
else
|
||||
{
|
||||
__this->led_flag = 0;
|
||||
BT_LED_OFF();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BT_LED_ON();
|
||||
}
|
||||
|
||||
if (__this->t_cnt > 0)
|
||||
{
|
||||
__this->t_cnt--;
|
||||
if (__this->t_cnt == 0)
|
||||
{
|
||||
BAK_LED_OFF();
|
||||
PWR_LED_OFF();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
BAK_LED_OFF();
|
||||
PWR_LED_OFF();
|
||||
}
|
||||
}
|
||||
|
||||
static void start_timer(void)
|
||||
{
|
||||
if (__this->timer)
|
||||
{
|
||||
sys_timer_del(__this->timer);
|
||||
}
|
||||
|
||||
__this->t_cnt = 0;
|
||||
__this->timer = sys_timer_add(NULL, led_tim_callback, 500);
|
||||
}
|
||||
|
||||
void kt_init(void)
|
||||
{
|
||||
start_timer();
|
||||
}
|
||||
|
||||
void bled_set(void)
|
||||
{
|
||||
__this->t_cnt = 10;
|
||||
BAK_LED_ON();
|
||||
PWR_LED_ON();
|
||||
}
|
||||
|
||||
u8 kt_key_event_filter_after(int key_event)
|
||||
{
|
||||
switch (key_event)
|
||||
{
|
||||
case KEY_MUSIC_PP:
|
||||
bled_set();
|
||||
break;
|
||||
case KEY_MUSIC_PREV:
|
||||
bled_set();
|
||||
break;
|
||||
case KEY_MUSIC_NEXT:
|
||||
bled_set();
|
||||
break;
|
||||
case KEY_VOL_UP:
|
||||
bled_set();
|
||||
break;
|
||||
case KEY_VOL_DOWN:
|
||||
bled_set();
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
39
apps/kaotings/kt.h
Normal file
39
apps/kaotings/kt.h
Normal file
@ -0,0 +1,39 @@
|
||||
#ifndef __KT_H__
|
||||
#define __KT_H__
|
||||
|
||||
#include "system/includes.h"
|
||||
|
||||
/*---------- AD Values ----------*/
|
||||
// VOL- 837
|
||||
// VOL+ 812
|
||||
// PP 783
|
||||
// PREV 747
|
||||
// NEXT 701
|
||||
|
||||
|
||||
#define KTCFG_PA_MUTE_PIN IO_PORTB_09
|
||||
#define PA_MUTE() (gpio_set_output_value(KTCFG_PA_MUTE_PIN,0))
|
||||
#define PA_UNMUTE() (gpio_set_output_value(KTCFG_PA_MUTE_PIN,1))
|
||||
|
||||
#define KTCFG_PWR_LED_PIN IO_PORTC_03
|
||||
#define KTCFG_BAK_LED_PIN IO_PORTC_04
|
||||
#define KTCFG_BT_LED_PIN IO_PORTC_05
|
||||
|
||||
|
||||
#define BT_LED_ON() (gpio_set_output_value(KTCFG_BT_LED_PIN,1))
|
||||
#define BT_LED_OFF() (gpio_set_output_value(KTCFG_BT_LED_PIN,0))
|
||||
|
||||
#define PWR_LED_ON() (gpio_set_output_value(KTCFG_PWR_LED_PIN,0))
|
||||
#define PWR_LED_OFF() (gpio_set_output_value(KTCFG_PWR_LED_PIN,1))
|
||||
|
||||
#define BAK_LED_ON() (gpio_set_output_value(KTCFG_BAK_LED_PIN,1))
|
||||
#define BAK_LED_OFF() (gpio_set_output_value(KTCFG_BAK_LED_PIN,0))
|
||||
|
||||
|
||||
u8 kt_key_event_filter_after(int key_event);
|
||||
|
||||
void kt_init(void);
|
||||
void kt_boot_init(void);
|
||||
|
||||
|
||||
#endif
|
||||
@ -798,7 +798,7 @@ struct port_wakeup port0 = {
|
||||
.pullup_down_enable = ENABLE, //配置I/O 内部上下拉是否使能
|
||||
.edge = FALLING_EDGE, //唤醒方式选择,可选:上升沿\下降沿
|
||||
.attribute = BLUETOOTH_RESUME, //保留参数
|
||||
.iomap = IO_PORTA_10, //唤醒口选择
|
||||
.iomap = IO_PORTB_04, //唤醒口选择
|
||||
};
|
||||
|
||||
/* RTC PR0 PR1 唤醒 */
|
||||
|
||||
@ -26,12 +26,12 @@
|
||||
// app 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_APP_BT_EN 1
|
||||
#define TCFG_APP_MUSIC_EN 1
|
||||
#define TCFG_APP_LINEIN_EN 1
|
||||
#define TCFG_APP_FM_EN 1
|
||||
#define TCFG_APP_PC_EN 1
|
||||
#define TCFG_APP_RTC_EN 1
|
||||
#define TCFG_APP_RECORD_EN 1
|
||||
#define TCFG_APP_MUSIC_EN 0
|
||||
#define TCFG_APP_LINEIN_EN 0
|
||||
#define TCFG_APP_FM_EN 0
|
||||
#define TCFG_APP_PC_EN 0
|
||||
#define TCFG_APP_RTC_EN 0
|
||||
#define TCFG_APP_RECORD_EN 0
|
||||
#define TCFG_APP_SPDIF_EN 0
|
||||
//*********************************************************************************//
|
||||
// PCM_DEBUG调试配置 //
|
||||
@ -44,7 +44,7 @@
|
||||
//*********************************************************************************//
|
||||
#define TCFG_UART0_ENABLE ENABLE_THIS_MOUDLE //串口打印模块使能
|
||||
#define TCFG_UART0_RX_PORT NO_CONFIG_PORT //串口接收脚配置(用于打印可以选择NO_CONFIG_PORT)
|
||||
#define TCFG_UART0_TX_PORT IO_PORTA_05 //串口发送脚配置
|
||||
#define TCFG_UART0_TX_PORT IO_PORT_DP //串口发送脚配置
|
||||
#define TCFG_UART0_BAUDRATE 1000000 //串口波特率配置
|
||||
|
||||
//*********************************************************************************//
|
||||
@ -65,7 +65,7 @@
|
||||
//*********************************************************************************//
|
||||
// 硬件SPI 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_HW_SPI1_ENABLE ENABLE_THIS_MOUDLE
|
||||
#define TCFG_HW_SPI1_ENABLE DISABLE_THIS_MOUDLE
|
||||
//A组IO: DI: PB2 DO: PB1 CLK: PB0
|
||||
//B组IO: DI: PC3 DO: PC5 CLK: PC4
|
||||
#define TCFG_HW_SPI1_PORT 'A'
|
||||
@ -73,7 +73,7 @@
|
||||
#define TCFG_HW_SPI1_MODE SPI_MODE_BIDIR_1BIT
|
||||
#define TCFG_HW_SPI1_ROLE SPI_ROLE_MASTER
|
||||
|
||||
#define TCFG_HW_SPI2_ENABLE ENABLE_THIS_MOUDLE
|
||||
#define TCFG_HW_SPI2_ENABLE DISABLE_THIS_MOUDLE
|
||||
//A组IO: DI: PB8 DO: PB10 CLK: PB9
|
||||
//B组IO: DI: PA13 DO: DM CLK: DP
|
||||
#define TCFG_HW_SPI2_PORT 'A'
|
||||
@ -118,7 +118,7 @@
|
||||
#define SD_CMD_DECT 0
|
||||
#define SD_CLK_DECT 1
|
||||
#define SD_IO_DECT 2
|
||||
#define TCFG_SD0_ENABLE ENABLE_THIS_MOUDLE
|
||||
#define TCFG_SD0_ENABLE DISABLE_THIS_MOUDLE
|
||||
//A组IO: CMD:PA9 CLK:PA10 DAT0:PA5 DAT1:PA6 DAT2:PA7 DAT3:PA8
|
||||
//B组IO: CMD:PB10 CLK:PB9 DAT0:PB8 DAT1:PB6 DAT2:PB5 DAT3:PB4
|
||||
#define TCFG_SD0_PORTS 'B'
|
||||
@ -142,7 +142,7 @@
|
||||
// USB 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_PC_ENABLE TCFG_APP_PC_EN//PC模块使能
|
||||
#define TCFG_UDISK_ENABLE ENABLE_THIS_MOUDLE//U盘模块使能
|
||||
#define TCFG_UDISK_ENABLE DISABLE_THIS_MOUDLE//U盘模块使能
|
||||
#define TCFG_OTG_USB_DEV_EN BIT(0)//USB0 = BIT(0) USB1 = BIT(1)
|
||||
|
||||
#define TCFG_VIR_UDISK_ENABLE 0//ENABLE_THIS_MOUDLE
|
||||
@ -211,26 +211,25 @@
|
||||
//*********************************************************************************//
|
||||
// iokey 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_IOKEY_ENABLE DISABLE_THIS_MOUDLE //是否使能IO按键
|
||||
#define TCFG_IOKEY_ENABLE ENABLE_THIS_MOUDLE //是否使能IO按键
|
||||
|
||||
#define TCFG_IOKEY_POWER_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
|
||||
|
||||
#define TCFG_IOKEY_POWER_ONE_PORT IO_PORTB_01 //IO按键端口
|
||||
#define TCFG_IOKEY_POWER_ONE_PORT IO_PORTB_04 //IO按键端口
|
||||
|
||||
#define TCFG_IOKEY_PREV_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
|
||||
#define TCFG_IOKEY_PREV_ONE_PORT IO_PORTB_00
|
||||
#define TCFG_IOKEY_PREV_ONE_PORT -1
|
||||
|
||||
#define TCFG_IOKEY_NEXT_CONNECT_WAY ONE_PORT_TO_LOW //按键一端接低电平一端接IO
|
||||
#define TCFG_IOKEY_NEXT_ONE_PORT IO_PORTB_02
|
||||
#define TCFG_IOKEY_NEXT_ONE_PORT -1
|
||||
|
||||
//*********************************************************************************//
|
||||
// adkey 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_ADKEY_ENABLE ENABLE_THIS_MOUDLE//是否使能AD按键
|
||||
#define TCFG_ADKEY_LED_IO_REUSE DISABLE_THIS_MOUDLE //ADKEY 和 LED IO复用,led只能设置蓝灯显示
|
||||
#define TCFG_ADKEY_PORT IO_PORTA_10 //AD按键端口(需要注意选择的IO口是否支持AD功能)
|
||||
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PA10
|
||||
#define TCFG_ADKEY_EXTERN_UP_ENABLE ENABLE_THIS_MOUDLE //是否使用外部上拉
|
||||
#define TCFG_ADKEY_PORT IO_PORTB_08 //AD按键端口(需要注意选择的IO口是否支持AD功能)
|
||||
#define TCFG_ADKEY_AD_CHANNEL AD_CH_PB8
|
||||
#define TCFG_ADKEY_EXTERN_UP_ENABLE DISABLE_THIS_MOUDLE //是否使用外部上拉
|
||||
|
||||
#if TCFG_ADKEY_EXTERN_UP_ENABLE
|
||||
#define R_UP 220 //22K,外部上拉阻值在此自行设置
|
||||
@ -239,16 +238,16 @@
|
||||
#endif
|
||||
|
||||
//必须从小到大填电阻,没有则同VDDIO,填0x3ffL
|
||||
#define TCFG_ADKEY_AD0 (0) //0R
|
||||
#define TCFG_ADKEY_AD1 (0x3ffL * 30 / (30 + R_UP)) //3k
|
||||
#define TCFG_ADKEY_AD2 (0x3ffL * 62 / (62 + R_UP)) //6.2k
|
||||
#define TCFG_ADKEY_AD3 (0x3ffL * 91 / (91 + R_UP)) //9.1k
|
||||
#define TCFG_ADKEY_AD4 (0x3ffL * 150 / (150 + R_UP)) //15k
|
||||
#define TCFG_ADKEY_AD5 (0x3ffL * 240 / (240 + R_UP)) //24k
|
||||
#define TCFG_ADKEY_AD6 (0x3ffL * 330 / (330 + R_UP)) //33k
|
||||
#define TCFG_ADKEY_AD7 (0x3ffL * 510 / (510 + R_UP)) //51k
|
||||
#define TCFG_ADKEY_AD8 (0x3ffL * 1000 / (1000 + R_UP)) //100k
|
||||
#define TCFG_ADKEY_AD9 (0x3ffL * 2200 / (2200 + R_UP)) //220k
|
||||
#define TCFG_ADKEY_AD0 (689) //0R
|
||||
#define TCFG_ADKEY_AD1 (750) //3k
|
||||
#define TCFG_ADKEY_AD2 (785) //6.2k
|
||||
#define TCFG_ADKEY_AD3 (820) //9.1k
|
||||
#define TCFG_ADKEY_AD4 (833) //15k
|
||||
#define TCFG_ADKEY_AD5 (0x3ffL) //24k
|
||||
#define TCFG_ADKEY_AD6 (0x3ffL) //33k
|
||||
#define TCFG_ADKEY_AD7 (0x3ffL) //51k
|
||||
#define TCFG_ADKEY_AD8 (0x3ffL) //100k
|
||||
#define TCFG_ADKEY_AD9 (0x3ffL) //220k
|
||||
#define TCFG_ADKEY_VDDIO (0x3ffL)
|
||||
|
||||
#define TCFG_ADKEY_VOLTAGE0 ((TCFG_ADKEY_AD0 + TCFG_ADKEY_AD1) / 2)
|
||||
@ -395,7 +394,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define AUDIO_OUTPUT_WAY AUDIO_OUTPUT_WAY_DAC
|
||||
#define LINEIN_INPUT_WAY LINEIN_INPUT_WAY_ADC //LINEIN_INPUT_WAY_ANALOG
|
||||
|
||||
#define AUDIO_OUTPUT_AUTOMUTE 0//ENABLE
|
||||
#define AUDIO_OUTPUT_AUTOMUTE 1//ENABLE
|
||||
#define DAC_AUTO_HIGH_Z_EN DISABLE //处理直推串音问题, 隔直不要开
|
||||
|
||||
/*
|
||||
@ -421,9 +420,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_CALL_USE_DIGITAL_VOLUME 0
|
||||
|
||||
// 使能改宏,提示音音量使用music音量
|
||||
#define APP_AUDIO_STATE_WTONE_BY_MUSIC (1)
|
||||
#define APP_AUDIO_STATE_WTONE_BY_MUSIC (0)
|
||||
// 0:提示音不使用默认音量; 1:默认提示音音量值
|
||||
#define TONE_MODE_DEFAULE_VOLUME (0)
|
||||
#define TONE_MODE_DEFAULE_VOLUME (10)
|
||||
|
||||
//AudioEffects代码链接管理
|
||||
#define AUDIO_EFFECTS_DRC_AT_RAM 0
|
||||
@ -470,9 +469,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
// UI 配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_UI_ENABLE ENABLE_THIS_MOUDLE //UI总开关
|
||||
#define CONFIG_UI_STYLE STYLE_JL_LED7
|
||||
#define TCFG_UI_LED7_ENABLE ENABLE_THIS_MOUDLE //UI使用LED7显示
|
||||
#define TCFG_UI_ENABLE DISABLE_THIS_MOUDLE //UI总开关
|
||||
//#define CONFIG_UI_STYLE STYLE_JL_LED7
|
||||
#define TCFG_UI_LED7_ENABLE DISABLE_THIS_MOUDLE //UI使用LED7显示
|
||||
// #define TCFG_UI_LCD_SEG3X9_ENABLE ENABLE_THIS_MOUDLE //UI使用LCD段码屏显示
|
||||
// #define TCFG_LCD_ST7735S_ENABLE ENABLE_THIS_MOUDLE
|
||||
// #define TCFG_LCD_ST7789VW_ENABLE ENABLE_THIS_MOUDLE
|
||||
@ -505,7 +504,7 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
// EQ配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_EQ_ENABLE 1 //支持EQ功能,EQ总使能
|
||||
#define TCFG_EQ_ENABLE 0 //支持EQ功能,EQ总使能
|
||||
#if TCFG_EQ_ENABLE
|
||||
#define TCFG_BT_MUSIC_EQ_ENABLE 1 //支持蓝牙音乐EQ
|
||||
#define TCFG_PHONE_EQ_ENABLE 1 //支持通话近端EQ
|
||||
@ -518,11 +517,11 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_AUDIO_MIC_EFFECT_POST_EQ_ENABLE 0 //MIC音效后置EQ使能(includes DRC)
|
||||
|
||||
|
||||
#define EQ_SECTION_MAX 20//eq 段数
|
||||
#define EQ_SECTION_MAX 10//eq 段数
|
||||
#define TCFG_DYNAMIC_EQ_ENABLE 0 //动态eq使能,接在eq后,需输入32bit位宽数据
|
||||
#endif//TCFG_EQ_ENABLE
|
||||
|
||||
#define TCFG_DRC_ENABLE 1 //DRC 总使能
|
||||
#define TCFG_DRC_ENABLE 0 //DRC 总使能
|
||||
#define TCFG_AUDIO_MDRC_ENABLE 0 //多带drc使能 0:关闭多带drc, 1:使能多带drc 2:使能多带drc 并且 多带drc后再做一次全带的drc
|
||||
|
||||
#if TCFG_DRC_ENABLE
|
||||
@ -661,8 +660,8 @@ DAC硬件上的连接方式,可选的配置:
|
||||
// 系统配置 //
|
||||
//*********************************************************************************//
|
||||
#define TCFG_AUTO_SHUT_DOWN_TIME 0 //没有蓝牙连接自动关机时间
|
||||
#define TCFG_SYS_LVD_EN 1 //电量检测使能
|
||||
#define TCFG_POWER_ON_NEED_KEY 0 //是否需要按按键开机配置
|
||||
#define TCFG_SYS_LVD_EN 0 //电量检测使能
|
||||
#define TCFG_POWER_ON_NEED_KEY 1 //是否需要按按键开机配置
|
||||
#define TWFG_APP_POWERON_IGNORE_DEV 4000//上电忽略挂载设备,0时不忽略,非0则n毫秒忽略
|
||||
|
||||
#define TCFG_AUDIO_DEC_OUT_TASK 0 // 解码使用单独任务做输出
|
||||
@ -677,8 +676,8 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_USER_EMITTER_ENABLE 0 //emitter功能使能
|
||||
#define TCFG_BT_SNIFF_ENABLE 0 //bt sniff 功能使能
|
||||
|
||||
#define USER_SUPPORT_PROFILE_SPP 1
|
||||
#define USER_SUPPORT_PROFILE_HFP 1
|
||||
#define USER_SUPPORT_PROFILE_SPP 0
|
||||
#define USER_SUPPORT_PROFILE_HFP 0
|
||||
#define USER_SUPPORT_PROFILE_A2DP 1
|
||||
#define USER_SUPPORT_PROFILE_AVCTP 1
|
||||
#define USER_SUPPORT_PROFILE_HID 1
|
||||
@ -698,9 +697,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#endif
|
||||
|
||||
#define BT_INBAND_RINGTONE 0 //是否播放手机自带来电铃声
|
||||
#define BT_PHONE_NUMBER 1 //是否播放来电报号
|
||||
#define BT_PHONE_NUMBER 0 //是否播放来电报号
|
||||
#define BT_SYNC_PHONE_RING 0 //是否TWS同步播放来电铃声
|
||||
#define BT_SUPPORT_DISPLAY_BAT 1 //是否使能电量检测
|
||||
#define BT_SUPPORT_DISPLAY_BAT 0 //是否使能电量检测
|
||||
#define BT_SUPPORT_MUSIC_VOL_SYNC 1 //是否使能音量同步
|
||||
|
||||
#define TCFG_BLUETOOTH_BACK_MODE 1 //后台模式
|
||||
@ -757,14 +756,14 @@ DAC硬件上的连接方式,可选的配置:
|
||||
//*********************************************************************************//
|
||||
#define TCFG_DEC_G729_ENABLE ENABLE
|
||||
#define TCFG_DEC_MP3_ENABLE ENABLE
|
||||
#define TCFG_DEC_WMA_ENABLE ENABLE
|
||||
#define TCFG_DEC_WAV_ENABLE ENABLE
|
||||
#define TCFG_DEC_FLAC_ENABLE ENABLE
|
||||
#define TCFG_DEC_APE_ENABLE ENABLE
|
||||
#define TCFG_DEC_M4A_ENABLE ENABLE
|
||||
#define TCFG_DEC_ALAC_ENABLE ENABLE
|
||||
#define TCFG_DEC_AMR_ENABLE ENABLE
|
||||
#define TCFG_DEC_DTS_ENABLE ENABLE
|
||||
#define TCFG_DEC_WMA_ENABLE DISABLE
|
||||
#define TCFG_DEC_WAV_ENABLE DISABLE
|
||||
#define TCFG_DEC_FLAC_ENABLE DISABLE
|
||||
#define TCFG_DEC_APE_ENABLE DISABLE
|
||||
#define TCFG_DEC_M4A_ENABLE DISABLE
|
||||
#define TCFG_DEC_ALAC_ENABLE DISABLE
|
||||
#define TCFG_DEC_AMR_ENABLE DISABLE
|
||||
#define TCFG_DEC_DTS_ENABLE DISABLE
|
||||
#define TCFG_DEC_G726_ENABLE DISABLE
|
||||
#define TCFG_DEC_MIDI_ENABLE DISABLE
|
||||
#define TCFG_DEC_MTY_ENABLE DISABLE
|
||||
@ -869,9 +868,9 @@ DAC硬件上的连接方式,可选的配置:
|
||||
#define TCFG_ENC_CVSD_ENABLE ENABLE
|
||||
#define TCFG_ENC_MSBC_ENABLE ENABLE
|
||||
#define TCFG_ENC_G726_ENABLE ENABLE
|
||||
#define TCFG_ENC_MP3_ENABLE ENABLE
|
||||
#define TCFG_ENC_ADPCM_ENABLE ENABLE
|
||||
#define TCFG_ENC_PCM_ENABLE ENABLE
|
||||
#define TCFG_ENC_MP3_ENABLE DISABLE
|
||||
#define TCFG_ENC_ADPCM_ENABLE DISABLE
|
||||
#define TCFG_ENC_PCM_ENABLE DISABLE
|
||||
#define TCFG_ENC_SBC_ENABLE ENABLE
|
||||
#define TCFG_ENC_OPUS_ENABLE DISABLE
|
||||
#define TCFG_ENC_SPEEX_ENABLE DISABLE
|
||||
|
||||
@ -12,22 +12,22 @@
|
||||
const u16 bt_key_ad_table[KEY_AD_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
//单击 //长按 //hold //抬起 //双击 //三击
|
||||
[0] = {
|
||||
KEY_CHANGE_MODE, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_MUSIC_NEXT, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[1] = {
|
||||
KEY_MUSIC_PREV, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_MUSIC_PREV, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[2] = {
|
||||
KEY_MUSIC_PP, KEY_CALL_HANG_UP, KEY_NULL, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL
|
||||
KEY_MUSIC_PP, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[3] = {
|
||||
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_VOL_UP, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[4] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_REVERB_OPEN, KEY_NULL
|
||||
KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_VOL_DOWN, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[5] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_ENC_START, KEY_NULL
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[6] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
|
||||
@ -12,16 +12,16 @@
|
||||
const u16 bt_key_io_table[KEY_IO_NUM_MAX][KEY_EVENT_MAX] = {
|
||||
//单击 //长按 //hold //抬起 //双击 //三击
|
||||
[0] = {
|
||||
KEY_MUSIC_PP, KEY_CALL_HANG_UP, KEY_NULL, KEY_NULL, KEY_CALL_LAST_NO, KEY_NULL
|
||||
KEY_NULL, KEY_POWEROFF, KEY_POWEROFF_HOLD, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[1] = {
|
||||
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[2] = {
|
||||
KEY_MUSIC_NEXT, KEY_VOL_UP, KEY_VOL_UP, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[3] = {
|
||||
KEY_CHANGE_MODE, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
},
|
||||
[4] = {
|
||||
KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL, KEY_NULL
|
||||
|
||||
@ -8,7 +8,7 @@
|
||||
#include "app_charge.h"
|
||||
#include "chgbox_ctrl.h"
|
||||
#include "update_loader_download.h"
|
||||
|
||||
#include "kt.h"
|
||||
|
||||
extern void setup_arch();
|
||||
extern int audio_dec_init();
|
||||
@ -103,6 +103,8 @@ static void app_init()
|
||||
|
||||
board_init();
|
||||
|
||||
kt_boot_init();
|
||||
|
||||
do_initcall();
|
||||
|
||||
do_module_initcall();
|
||||
|
||||
@ -911,6 +911,10 @@ int bt_key_event_handler(struct sys_event *event)
|
||||
return true;
|
||||
}
|
||||
|
||||
if (kt_key_event_filter_after(key_event) == true) {
|
||||
return true;
|
||||
}
|
||||
|
||||
switch (key_event) {
|
||||
|
||||
case KEY_MUSIC_PP:
|
||||
|
||||
@ -12,10 +12,10 @@
|
||||
#include "ui/ui_api.h"
|
||||
#include "app_task.h"
|
||||
#include "key_event_deal.h"
|
||||
#include "kt.h"
|
||||
|
||||
|
||||
#define LOG_TAG_CONST APP_IDLE
|
||||
#define LOG_TAG "[APP_IDLE]"
|
||||
#define LOG_TAG_CONST APP_IDLE
|
||||
#define LOG_TAG "[APP_IDLE]"
|
||||
#define LOG_ERROR_ENABLE
|
||||
#define LOG_DEBUG_ENABLE
|
||||
#define LOG_INFO_ENABLE
|
||||
@ -23,8 +23,7 @@
|
||||
#define LOG_CLI_ENABLE
|
||||
#include "debug.h"
|
||||
|
||||
|
||||
static void lcd_ui_power_on_timeout(void *p)
|
||||
static void lcd_ui_power_on_timeout(void *p)
|
||||
{
|
||||
#if (TCFG_SPI_LCD_ENABLE)
|
||||
/* sys_key_event_enable(); */
|
||||
@ -41,10 +40,9 @@ static void lcd_ui_power_on_timeout(void *p)
|
||||
app_task_switch_to(APP_MUSIC_TASK);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
}
|
||||
|
||||
static void lcd_ui_power_on()
|
||||
static void lcd_ui_power_on()
|
||||
{
|
||||
#if (TCFG_SPI_LCD_ENABLE)
|
||||
int logo_time = 0;
|
||||
@ -55,9 +53,9 @@ static void lcd_ui_power_on()
|
||||
|
||||
static int power_on_init(void)
|
||||
{
|
||||
///有些需要在开机提示完成之后再初始化的东西, 可以在这里初始化
|
||||
/// 有些需要在开机提示完成之后再初始化的东西, 可以在这里初始化
|
||||
#if (TCFG_SPI_LCD_ENABLE)
|
||||
lcd_ui_power_on();//由ui决定切换的模式
|
||||
lcd_ui_power_on(); // 由ui决定切换的模式
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
@ -65,7 +63,7 @@ static int power_on_init(void)
|
||||
app_task_switch_to(APP_BT_TASK);
|
||||
#else
|
||||
|
||||
#if TCFG_USB_APPLE_DOCK_EN //苹果iap协议使用pc模式
|
||||
#if TCFG_USB_APPLE_DOCK_EN // 苹果iap协议使用pc模式
|
||||
app_task_switch_to(APP_PC_TASK);
|
||||
#else
|
||||
app_task_switch_to(APP_SLEEP_TASK);
|
||||
@ -88,14 +86,10 @@ static int power_on_unint(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
static int poweron_sys_event_handler(struct sys_event *event)
|
||||
{
|
||||
switch (event->type) {
|
||||
switch (event->type)
|
||||
{
|
||||
case SYS_KEY_EVENT:
|
||||
break;
|
||||
case SYS_BT_EVENT:
|
||||
@ -108,53 +102,56 @@ static int poweron_sys_event_handler(struct sys_event *event)
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
static void tone_play_end_callback(void *priv, int flag)
|
||||
static void tone_play_end_callback(void *priv, int flag)
|
||||
{
|
||||
int index = (int)priv;
|
||||
|
||||
if (APP_POWERON_TASK != app_get_curr_task()) {
|
||||
if (APP_POWERON_TASK != app_get_curr_task())
|
||||
{
|
||||
log_error("tone callback task out \n");
|
||||
return;
|
||||
}
|
||||
|
||||
switch (index) {
|
||||
switch (index)
|
||||
{
|
||||
case IDEX_TONE_POWER_ON:
|
||||
power_on_init();
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
void app_poweron_task()
|
||||
{
|
||||
int msg[32];
|
||||
|
||||
kt_init();
|
||||
|
||||
UI_SHOW_MENU(MENU_POWER_UP, 0, 0, NULL);
|
||||
|
||||
int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON);
|
||||
int err = tone_play_with_callback_by_name(tone_table[IDEX_TONE_POWER_ON], 1, tone_play_end_callback, (void *)IDEX_TONE_POWER_ON);
|
||||
/* if (err) { //提示音没有,播放失败,直接init流程 */
|
||||
/* power_on_init(); */
|
||||
/* } */
|
||||
|
||||
|
||||
while (1) {
|
||||
while (1)
|
||||
{
|
||||
app_task_get_msg(msg, ARRAY_SIZE(msg), 1);
|
||||
switch (msg[0]) {
|
||||
switch (msg[0])
|
||||
{
|
||||
case APP_MSG_SYS_EVENT:
|
||||
if (poweron_sys_event_handler((struct sys_event *)(msg + 1)) == false) {
|
||||
app_default_event_deal((struct sys_event *)(&msg[1])); //由common统一处理
|
||||
if (poweron_sys_event_handler((struct sys_event *)(msg + 1)) == false)
|
||||
{
|
||||
app_default_event_deal((struct sys_event *)(&msg[1])); // 由common统一处理
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (app_task_exitting()) {
|
||||
if (app_task_exitting())
|
||||
{
|
||||
power_on_unint();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -75,10 +75,10 @@
|
||||
TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_DUAL_LR_DIFF)
|
||||
#define MAX_ANA_VOL (21)
|
||||
#else
|
||||
#define MAX_ANA_VOL (28)
|
||||
#define MAX_ANA_VOL (24)
|
||||
#endif/*TCFG_AUDIO_DAC_CONNECT_MODE*/
|
||||
|
||||
#define MAX_COM_VOL (22) // 具体数值应小于联合音量等级的数组大小 (combined_vol_list)
|
||||
#define MAX_COM_VOL (30) // 具体数值应小于联合音量等级的数组大小 (combined_vol_list)
|
||||
#define MAX_DIG_VOL (100)
|
||||
|
||||
#define MAX_DIG_GR_VOL (30)//数字音量组的最大值
|
||||
@ -96,8 +96,8 @@
|
||||
#endif
|
||||
|
||||
|
||||
#define SYS_DEFAULT_VOL 0//SYS_MAX_VOL //(SYS_MAX_VOL/2)
|
||||
#define SYS_DEFAULT_TONE_VOL 18 //(SYS_MAX_VOL)
|
||||
#define SYS_DEFAULT_VOL SYS_MAX_VOL/2 //SYS_MAX_VOL //(SYS_MAX_VOL/2)
|
||||
#define SYS_DEFAULT_TONE_VOL 10 //(SYS_MAX_VOL)
|
||||
#define SYS_DEFAULT_SIN_VOL 17
|
||||
|
||||
#define APP_AUDIO_STATE_IDLE 0
|
||||
|
||||
@ -62,28 +62,28 @@ void *fmtx_digvol_last_entry = NULL;
|
||||
struct audio_stream_entry *fmtx_last_entry = NULL;
|
||||
#endif
|
||||
|
||||
#define AUDIO_CODEC_SUPPORT_SYNC 1 // 同步
|
||||
#define AUDIO_CODEC_SUPPORT_SYNC 1 // 同步
|
||||
|
||||
#if (RECORDER_MIX_EN)
|
||||
#define MAX_SRC_NUMBER 5 // 最大支持src个数
|
||||
#define MAX_SRC_NUMBER 5 // 最大支持src个数
|
||||
#else
|
||||
#define MAX_SRC_NUMBER 3 // 最大支持src个数
|
||||
#endif/*RECORDER_MIX_EN*/
|
||||
#define MAX_SRC_NUMBER 3 // 最大支持src个数
|
||||
#endif /*RECORDER_MIX_EN*/
|
||||
|
||||
#define AUDIO_DECODE_TASK_WAKEUP_TIME 0 // 解码定时唤醒 // ms
|
||||
#define AUDIO_DECODE_TASK_WAKEUP_TIME 0 // 解码定时唤醒 // ms
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
struct audio_decoder_task decode_task = {0};
|
||||
struct audio_mixer mixer = {0};
|
||||
struct audio_decoder_task decode_task = {0};
|
||||
struct audio_mixer mixer = {0};
|
||||
/*struct audio_stream_dac_out *dac_last = NULL;*/
|
||||
|
||||
#if TCFG_MIXER_CYCLIC_TASK_EN
|
||||
struct audio_mixer_task mixer_task = {0};
|
||||
struct audio_mixer_task mixer_task = {0};
|
||||
#endif
|
||||
|
||||
#if TCFG_DEC2TWS_TASK_ENABLE
|
||||
struct audio_decoder_task localtws_decode_task = {0};
|
||||
struct audio_decoder_task localtws_decode_task = {0};
|
||||
#endif
|
||||
|
||||
static u8 audio_dec_inited = 0;
|
||||
@ -94,17 +94,16 @@ loudness_hdl *loudness;
|
||||
|
||||
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
||||
#if !TCFG_EQ_DIVIDE_ENABLE
|
||||
struct channel_switch *mix_ch_switch = NULL;//声道变换
|
||||
struct channel_switch *mix_ch_switch = NULL; // 声道变换
|
||||
#endif
|
||||
#endif
|
||||
|
||||
u8 audio_src_hw_filt[SRC_FILT_POINTS * SRC_CHI * 2 * MAX_SRC_NUMBER] ALIGNED(4); /*SRC的滤波器必须4个byte对齐*/
|
||||
u8 audio_src_hw_filt[SRC_FILT_POINTS * SRC_CHI * 2 * MAX_SRC_NUMBER] ALIGNED(4); /*SRC的滤波器必须4个byte对齐*/
|
||||
s16 mix_buff[AUDIO_MIXER_LEN / 2] SEC(.dec_mix_buff);
|
||||
#if (RECORDER_MIX_EN)
|
||||
struct audio_mixer recorder_mixer = {0};
|
||||
s16 recorder_mix_buff[AUDIO_MIXER_LEN / 2] SEC(.dec_mix_buff);
|
||||
#endif/*RECORDER_MIX_EN*/
|
||||
|
||||
#endif /*RECORDER_MIX_EN*/
|
||||
|
||||
#if (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_DAC)
|
||||
#if AUDIO_CODEC_SUPPORT_SYNC
|
||||
@ -115,13 +114,12 @@ s16 dac_sync_buff[256];
|
||||
#if AUDIO_VOCAL_REMOVE_EN
|
||||
vocal_remove_hdl *mix_vocal_remove_hdl = NULL;
|
||||
void *vocal_remove_open(u8 ch_num);
|
||||
struct channel_switch *vocal_remove_mix_ch_switch = NULL;//声道变换,单声道时,先让解码出立体声,做完人声消除,再变单声道
|
||||
struct channel_switch *vocal_remove_mix_ch_switch = NULL; // 声道变换,单声道时,先让解码出立体声,做完人声消除,再变单声道
|
||||
#endif
|
||||
|
||||
|
||||
extern const int config_mixer_en;
|
||||
|
||||
#define AUDIO_DEC_MIXER_EN config_mixer_en
|
||||
#define AUDIO_DEC_MIXER_EN config_mixer_en
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
@ -129,48 +127,54 @@ extern const int config_mixer_en;
|
||||
extern spectrum_fft_hdl *spec_hdl;
|
||||
#endif
|
||||
|
||||
|
||||
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG
|
||||
static float bass_gain = 0;
|
||||
//低音调节测试例子
|
||||
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) && SOUND_TRACK_2_P_X_CH_CONFIG
|
||||
static float bass_gain = 0;
|
||||
// 低音调节测试例子
|
||||
void sound_track_bass_vol_test_demo(u8 up_down)
|
||||
{
|
||||
if (up_down) {
|
||||
if (up_down)
|
||||
{
|
||||
bass_gain++;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
bass_gain--;
|
||||
}
|
||||
if (bass_gain > 6) {
|
||||
if (bass_gain > 6)
|
||||
{
|
||||
bass_gain = 6;
|
||||
tone_play_by_path(TONE_NORMAL, 0); //播放一段正弦波
|
||||
tone_play_by_path(TONE_NORMAL, 0); // 播放一段正弦波
|
||||
}
|
||||
if (bass_gain < -6) {
|
||||
if (bass_gain < -6)
|
||||
{
|
||||
bass_gain = -6;
|
||||
tone_play_by_path(TONE_NORMAL, 0); //播放一段正弦波
|
||||
tone_play_by_path(TONE_NORMAL, 0); // 播放一段正弦波
|
||||
}
|
||||
//printf("=====bass gain %d\n", (int)bass_gain);
|
||||
// printf("=====bass gain %d\n", (int)bass_gain);
|
||||
low_bass_set_global_gain(bass_gain, bass_gain);
|
||||
}
|
||||
|
||||
#endif/*defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG*/
|
||||
#endif /*defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG*/
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
struct _audio_phase_inver_hdl {
|
||||
struct audio_stream_entry entry; // 音频流入口
|
||||
struct _audio_phase_inver_hdl
|
||||
{
|
||||
struct audio_stream_entry entry; // 音频流入口
|
||||
} audio_phase_inver_hdl;
|
||||
|
||||
static void audio_phase_inver_output_data_process_len(struct audio_stream_entry *entry, int len)
|
||||
static void audio_phase_inver_output_data_process_len(struct audio_stream_entry *entry, int len)
|
||||
{
|
||||
}
|
||||
|
||||
static int audio_phase_inver_data_handler(struct audio_stream_entry *entry,
|
||||
struct audio_data_frame *in,
|
||||
struct audio_data_frame *out)
|
||||
struct audio_data_frame *in,
|
||||
struct audio_data_frame *out)
|
||||
{
|
||||
struct _audio_phase_inver_hdl *hdl = container_of(entry, struct _audio_phase_inver_hdl, entry);
|
||||
out->data = in->data;
|
||||
out->data_len = in->data_len;
|
||||
if (in->data_len - in->offset > 0) {
|
||||
if (in->data_len - in->offset > 0)
|
||||
{
|
||||
digital_phase_inverter_s16(in->data + in->offset / 2, in->data_len - in->offset);
|
||||
}
|
||||
return in->data_len;
|
||||
@ -178,10 +182,6 @@ static int audio_phase_inver_data_handler(struct audio_stream_entry *entry,
|
||||
|
||||
//////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 获取dac能量值
|
||||
@param
|
||||
@ -193,7 +193,8 @@ int audio_dac_energy_get(void)
|
||||
{
|
||||
#if AUDIO_OUTPUT_AUTOMUTE
|
||||
int audio_energy_detect_energy_get(void *_hdl, u8 ch);
|
||||
if (mix_out_automute_hdl) {
|
||||
if (mix_out_automute_hdl)
|
||||
{
|
||||
return audio_energy_detect_energy_get(mix_out_automute_hdl, BIT(0));
|
||||
}
|
||||
|
||||
@ -218,7 +219,6 @@ void audio_resume_all_decoder(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
#if AUDIO_DECODE_TASK_WAKEUP_TIME
|
||||
#include "timer.h"
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -230,7 +230,7 @@ void audio_resume_all_decoder(void)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void audio_decoder_wakeup_timer(void *priv)
|
||||
{
|
||||
//putchar('k');
|
||||
// putchar('k');
|
||||
struct audio_decoder_task *task = priv;
|
||||
audio_decoder_resume_all(task);
|
||||
}
|
||||
@ -243,7 +243,8 @@ static void audio_decoder_wakeup_timer(void *priv)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int audio_decoder_task_add_probe(struct audio_decoder_task *task)
|
||||
{
|
||||
if (task->wakeup_timer == 0) {
|
||||
if (task->wakeup_timer == 0)
|
||||
{
|
||||
task->wakeup_timer = sys_hi_timer_add(task, audio_decoder_wakeup_timer, AUDIO_DECODE_TASK_WAKEUP_TIME);
|
||||
log_i("audio_decoder_task_add_probe:%d\n", task->wakeup_timer);
|
||||
}
|
||||
@ -259,11 +260,13 @@ int audio_decoder_task_add_probe(struct audio_decoder_task *task)
|
||||
int audio_decoder_task_del_probe(struct audio_decoder_task *task)
|
||||
{
|
||||
log_i("audio_decoder_task_del_probe\n");
|
||||
if (audio_decoder_task_wait_state(task) > 0) {
|
||||
if (audio_decoder_task_wait_state(task) > 0)
|
||||
{
|
||||
/*解码任务列表还有任务*/
|
||||
return 0;
|
||||
}
|
||||
if (task->wakeup_timer) {
|
||||
if (task->wakeup_timer)
|
||||
{
|
||||
log_i("audio_decoder_task_del_probe:%d\n", task->wakeup_timer);
|
||||
sys_hi_timer_del(task->wakeup_timer);
|
||||
task->wakeup_timer = 0;
|
||||
@ -279,13 +282,14 @@ int audio_decoder_task_del_probe(struct audio_decoder_task *task)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
int audio_decoder_wakeup_modify(int msecs)
|
||||
{
|
||||
if (decode_task.wakeup_timer) {
|
||||
if (decode_task.wakeup_timer)
|
||||
{
|
||||
sys_hi_timer_modify(decode_task.wakeup_timer, msecs);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
#endif/*AUDIO_DECODE_TASK_WAKEUP_TIME*/
|
||||
#endif /*AUDIO_DECODE_TASK_WAKEUP_TIME*/
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 各模式主解码open
|
||||
@ -322,7 +326,7 @@ u32 audio_output_nor_rate(void)
|
||||
return 44100;
|
||||
#endif
|
||||
|
||||
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) &&SOUND_TRACK_2_P_X_CH_CONFIG
|
||||
#if defined(SOUND_TRACK_2_P_X_CH_CONFIG) && SOUND_TRACK_2_P_X_CH_CONFIG
|
||||
return 44100;
|
||||
#endif
|
||||
|
||||
@ -353,13 +357,14 @@ u32 audio_output_nor_rate(void)
|
||||
u32 audio_output_rate(int input_rate)
|
||||
{
|
||||
u32 out_rate = audio_output_nor_rate();
|
||||
if (out_rate) {
|
||||
if (out_rate)
|
||||
{
|
||||
return out_rate;
|
||||
}
|
||||
|
||||
#if (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_BT)
|
||||
if ((bt_user_priv_var.emitter_or_receiver == BT_EMITTER_EN) && (!bt_phone_dec_is_running())
|
||||
&& (!bt_media_is_running())) {
|
||||
if ((bt_user_priv_var.emitter_or_receiver == BT_EMITTER_EN) && (!bt_phone_dec_is_running()) && (!bt_media_is_running()))
|
||||
{
|
||||
y_printf("+++ \n");
|
||||
return audio_sbc_enc_get_rate();
|
||||
}
|
||||
@ -368,12 +373,13 @@ u32 audio_output_rate(int input_rate)
|
||||
#endif
|
||||
|
||||
#if (TCFG_MIC_EFFECT_ENABLE)
|
||||
if (input_rate > 48000) {
|
||||
if (input_rate > 48000)
|
||||
{
|
||||
return 48000;
|
||||
}
|
||||
#endif
|
||||
//y_printf("+++ 11 \n");
|
||||
return app_audio_output_samplerate_select(input_rate, 1);
|
||||
// y_printf("+++ 11 \n");
|
||||
return app_audio_output_samplerate_select(input_rate, 1);
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -387,21 +393,26 @@ u32 audio_output_channel_num(void)
|
||||
{
|
||||
#if ((AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_DAC) || (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_BT))
|
||||
/*根据DAC输出的方式选择输出的声道*/
|
||||
u8 dac_connect_mode = app_audio_output_mode_get();
|
||||
if (dac_connect_mode == DAC_OUTPUT_LR || dac_connect_mode == DAC_OUTPUT_DUAL_LR_DIFF) {
|
||||
u8 dac_connect_mode = app_audio_output_mode_get();
|
||||
if (dac_connect_mode == DAC_OUTPUT_LR || dac_connect_mode == DAC_OUTPUT_DUAL_LR_DIFF)
|
||||
{
|
||||
return 2;
|
||||
} else if (dac_connect_mode == DAC_OUTPUT_FRONT_LR_REAR_LR) {
|
||||
}
|
||||
else if (dac_connect_mode == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
||||
{
|
||||
return 2;
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
#if AUDIO_VOCAL_REMOVE_EN
|
||||
return 2;
|
||||
return 2;
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
#elif (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_FM)
|
||||
return 2;
|
||||
return 2;
|
||||
#else
|
||||
return 2;
|
||||
return 2;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -416,27 +427,35 @@ u32 audio_output_channel_type(void)
|
||||
{
|
||||
#if ((AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_DAC) || (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_BT))
|
||||
/*根据DAC输出的方式选择输出的声道*/
|
||||
u8 dac_connect_mode = app_audio_output_mode_get();
|
||||
if (dac_connect_mode == DAC_OUTPUT_LR || dac_connect_mode == DAC_OUTPUT_DUAL_LR_DIFF) {
|
||||
u8 dac_connect_mode = app_audio_output_mode_get();
|
||||
if (dac_connect_mode == DAC_OUTPUT_LR || dac_connect_mode == DAC_OUTPUT_DUAL_LR_DIFF)
|
||||
{
|
||||
return AUDIO_CH_LR;
|
||||
} else if (dac_connect_mode == DAC_OUTPUT_FRONT_LR_REAR_LR) {
|
||||
}
|
||||
else if (dac_connect_mode == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
||||
{
|
||||
return AUDIO_CH_LR;
|
||||
} else if (dac_connect_mode == DAC_OUTPUT_MONO_L) {
|
||||
return AUDIO_CH_DIFF; //要输出左右合成的单声道数据选这个
|
||||
/* return AUDIO_CH_L; */ //只要输出左声道的数据选这个
|
||||
} else if (dac_connect_mode == DAC_OUTPUT_MONO_R) {
|
||||
}
|
||||
else if (dac_connect_mode == DAC_OUTPUT_MONO_L)
|
||||
{
|
||||
return AUDIO_CH_DIFF; // 要输出左右合成的单声道数据选这个
|
||||
/* return AUDIO_CH_L; */ // 只要输出左声道的数据选这个
|
||||
}
|
||||
else if (dac_connect_mode == DAC_OUTPUT_MONO_R)
|
||||
{
|
||||
|
||||
return AUDIO_CH_DIFF; //要输出左右合成的单声道数据选这个
|
||||
return AUDIO_CH_DIFF; // 要输出左右合成的单声道数据选这个
|
||||
|
||||
/* return AUDIO_CH_R; */ //只要输出右声道的数据选这个
|
||||
|
||||
} else {
|
||||
/* return AUDIO_CH_R; */ // 只要输出右声道的数据选这个
|
||||
}
|
||||
else
|
||||
{
|
||||
return AUDIO_CH_DIFF;
|
||||
}
|
||||
#elif (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_FM)
|
||||
return AUDIO_CH_LR;
|
||||
return AUDIO_CH_LR;
|
||||
#else
|
||||
return AUDIO_CH_LR;
|
||||
return AUDIO_CH_LR;
|
||||
#endif
|
||||
}
|
||||
|
||||
@ -450,14 +469,14 @@ u32 audio_output_channel_type(void)
|
||||
int audio_output_set_start_volume(u8 state)
|
||||
{
|
||||
s16 vol_max = get_max_sys_vol();
|
||||
if (state == APP_AUDIO_STATE_CALL) {
|
||||
if (state == APP_AUDIO_STATE_CALL)
|
||||
{
|
||||
vol_max = app_var.aec_dac_gain;
|
||||
}
|
||||
app_audio_state_switch(state, vol_max);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 开始音频输出
|
||||
@param sample_rate: 输出采样率
|
||||
@ -469,11 +488,13 @@ int audio_output_set_start_volume(u8 state)
|
||||
u8 audio_output_flag = 0;
|
||||
int audio_output_start(u32 sample_rate, u8 reset_rate)
|
||||
{
|
||||
if (reset_rate) {
|
||||
if (reset_rate)
|
||||
{
|
||||
app_audio_output_samplerate_set(sample_rate);
|
||||
}
|
||||
|
||||
if (audio_output_flag) {
|
||||
if (audio_output_flag)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -509,14 +530,15 @@ void audio_output_stop(void)
|
||||
*/
|
||||
/*----------------------------------------------------------------------------*/
|
||||
struct audio_src_handle *audio_hw_resample_open(void *priv,
|
||||
int (*output_handler)(void *, void *, int),
|
||||
u8 channel,
|
||||
u16 input_sample_rate,
|
||||
u16 output_sample_rate)
|
||||
int (*output_handler)(void *, void *, int),
|
||||
u8 channel,
|
||||
u16 input_sample_rate,
|
||||
u16 output_sample_rate)
|
||||
{
|
||||
struct audio_src_handle *hdl;
|
||||
hdl = zalloc(sizeof(struct audio_src_handle));
|
||||
if (hdl) {
|
||||
if (hdl)
|
||||
{
|
||||
audio_hw_src_open(hdl, channel, SRC_TYPE_RESAMPLE);
|
||||
audio_hw_src_set_rate(hdl, input_sample_rate, output_sample_rate);
|
||||
audio_src_set_output_handler(hdl, priv, output_handler);
|
||||
@ -534,14 +556,14 @@ struct audio_src_handle *audio_hw_resample_open(void *priv,
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void audio_hw_resample_close(struct audio_src_handle *hdl)
|
||||
{
|
||||
if (hdl) {
|
||||
if (hdl)
|
||||
{
|
||||
audio_hw_src_stop(hdl);
|
||||
audio_hw_src_close(hdl);
|
||||
free(hdl);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief mixer事件处理
|
||||
@param *mixer: 句柄
|
||||
@ -552,22 +574,27 @@ void audio_hw_resample_close(struct audio_src_handle *hdl)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static void mixer_event_handler(struct audio_mixer *mixer, int event)
|
||||
{
|
||||
switch (event) {
|
||||
switch (event)
|
||||
{
|
||||
case MIXER_EVENT_OPEN:
|
||||
if (audio_mixer_get_ch_num(mixer) >= 1) {
|
||||
if (audio_mixer_get_ch_num(mixer) >= 1)
|
||||
{
|
||||
clock_add_set(DEC_MIX_CLK);
|
||||
}
|
||||
break;
|
||||
case MIXER_EVENT_CLOSE:
|
||||
if (audio_mixer_get_ch_num(mixer) == 0) {
|
||||
if (audio_mixer_get_ch_num(mixer) == 0)
|
||||
{
|
||||
clock_remove_set(DEC_MIX_CLK);
|
||||
}
|
||||
if (config_mixer_en) {
|
||||
if (config_mixer_en)
|
||||
{
|
||||
os_mutex_pend(&mixer->mutex, 0);
|
||||
if (audio_mixer_get_active_ch_num(mixer) == 0) {
|
||||
if (audio_mixer_get_active_ch_num(mixer) == 0)
|
||||
{
|
||||
/*输出通道可以进行stop处理*/
|
||||
audio_mixer_output_stop(mixer);
|
||||
//通道关闭时,清掉节点记录的偏移,防止下个解码打开时,mix之后的同步节点断言
|
||||
// 通道关闭时,清掉节点记录的偏移,防止下个解码打开时,mix之后的同步节点断言
|
||||
audio_stream_clear_from(&mixer->entry);
|
||||
}
|
||||
os_mutex_post(&mixer->mutex);
|
||||
@ -579,7 +606,6 @@ static void mixer_event_handler(struct audio_mixer *mixer, int event)
|
||||
#endif
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 检测mixer采样率支持
|
||||
@ -591,7 +617,8 @@ static void mixer_event_handler(struct audio_mixer *mixer, int event)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
static u32 audio_mixer_check_sr(struct audio_mixer *mixer, u32 sr)
|
||||
{
|
||||
return audio_output_rate(sr);;
|
||||
return audio_output_rate(sr);
|
||||
;
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -617,9 +644,12 @@ int vol_get_test()
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void audio_mixer_reset_sample_rate(u8 flag, u32 sr)
|
||||
{
|
||||
if (flag) {
|
||||
if (flag)
|
||||
{
|
||||
audio_mixer_set_sample_rate(&mixer, MIXER_SR_SPEC, sr);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
audio_mixer_set_sample_rate(&mixer, MIXER_SR_FIRST, sr);
|
||||
}
|
||||
}
|
||||
@ -634,23 +664,24 @@ void audio_mixer_reset_sample_rate(u8 flag, u32 sr)
|
||||
int audio_dec_occupy_trace_hdl(void *priv, u32 idle_total)
|
||||
{
|
||||
struct audio_decoder_occupy *occupy = priv;
|
||||
if (idle_total < occupy->idle_expect) {
|
||||
if (occupy->pend_time) {
|
||||
if (idle_total < occupy->idle_expect)
|
||||
{
|
||||
if (occupy->pend_time)
|
||||
{
|
||||
os_time_dly(occupy->pend_time);
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
extern void audio_adda_gain_dump(void);//打印所有adc,dac的增益
|
||||
extern void audio_adda_gain_dump(void); // 打印所有adc,dac的增益
|
||||
/*音频配置实时跟踪,可以用来查看ADC/DAC增益,或者其他寄存器配置*/
|
||||
static void audio_config_trace(void *priv)
|
||||
{
|
||||
printf(">>Audio_Config_Trace:\n");
|
||||
audio_adda_gain_dump();
|
||||
//audio_adda_dump();
|
||||
//mem_stats();
|
||||
// audio_adda_dump();
|
||||
// mem_stats();
|
||||
}
|
||||
|
||||
/*----------------------------------------------------------------------------*/
|
||||
@ -668,7 +699,6 @@ int audio_dec_init()
|
||||
|
||||
printf("audio_dec_init\n");
|
||||
|
||||
|
||||
// 创建解码任务
|
||||
err = audio_decoder_task_create(&decode_task, "audio_dec");
|
||||
|
||||
@ -676,8 +706,8 @@ int audio_dec_init()
|
||||
decode_task.occupy.pend_time = 1;
|
||||
decode_task.occupy.idle_expect = 4;
|
||||
decode_task.occupy.trace_period = 200;
|
||||
//decode_task.occupy.trace_hdl = audio_dec_occupy_trace_hdl;
|
||||
#endif/*TCFG_AUDIO_DECODER_OCCUPY_TRACE*/
|
||||
// decode_task.occupy.trace_hdl = audio_dec_occupy_trace_hdl;
|
||||
#endif /*TCFG_AUDIO_DECODER_OCCUPY_TRACE*/
|
||||
|
||||
#if TCFG_AUDIO_DEC_OUT_TASK
|
||||
audio_decoder_out_task_create(&decode_task, "audio_out");
|
||||
@ -704,7 +734,8 @@ int audio_dec_init()
|
||||
/*硬件SRC模块滤波器buffer设置,可根据最大使用数量设置整体buffer*/
|
||||
audio_src_base_filt_init(audio_src_hw_filt, sizeof(audio_src_hw_filt));
|
||||
|
||||
if (!AUDIO_DEC_MIXER_EN) {
|
||||
if (!AUDIO_DEC_MIXER_EN)
|
||||
{
|
||||
#if AUDIO_OUTPUT_INCLUDE_DAC
|
||||
// 创建dac通道
|
||||
audio_dac_new_channel(&dac_hdl, &default_dac);
|
||||
@ -724,11 +755,12 @@ int audio_dec_init()
|
||||
audio_mixer_set_event_handler(&mixer, mixer_event_handler);
|
||||
// 使能mixer采样率检测
|
||||
audio_mixer_set_check_sr_handler(&mixer, audio_mixer_check_sr);
|
||||
if (config_mixer_en) {
|
||||
if (config_mixer_en)
|
||||
{
|
||||
/*初始化mix_buf的长度*/
|
||||
audio_mixer_set_output_buf(&mixer, mix_buff, sizeof(mix_buff));
|
||||
#ifdef CONFIG_MIXER_CYCLIC
|
||||
#define MIXER_MIN_LEN (128*4*2)
|
||||
#define MIXER_MIN_LEN (128 * 4 * 2)
|
||||
// 设置mixer最小输出长度
|
||||
audio_mixer_set_min_len(&mixer, sizeof(mix_buff) < (MIXER_MIN_LEN * 2) ? (sizeof(mix_buff) / 2) : MIXER_MIN_LEN);
|
||||
#if (SOUNDCARD_ENABLE)
|
||||
@ -748,7 +780,8 @@ int audio_dec_init()
|
||||
audio_mixer_set_channel_num(&mixer, ch_num);
|
||||
// 检测音频输出采样率是否为固定输出
|
||||
u32 sr = audio_output_nor_rate();
|
||||
if (sr) {
|
||||
if (sr)
|
||||
{
|
||||
// 固定采样率输出
|
||||
audio_mixer_set_sample_rate(&mixer, MIXER_SR_SPEC, sr);
|
||||
}
|
||||
@ -763,9 +796,10 @@ int audio_dec_init()
|
||||
|
||||
struct audio_stream_entry *entries[8] = {NULL};
|
||||
|
||||
#if defined(TCFG_EQ_DIVIDE_ENABLE)&&(!TCFG_EQ_DIVIDE_ENABLE)// && (!defined(CONFIG_MIXER_CYCLIC))
|
||||
#if defined(TCFG_EQ_DIVIDE_ENABLE) && (!TCFG_EQ_DIVIDE_ENABLE) // && (!defined(CONFIG_MIXER_CYCLIC))
|
||||
|
||||
if (ch_num <= 2) {
|
||||
if (ch_num <= 2)
|
||||
{
|
||||
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
||||
mix_ch_switch = channel_switch_open(AUDIO_CH_QUAD, AUDIO_SYNTHESIS_LEN / 2);
|
||||
#endif
|
||||
@ -778,33 +812,32 @@ int audio_dec_init()
|
||||
#endif
|
||||
|
||||
#if AUDIO_SPECTRUM_CONFIG
|
||||
//频响能量值获取接口
|
||||
// 频响能量值获取接口
|
||||
spec_hdl = spectrum_open_demo(sr, ch_num);
|
||||
#endif
|
||||
|
||||
#if AUDIO_EQUALLOUDNESS_CONFIG
|
||||
if (ch_num != 4) {
|
||||
if (ch_num != 4)
|
||||
{
|
||||
loudness_open_parm parm = {0};
|
||||
parm.sr = sr;
|
||||
parm.ch_num = ch_num;
|
||||
parm.threadhold_vol = LOUDNESS_THREADHOLD_VOL;
|
||||
parm.vol_cb = vol_get_test;
|
||||
loudness = audio_equal_loudness_open(&parm);//不支持四声道
|
||||
loudness = audio_equal_loudness_open(&parm); // 不支持四声道
|
||||
}
|
||||
#endif
|
||||
|
||||
#if AUDIO_VOCAL_REMOVE_EN
|
||||
mix_vocal_remove_hdl = vocal_remove_open(ch_num);
|
||||
|
||||
u8 dac_connect_mode = app_audio_output_mode_get();
|
||||
if ((dac_connect_mode == DAC_OUTPUT_MONO_L)
|
||||
|| (dac_connect_mode == DAC_OUTPUT_MONO_R)
|
||||
|| (dac_connect_mode == DAC_OUTPUT_MONO_LR_DIFF)) {
|
||||
u8 dac_connect_mode = app_audio_output_mode_get();
|
||||
if ((dac_connect_mode == DAC_OUTPUT_MONO_L) || (dac_connect_mode == DAC_OUTPUT_MONO_R) || (dac_connect_mode == DAC_OUTPUT_MONO_LR_DIFF))
|
||||
{
|
||||
vocal_remove_mix_ch_switch = channel_switch_open(AUDIO_CH_DIFF, 512);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
// 数据流串联。可以在mixer和last中间添加其他的数据流,比如eq等
|
||||
u8 entry_cnt = 0;
|
||||
entries[entry_cnt++] = &mixer.entry;
|
||||
@ -813,38 +846,42 @@ int audio_dec_init()
|
||||
audio_phase_inver_hdl.entry.data_process_len = audio_phase_inver_output_data_process_len;
|
||||
audio_phase_inver_hdl.entry.data_handler = audio_phase_inver_data_handler;
|
||||
entries[entry_cnt++] = &(audio_phase_inver_hdl.entry);
|
||||
#endif/*TCFG_DIG_PHASE_INVERTER_EN*/
|
||||
#endif /*TCFG_DIG_PHASE_INVERTER_EN*/
|
||||
|
||||
#if AUDIO_EQUALLOUDNESS_CONFIG
|
||||
if (loudness) {
|
||||
if (loudness)
|
||||
{
|
||||
entries[entry_cnt++] = &loudness->loudness->entry;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (TCFG_AUDIO_DAC_CONNECT_MODE == DAC_OUTPUT_FRONT_LR_REAR_LR)
|
||||
#if !TCFG_EQ_DIVIDE_ENABLE
|
||||
if (mix_ch_switch) {
|
||||
if (mix_ch_switch)
|
||||
{
|
||||
entries[entry_cnt++] = &mix_ch_switch->entry;
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#if AUDIO_SPECTRUM_CONFIG
|
||||
if (spec_hdl) {
|
||||
if (spec_hdl)
|
||||
{
|
||||
entries[entry_cnt++] = &spec_hdl->entry;
|
||||
}
|
||||
#endif
|
||||
|
||||
#if AUDIO_VOCAL_REMOVE_EN
|
||||
if (mix_vocal_remove_hdl) {
|
||||
if (mix_vocal_remove_hdl)
|
||||
{
|
||||
entries[entry_cnt++] = &mix_vocal_remove_hdl->entry;
|
||||
}
|
||||
if (vocal_remove_mix_ch_switch) {
|
||||
if (vocal_remove_mix_ch_switch)
|
||||
{
|
||||
entries[entry_cnt++] = &vocal_remove_mix_ch_switch->entry;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#if AUDIO_OUTPUT_AUTOMUTE
|
||||
entries[entry_cnt++] = mix_out_automute_entry;
|
||||
#endif
|
||||
@ -870,7 +907,6 @@ int audio_dec_init()
|
||||
entry_cnt++;
|
||||
#endif
|
||||
|
||||
|
||||
#if (AUDIO_OUTPUT_INCLUDE_IIS)
|
||||
audio_dig_vol_param iis_digvol_last_param = {
|
||||
.vol_start = app_var.music_volume,
|
||||
@ -890,14 +926,15 @@ int audio_dec_init()
|
||||
entries[entry_cnt++] = iis_entries_start;
|
||||
entries[entry_cnt++] = iis_digvol_last_entry;
|
||||
entries[entry_cnt++] = iis_last_entry;
|
||||
for (int i = 0; i < entry_cnt - 1; i++) {
|
||||
for (int i = 0; i < entry_cnt - 1; i++)
|
||||
{
|
||||
audio_stream_add_entry(entries[i], entries[i + 1]);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if (AUDIO_OUTPUT_WAY == AUDIO_OUTPUT_WAY_BT)
|
||||
// 蓝牙发射。从倒数第二个节点分流
|
||||
extern int audio_data_set_zero(struct audio_stream_entry * entry, struct audio_data_frame * data_buf);
|
||||
extern int audio_data_set_zero(struct audio_stream_entry * entry, struct audio_data_frame * data_buf);
|
||||
default_dac.entry.prob_handler = audio_data_set_zero;
|
||||
audio_dig_vol_param bt_digvol_last_param = {
|
||||
.vol_start = app_var.music_volume,
|
||||
@ -936,7 +973,8 @@ int audio_dec_init()
|
||||
entries[entry_cnt++] = fmtx_entries_start;
|
||||
entries[entry_cnt++] = fmtx_digvol_last_entry;
|
||||
entries[entry_cnt++] = fmtx_last_entry;
|
||||
for (int i = 0; i < entry_cnt - 1; i++) {
|
||||
for (int i = 0; i < entry_cnt - 1; i++)
|
||||
{
|
||||
audio_stream_add_entry(entries[i], entries[i + 1]);
|
||||
}
|
||||
#endif
|
||||
@ -946,8 +984,7 @@ __mixer_init_end:
|
||||
#if (RECORDER_MIX_EN)
|
||||
// 录音
|
||||
recorder_mix_init(&recorder_mixer, recorder_mix_buff, sizeof(recorder_mix_buff));
|
||||
#endif//RECORDER_MIX_EN
|
||||
|
||||
#endif // RECORDER_MIX_EN
|
||||
|
||||
// 音频音量初始化
|
||||
app_audio_volume_init();
|
||||
@ -973,7 +1010,7 @@ __mixer_init_end:
|
||||
|
||||
#if TCFG_AUDIO_CONFIG_TRACE
|
||||
sys_timer_add(NULL, audio_config_trace, 3000);
|
||||
#endif/*TCFG_AUDIO_CONFIG_TRACE*/
|
||||
#endif /*TCFG_AUDIO_CONFIG_TRACE*/
|
||||
|
||||
return err;
|
||||
}
|
||||
@ -991,9 +1028,10 @@ static u8 audio_dec_init_complete()
|
||||
/*不支持Audio功能,返回idle*/
|
||||
#if (defined TCFG_AUDIO_ENABLE && (TCFG_AUDIO_ENABLE == 0))
|
||||
return 1;
|
||||
#endif/*TCFG_AUDIO_ENABLE*/
|
||||
#endif /*TCFG_AUDIO_ENABLE*/
|
||||
|
||||
if (!audio_dec_inited) {
|
||||
if (!audio_dec_inited)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -1004,13 +1042,20 @@ REGISTER_LP_TARGET(audio_dec_init_lp_target) = {
|
||||
.is_idle = audio_dec_init_complete,
|
||||
};
|
||||
|
||||
|
||||
|
||||
#if AUDIO_OUTPUT_AUTOMUTE
|
||||
#include "kt.h"
|
||||
|
||||
void audio_mix_out_automute_mute(u8 mute)
|
||||
{
|
||||
printf(">>>>>>>>>>>>>>>>>>>> %s\n", mute ? ("MUTE") : ("UNMUTE"));
|
||||
// printf(">>>>>>>>>>>>>>>>>>>> %s\n", mute ? ("MUTE") : ("UNMUTE"));
|
||||
if (mute)
|
||||
{
|
||||
PA_MUTE();
|
||||
}
|
||||
else
|
||||
{
|
||||
PA_UNMUTE();
|
||||
}
|
||||
}
|
||||
|
||||
/* #define AUDIO_E_DET_UNMUTE (0x00) */
|
||||
@ -1018,9 +1063,12 @@ void audio_mix_out_automute_mute(u8 mute)
|
||||
void mix_out_automute_handler(u8 event, u8 ch)
|
||||
{
|
||||
printf(">>>> ch:%d %s\n", ch, event ? ("MUTE") : ("UNMUTE"));
|
||||
if (ch == app_audio_output_channel_get()) {
|
||||
if (ch == app_audio_output_channel_get())
|
||||
{
|
||||
audio_mix_out_automute_mute(event);
|
||||
} else {
|
||||
}
|
||||
else
|
||||
{
|
||||
#if DAC_AUTO_HIGH_Z_EN
|
||||
app_audio_output_ch_mute(BIT(ch), event);
|
||||
#endif
|
||||
@ -1030,7 +1078,8 @@ void mix_out_automute_handler(u8 event, u8 ch)
|
||||
void mix_out_automute_skip(u8 skip)
|
||||
{
|
||||
u8 mute = !skip;
|
||||
if (mix_out_automute_hdl) {
|
||||
if (mix_out_automute_hdl)
|
||||
{
|
||||
audio_energy_detect_skip(mix_out_automute_hdl, 0xFFFF, skip);
|
||||
audio_mix_out_automute_mute(mute);
|
||||
}
|
||||
@ -1038,7 +1087,8 @@ void mix_out_automute_skip(u8 skip)
|
||||
|
||||
void mix_out_automute_open()
|
||||
{
|
||||
if (mix_out_automute_hdl) {
|
||||
if (mix_out_automute_hdl)
|
||||
{
|
||||
printf("mix_out_automute is already open !\n");
|
||||
return;
|
||||
}
|
||||
@ -1062,12 +1112,12 @@ void mix_out_automute_open()
|
||||
|
||||
void mix_out_automute_close()
|
||||
{
|
||||
if (mix_out_automute_hdl) {
|
||||
if (mix_out_automute_hdl)
|
||||
{
|
||||
audio_energy_detect_close(mix_out_automute_hdl);
|
||||
}
|
||||
}
|
||||
#endif //#if AUDIO_OUTPUT_AUTOMUTE
|
||||
|
||||
#endif // #if AUDIO_OUTPUT_AUTOMUTE
|
||||
|
||||
/*****************************************************************************
|
||||
*
|
||||
@ -1092,7 +1142,8 @@ void *sys_digvol_group = NULL;
|
||||
|
||||
int sys_digvol_group_open(void)
|
||||
{
|
||||
if (sys_digvol_group == NULL) {
|
||||
if (sys_digvol_group == NULL)
|
||||
{
|
||||
sys_digvol_group = audio_dig_vol_group_open();
|
||||
return 0;
|
||||
}
|
||||
@ -1101,7 +1152,8 @@ int sys_digvol_group_open(void)
|
||||
|
||||
int sys_digvol_group_close(void)
|
||||
{
|
||||
if (sys_digvol_group != NULL) {
|
||||
if (sys_digvol_group != NULL)
|
||||
{
|
||||
return audio_dig_vol_group_close(sys_digvol_group);
|
||||
}
|
||||
return -1;
|
||||
@ -1120,21 +1172,22 @@ u16 __attribute__((weak)) get_ch_digvol_start(char *logo)
|
||||
return get_max_sys_vol();
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************
|
||||
* Function name : sys_digvol_group_ch_open
|
||||
* Description : 解码通道数字音量打开且加入分组管理
|
||||
* Parameter :
|
||||
* @logo 解码通道的标识
|
||||
* @vol_start 解码通道数字音量启动等级, 传 -1 时会调用 get_ch_digvol_start 获取
|
||||
* Return : digvol audio stream entry
|
||||
*******************************************************/
|
||||
* Function name : sys_digvol_group_ch_open
|
||||
* Description : 解码通道数字音量打开且加入分组管理
|
||||
* Parameter :
|
||||
* @logo 解码通道的标识
|
||||
* @vol_start 解码通道数字音量启动等级, 传 -1 时会调用 get_ch_digvol_start 获取
|
||||
* Return : digvol audio stream entry
|
||||
*******************************************************/
|
||||
void *sys_digvol_group_ch_open(char *logo, int vol_start, audio_dig_vol_param *parm)
|
||||
{
|
||||
if (sys_digvol_group == NULL || logo == NULL) {
|
||||
if (sys_digvol_group == NULL || logo == NULL)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
if (vol_start == -1) {
|
||||
if (vol_start == -1)
|
||||
{
|
||||
vol_start = get_ch_digvol_start(logo);
|
||||
}
|
||||
audio_dig_vol_param temp_digvol_param = {
|
||||
@ -1146,11 +1199,13 @@ void *sys_digvol_group_ch_open(char *logo, int vol_start, audio_dig_vol_param *p
|
||||
.fade_gain_step = 10,
|
||||
.vol_list = NULL,
|
||||
};
|
||||
if (parm == NULL) {
|
||||
if (parm == NULL)
|
||||
{
|
||||
parm = &temp_digvol_param;
|
||||
}
|
||||
void *digvol_hdl = audio_dig_vol_open(parm);
|
||||
if (digvol_hdl) {
|
||||
if (digvol_hdl)
|
||||
{
|
||||
audio_dig_vol_group_add(sys_digvol_group, digvol_hdl, logo);
|
||||
return audio_dig_vol_entry_get(digvol_hdl);
|
||||
}
|
||||
@ -1159,20 +1214,21 @@ void *sys_digvol_group_ch_open(char *logo, int vol_start, audio_dig_vol_param *p
|
||||
|
||||
int sys_digvol_group_ch_close(char *logo)
|
||||
{
|
||||
if (sys_digvol_group == NULL || logo == NULL) {
|
||||
if (sys_digvol_group == NULL || logo == NULL)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
void *hdl = audio_dig_vol_group_hdl_get(sys_digvol_group, logo);
|
||||
|
||||
if (hdl != NULL) {
|
||||
if (hdl != NULL)
|
||||
{
|
||||
void *entry = audio_dig_vol_entry_get(hdl);
|
||||
if (entry != NULL) {
|
||||
if (entry != NULL)
|
||||
{
|
||||
audio_stream_del_entry(entry);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
audio_dig_vol_close(audio_dig_vol_group_hdl_get(sys_digvol_group, logo));
|
||||
audio_dig_vol_group_del(sys_digvol_group, logo);
|
||||
return 0;
|
||||
@ -1180,7 +1236,6 @@ int sys_digvol_group_ch_close(char *logo)
|
||||
|
||||
#endif // SYS_DIGVOL_GROUP_EN
|
||||
|
||||
|
||||
#if AUDIO_VOCAL_REMOVE_EN
|
||||
/*----------------------------------------------------------------------------*/
|
||||
/**@brief 人声消除打开例子
|
||||
@ -1206,12 +1261,11 @@ void *vocal_remove_open(u8 ch_num)
|
||||
/*----------------------------------------------------------------------------*/
|
||||
void vocal_remove_close()
|
||||
{
|
||||
if (mix_vocal_remove_hdl) {
|
||||
if (mix_vocal_remove_hdl)
|
||||
{
|
||||
audio_vocal_remove_close(mix_vocal_remove_hdl);
|
||||
mix_vocal_remove_hdl = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
@ -24,48 +24,7 @@ pcm_decoder
|
||||
|
||||
|
||||
mp3_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
wma_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
flac_decoder
|
||||
|
||||
|
||||
|
||||
ape_decoder
|
||||
|
||||
|
||||
|
||||
m4a_decoder
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
alac_decoder
|
||||
|
||||
|
||||
|
||||
amr_decoder
|
||||
|
||||
|
||||
|
||||
dts_decoder
|
||||
|
||||
|
||||
|
||||
g729_decoder
|
||||
wav_decoder
|
||||
cvsd_encoder
|
||||
|
||||
|
||||
@ -74,19 +33,11 @@ msbc_encoder
|
||||
|
||||
|
||||
|
||||
mp3_encoder
|
||||
|
||||
|
||||
|
||||
|
||||
g726_encoder
|
||||
|
||||
|
||||
|
||||
adpcm_encoder
|
||||
|
||||
|
||||
|
||||
pcm_encoder
|
||||
sbc_encoder
|
||||
|
||||
|
||||
|
||||
Binary file not shown.
Binary file not shown.
1
cpu/br23/tools/cfg_tool_state_complete.lua
Normal file
1
cpu/br23/tools/cfg_tool_state_complete.lua
Normal file
File diff suppressed because one or more lines are too long
1
cpu/br23/tools/download/standard/KTS-AC69xx_5458.key
Normal file
1
cpu/br23/tools/download/standard/KTS-AC69xx_5458.key
Normal file
@ -0,0 +1 @@
|
||||
44b10a8a9a97a7ea8795ce48fe8bb180954fc20c5763ded5954fc20c5763ded5399f4f1d
|
||||
Binary file not shown.
Binary file not shown.
@ -13,13 +13,13 @@ copy ..\..\ota_all.bin .
|
||||
copy ..\..\ota_nor.bin .
|
||||
|
||||
|
||||
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1
|
||||
..\..\isd_download.exe -tonorflash -dev br23 -boot 0x12000 -div8 -wait 300 -uboot uboot.boot -app app.bin -res tone.cfg cfg_tool.bin eq_cfg_hw.bin -format all %1 -key KTS-AC69xx_5458.key
|
||||
:: -format all
|
||||
::-reboot 2500
|
||||
|
||||
|
||||
|
||||
@rem 删除临时文件-format all
|
||||
@rem ɾ<EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD>ļ<EFBFBD>-format all
|
||||
if exist *.mp3 del *.mp3
|
||||
if exist *.PIX del *.PIX
|
||||
if exist *.TAB del *.TAB
|
||||
@ -28,13 +28,13 @@ if exist *.sty del *.sty
|
||||
|
||||
|
||||
|
||||
@rem 生成固件升级文件
|
||||
@rem <EFBFBD><EFBFBD><EFBFBD>ɹ̼<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
copy ota_all.bin ota.bin
|
||||
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_all.fw
|
||||
copy ota_nor.bin ota.bin
|
||||
..\..\fw_add.exe -noenc -fw jl_isd.fw -add ota.bin -type 100 -out jl_isd_nor.fw
|
||||
|
||||
@rem 添加配置脚本的版本信息到 FW 文件中
|
||||
@rem <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ýű<EFBFBD><EFBFBD>İ汾<EFBFBD><EFBFBD>Ϣ<EFBFBD><EFBFBD> FW <20>ļ<EFBFBD><C4BC><EFBFBD>
|
||||
..\..\fw_add.exe -noenc -fw jl_isd_all.fw -add script.ver -out jl_isd_all.fw
|
||||
..\..\fw_add.exe -noenc -fw jl_isd_nor.fw -add script.ver -out jl_isd_nor.fw
|
||||
|
||||
@ -48,16 +48,16 @@ copy jl_isd_all.fw jl_isd.fw
|
||||
del jl_isd_all.ufw jl_isd_nor.ufw jl_isd_all.fw jl_isd_nor.fw
|
||||
|
||||
|
||||
@REM 生成配置文件升级文件
|
||||
@REM <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD>
|
||||
::ufw_maker.exe -chip AC800X %ADD_KEY% -output config.ufw -res bt_cfg.cfg
|
||||
|
||||
::IF EXIST jl_696x.bin del jl_696x.bin
|
||||
|
||||
|
||||
@rem 常用命令说明
|
||||
@rem -format vm //擦除VM 区域
|
||||
@rem -format cfg //擦除BT CFG 区域
|
||||
@rem -format 0x3f0-2 //表示从第 0x3f0 个 sector 开始连续擦除 2 个 sector(第一个参数为16进制或10进制都可,第二个参数必须是10进制)
|
||||
@rem <EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><EFBFBD>
|
||||
@rem -format vm //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>VM <20><><EFBFBD><EFBFBD>
|
||||
@rem -format cfg //<EFBFBD><EFBFBD><EFBFBD><EFBFBD>BT CFG <20><><EFBFBD><EFBFBD>
|
||||
@rem -format 0x3f0-2 //<EFBFBD><EFBFBD>ʾ<EFBFBD>ӵ<EFBFBD> 0x3f0 <20><> sector <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> 2 <20><> sector(<28><>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϊ16<31><36><EFBFBD>ƻ<EFBFBD>10<31><30><EFBFBD>ƶ<EFBFBD><C6B6>ɣ<EFBFBD><C9A3>ڶ<EFBFBD><DAB6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>10<31><30><EFBFBD><EFBFBD>)
|
||||
|
||||
ping /n 2 127.1>null
|
||||
IF EXIST null del null
|
||||
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
BIN
tone/MP05/bt.mp3
Normal file
BIN
tone/MP05/bt.mp3
Normal file
Binary file not shown.
BIN
tone/MP05/bt.wtg
Normal file
BIN
tone/MP05/bt.wtg
Normal file
Binary file not shown.
BIN
tone/MP05/bt_conn.mp3
Normal file
BIN
tone/MP05/bt_conn.mp3
Normal file
Binary file not shown.
BIN
tone/MP05/bt_conn.wtg
Normal file
BIN
tone/MP05/bt_conn.wtg
Normal file
Binary file not shown.
BIN
tone/MP05/bt_dconn.mp3
Normal file
BIN
tone/MP05/bt_dconn.mp3
Normal file
Binary file not shown.
BIN
tone/MP05/bt_dconn.wtg
Normal file
BIN
tone/MP05/bt_dconn.wtg
Normal file
Binary file not shown.
BIN
tone/MP05/power_off.mp3
Normal file
BIN
tone/MP05/power_off.mp3
Normal file
Binary file not shown.
BIN
tone/MP05/power_off.wtg
Normal file
BIN
tone/MP05/power_off.wtg
Normal file
Binary file not shown.
BIN
tone/MP05/power_on.mp3
Normal file
BIN
tone/MP05/power_on.mp3
Normal file
Binary file not shown.
BIN
tone/MP05/power_on.wtg
Normal file
BIN
tone/MP05/power_on.wtg
Normal file
Binary file not shown.
Loading…
Reference in New Issue
Block a user