Merge pull request #33 from pine64/developer-comforts
Developer comforts part 1
This commit is contained in:
commit
8a7e040fc7
|
@ -0,0 +1 @@
|
||||||
|
BasedOnStyle: LLVM
|
|
@ -0,0 +1,17 @@
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on: [push, pull_request]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build-firmware:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
container:
|
||||||
|
image: ghcr.io/pine64/openpinebuds:latest-sdk
|
||||||
|
steps:
|
||||||
|
- name: Build the main firmware
|
||||||
|
run: cd /usr/src/ && ./build.sh || cat /usr/src/log.txt
|
||||||
|
|
||||||
|
- name: Archive produced firmware
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
path: /usr/src/out/open_source/open_source.bin
|
|
@ -31,6 +31,7 @@ RUN apt-get update \
|
||||||
bzip2 \
|
bzip2 \
|
||||||
curl \
|
curl \
|
||||||
ffmpeg \
|
ffmpeg \
|
||||||
|
clang-format \
|
||||||
git \
|
git \
|
||||||
make \
|
make \
|
||||||
tar \
|
tar \
|
||||||
|
|
25
Makefile
25
Makefile
|
@ -1037,7 +1037,32 @@ endif
|
||||||
|
|
||||||
PHONY += FORCE
|
PHONY += FORCE
|
||||||
FORCE: ;
|
FORCE: ;
|
||||||
|
### Formatting
|
||||||
|
ALL_SOURCE = $(shell find . \( -type f \( -name '*.c' -o -name '*.cpp' \) \) )
|
||||||
|
|
||||||
|
|
||||||
|
style:
|
||||||
|
@for src in $(ALL_SOURCE) $(ALL_INCLUDES); do \
|
||||||
|
echo "Formatting $$src..." ; \
|
||||||
|
clang-format -i "$$src" ; \
|
||||||
|
done
|
||||||
|
@echo "Done"
|
||||||
|
|
||||||
|
check-style:
|
||||||
|
@for src in $(ALL_SOURCE) $(ALL_INCLUDES) ; do \
|
||||||
|
var=`clang-format "$$src" | diff "$$src" - | wc -l` ; \
|
||||||
|
if [ $$var -ne 0 ] ; then \
|
||||||
|
echo "$$src does not respect the coding style (diff: $$var lines)" ; \
|
||||||
|
clang-format "$$src" | diff "$$src" -; \
|
||||||
|
exit 1 ; \
|
||||||
|
fi ; \
|
||||||
|
done
|
||||||
|
@echo "Style check passed"
|
||||||
|
|
||||||
|
|
||||||
|
PHONY += style check-style
|
||||||
|
|
||||||
# Declare the contents of the .PHONY variable as phony. We keep that
|
# Declare the contents of the .PHONY variable as phony. We keep that
|
||||||
# information in a variable so we can use it in if_changed and friends.
|
# information in a variable so we can use it in if_changed and friends.
|
||||||
.PHONY: $(PHONY)
|
.PHONY: $(PHONY)
|
||||||
|
|
||||||
|
|
|
@ -17,13 +17,13 @@
|
||||||
#define __ANC_WNR_H__
|
#define __ANC_WNR_H__
|
||||||
|
|
||||||
// #include "plat_types.h"
|
// #include "plat_types.h"
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
ANC_WNR_OPEN_MODE_STANDALONE = 0,
|
ANC_WNR_OPEN_MODE_STANDALONE = 0,
|
||||||
ANC_WNR_OPEN_MODE_CONFIGURE,
|
ANC_WNR_OPEN_MODE_CONFIGURE,
|
||||||
|
|
||||||
|
@ -32,8 +32,7 @@ typedef enum
|
||||||
|
|
||||||
void anc_release_gain(void);
|
void anc_release_gain(void);
|
||||||
|
|
||||||
typedef enum
|
typedef enum {
|
||||||
{
|
|
||||||
APP_WNR_NOTIFY_DETECT_RESULT,
|
APP_WNR_NOTIFY_DETECT_RESULT,
|
||||||
APP_WNR_REQUEST_DETECT_RESULT,
|
APP_WNR_REQUEST_DETECT_RESULT,
|
||||||
APP_WNR_RESPONSE_DETECT_RESULT,
|
APP_WNR_RESPONSE_DETECT_RESULT,
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/***************************************************************************
|
/***************************************************************************
|
||||||
*
|
*
|
||||||
* Copyright 2015-2019 BES.
|
* Copyright 2015-2019 BES.
|
||||||
|
@ -17,32 +16,26 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "anc_assist.h"
|
#include "anc_assist.h"
|
||||||
#include "hal_trace.h"
|
#include "anc_assist_algo.h"
|
||||||
|
#include "anc_process.h"
|
||||||
#include "arm_math.h"
|
#include "arm_math.h"
|
||||||
#include "audio_dump.h"
|
#include "audio_dump.h"
|
||||||
#include "speech_cfg.h"
|
|
||||||
#include "anc_process.h"
|
|
||||||
#include "audioflinger.h"
|
#include "audioflinger.h"
|
||||||
#include "anc_assist_algo.h"
|
|
||||||
#include "hal_codec.h"
|
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "hal_aud.h"
|
#include "hal_aud.h"
|
||||||
|
#include "hal_codec.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "speech_cfg.h"
|
||||||
|
#include "speech_memory.h"
|
||||||
|
#include "speech_ssat.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include "hal_aud.h"
|
|
||||||
#include "anc_process.h"
|
|
||||||
#include "anc_assist_algo.h"
|
|
||||||
#include "speech_memory.h"
|
|
||||||
#include "speech_ssat.h"
|
|
||||||
|
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
||||||
#include "main_classify.h"
|
#include "main_classify.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static void _close_mic_anc_assist();
|
static void _close_mic_anc_assist();
|
||||||
static void _open_mic_anc_assist();
|
static void _open_mic_anc_assist();
|
||||||
#define _SAMPLE_RATE (16000)
|
#define _SAMPLE_RATE (16000)
|
||||||
|
@ -72,62 +65,62 @@ int MIC_MAP = 0;
|
||||||
#define _PLAY_SAMPLE_RATE (8000)
|
#define _PLAY_SAMPLE_RATE (8000)
|
||||||
#define _PLAY_FRAME_LEN (80)
|
#define _PLAY_FRAME_LEN (80)
|
||||||
#define AF_PLAY_STREAM_BUFF_SIZE (_PLAY_FRAME_LEN * SAMPLE_BYTES * 1 * 2)
|
#define AF_PLAY_STREAM_BUFF_SIZE (_PLAY_FRAME_LEN * SAMPLE_BYTES * 1 * 2)
|
||||||
static uint8_t __attribute__((aligned(4))) af_play_stream_buff[AF_PLAY_STREAM_BUFF_SIZE];
|
static uint8_t __attribute__((aligned(4)))
|
||||||
|
af_play_stream_buff[AF_PLAY_STREAM_BUFF_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
||||||
ClassifyState * NoiseClassify_st = NULL;
|
ClassifyState *NoiseClassify_st = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED) || defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED) || defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED) || defined(ANC_ASSIST_HESS_ENABLED) || \
|
||||||
|
defined(ANC_ASSIST_PNC_ENABLED) || \
|
||||||
|
defined(ANC_ASSIST_DEHOWLING_ENABLED) || \
|
||||||
|
defined(ANC_ASSIST_WNR_ENABLED) || \
|
||||||
|
defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
||||||
|
|
||||||
extern const struct_anc_cfg * anc_coef_list_48k[1];
|
extern const struct_anc_cfg *anc_coef_list_48k[1];
|
||||||
void anc_assist_change_curve(int curve_id){
|
void anc_assist_change_curve(int curve_id) {
|
||||||
TRACE(2,"[%s] change anc curve %d",__func__,curve_id);
|
TRACE(2, "[%s] change anc curve %d", __func__, curve_id);
|
||||||
anc_set_cfg(anc_coef_list_48k[0],ANC_FEEDFORWARD,ANC_GAIN_NO_DELAY);
|
anc_set_cfg(anc_coef_list_48k[0], ANC_FEEDFORWARD, ANC_GAIN_NO_DELAY);
|
||||||
anc_set_cfg(anc_coef_list_48k[0],ANC_FEEDBACK,ANC_GAIN_NO_DELAY);
|
anc_set_cfg(anc_coef_list_48k[0], ANC_FEEDBACK, ANC_GAIN_NO_DELAY);
|
||||||
}
|
}
|
||||||
bool audio_engine_tt_is_on(){
|
bool audio_engine_tt_is_on() { return 1; }
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define _tgt_ff_gain (512)
|
#define _tgt_ff_gain (512)
|
||||||
void anc_assist_set_anc_gain(float gain_ch_l, float gain_ch_r,enum ANC_TYPE_T anc_type){
|
void anc_assist_set_anc_gain(float gain_ch_l, float gain_ch_r,
|
||||||
|
enum ANC_TYPE_T anc_type) {
|
||||||
|
|
||||||
TRACE(2,"[%s] set anc gain %d",__func__,(int)(100*gain_ch_l));
|
TRACE(2, "[%s] set anc gain %d", __func__, (int)(100 * gain_ch_l));
|
||||||
uint32_t tgt_ff_gain_l,tgt_ff_gain_r;
|
uint32_t tgt_ff_gain_l, tgt_ff_gain_r;
|
||||||
tgt_ff_gain_l = (uint32_t)(_tgt_ff_gain*gain_ch_l);
|
tgt_ff_gain_l = (uint32_t)(_tgt_ff_gain * gain_ch_l);
|
||||||
tgt_ff_gain_r = (uint32_t)(_tgt_ff_gain*gain_ch_r);
|
tgt_ff_gain_r = (uint32_t)(_tgt_ff_gain * gain_ch_r);
|
||||||
anc_set_gain(tgt_ff_gain_l,tgt_ff_gain_r,anc_type);
|
anc_set_gain(tgt_ff_gain_l, tgt_ff_gain_r, anc_type);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
||||||
static LeakageDetectionState * pilot_st = NULL;
|
static LeakageDetectionState *pilot_st = NULL;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || \
|
||||||
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
||||||
static ANCAssistMultiState * anc_assist_multi_st = NULL;
|
static ANCAssistMultiState *anc_assist_multi_st = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
ANC_ASSIST_MODE_T g_anc_assist_mode = ANC_ASSIST_MODE_QTY;
|
ANC_ASSIST_MODE_T g_anc_assist_mode = ANC_ASSIST_MODE_QTY;
|
||||||
void anc_assist_open(ANC_ASSIST_MODE_T mode){
|
void anc_assist_open(ANC_ASSIST_MODE_T mode) {
|
||||||
g_anc_assist_mode = mode;
|
g_anc_assist_mode = mode;
|
||||||
|
|
||||||
|
// normal init
|
||||||
//normal init
|
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
||||||
pilot_st = LeakageDetection_create(160,0);
|
pilot_st = LeakageDetection_create(160, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || \
|
||||||
anc_assist_multi_st = ANCAssistMulti_create(_SAMPLE_RATE,_FRAME_LEN,128);
|
defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
||||||
|
anc_assist_multi_st = ANCAssistMulti_create(_SAMPLE_RATE, _FRAME_LEN, 128);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
||||||
|
@ -136,36 +129,27 @@ void anc_assist_open(ANC_ASSIST_MODE_T mode){
|
||||||
|
|
||||||
// audio_dump_init(160,sizeof(short),3);
|
// audio_dump_init(160,sizeof(short),3);
|
||||||
|
|
||||||
|
if (mode == ANC_ASSIST_MODE_QTY) {
|
||||||
if( mode == ANC_ASSIST_MODE_QTY){
|
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else{
|
if (mode == ANC_ASSIST_STANDALONE || mode == ANC_ASSIST_MUSIC) {
|
||||||
if(mode == ANC_ASSIST_STANDALONE || mode == ANC_ASSIST_MUSIC ){
|
|
||||||
_open_mic_anc_assist();
|
_open_mic_anc_assist();
|
||||||
}
|
}
|
||||||
if(mode == ANC_ASSIST_PHONE_8K){
|
if (mode == ANC_ASSIST_PHONE_8K) {
|
||||||
// normal init 8k
|
// normal init 8k
|
||||||
}
|
} else if (mode == ANC_ASSIST_PHONE_16K) {
|
||||||
else if(mode == ANC_ASSIST_PHONE_16K){
|
|
||||||
// normal init 16k
|
// normal init 16k
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void anc_assist_close() {
|
||||||
|
|
||||||
|
|
||||||
void anc_assist_close(){
|
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
||||||
LeakageDetection_destroy(pilot_st);
|
LeakageDetection_destroy(pilot_st);
|
||||||
#endif
|
#endif
|
||||||
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || \
|
||||||
|
defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
||||||
ANCAssistMulti_destroy(anc_assist_multi_st);
|
ANCAssistMulti_destroy(anc_assist_multi_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -175,41 +159,37 @@ void anc_assist_close(){
|
||||||
|
|
||||||
// ext_heap_deinit();
|
// ext_heap_deinit();
|
||||||
|
|
||||||
if( g_anc_assist_mode == ANC_ASSIST_MODE_QTY){
|
if (g_anc_assist_mode == ANC_ASSIST_MODE_QTY) {
|
||||||
return;
|
return;
|
||||||
}
|
} else {
|
||||||
else{
|
if (g_anc_assist_mode == ANC_ASSIST_STANDALONE ||
|
||||||
if(g_anc_assist_mode == ANC_ASSIST_STANDALONE || g_anc_assist_mode == ANC_ASSIST_MUSIC ){
|
g_anc_assist_mode == ANC_ASSIST_MUSIC) {
|
||||||
_close_mic_anc_assist();
|
_close_mic_anc_assist();
|
||||||
}
|
}
|
||||||
if(g_anc_assist_mode == ANC_ASSIST_PHONE_8K){
|
if (g_anc_assist_mode == ANC_ASSIST_PHONE_8K) {
|
||||||
// normal init 8k
|
// normal init 8k
|
||||||
}
|
} else if (g_anc_assist_mode == ANC_ASSIST_PHONE_16K) {
|
||||||
else if(g_anc_assist_mode == ANC_ASSIST_PHONE_16K){
|
|
||||||
// normal init 16k
|
// normal init 16k
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
extern ASSIST_PCM_T ref_buf_data[80];
|
extern ASSIST_PCM_T ref_buf_data[80];
|
||||||
void anc_assist_process(uint8_t * buf, int len){
|
void anc_assist_process(uint8_t *buf, int len) {
|
||||||
|
|
||||||
|
|
||||||
int32_t frame_len = len / SAMPLE_BYTES / MIC_NUM;
|
int32_t frame_len = len / SAMPLE_BYTES / MIC_NUM;
|
||||||
ASSERT(frame_len == _FRAME_LEN, "[%s] frame len(%d) is invalid.", __func__, frame_len);
|
ASSERT(frame_len == _FRAME_LEN, "[%s] frame len(%d) is invalid.", __func__,
|
||||||
|
frame_len);
|
||||||
ASSIST_PCM_T *pcm_buf = (ASSIST_PCM_T *)buf;
|
ASSIST_PCM_T *pcm_buf = (ASSIST_PCM_T *)buf;
|
||||||
|
|
||||||
ASSIST_PCM_T *mic1 = (ASSIST_PCM_T *)af_stream_mic1;
|
ASSIST_PCM_T *mic1 = (ASSIST_PCM_T *)af_stream_mic1;
|
||||||
ASSIST_PCM_T *mic2 = (ASSIST_PCM_T *)af_stream_mic2;
|
ASSIST_PCM_T *mic2 = (ASSIST_PCM_T *)af_stream_mic2;
|
||||||
ASSIST_PCM_T *mic3 = (ASSIST_PCM_T *)af_stream_mic3;
|
ASSIST_PCM_T *mic3 = (ASSIST_PCM_T *)af_stream_mic3;
|
||||||
|
|
||||||
for (int32_t i=0; i<frame_len; i++) {
|
for (int32_t i = 0; i < frame_len; i++) {
|
||||||
mic1[i] = pcm_buf[MIC_NUM*i + 0];
|
mic1[i] = pcm_buf[MIC_NUM * i + 0];
|
||||||
mic2[i] = pcm_buf[MIC_NUM*i + 1];
|
mic2[i] = pcm_buf[MIC_NUM * i + 1];
|
||||||
mic3[i] = pcm_buf[MIC_NUM*i + 2];
|
mic3[i] = pcm_buf[MIC_NUM * i + 2];
|
||||||
}
|
}
|
||||||
// audio_dump_clear_up();
|
// audio_dump_clear_up();
|
||||||
// audio_dump_add_channel_data(0,mic1,160);
|
// audio_dump_add_channel_data(0,mic1,160);
|
||||||
|
@ -218,11 +198,12 @@ void anc_assist_process(uint8_t * buf, int len){
|
||||||
// audio_dump_run();
|
// audio_dump_run();
|
||||||
// TRACE(2,"in callback");
|
// TRACE(2,"in callback");
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
||||||
LeakageDetection_process(pilot_st,AF_ANC_OFF,mic3,ref_buf_data,frame_len);
|
LeakageDetection_process(pilot_st, AF_ANC_OFF, mic3, ref_buf_data, frame_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_PNC_ENABLED) || \
|
||||||
ANCAssistMulti_process(anc_assist_multi_st,mic1,mic2,mic3,frame_len);
|
defined(ANC_ASSIST_DEHOWLING_ENABLED) || defined(ANC_ASSIST_WNR_ENABLED)
|
||||||
|
ANCAssistMulti_process(anc_assist_multi_st, mic1, mic2, mic3, frame_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
#if defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
||||||
|
@ -230,73 +211,48 @@ void anc_assist_process(uint8_t * buf, int len){
|
||||||
classify_process(NoiseClassify_st, mic1, last_classify_res);
|
classify_process(NoiseClassify_st, mic1, last_classify_res);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(g_anc_assist_mode == ANC_ASSIST_PHONE_16K){
|
if (g_anc_assist_mode == ANC_ASSIST_PHONE_16K) {
|
||||||
//down sample
|
// down sample
|
||||||
}
|
}
|
||||||
|
|
||||||
//process fft
|
// process fft
|
||||||
|
|
||||||
// wnr
|
// wnr
|
||||||
|
|
||||||
|
|
||||||
// pnc
|
// pnc
|
||||||
|
|
||||||
|
|
||||||
// hess
|
// hess
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// pilot adpt
|
// pilot adpt
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t anc_assist_callback(uint8_t *buf, uint32_t len) {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static uint32_t anc_assist_callback(uint8_t *buf, uint32_t len){
|
|
||||||
#ifdef TEST_MIPS
|
#ifdef TEST_MIPS
|
||||||
start_ticks = hal_fast_sys_timer_get();
|
start_ticks = hal_fast_sys_timer_get();
|
||||||
#endif
|
#endif
|
||||||
anc_assist_process(buf,len);
|
anc_assist_process(buf, len);
|
||||||
|
|
||||||
#ifdef TEST_MIPS
|
#ifdef TEST_MIPS
|
||||||
end_ticks = hal_fast_sys_timer_get();
|
end_ticks = hal_fast_sys_timer_get();
|
||||||
used_mips = (end_ticks - start_ticks) * 1000 / (start_ticks - pre_ticks);
|
used_mips = (end_ticks - start_ticks) * 1000 / (start_ticks - pre_ticks);
|
||||||
TRACE(2,"[%s] Usage: %d in a thousand (MIPS).", __func__, used_mips);
|
TRACE(2, "[%s] Usage: %d in a thousand (MIPS).", __func__, used_mips);
|
||||||
//wnr_ticks = start_ticks;
|
// wnr_ticks = start_ticks;
|
||||||
//TRACE(2,"[%s] WNR frame takes %d ms.", __func__, FAST_TICKS_TO_MS((start_ticks - pre_ticks)*100));
|
// TRACE(2,"[%s] WNR frame takes %d ms.", __func__,
|
||||||
|
// FAST_TICKS_TO_MS((start_ticks - pre_ticks)*100));
|
||||||
pre_ticks = start_ticks;
|
pre_ticks = start_ticks;
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
||||||
static uint32_t anc_assist_playback_callback(uint8_t *buf, uint32_t len){
|
static uint32_t anc_assist_playback_callback(uint8_t *buf, uint32_t len) {
|
||||||
get_pilot_data(buf,len);
|
get_pilot_data(buf, len);
|
||||||
// TRACE(2,"playing data %d",len);
|
// TRACE(2,"playing data %d",len);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static void _open_mic_anc_assist(void) {
|
||||||
static void _open_mic_anc_assist(void)
|
|
||||||
{
|
|
||||||
|
|
||||||
int anc_assist_mic_num = 0;
|
int anc_assist_mic_num = 0;
|
||||||
|
|
||||||
|
@ -304,82 +260,71 @@ static void _open_mic_anc_assist(void)
|
||||||
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FB_MIC;
|
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FB_MIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_HESS_ENABLED) || defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
#if defined(ANC_ASSIST_HESS_ENABLED) || \
|
||||||
|
defined(ANC_ASSIST_NOISE_ADAPTIVE_ENABLED)
|
||||||
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FF1_MIC;
|
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FF1_MIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_PNC_ENABLED)
|
#if defined(ANC_ASSIST_PNC_ENABLED)
|
||||||
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FF1_MIC | ANC_ASSIST_FB_MIC;
|
anc_assist_mic_num =
|
||||||
|
anc_assist_mic_num | ANC_ASSIST_FF1_MIC | ANC_ASSIST_FB_MIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_DEHOWLING_ENABLED)
|
#if defined(ANC_ASSIST_DEHOWLING_ENABLED)
|
||||||
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FF1_MIC | ANC_ASSIST_FB_MIC;
|
anc_assist_mic_num =
|
||||||
|
anc_assist_mic_num | ANC_ASSIST_FF1_MIC | ANC_ASSIST_FB_MIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_WNR_ENABLED)
|
#if defined(ANC_ASSIST_WNR_ENABLED)
|
||||||
anc_assist_mic_num = anc_assist_mic_num | ANC_ASSIST_FF1_MIC | ANC_ASSIST_FF2_MIC;
|
anc_assist_mic_num =
|
||||||
|
anc_assist_mic_num | ANC_ASSIST_FF1_MIC | ANC_ASSIST_FF2_MIC;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
switch(anc_assist_mic_num){
|
switch (anc_assist_mic_num) {
|
||||||
case(0):
|
case (0): {
|
||||||
{
|
TRACE(2, "[%s] no mic is used", __func__);
|
||||||
TRACE(2,"[%s] no mic is used",__func__);
|
|
||||||
return;
|
return;
|
||||||
}
|
} break;
|
||||||
break;
|
case (1): {
|
||||||
case(1):
|
TRACE(2, "[%s] use fb mic only", __func__);
|
||||||
{
|
|
||||||
TRACE(2,"[%s] use fb mic only",__func__);
|
|
||||||
MIC_NUM = 3;
|
MIC_NUM = 3;
|
||||||
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
||||||
|
|
||||||
}
|
} break;
|
||||||
break;
|
case (4): {
|
||||||
case(4):
|
TRACE(2, "[%s] use ff mic only", __func__);
|
||||||
{
|
|
||||||
TRACE(2,"[%s] use ff mic only",__func__);
|
|
||||||
MIC_NUM = 3;
|
MIC_NUM = 3;
|
||||||
MIC_MAP = AUD_INPUT_PATH_ANC_WNR;
|
MIC_MAP = AUD_INPUT_PATH_ANC_WNR;
|
||||||
|
|
||||||
}
|
} break;
|
||||||
break;
|
case (5): {
|
||||||
case(5):
|
TRACE(2, "[%s] use ff mic and fb mic", __func__);
|
||||||
{
|
|
||||||
TRACE(2,"[%s] use ff mic and fb mic",__func__);
|
|
||||||
MIC_NUM = 3;
|
MIC_NUM = 3;
|
||||||
MIC_MAP = AUD_INPUT_PATH_ANC_WNR;
|
MIC_MAP = AUD_INPUT_PATH_ANC_WNR;
|
||||||
|
|
||||||
}
|
} break;
|
||||||
break;
|
case (6): {
|
||||||
case(6):
|
TRACE(2, "[%s] use ff1 mic and ff2 mic", __func__);
|
||||||
{
|
|
||||||
TRACE(2,"[%s] use ff1 mic and ff2 mic",__func__);
|
|
||||||
MIC_NUM = 2;
|
MIC_NUM = 2;
|
||||||
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
||||||
|
|
||||||
}
|
} break;
|
||||||
break;
|
case (7): {
|
||||||
case(7):
|
TRACE(2, "[%s] use ff1 mic and ff2 mic and fb mic", __func__);
|
||||||
{
|
|
||||||
TRACE(2,"[%s] use ff1 mic and ff2 mic and fb mic",__func__);
|
|
||||||
MIC_NUM = 2;
|
MIC_NUM = 2;
|
||||||
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
||||||
|
|
||||||
}
|
} break;
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
{
|
|
||||||
TRACE(2,"[%s] invalid mic order is used",__func__);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
|
default: {
|
||||||
|
TRACE(2, "[%s] invalid mic order is used", __func__);
|
||||||
|
} break;
|
||||||
}
|
}
|
||||||
|
|
||||||
MIC_NUM = 3;
|
MIC_NUM = 3;
|
||||||
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
MIC_MAP = AUD_INPUT_PATH_AF_ANC;
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
TRACE(1,"[%s] ...", __func__);
|
TRACE(1, "[%s] ...", __func__);
|
||||||
|
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
stream_cfg.channel_num = (enum AUD_CHANNEL_NUM_T)MIC_NUM;
|
stream_cfg.channel_num = (enum AUD_CHANNEL_NUM_T)MIC_NUM;
|
||||||
|
@ -392,21 +337,22 @@ static void _open_mic_anc_assist(void)
|
||||||
stream_cfg.handler = anc_assist_callback;
|
stream_cfg.handler = anc_assist_callback;
|
||||||
stream_cfg.data_size = _FRAME_LEN * SAMPLE_BYTES * 2 * MIC_NUM;
|
stream_cfg.data_size = _FRAME_LEN * SAMPLE_BYTES * 2 * MIC_NUM;
|
||||||
stream_cfg.data_ptr = af_stream_buff;
|
stream_cfg.data_ptr = af_stream_buff;
|
||||||
ASSERT(stream_cfg.channel_num == MIC_NUM, "[%s] channel number(%d) is invalid.", __func__, stream_cfg.channel_num);
|
ASSERT(stream_cfg.channel_num == MIC_NUM,
|
||||||
TRACE(2,"[%s] sample_rate:%d, data_size:%d", __func__, stream_cfg.sample_rate, stream_cfg.data_size);
|
"[%s] channel number(%d) is invalid.", __func__,
|
||||||
TRACE(2,"[%s] af_stream_buff = %p", __func__, af_stream_buff);
|
stream_cfg.channel_num);
|
||||||
|
TRACE(2, "[%s] sample_rate:%d, data_size:%d", __func__,
|
||||||
|
stream_cfg.sample_rate, stream_cfg.data_size);
|
||||||
|
TRACE(2, "[%s] af_stream_buff = %p", __func__, af_stream_buff);
|
||||||
|
|
||||||
af_stream_open(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE, &stream_cfg);
|
af_stream_open(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE, &stream_cfg);
|
||||||
af_stream_start(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE);
|
af_stream_start(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE);
|
||||||
|
|
||||||
|
|
||||||
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
#if defined(ANC_ASSIST_PILOT_ENABLED)
|
||||||
// struct AF_STREAM_CONFIG_T stream_cfg;
|
// struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
TRACE(1,"[%s] set play ...", __func__);
|
TRACE(1, "[%s] set play ...", __func__);
|
||||||
|
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
|
|
||||||
|
|
||||||
stream_cfg.bits = (enum AUD_BITS_T)_SAMPLE_BITS;
|
stream_cfg.bits = (enum AUD_BITS_T)_SAMPLE_BITS;
|
||||||
stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
||||||
stream_cfg.sample_rate = (enum AUD_SAMPRATE_T)_PLAY_SAMPLE_RATE;
|
stream_cfg.sample_rate = (enum AUD_SAMPRATE_T)_PLAY_SAMPLE_RATE;
|
||||||
|
@ -419,26 +365,18 @@ static void _open_mic_anc_assist(void)
|
||||||
stream_cfg.data_ptr = af_play_stream_buff;
|
stream_cfg.data_ptr = af_play_stream_buff;
|
||||||
stream_cfg.data_size = sizeof(af_play_stream_buff);
|
stream_cfg.data_size = sizeof(af_play_stream_buff);
|
||||||
|
|
||||||
|
|
||||||
af_stream_open(ANC_ADPT_STREAM_ID, AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(ANC_ADPT_STREAM_ID, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
af_stream_start(ANC_ADPT_STREAM_ID, AUD_STREAM_PLAYBACK);
|
af_stream_start(ANC_ADPT_STREAM_ID, AUD_STREAM_PLAYBACK);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _close_mic_anc_assist() {
|
||||||
|
TRACE(1, "[%s] ...", __func__);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
static void _close_mic_anc_assist(){
|
|
||||||
TRACE(1,"[%s] ...", __func__);
|
|
||||||
|
|
||||||
af_stream_stop(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE);
|
af_stream_stop(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE);
|
||||||
af_stream_close(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE);
|
af_stream_close(ANC_ADPT_STREAM_ID, AUD_STREAM_CAPTURE);
|
||||||
if(g_anc_assist_mode == ANC_ASSIST_STANDALONE || g_anc_assist_mode == ANC_ASSIST_MUSIC ){
|
if (g_anc_assist_mode == ANC_ASSIST_STANDALONE ||
|
||||||
|
g_anc_assist_mode == ANC_ASSIST_MUSIC) {
|
||||||
// close capture
|
// close capture
|
||||||
}
|
}
|
||||||
// destroy
|
// destroy
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -13,8 +13,8 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "math.h"
|
|
||||||
#include "peak_detector.h"
|
#include "peak_detector.h"
|
||||||
|
#include "math.h"
|
||||||
|
|
||||||
// #define PKD_FACTOR_UP (0.6)
|
// #define PKD_FACTOR_UP (0.6)
|
||||||
// #define PKD_FACTOR_DOWN (2.0)
|
// #define PKD_FACTOR_DOWN (2.0)
|
||||||
|
@ -27,62 +27,59 @@ static float pkd_factor1 = 0.0f;
|
||||||
static float pkd_factor2 = 0.0f;
|
static float pkd_factor2 = 0.0f;
|
||||||
static float pkd_reduce_rate = 1.0f;
|
static float pkd_reduce_rate = 1.0f;
|
||||||
|
|
||||||
#define FABS(x) ( (x) >= 0.f ? (x) : -(x) )
|
#define FABS(x) ((x) >= 0.f ? (x) : -(x))
|
||||||
#define Max(a,b) ((a)>(b) ? (a):(b))
|
#define Max(a, b) ((a) > (b) ? (a) : (b))
|
||||||
|
|
||||||
// Depend on codec_dac_vol
|
// Depend on codec_dac_vol
|
||||||
// const float pkd_vol_multiple[18] = {0.089125, 0.0, 0.005623, 0.007943, 0.011220, 0.015849, 0.022387, 0.031623, 0.044668, 0.063096, 0.089125, 0.125893, 0.177828, 0.251189, 0.354813, 0.501187, 0.707946, 1.000000};
|
// const float pkd_vol_multiple[18] = {0.089125, 0.0, 0.005623, 0.007943,
|
||||||
|
// 0.011220, 0.015849, 0.022387, 0.031623, 0.044668, 0.063096, 0.089125,
|
||||||
|
// 0.125893, 0.177828, 0.251189, 0.354813, 0.501187, 0.707946, 1.000000};
|
||||||
|
|
||||||
// static uint32_t test_num = 0;
|
// static uint32_t test_num = 0;
|
||||||
|
|
||||||
// int app_bt_stream_local_volume_get(void);
|
// int app_bt_stream_local_volume_get(void);
|
||||||
|
|
||||||
// y = 20log(x)
|
// y = 20log(x)
|
||||||
static inline float convert_multiple_to_db(float multiple)
|
static inline float convert_multiple_to_db(float multiple) {
|
||||||
{
|
return 20 * (float)log10(multiple);
|
||||||
return 20*(float)log10(multiple);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// x = 10^(y/20)
|
// x = 10^(y/20)
|
||||||
static inline float convert_db_to_multiple(float db)
|
static inline float convert_db_to_multiple(float db) {
|
||||||
{
|
return (float)pow(10, db / 20);
|
||||||
return (float)pow(10, db/20);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void peak_detector_init(void)
|
void peak_detector_init(void) {
|
||||||
{
|
|
||||||
pkd_alphaR = 0.0f;
|
pkd_alphaR = 0.0f;
|
||||||
pkd_alphaA = 0.0f;
|
pkd_alphaA = 0.0f;
|
||||||
pkd_factor1 = 0.0f;
|
pkd_factor1 = 0.0f;
|
||||||
pkd_factor2 = 0.0f;
|
pkd_factor2 = 0.0f;
|
||||||
pkd_reduce_rate = 1.0f;
|
pkd_reduce_rate = 1.0f;
|
||||||
// TRACE(3,"[%s] pkd_alphaR = %f, pkd_alphaA = %f", __func__, (double)pkd_alphaR, (double)pkd_alphaA);
|
// TRACE(3,"[%s] pkd_alphaR = %f, pkd_alphaA = %f", __func__,
|
||||||
|
// (double)pkd_alphaR, (double)pkd_alphaA);
|
||||||
}
|
}
|
||||||
|
|
||||||
void peak_detector_setup(PEAK_DETECTOR_CFG_T *cfg)
|
void peak_detector_setup(PEAK_DETECTOR_CFG_T *cfg) {
|
||||||
{
|
|
||||||
pkd_samp_bits = cfg->bits;
|
pkd_samp_bits = cfg->bits;
|
||||||
pkd_alphaR = (float)exp(-1/(cfg->factor_down * cfg->fs));
|
pkd_alphaR = (float)exp(-1 / (cfg->factor_down * cfg->fs));
|
||||||
pkd_alphaA = (float)exp(-1/(cfg->factor_up * cfg->fs));
|
pkd_alphaA = (float)exp(-1 / (cfg->factor_up * cfg->fs));
|
||||||
pkd_reduce_rate = convert_db_to_multiple(cfg->reduce_dB);
|
pkd_reduce_rate = convert_db_to_multiple(cfg->reduce_dB);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void peak_detector_run_16bits(int16_t *buf, uint32_t len, float vol_multiple)
|
static void peak_detector_run_16bits(int16_t *buf, uint32_t len,
|
||||||
{
|
float vol_multiple) {
|
||||||
float normal_rate = 1.0;
|
float normal_rate = 1.0;
|
||||||
float tgt_rate = 1.0;
|
float tgt_rate = 1.0;
|
||||||
|
|
||||||
for(uint32_t i = 0; i < len; i++)
|
for (uint32_t i = 0; i < len; i++) {
|
||||||
{
|
|
||||||
pkd_factor1 = Max(buf[i], pkd_alphaR * pkd_factor1);
|
pkd_factor1 = Max(buf[i], pkd_alphaR * pkd_factor1);
|
||||||
pkd_factor2 = pkd_alphaA * pkd_factor2 + (1 - pkd_alphaA) * pkd_factor1;
|
pkd_factor2 = pkd_alphaA * pkd_factor2 + (1 - pkd_alphaA) * pkd_factor1;
|
||||||
|
|
||||||
normal_rate = pkd_factor2/32768;
|
normal_rate = pkd_factor2 / 32768;
|
||||||
|
|
||||||
tgt_rate = pkd_reduce_rate / normal_rate / vol_multiple;
|
tgt_rate = pkd_reduce_rate / normal_rate / vol_multiple;
|
||||||
|
|
||||||
if(tgt_rate > 1.0)
|
if (tgt_rate > 1.0) {
|
||||||
{
|
|
||||||
tgt_rate = 1.0;
|
tgt_rate = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,11 +105,14 @@ static void peak_detector_run_16bits(int16_t *buf, uint32_t len, float vol_multi
|
||||||
// {
|
// {
|
||||||
// test_num = 0;
|
// test_num = 0;
|
||||||
// TRACE(0,"START>>>");
|
// TRACE(0,"START>>>");
|
||||||
// TRACE(2,"vol_level = %d, pkd_vol_multiple = %f", vol_level, pkd_vol_multiple[vol_level]);
|
// TRACE(2,"vol_level = %d, pkd_vol_multiple = %f", vol_level,
|
||||||
// TRACE(3,"buf = %d, pkd_alphaR = %f, pkd_alphaA = %f", buf[len-1], pkd_alphaR, pkd_alphaA);
|
// pkd_vol_multiple[vol_level]); TRACE(3,"buf = %d, pkd_alphaR = %f,
|
||||||
// TRACE(4,"pkd_factor1 = %f, pkd_factor2 = %f, normal_rate = %f, tgt_rate = %f", pkd_factor1, pkd_factor2, normal_rate, tgt_rate);
|
// pkd_alphaA = %f", buf[len-1], pkd_alphaR, pkd_alphaA);
|
||||||
// TRACE(0,"END<<<");
|
// TRACE(4,"pkd_factor1 = %f, pkd_factor2 = %f, normal_rate = %f, tgt_rate =
|
||||||
// // TRACE(7,"[%s] buf = %d, pkd_alphaR = %f, pkd_alphaA = %f, pkd_factor1 = %f, pkd_factor2 = %f, normal_rate = %f", __func__, buf[len-1], pkd_alphaR, pkd_alphaA, pkd_factor1, pkd_factor2, (1.0 - pkd_factor2/32768));
|
// %f", pkd_factor1, pkd_factor2, normal_rate, tgt_rate); TRACE(0,"END<<<");
|
||||||
|
// // TRACE(7,"[%s] buf = %d, pkd_alphaR = %f, pkd_alphaA = %f, pkd_factor1 =
|
||||||
|
// %f, pkd_factor2 = %f, normal_rate = %f", __func__, buf[len-1], pkd_alphaR,
|
||||||
|
// pkd_alphaA, pkd_factor1, pkd_factor2, (1.0 - pkd_factor2/32768));
|
||||||
// }
|
// }
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -139,22 +139,20 @@ static void peak_detector_run_16bits(int16_t *buf, uint32_t len, float vol_multi
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void peak_detector_run_24bits(int32_t *buf, uint32_t len, float vol_multiple)
|
static void peak_detector_run_24bits(int32_t *buf, uint32_t len,
|
||||||
{
|
float vol_multiple) {
|
||||||
float normal_rate = 1.0;
|
float normal_rate = 1.0;
|
||||||
float tgt_rate = 1.0;
|
float tgt_rate = 1.0;
|
||||||
|
|
||||||
for(uint32_t i = 0; i < len; i++)
|
for (uint32_t i = 0; i < len; i++) {
|
||||||
{
|
|
||||||
pkd_factor1 = Max(buf[i], pkd_alphaR * pkd_factor1);
|
pkd_factor1 = Max(buf[i], pkd_alphaR * pkd_factor1);
|
||||||
pkd_factor2 = pkd_alphaA * pkd_factor2 + (1 - pkd_alphaA) * pkd_factor1;
|
pkd_factor2 = pkd_alphaA * pkd_factor2 + (1 - pkd_alphaA) * pkd_factor1;
|
||||||
|
|
||||||
normal_rate = pkd_factor2/32768;
|
normal_rate = pkd_factor2 / 32768;
|
||||||
|
|
||||||
tgt_rate = pkd_reduce_rate / normal_rate / vol_multiple;
|
tgt_rate = pkd_reduce_rate / normal_rate / vol_multiple;
|
||||||
|
|
||||||
if(tgt_rate > 1.0)
|
if (tgt_rate > 1.0) {
|
||||||
{
|
|
||||||
tgt_rate = 1.0;
|
tgt_rate = 1.0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -177,8 +175,7 @@ static void peak_detector_run_24bits(int32_t *buf, uint32_t len, float vol_multi
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void peak_detector_run(uint8_t *buf, uint32_t len, float vol_multiple)
|
void peak_detector_run(uint8_t *buf, uint32_t len, float vol_multiple) {
|
||||||
{
|
|
||||||
// int vol_level = 0;
|
// int vol_level = 0;
|
||||||
|
|
||||||
if (pkd_samp_bits <= AUD_BITS_16) {
|
if (pkd_samp_bits <= AUD_BITS_16) {
|
||||||
|
@ -193,4 +190,3 @@ void peak_detector_run(uint8_t *buf, uint32_t len, float vol_multiple)
|
||||||
|
|
||||||
// vol_level = app_bt_stream_local_volume_get();
|
// vol_level = app_bt_stream_local_volume_get();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,20 +13,20 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_thread.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "app_thread.h"
|
|
||||||
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "app_audtest_pattern.h"
|
#include "app_audtest_pattern.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
|
||||||
#include "hal_aud.h"
|
#include "app_utils.h"
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "audiobuffer.h"
|
#include "audiobuffer.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
#include "eq_export.h"
|
||||||
|
#include "hal_aud.h"
|
||||||
#include "stdbool.h"
|
#include "stdbool.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "eq_export.h"
|
|
||||||
#include "app_utils.h"
|
|
||||||
|
|
||||||
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
||||||
#include "anc_usb_app.h"
|
#include "anc_usb_app.h"
|
||||||
|
@ -66,82 +66,69 @@ static uint8_t ALIGNED4 app_test_recv_buff[USB_AUDIO_RECV_BUFF_SIZE];
|
||||||
static uint8_t ALIGNED4 app_test_send_buff[USB_AUDIO_SEND_BUFF_SIZE];
|
static uint8_t ALIGNED4 app_test_send_buff[USB_AUDIO_SEND_BUFF_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t pcm_1ksin_more_data(uint8_t *buf, uint32_t len)
|
uint32_t pcm_1ksin_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
static uint32_t nextPbufIdx = 0;
|
static uint32_t nextPbufIdx = 0;
|
||||||
uint32_t remain_size = len;
|
uint32_t remain_size = len;
|
||||||
uint32_t curr_size = 0;
|
uint32_t curr_size = 0;
|
||||||
static uint32_t pcm_preIrqTime = 0;;
|
static uint32_t pcm_preIrqTime = 0;
|
||||||
|
;
|
||||||
uint32_t stime = 0;
|
uint32_t stime = 0;
|
||||||
|
|
||||||
|
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
TRACE(3,"pcm_1ksin_more_data irqDur:%d readbuff:0x%08x %d\n ", TICKS_TO_MS(stime - pcm_preIrqTime), buf, len);
|
TRACE(3, "pcm_1ksin_more_data irqDur:%d readbuff:0x%08x %d\n ",
|
||||||
|
TICKS_TO_MS(stime - pcm_preIrqTime), buf, len);
|
||||||
pcm_preIrqTime = stime;
|
pcm_preIrqTime = stime;
|
||||||
|
|
||||||
// TRACE(2,"[pcm_1ksin_more_data] len=%d nextBuf:%d\n", len, nextPbufIdx);
|
// TRACE(2,"[pcm_1ksin_more_data] len=%d nextBuf:%d\n", len, nextPbufIdx);
|
||||||
if (remain_size > sizeof(sinwave))
|
if (remain_size > sizeof(sinwave)) {
|
||||||
{
|
do {
|
||||||
do{
|
if (nextPbufIdx) {
|
||||||
if (nextPbufIdx)
|
curr_size = sizeof(sinwave) - nextPbufIdx;
|
||||||
{
|
memcpy(buf, &sinwave[nextPbufIdx / 2], curr_size);
|
||||||
curr_size = sizeof(sinwave)-nextPbufIdx;
|
|
||||||
memcpy(buf,&sinwave[nextPbufIdx/2], curr_size);
|
|
||||||
remain_size -= curr_size;
|
remain_size -= curr_size;
|
||||||
nextPbufIdx = 0;
|
nextPbufIdx = 0;
|
||||||
}
|
} else if (remain_size > sizeof(sinwave)) {
|
||||||
else if (remain_size>sizeof(sinwave))
|
memcpy(buf + curr_size, sinwave, sizeof(sinwave));
|
||||||
{
|
|
||||||
memcpy(buf+curr_size,sinwave,sizeof(sinwave));
|
|
||||||
curr_size += sizeof(sinwave);
|
curr_size += sizeof(sinwave);
|
||||||
remain_size -= sizeof(sinwave);
|
remain_size -= sizeof(sinwave);
|
||||||
}
|
} else {
|
||||||
else
|
memcpy(buf + curr_size, sinwave, remain_size);
|
||||||
{
|
|
||||||
memcpy(buf+curr_size,sinwave,remain_size);
|
|
||||||
nextPbufIdx = remain_size;
|
nextPbufIdx = remain_size;
|
||||||
remain_size = 0;
|
remain_size = 0;
|
||||||
}
|
}
|
||||||
}while(remain_size);
|
} while (remain_size);
|
||||||
}
|
} else {
|
||||||
else
|
if ((sizeof(sinwave) - nextPbufIdx) >= len) {
|
||||||
{
|
memcpy(buf, &sinwave[nextPbufIdx / 2], len);
|
||||||
if ((sizeof(sinwave) - nextPbufIdx) >= len)
|
|
||||||
{
|
|
||||||
memcpy(buf, &sinwave[nextPbufIdx/2],len);
|
|
||||||
nextPbufIdx += len;
|
nextPbufIdx += len;
|
||||||
}
|
} else {
|
||||||
else
|
curr_size = sizeof(sinwave) - nextPbufIdx;
|
||||||
{
|
memcpy(buf, &sinwave[nextPbufIdx / 2], curr_size);
|
||||||
curr_size = sizeof(sinwave)-nextPbufIdx;
|
|
||||||
memcpy(buf, &sinwave[nextPbufIdx/2],curr_size);
|
|
||||||
nextPbufIdx = len - curr_size;
|
nextPbufIdx = len - curr_size;
|
||||||
memcpy(buf+curr_size,sinwave, nextPbufIdx);
|
memcpy(buf + curr_size, sinwave, nextPbufIdx);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pcm_mute_more_data(uint8_t *buf, uint32_t len)
|
uint32_t pcm_mute_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
memset(buf, 0, len);
|
||||||
memset(buf, 0 , len);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void da_output_sin1k(bool on)
|
void da_output_sin1k(bool on) {
|
||||||
{
|
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
|
|
||||||
if (isRun==on)
|
if (isRun == on)
|
||||||
return;
|
return;
|
||||||
else
|
else
|
||||||
isRun=on;
|
isRun = on;
|
||||||
TRACE(2,"%s %d\n", __func__, on);
|
TRACE(2, "%s %d\n", __func__, on);
|
||||||
|
|
||||||
if (on){
|
if (on) {
|
||||||
stream_cfg.bits = AUD_BITS_16;
|
stream_cfg.bits = AUD_BITS_16;
|
||||||
stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
||||||
stream_cfg.sample_rate = AUD_SAMPRATE_44100;
|
stream_cfg.sample_rate = AUD_SAMPRATE_44100;
|
||||||
|
@ -156,95 +143,91 @@ void da_output_sin1k(bool on)
|
||||||
|
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
}else{
|
} else {
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void da_tester(uint8_t on)
|
void da_tester(uint8_t on) { da_output_sin1k(on); }
|
||||||
{
|
|
||||||
da_output_sin1k(on);
|
|
||||||
}
|
|
||||||
|
|
||||||
extern int voicecvsd_audio_init(void);
|
extern int voicecvsd_audio_init(void);
|
||||||
extern uint32_t voicecvsd_audio_more_data(uint8_t *buf, uint32_t len);
|
extern uint32_t voicecvsd_audio_more_data(uint8_t *buf, uint32_t len);
|
||||||
extern int get_voicecvsd_buffer_size(void);
|
extern int get_voicecvsd_buffer_size(void);
|
||||||
extern int store_voice_pcm2cvsd(unsigned char *buf, unsigned int len);
|
extern int store_voice_pcm2cvsd(unsigned char *buf, unsigned int len);
|
||||||
|
|
||||||
static uint32_t pcm_data_capture(uint8_t *buf, uint32_t len)
|
static uint32_t pcm_data_capture(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t stime, etime;
|
uint32_t stime, etime;
|
||||||
static uint32_t preIrqTime = 0;
|
static uint32_t preIrqTime = 0;
|
||||||
|
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
// audio_buffer_set_stereo2mono_16bits(buf, len, 1);
|
// audio_buffer_set_stereo2mono_16bits(buf, len, 1);
|
||||||
audio_buffer_set(buf, len);
|
audio_buffer_set(buf, len);
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
TRACE(4,"%s irqDur:%d fsSpend:%d, Len:%d", __func__, TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len);
|
TRACE(4, "%s irqDur:%d fsSpend:%d, Len:%d", __func__,
|
||||||
|
TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len);
|
||||||
preIrqTime = stime;
|
preIrqTime = stime;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t pcm_data_playback(uint8_t *buf, uint32_t len)
|
static uint32_t pcm_data_playback(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t stime, etime;
|
uint32_t stime, etime;
|
||||||
static uint32_t preIrqTime = 0;
|
static uint32_t preIrqTime = 0;
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
// audio_buffer_get_mono2stereo_16bits(buf, len);
|
// audio_buffer_get_mono2stereo_16bits(buf, len);
|
||||||
audio_buffer_get(buf, len);
|
audio_buffer_get(buf, len);
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
TRACE(4,"%s irqDur:%d fsSpend:%d, Len:%d", __func__, TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len);
|
TRACE(4, "%s irqDur:%d fsSpend:%d, Len:%d", __func__,
|
||||||
|
TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len);
|
||||||
preIrqTime = stime;
|
preIrqTime = stime;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pcm_cvsd_data_capture(uint8_t *buf, uint32_t len)
|
uint32_t pcm_cvsd_data_capture(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t stime, etime;
|
uint32_t stime, etime;
|
||||||
static uint32_t preIrqTime = 0;
|
static uint32_t preIrqTime = 0;
|
||||||
|
|
||||||
//TRACE(1,"%s enter", __func__);
|
// TRACE(1,"%s enter", __func__);
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
len >>= 1;
|
len >>= 1;
|
||||||
audio_stereo2mono_16bits(0, (uint16_t *)buf, (uint16_t *)buf, len);
|
audio_stereo2mono_16bits(0, (uint16_t *)buf, (uint16_t *)buf, len);
|
||||||
store_voice_pcm2cvsd(buf, len);
|
store_voice_pcm2cvsd(buf, len);
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
TRACE(4,"%s exit irqDur:%d fsSpend:%d, add:%d", __func__, TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len);
|
TRACE(4, "%s exit irqDur:%d fsSpend:%d, add:%d", __func__,
|
||||||
|
TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len);
|
||||||
preIrqTime = stime;
|
preIrqTime = stime;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t pcm_cvsd_data_playback(uint8_t *buf, uint32_t len)
|
uint32_t pcm_cvsd_data_playback(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
int n;
|
int n;
|
||||||
uint32_t stime, etime;
|
uint32_t stime, etime;
|
||||||
static uint32_t preIrqTime = 0;
|
static uint32_t preIrqTime = 0;
|
||||||
|
|
||||||
//TRACE(1,"%s enter", __func__);
|
// TRACE(1,"%s enter", __func__);
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
pcm_1ksin_more_data(buf, len);
|
pcm_1ksin_more_data(buf, len);
|
||||||
voicecvsd_audio_more_data(buf, len);
|
voicecvsd_audio_more_data(buf, len);
|
||||||
n = get_voicecvsd_buffer_size();
|
n = get_voicecvsd_buffer_size();
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
TRACE(5,"%s exit irqDur:%d fsSpend:%d, get:%d remain:%d", __func__, TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len, n);
|
TRACE(5, "%s exit irqDur:%d fsSpend:%d, get:%d remain:%d", __func__,
|
||||||
|
TICKS_TO_MS(stime - preIrqTime), TICKS_TO_MS(etime - stime), len, n);
|
||||||
preIrqTime = stime;
|
preIrqTime = stime;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void adc_looptester(bool on, enum AUD_IO_PATH_T input_path, enum AUD_SAMPRATE_T sample_rate)
|
void adc_looptester(bool on, enum AUD_IO_PATH_T input_path,
|
||||||
{
|
enum AUD_SAMPRATE_T sample_rate) {
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
|
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
|
|
||||||
if (isRun==on)
|
if (isRun == on)
|
||||||
return;
|
return;
|
||||||
else
|
else
|
||||||
isRun=on;
|
isRun = on;
|
||||||
|
|
||||||
if (on){
|
if (on) {
|
||||||
audio_buffer_init();
|
audio_buffer_init();
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
|
|
||||||
|
@ -271,7 +254,7 @@ void adc_looptester(bool on, enum AUD_IO_PATH_T input_path, enum AUD_SAMPRATE_T
|
||||||
|
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
}else{
|
} else {
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
|
@ -280,11 +263,11 @@ void adc_looptester(bool on, enum AUD_IO_PATH_T input_path, enum AUD_SAMPRATE_T
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
||||||
void app_anc_usb_init(void)
|
void app_anc_usb_init(void) {
|
||||||
{
|
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_52M);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_52M);
|
||||||
|
|
||||||
anc_usb_app_init(AUD_INPUT_PATH_MAINMIC, AUD_SAMPRATE_96000, AUD_SAMPRATE_192000);
|
anc_usb_app_init(AUD_INPUT_PATH_MAINMIC, AUD_SAMPRATE_96000,
|
||||||
|
AUD_SAMPRATE_192000);
|
||||||
|
|
||||||
struct USB_AUDIO_BUF_CFG cfg;
|
struct USB_AUDIO_BUF_CFG cfg;
|
||||||
|
|
||||||
|
@ -300,8 +283,8 @@ void app_anc_usb_init(void)
|
||||||
|
|
||||||
usb_audio_app_init(&cfg);
|
usb_audio_app_init(&cfg);
|
||||||
|
|
||||||
//dualadc_audio_app_init(app_test_playback_buff, USB_AUDIO_PLAYBACK_BUFF_SIZE,
|
// dualadc_audio_app_init(app_test_playback_buff,
|
||||||
//app_test_capture_buff, USB_AUDIO_CAPTURE_BUFF_SIZE);
|
// USB_AUDIO_PLAYBACK_BUFF_SIZE, app_test_capture_buff,
|
||||||
|
// USB_AUDIO_CAPTURE_BUFF_SIZE);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -13,11 +13,10 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "audiobuffer.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "cqueue.h"
|
#include "cqueue.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "audiobuffer.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
static osMutexId g_audio_queue_mutex_id = NULL;
|
static osMutexId g_audio_queue_mutex_id = NULL;
|
||||||
|
@ -25,36 +24,36 @@ osMutexDef(g_audio_queue_mutex);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static CQueue audio_queue;
|
static CQueue audio_queue;
|
||||||
static unsigned char audio_queue_buf[AUDIO_BUFFER_FRAME_SIZE*AUDIO_BUFFER_FRAME_NUM];
|
static unsigned char
|
||||||
|
audio_queue_buf[AUDIO_BUFFER_FRAME_SIZE * AUDIO_BUFFER_FRAME_NUM];
|
||||||
|
|
||||||
void audio_mono2stereo_16bits(uint16_t *dst_buf, uint16_t *src_buf, uint32_t src_len)
|
void audio_mono2stereo_16bits(uint16_t *dst_buf, uint16_t *src_buf,
|
||||||
{
|
uint32_t src_len) {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
for (i = 0; i < src_len; ++i) {
|
for (i = 0; i < src_len; ++i) {
|
||||||
dst_buf[i*2 + 0] = dst_buf[i*2 + 1] = src_buf[i];
|
dst_buf[i * 2 + 0] = dst_buf[i * 2 + 1] = src_buf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio_stereo2mono_16bits(uint8_t chnlsel, uint16_t *dst_buf, uint16_t *src_buf, uint32_t src_len)
|
void audio_stereo2mono_16bits(uint8_t chnlsel, uint16_t *dst_buf,
|
||||||
{
|
uint16_t *src_buf, uint32_t src_len) {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
for (i = 0; i < src_len; i+=2) {
|
for (i = 0; i < src_len; i += 2) {
|
||||||
dst_buf[i/2] = src_buf[i + chnlsel];
|
dst_buf[i / 2] = src_buf[i + chnlsel];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void audio_buffer_init(void)
|
void audio_buffer_init(void) {
|
||||||
{
|
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
if (g_audio_queue_mutex_id == NULL)
|
if (g_audio_queue_mutex_id == NULL)
|
||||||
g_audio_queue_mutex_id = osMutexCreate((osMutex(g_audio_queue_mutex)));
|
g_audio_queue_mutex_id = osMutexCreate((osMutex(g_audio_queue_mutex)));
|
||||||
#endif
|
#endif
|
||||||
InitCQueue(&audio_queue, sizeof(audio_queue_buf), (unsigned char *)&audio_queue_buf);
|
InitCQueue(&audio_queue, sizeof(audio_queue_buf),
|
||||||
|
(unsigned char *)&audio_queue_buf);
|
||||||
memset(&audio_queue_buf, 0x00, sizeof(audio_queue_buf));
|
memset(&audio_queue_buf, 0x00, sizeof(audio_queue_buf));
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_buffer_length(void)
|
int audio_buffer_length(void) {
|
||||||
{
|
|
||||||
int len;
|
int len;
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
||||||
|
@ -66,8 +65,7 @@ int audio_buffer_length(void)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_buffer_set(uint8_t *buff, uint16_t len)
|
int audio_buffer_set(uint8_t *buff, uint16_t len) {
|
||||||
{
|
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
|
@ -80,8 +78,7 @@ int audio_buffer_set(uint8_t *buff, uint16_t len)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_buffer_get(uint8_t *buff, uint16_t len)
|
int audio_buffer_get(uint8_t *buff, uint16_t len) {
|
||||||
{
|
|
||||||
uint8_t *e1 = NULL, *e2 = NULL;
|
uint8_t *e1 = NULL, *e2 = NULL;
|
||||||
unsigned int len1 = 0, len2 = 0;
|
unsigned int len1 = 0, len2 = 0;
|
||||||
int status;
|
int status;
|
||||||
|
@ -89,12 +86,12 @@ int audio_buffer_get(uint8_t *buff, uint16_t len)
|
||||||
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
||||||
#endif
|
#endif
|
||||||
status = PeekCQueue(&audio_queue, len, &e1, &len1, &e2, &len2);
|
status = PeekCQueue(&audio_queue, len, &e1, &len1, &e2, &len2);
|
||||||
if (len==(len1+len2)){
|
if (len == (len1 + len2)) {
|
||||||
memcpy(buff,e1,len1);
|
memcpy(buff, e1, len1);
|
||||||
memcpy(buff+len1,e2,len2);
|
memcpy(buff + len1, e2, len2);
|
||||||
DeCQueue(&audio_queue, 0, len);
|
DeCQueue(&audio_queue, 0, len);
|
||||||
DeCQueue(&audio_queue, 0, len2);
|
DeCQueue(&audio_queue, 0, len2);
|
||||||
}else{
|
} else {
|
||||||
memset(buff, 0x00, len);
|
memset(buff, 0x00, len);
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
|
@ -104,23 +101,23 @@ int audio_buffer_get(uint8_t *buff, uint16_t len)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_buffer_set_stereo2mono_16bits(uint8_t *buff, uint16_t len, uint8_t chnlsel)
|
int audio_buffer_set_stereo2mono_16bits(uint8_t *buff, uint16_t len,
|
||||||
{
|
uint8_t chnlsel) {
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
||||||
#endif
|
#endif
|
||||||
audio_stereo2mono_16bits(chnlsel, (uint16_t *)buff, (uint16_t *)buff, len>>1);
|
audio_stereo2mono_16bits(chnlsel, (uint16_t *)buff, (uint16_t *)buff,
|
||||||
status = EnCQueue(&audio_queue, buff, len>>1);
|
len >> 1);
|
||||||
|
status = EnCQueue(&audio_queue, buff, len >> 1);
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
osMutexRelease(g_audio_queue_mutex_id);
|
osMutexRelease(g_audio_queue_mutex_id);
|
||||||
#endif
|
#endif
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int audio_buffer_get_mono2stereo_16bits(uint8_t *buff, uint16_t len)
|
int audio_buffer_get_mono2stereo_16bits(uint8_t *buff, uint16_t len) {
|
||||||
{
|
|
||||||
uint8_t *e1 = NULL, *e2 = NULL;
|
uint8_t *e1 = NULL, *e2 = NULL;
|
||||||
unsigned int len1 = 0, len2 = 0;
|
unsigned int len1 = 0, len2 = 0;
|
||||||
int status;
|
int status;
|
||||||
|
@ -128,14 +125,15 @@ int audio_buffer_get_mono2stereo_16bits(uint8_t *buff, uint16_t len)
|
||||||
#ifndef _AUDIO_NO_THREAD_
|
#ifndef _AUDIO_NO_THREAD_
|
||||||
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
osMutexWait(g_audio_queue_mutex_id, osWaitForever);
|
||||||
#endif
|
#endif
|
||||||
status = PeekCQueue(&audio_queue, len>>1, &e1, &len1, &e2, &len2);
|
status = PeekCQueue(&audio_queue, len >> 1, &e1, &len1, &e2, &len2);
|
||||||
if (len>>1== len1+len2){
|
if (len >> 1 == len1 + len2) {
|
||||||
audio_mono2stereo_16bits((uint16_t *)buff, (uint16_t *)e1, len1>>1);
|
audio_mono2stereo_16bits((uint16_t *)buff, (uint16_t *)e1, len1 >> 1);
|
||||||
audio_mono2stereo_16bits((uint16_t *)(buff+(len1<<1)), (uint16_t *)e2, len2>>1);
|
audio_mono2stereo_16bits((uint16_t *)(buff + (len1 << 1)), (uint16_t *)e2,
|
||||||
|
len2 >> 1);
|
||||||
DeCQueue(&audio_queue, 0, len1);
|
DeCQueue(&audio_queue, 0, len1);
|
||||||
DeCQueue(&audio_queue, 0, len2);
|
DeCQueue(&audio_queue, 0, len2);
|
||||||
status = len;
|
status = len;
|
||||||
}else{
|
} else {
|
||||||
memset(buff, 0x00, len);
|
memset(buff, 0x00, len);
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -15,8 +15,8 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifdef A2DP_CP_ACCEL
|
#ifdef A2DP_CP_ACCEL
|
||||||
|
|
||||||
#include "a2dp_decoder_internal.h"
|
|
||||||
#include "a2dp_decoder_cp.h"
|
#include "a2dp_decoder_cp.h"
|
||||||
|
#include "a2dp_decoder_internal.h"
|
||||||
#include "cp_accel.h"
|
#include "cp_accel.h"
|
||||||
#include "hal_location.h"
|
#include "hal_location.h"
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
|
@ -82,28 +82,21 @@ static enum CP_PROC_DELAY_T proc_delay;
|
||||||
static bool cp_need_reset;
|
static bool cp_need_reset;
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
unsigned int set_cp_reset_flag(uint8_t evt)
|
unsigned int set_cp_reset_flag(uint8_t evt) {
|
||||||
{
|
|
||||||
cp_need_reset = true;
|
cp_need_reset = true;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_cp_need_reset(void)
|
bool is_cp_need_reset(void) {
|
||||||
{
|
|
||||||
bool ret = cp_need_reset;
|
bool ret = cp_need_reset;
|
||||||
cp_need_reset = false;
|
cp_need_reset = false;
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool is_cp_init_done(void)
|
bool is_cp_init_done(void) { return cp_accel_init_done(); }
|
||||||
{
|
|
||||||
return cp_accel_init_done();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
static void reset_frame_info(void)
|
static void reset_frame_info(void) {
|
||||||
{
|
|
||||||
uint32_t idle_cnt;
|
uint32_t idle_cnt;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -132,8 +125,7 @@ static void reset_frame_info(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
static unsigned int cp_a2dp_main(uint8_t event)
|
static unsigned int cp_a2dp_main(uint8_t event) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
#ifdef A2DP_TRACE_CP_DEC_TIME
|
#ifdef A2DP_TRACE_CP_DEC_TIME
|
||||||
uint32_t stime;
|
uint32_t stime;
|
||||||
|
@ -154,7 +146,9 @@ static unsigned int cp_a2dp_main(uint8_t event)
|
||||||
|
|
||||||
#ifdef A2DP_TRACE_CP_DEC_TIME
|
#ifdef A2DP_TRACE_CP_DEC_TIME
|
||||||
etime = hal_fast_sys_timer_get();
|
etime = hal_fast_sys_timer_get();
|
||||||
TRACE_A2DP_DECODER_I("cp_decode: %5u us in %5u us", FAST_TICKS_TO_US(etime - stime), FAST_TICKS_TO_US(etime - cp_last_dec_time));
|
TRACE_A2DP_DECODER_I("cp_decode: %5u us in %5u us",
|
||||||
|
FAST_TICKS_TO_US(etime - stime),
|
||||||
|
FAST_TICKS_TO_US(etime - cp_last_dec_time));
|
||||||
cp_last_dec_time = etime;
|
cp_last_dec_time = etime;
|
||||||
#endif
|
#endif
|
||||||
} while (ret == 0);
|
} while (ret == 0);
|
||||||
|
@ -170,9 +164,9 @@ static unsigned int cp_a2dp_main(uint8_t event)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cp_task_desc TASK_DESC_A2DP = {CP_ACCEL_STATE_CLOSED, cp_a2dp_main, NULL, NULL, set_cp_reset_flag};
|
static struct cp_task_desc TASK_DESC_A2DP = {
|
||||||
int a2dp_cp_init(A2DP_CP_DECODE_T decode_func, enum CP_PROC_DELAY_T delay)
|
CP_ACCEL_STATE_CLOSED, cp_a2dp_main, NULL, NULL, set_cp_reset_flag};
|
||||||
{
|
int a2dp_cp_init(A2DP_CP_DECODE_T decode_func, enum CP_PROC_DELAY_T delay) {
|
||||||
if (delay >= CP_PROC_DELAY_QTY) {
|
if (delay >= CP_PROC_DELAY_QTY) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -183,31 +177,30 @@ int a2dp_cp_init(A2DP_CP_DECODE_T decode_func, enum CP_PROC_DELAY_T delay)
|
||||||
cp_last_dec_time = hal_fast_sys_timer_get();
|
cp_last_dec_time = hal_fast_sys_timer_get();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
norflash_api_flush_disable(NORFLASH_API_USER_CP,(uint32_t)cp_accel_init_done);
|
norflash_api_flush_disable(NORFLASH_API_USER_CP,
|
||||||
|
(uint32_t)cp_accel_init_done);
|
||||||
cp_accel_open(CP_TASK_A2DP_DECODE, &TASK_DESC_A2DP);
|
cp_accel_open(CP_TASK_A2DP_DECODE, &TASK_DESC_A2DP);
|
||||||
while(cp_accel_init_done() == false) {
|
while (cp_accel_init_done() == false) {
|
||||||
hal_sys_timer_delay_us(100);
|
hal_sys_timer_delay_us(100);
|
||||||
}
|
}
|
||||||
norflash_api_flush_enable(NORFLASH_API_USER_CP);
|
norflash_api_flush_enable(NORFLASH_API_USER_CP);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int a2dp_cp_deinit(void)
|
int a2dp_cp_deinit(void) {
|
||||||
{
|
|
||||||
cp_accel_close(CP_TASK_A2DP_DECODE);
|
cp_accel_close(CP_TASK_A2DP_DECODE);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
int a2dp_cp_decoder_init(uint32_t out_frame_len, uint8_t max_frames)
|
int a2dp_cp_decoder_init(uint32_t out_frame_len, uint8_t max_frames) {
|
||||||
{
|
|
||||||
uint32_t i;
|
uint32_t i;
|
||||||
max_buffer_frames = max_frames;
|
max_buffer_frames = max_frames;
|
||||||
if (!mcu_dec_inited) {
|
if (!mcu_dec_inited) {
|
||||||
#ifdef A2DP_TRACE_CP_ACCEL
|
#ifdef A2DP_TRACE_CP_ACCEL
|
||||||
TRACE_A2DP_DECODER_I("%s: Decoder init", __func__);
|
TRACE_A2DP_DECODER_I("%s: Decoder init", __func__);
|
||||||
#endif
|
#endif
|
||||||
if(cp_accel_init_done() == false){
|
if (cp_accel_init_done() == false) {
|
||||||
TRACE_A2DP_DECODER_I("%s: CP ACCEL not init yet", __func__);
|
TRACE_A2DP_DECODER_I("%s: CP ACCEL not init yet", __func__);
|
||||||
return 6;
|
return 6;
|
||||||
}
|
}
|
||||||
|
@ -250,8 +243,7 @@ int a2dp_cp_decoder_init(uint32_t out_frame_len, uint8_t max_frames)
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
static uint32_t get_in_frame_cnt(uint32_t in_widx, uint32_t in_ridx)
|
static uint32_t get_in_frame_cnt(uint32_t in_widx, uint32_t in_ridx) {
|
||||||
{
|
|
||||||
uint32_t cnt;
|
uint32_t cnt;
|
||||||
|
|
||||||
if (in_widx >= in_ridx) {
|
if (in_widx >= in_ridx) {
|
||||||
|
@ -263,19 +255,14 @@ static uint32_t get_in_frame_cnt(uint32_t in_widx, uint32_t in_ridx)
|
||||||
return cnt;
|
return cnt;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_in_cp_frame_cnt(void)
|
uint32_t get_in_cp_frame_cnt(void) {
|
||||||
{
|
|
||||||
return get_in_frame_cnt(cp_in_widx, cp_in_ridx);
|
return get_in_frame_cnt(cp_in_widx, cp_in_ridx);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_in_cp_frame_delay(void)
|
uint32_t get_in_cp_frame_delay(void) { return proc_delay; }
|
||||||
{
|
|
||||||
return proc_delay;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
static uint32_t get_in_frame_free_cnt(uint32_t in_widx, uint32_t in_ridx)
|
static uint32_t get_in_frame_free_cnt(uint32_t in_widx, uint32_t in_ridx) {
|
||||||
{
|
|
||||||
uint32_t free_cnt;
|
uint32_t free_cnt;
|
||||||
|
|
||||||
if (in_widx >= in_ridx) {
|
if (in_widx >= in_ridx) {
|
||||||
|
@ -289,8 +276,8 @@ static uint32_t get_in_frame_free_cnt(uint32_t in_widx, uint32_t in_ridx)
|
||||||
}
|
}
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
int a2dp_cp_put_in_frame(const void *buf1, uint32_t len1, const void *buf2, uint32_t len2)
|
int a2dp_cp_put_in_frame(const void *buf1, uint32_t len1, const void *buf2,
|
||||||
{
|
uint32_t len2) {
|
||||||
uint16_t free_cnt;
|
uint16_t free_cnt;
|
||||||
uint16_t in_widx;
|
uint16_t in_widx;
|
||||||
uint16_t in_ridx;
|
uint16_t in_ridx;
|
||||||
|
@ -307,7 +294,7 @@ int a2dp_cp_put_in_frame(const void *buf1, uint32_t len1, const void *buf2, uin
|
||||||
in_widx = cp_in_widx;
|
in_widx = cp_in_widx;
|
||||||
in_ridx = cp_in_ridx;
|
in_ridx = cp_in_ridx;
|
||||||
|
|
||||||
if (max_buffer_frames < get_in_cp_frame_cnt()){
|
if (max_buffer_frames < get_in_cp_frame_cnt()) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,8 +367,7 @@ int a2dp_cp_put_in_frame(const void *buf1, uint32_t len1, const void *buf2, uin
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
int a2dp_cp_get_in_frame(void **p_buf, uint32_t *p_len)
|
int a2dp_cp_get_in_frame(void **p_buf, uint32_t *p_len) {
|
||||||
{
|
|
||||||
uint16_t in_widx;
|
uint16_t in_widx;
|
||||||
uint16_t in_ridx;
|
uint16_t in_ridx;
|
||||||
uint32_t in_rpos;
|
uint32_t in_rpos;
|
||||||
|
@ -410,8 +396,7 @@ int a2dp_cp_get_in_frame(void **p_buf, uint32_t *p_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
int a2dp_cp_consume_in_frame(void)
|
int a2dp_cp_consume_in_frame(void) {
|
||||||
{
|
|
||||||
uint16_t in_widx;
|
uint16_t in_widx;
|
||||||
uint16_t in_ridx;
|
uint16_t in_ridx;
|
||||||
|
|
||||||
|
@ -436,20 +421,15 @@ int a2dp_cp_consume_in_frame(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
uint32_t a2dp_cp_get_in_frame_index(void)
|
uint32_t a2dp_cp_get_in_frame_index(void) { return cp_in_ridx; }
|
||||||
{
|
|
||||||
return cp_in_ridx;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
uint32_t a2dp_cp_get_in_frame_cnt_by_index(uint32_t ridx)
|
uint32_t a2dp_cp_get_in_frame_cnt_by_index(uint32_t ridx) {
|
||||||
{
|
|
||||||
return get_in_frame_cnt(cp_in_widx, ridx);
|
return get_in_frame_cnt(cp_in_widx, ridx);
|
||||||
}
|
}
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
void a2dp_cp_reset_frame(void)
|
void a2dp_cp_reset_frame(void) {
|
||||||
{
|
|
||||||
#ifdef A2DP_TRACE_CP_ACCEL
|
#ifdef A2DP_TRACE_CP_ACCEL
|
||||||
TRACE_A2DP_DECODER_I("%s: Reset frames", __func__);
|
TRACE_A2DP_DECODER_I("%s: Reset frames", __func__);
|
||||||
#endif
|
#endif
|
||||||
|
@ -461,18 +441,15 @@ void a2dp_cp_reset_frame(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
bool a2dp_cp_get_frame_reset_status(void)
|
bool a2dp_cp_get_frame_reset_status(void) { return reset_frames; }
|
||||||
{
|
|
||||||
return reset_frames;
|
|
||||||
}
|
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
enum CP_EMPTY_OUT_FRM_T a2dp_cp_get_emtpy_out_frame(void **p_buf, uint32_t *p_len)
|
enum CP_EMPTY_OUT_FRM_T a2dp_cp_get_emtpy_out_frame(void **p_buf,
|
||||||
{
|
uint32_t *p_len) {
|
||||||
enum CP_EMPTY_OUT_FRM_T ret;
|
enum CP_EMPTY_OUT_FRM_T ret;
|
||||||
uint8_t out_widx;
|
uint8_t out_widx;
|
||||||
uint32_t out_wpos;
|
uint32_t out_wpos;
|
||||||
enum CP_DEC_STATE_T state ;
|
enum CP_DEC_STATE_T state;
|
||||||
|
|
||||||
if (reset_frames) {
|
if (reset_frames) {
|
||||||
return CP_EMPTY_OUT_FRM_ERR;
|
return CP_EMPTY_OUT_FRM_ERR;
|
||||||
|
@ -505,8 +482,7 @@ enum CP_EMPTY_OUT_FRM_T a2dp_cp_get_emtpy_out_frame(void **p_buf, uint32_t *p_le
|
||||||
}
|
}
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
int a2dp_cp_consume_emtpy_out_frame(void)
|
int a2dp_cp_consume_emtpy_out_frame(void) {
|
||||||
{
|
|
||||||
uint8_t out_widx;
|
uint8_t out_widx;
|
||||||
|
|
||||||
if (reset_frames) {
|
if (reset_frames) {
|
||||||
|
@ -535,11 +511,10 @@ int a2dp_cp_consume_emtpy_out_frame(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
int a2dp_cp_get_full_out_frame(void **p_buf, uint32_t *p_len)
|
int a2dp_cp_get_full_out_frame(void **p_buf, uint32_t *p_len) {
|
||||||
{
|
|
||||||
uint8_t out_ridx;
|
uint8_t out_ridx;
|
||||||
uint32_t out_rpos;
|
uint32_t out_rpos;
|
||||||
enum CP_DEC_STATE_T state ;
|
enum CP_DEC_STATE_T state;
|
||||||
|
|
||||||
if (reset_frames) {
|
if (reset_frames) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -550,10 +525,11 @@ int a2dp_cp_get_full_out_frame(void **p_buf, uint32_t *p_len)
|
||||||
|
|
||||||
if (state != CP_DEC_STATE_DONE && state != CP_DEC_STATE_INIT_DONE) {
|
if (state != CP_DEC_STATE_DONE && state != CP_DEC_STATE_INIT_DONE) {
|
||||||
// Notify CP to work again
|
// Notify CP to work again
|
||||||
cp_accel_send_event_mcu2cp(CP_BUILD_ID(CP_TASK_A2DP_DECODE, CP_EVENT_A2DP_DECODE));
|
cp_accel_send_event_mcu2cp(
|
||||||
if (state == CP_DEC_STATE_WORKING){
|
CP_BUILD_ID(CP_TASK_A2DP_DECODE, CP_EVENT_A2DP_DECODE));
|
||||||
|
if (state == CP_DEC_STATE_WORKING) {
|
||||||
return CP_EMPTY_OUT_FRM_WORKING;
|
return CP_EMPTY_OUT_FRM_WORKING;
|
||||||
}else{
|
} else {
|
||||||
return (10 + state);
|
return (10 + state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -580,10 +556,9 @@ int a2dp_cp_get_full_out_frame(void **p_buf, uint32_t *p_len)
|
||||||
}
|
}
|
||||||
|
|
||||||
SRAM_TEXT_LOC
|
SRAM_TEXT_LOC
|
||||||
int a2dp_cp_consume_full_out_frame(void)
|
int a2dp_cp_consume_full_out_frame(void) {
|
||||||
{
|
|
||||||
uint8_t out_ridx;
|
uint8_t out_ridx;
|
||||||
enum CP_DEC_STATE_T state ;
|
enum CP_DEC_STATE_T state;
|
||||||
|
|
||||||
if (reset_frames) {
|
if (reset_frames) {
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -609,10 +584,10 @@ int a2dp_cp_consume_full_out_frame(void)
|
||||||
cp_out_ridx = out_ridx;
|
cp_out_ridx = out_ridx;
|
||||||
|
|
||||||
// Notify CP to work again
|
// Notify CP to work again
|
||||||
cp_accel_send_event_mcu2cp(CP_BUILD_ID(CP_TASK_A2DP_DECODE, CP_EVENT_A2DP_DECODE));
|
cp_accel_send_event_mcu2cp(
|
||||||
|
CP_BUILD_ID(CP_TASK_A2DP_DECODE, CP_EVENT_A2DP_DECODE));
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -14,12 +14,12 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
|
#include "a2dp_decoder_internal.h"
|
||||||
#include "cmsis.h"
|
#include "cmsis.h"
|
||||||
|
#include "hal_location.h"
|
||||||
|
#include "heap_api.h"
|
||||||
#include "plat_types.h"
|
#include "plat_types.h"
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "heap_api.h"
|
|
||||||
#include "hal_location.h"
|
|
||||||
#include "a2dp_decoder_internal.h"
|
|
||||||
|
|
||||||
static A2DP_AUDIO_CONTEXT_T *a2dp_audio_context_p = NULL;
|
static A2DP_AUDIO_CONTEXT_T *a2dp_audio_context_p = NULL;
|
||||||
static A2DP_AUDIO_DECODER_LASTFRAME_INFO_T a2dp_audio_ldac_example_info;
|
static A2DP_AUDIO_DECODER_LASTFRAME_INFO_T a2dp_audio_ldac_example_info;
|
||||||
|
@ -32,41 +32,41 @@ typedef struct {
|
||||||
uint32_t buffer_len;
|
uint32_t buffer_len;
|
||||||
} a2dp_audio_example_decoder_frame_t;
|
} a2dp_audio_example_decoder_frame_t;
|
||||||
|
|
||||||
|
int a2dp_audio_example_decode_frame(uint8_t *buffer, uint32_t buffer_bytes) {
|
||||||
int a2dp_audio_example_decode_frame(uint8_t *buffer, uint32_t buffer_bytes)
|
|
||||||
{
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_preparse_packet(btif_media_header_t * header, uint8_t *buffer, uint32_t buffer_bytes)
|
int a2dp_audio_example_preparse_packet(btif_media_header_t *header,
|
||||||
{
|
uint8_t *buffer, uint32_t buffer_bytes) {
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void *a2dp_audio_example_frame_malloc(uint32_t packet_len) {
|
||||||
static void *a2dp_audio_example_frame_malloc(uint32_t packet_len)
|
|
||||||
{
|
|
||||||
a2dp_audio_example_decoder_frame_t *decoder_frame_p = NULL;
|
a2dp_audio_example_decoder_frame_t *decoder_frame_p = NULL;
|
||||||
uint8_t *buffer = NULL;
|
uint8_t *buffer = NULL;
|
||||||
|
|
||||||
buffer = (uint8_t *)a2dp_audio_heap_malloc(packet_len);
|
buffer = (uint8_t *)a2dp_audio_heap_malloc(packet_len);
|
||||||
decoder_frame_p = (a2dp_audio_example_decoder_frame_t *)a2dp_audio_heap_malloc(sizeof(a2dp_audio_example_decoder_frame_t));
|
decoder_frame_p =
|
||||||
|
(a2dp_audio_example_decoder_frame_t *)a2dp_audio_heap_malloc(
|
||||||
|
sizeof(a2dp_audio_example_decoder_frame_t));
|
||||||
decoder_frame_p->buffer = buffer;
|
decoder_frame_p->buffer = buffer;
|
||||||
decoder_frame_p->buffer_len = packet_len;
|
decoder_frame_p->buffer_len = packet_len;
|
||||||
return (void *)decoder_frame_p;
|
return (void *)decoder_frame_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
void a2dp_audio_example_free(void *packet)
|
void a2dp_audio_example_free(void *packet) {
|
||||||
{
|
a2dp_audio_example_decoder_frame_t *decoder_frame_p =
|
||||||
a2dp_audio_example_decoder_frame_t *decoder_frame_p = (a2dp_audio_example_decoder_frame_t *)packet;
|
(a2dp_audio_example_decoder_frame_t *)packet;
|
||||||
a2dp_audio_heap_free(decoder_frame_p->buffer);
|
a2dp_audio_heap_free(decoder_frame_p->buffer);
|
||||||
a2dp_audio_heap_free(decoder_frame_p);
|
a2dp_audio_heap_free(decoder_frame_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_store_packet(btif_media_header_t * header, uint8_t *buffer, uint32_t buffer_bytes)
|
int a2dp_audio_example_store_packet(btif_media_header_t *header,
|
||||||
{
|
uint8_t *buffer, uint32_t buffer_bytes) {
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
a2dp_audio_example_decoder_frame_t *decoder_frame_p = (a2dp_audio_example_decoder_frame_t *)a2dp_audio_example_frame_malloc(buffer_bytes);
|
a2dp_audio_example_decoder_frame_t *decoder_frame_p =
|
||||||
|
(a2dp_audio_example_decoder_frame_t *)a2dp_audio_example_frame_malloc(
|
||||||
|
buffer_bytes);
|
||||||
|
|
||||||
decoder_frame_p->sequenceNumber = header->sequenceNumber;
|
decoder_frame_p->sequenceNumber = header->sequenceNumber;
|
||||||
decoder_frame_p->timestamp = header->timestamp;
|
decoder_frame_p->timestamp = header->timestamp;
|
||||||
|
@ -77,45 +77,38 @@ int a2dp_audio_example_store_packet(btif_media_header_t * header, uint8_t *buffe
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_discards_packet(uint32_t packets)
|
int a2dp_audio_example_discards_packet(uint32_t packets) {
|
||||||
{
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_headframe_info_get(A2DP_AUDIO_HEADFRAME_INFO_T* headframe_info)
|
int a2dp_audio_example_headframe_info_get(
|
||||||
{
|
A2DP_AUDIO_HEADFRAME_INFO_T *headframe_info) {
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_info_get(void *info)
|
int a2dp_audio_example_info_get(void *info) { return A2DP_DECODER_NO_ERROR; }
|
||||||
{
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
int a2dp_audio_example_init(A2DP_AUDIO_OUTPUT_CONFIG_T *config, void *context)
|
int a2dp_audio_example_init(A2DP_AUDIO_OUTPUT_CONFIG_T *config, void *context) {
|
||||||
{
|
|
||||||
TRACE_A2DP_DECODER_D("%s", __func__);
|
TRACE_A2DP_DECODER_D("%s", __func__);
|
||||||
a2dp_audio_context_p = (A2DP_AUDIO_CONTEXT_T *)context;
|
a2dp_audio_context_p = (A2DP_AUDIO_CONTEXT_T *)context;
|
||||||
|
|
||||||
memset(&a2dp_audio_ldac_example_info, 0, sizeof(A2DP_AUDIO_DECODER_LASTFRAME_INFO_T));
|
memset(&a2dp_audio_ldac_example_info, 0,
|
||||||
memcpy(&a2dp_audio_example_output_config, config, sizeof(A2DP_AUDIO_OUTPUT_CONFIG_T));
|
sizeof(A2DP_AUDIO_DECODER_LASTFRAME_INFO_T));
|
||||||
|
memcpy(&a2dp_audio_example_output_config, config,
|
||||||
|
sizeof(A2DP_AUDIO_OUTPUT_CONFIG_T));
|
||||||
a2dp_audio_ldac_example_info.stream_info = &a2dp_audio_example_output_config;
|
a2dp_audio_ldac_example_info.stream_info = &a2dp_audio_example_output_config;
|
||||||
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_deinit(void)
|
int a2dp_audio_example_deinit(void) { return A2DP_DECODER_NO_ERROR; }
|
||||||
{
|
|
||||||
|
int a2dp_audio_example_synchronize_packet(
|
||||||
|
A2DP_AUDIO_SYNCFRAME_INFO_T *sync_info, uint32_t mask) {
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_example_synchronize_packet(A2DP_AUDIO_SYNCFRAME_INFO_T *sync_info, uint32_t mask)
|
int a2dp_audio_example_synchronize_dest_packet_mut(uint16_t packet_mut) {
|
||||||
{
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
|
||||||
}
|
|
||||||
|
|
||||||
int a2dp_audio_example_synchronize_dest_packet_mut(uint16_t packet_mut)
|
|
||||||
{
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -133,5 +126,4 @@ A2DP_AUDIO_DECODER_T a2dp_audio_example_decoder_config = {
|
||||||
a2dp_audio_example_headframe_info_get,
|
a2dp_audio_example_headframe_info_get,
|
||||||
a2dp_audio_example_info_get,
|
a2dp_audio_example_info_get,
|
||||||
a2dp_audio_example_free,
|
a2dp_audio_example_free,
|
||||||
} ;
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -14,13 +14,13 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
#include "cmsis.h"
|
|
||||||
#include "plat_types.h"
|
|
||||||
#include <string.h>
|
|
||||||
#include "heap_api.h"
|
|
||||||
#include "hal_location.h"
|
|
||||||
#include "a2dp_decoder_internal.h"
|
#include "a2dp_decoder_internal.h"
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
|
#include "cmsis.h"
|
||||||
|
#include "hal_location.h"
|
||||||
|
#include "heap_api.h"
|
||||||
|
#include "plat_types.h"
|
||||||
|
#include <string.h>
|
||||||
#if defined(A2DP_SCALABLE_ON)
|
#if defined(A2DP_SCALABLE_ON)
|
||||||
#include "heap_api.h"
|
#include "heap_api.h"
|
||||||
#include "ssc.h"
|
#include "ssc.h"
|
||||||
|
@ -36,14 +36,13 @@ static A2DP_AUDIO_OUTPUT_CONFIG_T output_config;
|
||||||
|
|
||||||
static unsigned char *scalable_decoder_place = NULL;
|
static unsigned char *scalable_decoder_place = NULL;
|
||||||
static unsigned char *scalable_decoder_temp_buf = NULL;
|
static unsigned char *scalable_decoder_temp_buf = NULL;
|
||||||
static short ss_pcm_buff[SCALABLE_FRAME_SIZE*4];
|
static short ss_pcm_buff[SCALABLE_FRAME_SIZE * 4];
|
||||||
static int scalable_uhq_flag __attribute__((unused)) = 0;
|
static int scalable_uhq_flag __attribute__((unused)) = 0;
|
||||||
|
|
||||||
static HANDLE_DECODER scalableDec_handle = NULL;
|
static HANDLE_DECODER scalableDec_handle = NULL;
|
||||||
|
|
||||||
static A2DP_AUDIO_DECODER_LASTFRAME_INFO_T lastframe_info;
|
static A2DP_AUDIO_DECODER_LASTFRAME_INFO_T lastframe_info;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint16_t sequenceNumber;
|
uint16_t sequenceNumber;
|
||||||
uint32_t timestamp;
|
uint32_t timestamp;
|
||||||
|
@ -51,26 +50,22 @@ typedef struct {
|
||||||
int buffer_len;
|
int buffer_len;
|
||||||
} a2dp_audio_scalable_decoder_frame_t;
|
} a2dp_audio_scalable_decoder_frame_t;
|
||||||
|
|
||||||
static void ss_to_24bit_buf(int32_t * out, int32_t * in, int size)
|
static void ss_to_24bit_buf(int32_t *out, int32_t *in, int size) {
|
||||||
{
|
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
out[i] = in[i];
|
out[i] = in[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void a2dp_audio_scalable_decoder_init(void)
|
static void a2dp_audio_scalable_decoder_init(void) {
|
||||||
{
|
|
||||||
if (scalableDec_handle == NULL) {
|
if (scalableDec_handle == NULL) {
|
||||||
scalableDec_handle = scalable_decoder_place;
|
scalableDec_handle = scalable_decoder_place;
|
||||||
|
|
||||||
|
ssc_decoder_init(scalableDec_handle, output_config.num_channels,
|
||||||
ssc_decoder_init(scalableDec_handle, output_config.num_channels, output_config.sample_rate);
|
output_config.sample_rate);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scalableDecoder_Close(HANDLE_DECODER handle)
|
static int scalableDecoder_Close(HANDLE_DECODER handle) {
|
||||||
{
|
|
||||||
if (handle) {
|
if (handle) {
|
||||||
a2dp_audio_heap_free(handle);
|
a2dp_audio_heap_free(handle);
|
||||||
a2dp_audio_heap_free(scalable_decoder_temp_buf);
|
a2dp_audio_heap_free(scalable_decoder_temp_buf);
|
||||||
|
@ -79,36 +74,35 @@ static int scalableDecoder_Close(HANDLE_DECODER handle)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void a2dp_audio_scalable_decoder_deinit(void)
|
static void a2dp_audio_scalable_decoder_deinit(void) {
|
||||||
{
|
|
||||||
if (scalableDec_handle) {
|
if (scalableDec_handle) {
|
||||||
scalableDecoder_Close(scalableDec_handle);
|
scalableDecoder_Close(scalableDec_handle);
|
||||||
scalableDec_handle = NULL;
|
scalableDec_handle = NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void a2dp_audio_scalable_decoder_reinit(void)
|
static void a2dp_audio_scalable_decoder_reinit(void) {
|
||||||
{
|
|
||||||
if (scalableDec_handle) {
|
if (scalableDec_handle) {
|
||||||
a2dp_audio_scalable_decoder_deinit();
|
a2dp_audio_scalable_decoder_deinit();
|
||||||
}
|
}
|
||||||
a2dp_audio_scalable_decoder_init();
|
a2dp_audio_scalable_decoder_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool is_valid_frame(a2dp_audio_scalable_decoder_frame_t * decoder_frame_p)
|
static bool
|
||||||
{
|
is_valid_frame(a2dp_audio_scalable_decoder_frame_t *decoder_frame_p) {
|
||||||
int hw_tmp, len, bitrate_bps, frame_len, frame_size;
|
int hw_tmp, len, bitrate_bps, frame_len, frame_size;
|
||||||
|
|
||||||
int sampling_rate = 44100;
|
int sampling_rate = 44100;
|
||||||
unsigned char *input_buf = decoder_frame_p->buffer;
|
unsigned char *input_buf = decoder_frame_p->buffer;
|
||||||
if (decoder_frame_p->buffer_len < SCALABLE_HEAD_SIZE) {
|
if (decoder_frame_p->buffer_len < SCALABLE_HEAD_SIZE) {
|
||||||
TRACE_A2DP_DECODER_E("invalid scalable a2dp frame, length < SCALABLE_HEAD_SIZE !!!!!!!");
|
TRACE_A2DP_DECODER_E(
|
||||||
|
"invalid scalable a2dp frame, length < SCALABLE_HEAD_SIZE !!!!!!!");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
scalable_uhq_flag = 0;
|
scalable_uhq_flag = 0;
|
||||||
|
|
||||||
switch ((input_buf[3]&0xf7)) {
|
switch ((input_buf[3] & 0xf7)) {
|
||||||
case 0xF0:
|
case 0xF0:
|
||||||
bitrate_bps = 88000;
|
bitrate_bps = 88000;
|
||||||
break;
|
break;
|
||||||
|
@ -142,23 +136,22 @@ static bool is_valid_frame(a2dp_audio_scalable_decoder_frame_t * decoder_frame_p
|
||||||
len = hw_tmp + len;
|
len = hw_tmp + len;
|
||||||
len = len + ((len & 1) ^ 1);
|
len = len + ((len & 1) ^ 1);
|
||||||
} else {
|
} else {
|
||||||
len = 369; //744/2-4+1
|
len = 369; // 744/2-4+1
|
||||||
}
|
}
|
||||||
TRACE_A2DP_DECODER_D
|
TRACE_A2DP_DECODER_D(
|
||||||
("scalable a2dp frame, length:%d bitrate:%d sampling_rate:%d",
|
"scalable a2dp frame, length:%d bitrate:%d sampling_rate:%d",
|
||||||
decoder_frame_p->buffer_len, bitrate_bps, sampling_rate);
|
decoder_frame_p->buffer_len, bitrate_bps, sampling_rate);
|
||||||
frame_len = SCALABLE_HEAD_SIZE + len - 1;
|
frame_len = SCALABLE_HEAD_SIZE + len - 1;
|
||||||
|
|
||||||
if (decoder_frame_p->buffer_len < frame_len) {
|
if (decoder_frame_p->buffer_len < frame_len) {
|
||||||
TRACE_A2DP_DECODER_E
|
TRACE_A2DP_DECODER_E(
|
||||||
("invalid scalable a2dp frame, length:%d < %d !!!!!!!", decoder_frame_p->buffer_len, frame_len);
|
"invalid scalable a2dp frame, length:%d < %d !!!!!!!",
|
||||||
|
decoder_frame_p->buffer_len, frame_len);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifdef A2DP_CP_ACCEL
|
#ifdef A2DP_CP_ACCEL
|
||||||
struct A2DP_CP_scalable_IN_FRM_INFO_T {
|
struct A2DP_CP_scalable_IN_FRM_INFO_T {
|
||||||
uint16_t sequenceNumber;
|
uint16_t sequenceNumber;
|
||||||
|
@ -176,8 +169,8 @@ struct A2DP_CP_scalable_OUT_FRM_INFO_T {
|
||||||
static bool cp_codec_reset;
|
static bool cp_codec_reset;
|
||||||
extern uint32_t app_bt_stream_get_dma_buffer_samples(void);
|
extern uint32_t app_bt_stream_get_dma_buffer_samples(void);
|
||||||
|
|
||||||
TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t buffer_bytes)
|
TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t *buffer,
|
||||||
{
|
uint32_t buffer_bytes) {
|
||||||
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
|
@ -189,11 +182,13 @@ TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t b
|
||||||
uint32_t out_frame_len;
|
uint32_t out_frame_len;
|
||||||
uint32_t cp_buffer_frames_max = 0;
|
uint32_t cp_buffer_frames_max = 0;
|
||||||
|
|
||||||
cp_buffer_frames_max = app_bt_stream_get_dma_buffer_samples()/2;
|
cp_buffer_frames_max = app_bt_stream_get_dma_buffer_samples() / 2;
|
||||||
if (cp_buffer_frames_max %(lastframe_info.frame_samples) ){
|
if (cp_buffer_frames_max % (lastframe_info.frame_samples)) {
|
||||||
cp_buffer_frames_max = cp_buffer_frames_max /(lastframe_info.frame_samples) +1;
|
cp_buffer_frames_max =
|
||||||
}else{
|
cp_buffer_frames_max / (lastframe_info.frame_samples) + 1;
|
||||||
cp_buffer_frames_max = cp_buffer_frames_max /(lastframe_info.frame_samples);
|
} else {
|
||||||
|
cp_buffer_frames_max =
|
||||||
|
cp_buffer_frames_max / (lastframe_info.frame_samples);
|
||||||
}
|
}
|
||||||
|
|
||||||
out_frame_len = sizeof(*p_out_info) + buffer_bytes;
|
out_frame_len = sizeof(*p_out_info) + buffer_bytes;
|
||||||
|
@ -202,8 +197,8 @@ TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t b
|
||||||
ASSERT(ret == 0, "%s: a2dp_cp_decoder_init() failed: ret=%d", __func__, ret);
|
ASSERT(ret == 0, "%s: a2dp_cp_decoder_init() failed: ret=%d", __func__, ret);
|
||||||
|
|
||||||
while ((node = a2dp_audio_list_begin(list)) != NULL) {
|
while ((node = a2dp_audio_list_begin(list)) != NULL) {
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
decoder_frame_p =
|
||||||
a2dp_audio_list_node(node);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
|
|
||||||
if (false == is_valid_frame(decoder_frame_p)) {
|
if (false == is_valid_frame(decoder_frame_p)) {
|
||||||
return A2DP_DECODER_DECODE_ERROR;
|
return A2DP_DECODER_DECODE_ERROR;
|
||||||
|
@ -212,7 +207,9 @@ TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t b
|
||||||
in_info.sequenceNumber = decoder_frame_p->sequenceNumber;
|
in_info.sequenceNumber = decoder_frame_p->sequenceNumber;
|
||||||
in_info.timestamp = decoder_frame_p->timestamp;
|
in_info.timestamp = decoder_frame_p->timestamp;
|
||||||
|
|
||||||
ret = a2dp_cp_put_in_frame(&in_info, sizeof(in_info), decoder_frame_p->buffer, decoder_frame_p->buffer_len);
|
ret =
|
||||||
|
a2dp_cp_put_in_frame(&in_info, sizeof(in_info), decoder_frame_p->buffer,
|
||||||
|
decoder_frame_p->buffer_len);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -229,7 +226,8 @@ TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t b
|
||||||
a2dp_cp_consume_full_out_frame();
|
a2dp_cp_consume_full_out_frame();
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
ASSERT(out_len == out_frame_len, "%s: Bad out len %u (should be %u)", __func__, out_len, out_frame_len);
|
ASSERT(out_len == out_frame_len, "%s: Bad out len %u (should be %u)",
|
||||||
|
__func__, out_len, out_frame_len);
|
||||||
|
|
||||||
p_out_info = (struct A2DP_CP_scalable_OUT_FRM_INFO_T *)out;
|
p_out_info = (struct A2DP_CP_scalable_OUT_FRM_INFO_T *)out;
|
||||||
if (p_out_info->pcm_len) {
|
if (p_out_info->pcm_len) {
|
||||||
|
@ -240,7 +238,8 @@ TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t b
|
||||||
lastframe_info.frame_samples = p_out_info->frame_samples;
|
lastframe_info.frame_samples = p_out_info->frame_samples;
|
||||||
lastframe_info.decoded_frames += p_out_info->decoded_frames;
|
lastframe_info.decoded_frames += p_out_info->decoded_frames;
|
||||||
lastframe_info.undecode_frames =
|
lastframe_info.undecode_frames =
|
||||||
a2dp_audio_list_length(list) + a2dp_cp_get_in_frame_cnt_by_index(p_out_info->frame_idx) - 1;
|
a2dp_audio_list_length(list) +
|
||||||
|
a2dp_cp_get_in_frame_cnt_by_index(p_out_info->frame_idx) - 1;
|
||||||
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -252,13 +251,13 @@ TEXT_SSC_LOC static int a2dp_cp_scalable_mcu_decode(uint8_t * buffer, uint32_t b
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = a2dp_cp_consume_full_out_frame();
|
ret = a2dp_cp_consume_full_out_frame();
|
||||||
ASSERT(ret == 0, "%s: a2dp_cp_consume_full_out_frame() failed: ret=%d", __func__, ret);
|
ASSERT(ret == 0, "%s: a2dp_cp_consume_full_out_frame() failed: ret=%d",
|
||||||
|
__func__, ret);
|
||||||
|
|
||||||
return dec_ret;
|
return dec_ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEXT_SSC_LOC int a2dp_cp_scalable_cp_decode(void)
|
TEXT_SSC_LOC int a2dp_cp_scalable_cp_decode(void) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
enum CP_EMPTY_OUT_FRM_T out_frm_st;
|
enum CP_EMPTY_OUT_FRM_T out_frm_st;
|
||||||
uint8_t *out;
|
uint8_t *out;
|
||||||
|
@ -270,97 +269,100 @@ TEXT_SSC_LOC int a2dp_cp_scalable_cp_decode(void)
|
||||||
uint8_t *in_buf;
|
uint8_t *in_buf;
|
||||||
uint32_t in_len;
|
uint32_t in_len;
|
||||||
uint32_t dec_sum;
|
uint32_t dec_sum;
|
||||||
int error, output_samples = 0,output_byte = 0;
|
int error, output_samples = 0, output_byte = 0;
|
||||||
|
|
||||||
if (cp_codec_reset)
|
if (cp_codec_reset) {
|
||||||
{
|
|
||||||
cp_codec_reset = false;
|
cp_codec_reset = false;
|
||||||
a2dp_audio_scalable_decoder_init();
|
a2dp_audio_scalable_decoder_init();
|
||||||
}
|
}
|
||||||
|
|
||||||
out_frm_st = a2dp_cp_get_emtpy_out_frame((void **)&out, &out_len);
|
out_frm_st = a2dp_cp_get_emtpy_out_frame((void **)&out, &out_len);
|
||||||
|
|
||||||
if (out_frm_st != CP_EMPTY_OUT_FRM_OK && out_frm_st != CP_EMPTY_OUT_FRM_WORKING)
|
if (out_frm_st != CP_EMPTY_OUT_FRM_OK &&
|
||||||
{
|
out_frm_st != CP_EMPTY_OUT_FRM_WORKING) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(out_len > sizeof(*p_out_info), "%s: Bad out_len %u (should > %u)", __func__, out_len, sizeof(*p_out_info));
|
ASSERT(out_len > sizeof(*p_out_info), "%s: Bad out_len %u (should > %u)",
|
||||||
|
__func__, out_len, sizeof(*p_out_info));
|
||||||
|
|
||||||
p_out_info = (struct A2DP_CP_scalable_OUT_FRM_INFO_T *)out;
|
p_out_info = (struct A2DP_CP_scalable_OUT_FRM_INFO_T *)out;
|
||||||
if (out_frm_st == CP_EMPTY_OUT_FRM_OK)
|
if (out_frm_st == CP_EMPTY_OUT_FRM_OK) {
|
||||||
{
|
|
||||||
p_out_info->pcm_len = 0;
|
p_out_info->pcm_len = 0;
|
||||||
p_out_info->decoded_frames = 0;
|
p_out_info->decoded_frames = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(out_len > sizeof(*p_out_info) + p_out_info->pcm_len,
|
ASSERT(out_len > sizeof(*p_out_info) + p_out_info->pcm_len,
|
||||||
"%s: Bad out_len %u (should > %u + %u)", __func__, out_len, sizeof(*p_out_info), p_out_info->pcm_len);
|
"%s: Bad out_len %u (should > %u + %u)", __func__, out_len,
|
||||||
|
sizeof(*p_out_info), p_out_info->pcm_len);
|
||||||
|
|
||||||
dec_start = (uint8_t *) (p_out_info + 1) + p_out_info->pcm_len;
|
dec_start = (uint8_t *)(p_out_info + 1) + p_out_info->pcm_len;
|
||||||
dec_len = out_len - (dec_start - (uint8_t *) out);
|
dec_len = out_len - (dec_start - (uint8_t *)out);
|
||||||
if (!scalableDec_handle) {
|
if (!scalableDec_handle) {
|
||||||
TRACE(0,"scalable_decode not ready");
|
TRACE(0, "scalable_decode not ready");
|
||||||
return 3;
|
return 3;
|
||||||
}
|
}
|
||||||
|
|
||||||
dec_sum = 0;
|
dec_sum = 0;
|
||||||
error = 0;
|
error = 0;
|
||||||
|
|
||||||
while (dec_sum < dec_len && error == 0)
|
while (dec_sum < dec_len && error == 0) {
|
||||||
{
|
ret = a2dp_cp_get_in_frame((void **)&in_buf, &in_len);
|
||||||
ret = a2dp_cp_get_in_frame((void * *) &in_buf, &in_len);
|
|
||||||
|
|
||||||
if (ret)
|
if (ret) {
|
||||||
{
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(in_len > sizeof(*p_in_info), "%s: Bad in_len %u (should > %u)", __func__, in_len, sizeof(*p_in_info));
|
ASSERT(in_len > sizeof(*p_in_info), "%s: Bad in_len %u (should > %u)",
|
||||||
|
__func__, in_len, sizeof(*p_in_info));
|
||||||
p_in_info = (struct A2DP_CP_scalable_IN_FRM_INFO_T *)in_buf;
|
p_in_info = (struct A2DP_CP_scalable_IN_FRM_INFO_T *)in_buf;
|
||||||
in_buf += sizeof(*p_in_info);
|
in_buf += sizeof(*p_in_info);
|
||||||
in_len -= sizeof(*p_in_info);
|
in_len -= sizeof(*p_in_info);
|
||||||
/* decode one SSC frame */
|
/* decode one SSC frame */
|
||||||
output_samples = ssc_decode(scalableDec_handle,(const unsigned char*)in_buf, ss_pcm_buff, SCALABLE_FRAME_SIZE, 0, 2);
|
output_samples =
|
||||||
if (0 == output_samples)
|
ssc_decode(scalableDec_handle, (const unsigned char *)in_buf,
|
||||||
{
|
ss_pcm_buff, SCALABLE_FRAME_SIZE, 0, 2);
|
||||||
|
if (0 == output_samples) {
|
||||||
a2dp_audio_scalable_decoder_reinit();
|
a2dp_audio_scalable_decoder_reinit();
|
||||||
TRACE(0, "scalable_decode reinin codec \n");
|
TRACE(0, "scalable_decode reinin codec \n");
|
||||||
error = A2DP_DECODER_DECODE_ERROR;
|
error = A2DP_DECODER_DECODE_ERROR;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
ss_to_24bit_buf((int32_t *) (dec_start+dec_sum), (int32_t *) ss_pcm_buff, output_samples);
|
ss_to_24bit_buf((int32_t *)(dec_start + dec_sum), (int32_t *)ss_pcm_buff,
|
||||||
|
output_samples);
|
||||||
output_byte = output_samples * 4;
|
output_byte = output_samples * 4;
|
||||||
dec_sum += output_byte;
|
dec_sum += output_byte;
|
||||||
exit:
|
exit:
|
||||||
memcpy(&p_out_info->in_info, ss_pcm_buff, sizeof(*p_in_info));
|
memcpy(&p_out_info->in_info, ss_pcm_buff, sizeof(*p_in_info));
|
||||||
p_out_info->decoded_frames++;
|
p_out_info->decoded_frames++;
|
||||||
p_out_info->frame_samples = SCALABLE_OUTPUT_FRAME_SAMPLES;
|
p_out_info->frame_samples = SCALABLE_OUTPUT_FRAME_SAMPLES;
|
||||||
p_out_info->frame_idx = a2dp_cp_get_in_frame_index();
|
p_out_info->frame_idx = a2dp_cp_get_in_frame_index();
|
||||||
|
|
||||||
ret = a2dp_cp_consume_in_frame();
|
ret = a2dp_cp_consume_in_frame();
|
||||||
ASSERT(ret == 0, "%s: a2dp_cp_consume_in_frame() failed: ret=%d", __func__, ret);
|
ASSERT(ret == 0, "%s: a2dp_cp_consume_in_frame() failed: ret=%d", __func__,
|
||||||
|
ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
p_out_info->pcm_len += dec_sum;
|
p_out_info->pcm_len += dec_sum;
|
||||||
|
|
||||||
if (error || out_len <= sizeof(*p_out_info) + p_out_info->pcm_len) {
|
if (error || out_len <= sizeof(*p_out_info) + p_out_info->pcm_len) {
|
||||||
ret = a2dp_cp_consume_emtpy_out_frame();
|
ret = a2dp_cp_consume_emtpy_out_frame();
|
||||||
ASSERT(ret == 0, "%s: a2dp_cp_consume_emtpy_out_frame() failed: ret=%d", __func__, ret);
|
ASSERT(ret == 0, "%s: a2dp_cp_consume_emtpy_out_frame() failed: ret=%d",
|
||||||
|
__func__, ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return error;
|
return error;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int a2dp_audio_scalable_init(A2DP_AUDIO_OUTPUT_CONFIG_T * config, void *context)
|
static int a2dp_audio_scalable_init(A2DP_AUDIO_OUTPUT_CONFIG_T *config,
|
||||||
{
|
void *context) {
|
||||||
TRACE_A2DP_DECODER_D("%s", __func__);
|
TRACE_A2DP_DECODER_D("%s", __func__);
|
||||||
|
|
||||||
TRACE(0,"\n\nA2DP SSC-LC INIT\n");
|
TRACE(0, "\n\nA2DP SSC-LC INIT\n");
|
||||||
|
|
||||||
a2dp_audio_context_p = (A2DP_AUDIO_CONTEXT_T *) context;
|
a2dp_audio_context_p = (A2DP_AUDIO_CONTEXT_T *)context;
|
||||||
|
|
||||||
memcpy(&output_config, config, sizeof(A2DP_AUDIO_OUTPUT_CONFIG_T));
|
memcpy(&output_config, config, sizeof(A2DP_AUDIO_OUTPUT_CONFIG_T));
|
||||||
|
|
||||||
|
@ -371,19 +373,25 @@ static int a2dp_audio_scalable_init(A2DP_AUDIO_OUTPUT_CONFIG_T * config, void *c
|
||||||
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
||||||
|
|
||||||
ASSERT(a2dp_audio_context_p->dest_packet_mut < SCALABLE_MTU_LIMITER,
|
ASSERT(a2dp_audio_context_p->dest_packet_mut < SCALABLE_MTU_LIMITER,
|
||||||
"%s MTU OVERFLOW:%u/%u", __func__, a2dp_audio_context_p->dest_packet_mut, SCALABLE_MTU_LIMITER);
|
"%s MTU OVERFLOW:%u/%u", __func__,
|
||||||
|
a2dp_audio_context_p->dest_packet_mut, SCALABLE_MTU_LIMITER);
|
||||||
|
|
||||||
int decoder_size;
|
int decoder_size;
|
||||||
|
|
||||||
decoder_size = ssc_decoder_get_size(output_config.num_channels); //todo: get size with codec capability
|
decoder_size = ssc_decoder_get_size(
|
||||||
|
output_config.num_channels); // todo: get size with codec capability
|
||||||
|
|
||||||
TRACE(0, "decoder size %d", decoder_size);
|
TRACE(0, "decoder size %d", decoder_size);
|
||||||
|
|
||||||
scalable_decoder_place = (unsigned char *)a2dp_audio_heap_malloc(decoder_size);
|
scalable_decoder_place =
|
||||||
ASSERT_A2DP_DECODER(scalable_decoder_place, "no memory resource for scalable_decoder_place");
|
(unsigned char *)a2dp_audio_heap_malloc(decoder_size);
|
||||||
|
ASSERT_A2DP_DECODER(scalable_decoder_place,
|
||||||
|
"no memory resource for scalable_decoder_place");
|
||||||
|
|
||||||
scalable_decoder_temp_buf = (unsigned char *)a2dp_audio_heap_malloc(SCALABLE_FRAME_SIZE * 16);
|
scalable_decoder_temp_buf =
|
||||||
ASSERT_A2DP_DECODER(scalable_decoder_temp_buf, "no memory resource for scalable_decoder_temp_buf");
|
(unsigned char *)a2dp_audio_heap_malloc(SCALABLE_FRAME_SIZE * 16);
|
||||||
|
ASSERT_A2DP_DECODER(scalable_decoder_temp_buf,
|
||||||
|
"no memory resource for scalable_decoder_temp_buf");
|
||||||
|
|
||||||
#ifdef A2DP_CP_ACCEL
|
#ifdef A2DP_CP_ACCEL
|
||||||
int ret;
|
int ret;
|
||||||
|
@ -397,21 +405,20 @@ static int a2dp_audio_scalable_init(A2DP_AUDIO_OUTPUT_CONFIG_T * config, void *c
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_deinit(void)
|
static int a2dp_audio_scalable_deinit(void) {
|
||||||
{
|
|
||||||
#ifdef A2DP_CP_ACCEL
|
#ifdef A2DP_CP_ACCEL
|
||||||
a2dp_cp_deinit();
|
a2dp_cp_deinit();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
a2dp_audio_scalable_decoder_deinit();
|
a2dp_audio_scalable_decoder_deinit();
|
||||||
|
|
||||||
TRACE(0,"\n\nA2DP SCALABLE DEINIT\n");
|
TRACE(0, "\n\nA2DP SCALABLE DEINIT\n");
|
||||||
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_scalable_mcu_decode_frame(uint8_t * buffer, uint32_t buffer_bytes)
|
int a2dp_audio_scalable_mcu_decode_frame(uint8_t *buffer,
|
||||||
{
|
uint32_t buffer_bytes) {
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
||||||
|
@ -421,24 +428,25 @@ int a2dp_audio_scalable_mcu_decode_frame(uint8_t * buffer, uint32_t buffer_bytes
|
||||||
int output_byte = 0, output_samples = 0;
|
int output_byte = 0, output_samples = 0;
|
||||||
uint8_t *output = buffer;
|
uint8_t *output = buffer;
|
||||||
// TRACE(1,"bbd %d",buffer_bytes );
|
// TRACE(1,"bbd %d",buffer_bytes );
|
||||||
if (buffer_bytes < (SCALABLE_FRAME_SIZE * output_config.num_channels * output_config.bits_depth / 8)) {
|
if (buffer_bytes < (SCALABLE_FRAME_SIZE * output_config.num_channels *
|
||||||
TRACE(1,"scalable_decode pcm_len = %d \n", buffer_bytes);
|
output_config.bits_depth / 8)) {
|
||||||
|
TRACE(1, "scalable_decode pcm_len = %d \n", buffer_bytes);
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
if (!scalableDec_handle) {
|
if (!scalableDec_handle) {
|
||||||
TRACE(0,"scalable_decode not ready");
|
TRACE(0, "scalable_decode not ready");
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
while (output < buffer + buffer_bytes) {
|
while (output < buffer + buffer_bytes) {
|
||||||
node = a2dp_audio_list_begin(list);
|
node = a2dp_audio_list_begin(list);
|
||||||
if (!node) {
|
if (!node) {
|
||||||
TRACE(0,"scalable_decode cache underflow");
|
TRACE(0, "scalable_decode cache underflow");
|
||||||
cache_underflow = true;
|
cache_underflow = true;
|
||||||
goto exit;
|
goto exit;
|
||||||
} else {
|
} else {
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
decoder_frame_p =
|
||||||
a2dp_audio_list_node(node);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
|
|
||||||
if (false == is_valid_frame(decoder_frame_p)) {
|
if (false == is_valid_frame(decoder_frame_p)) {
|
||||||
TRACE_A2DP_DECODER_E("%s %d invalid a2dp frame", __func__, __LINE__);
|
TRACE_A2DP_DECODER_E("%s %d invalid a2dp frame", __func__, __LINE__);
|
||||||
|
@ -447,28 +455,28 @@ int a2dp_audio_scalable_mcu_decode_frame(uint8_t * buffer, uint32_t buffer_bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
/* decode one SSC frame */
|
/* decode one SSC frame */
|
||||||
output_samples =
|
output_samples = ssc_decode(scalableDec_handle, decoder_frame_p->buffer,
|
||||||
ssc_decode(scalableDec_handle,
|
ss_pcm_buff, SCALABLE_FRAME_SIZE, 0, 2);
|
||||||
decoder_frame_p->buffer, ss_pcm_buff, SCALABLE_FRAME_SIZE,0,2);
|
|
||||||
|
|
||||||
TRACE_A2DP_DECODER_D
|
TRACE_A2DP_DECODER_D("scalable_decode seq:%d len:%d output_samples:%d",
|
||||||
("scalable_decode seq:%d len:%d output_samples:%d",
|
decoder_frame_p->sequenceNumber,
|
||||||
decoder_frame_p->sequenceNumber, decoder_frame_p->buffer_len, output_samples);
|
decoder_frame_p->buffer_len, output_samples);
|
||||||
|
|
||||||
if (0 == output_samples) {
|
if (0 == output_samples) {
|
||||||
TRACE(0,"scalable_decode failed !!!!!!");
|
TRACE(0, "scalable_decode failed !!!!!!");
|
||||||
//if failed reopen it again
|
// if failed reopen it again
|
||||||
a2dp_audio_scalable_decoder_reinit();
|
a2dp_audio_scalable_decoder_reinit();
|
||||||
TRACE(0,"scalable_decode reinin codec \n");
|
TRACE(0, "scalable_decode reinin codec \n");
|
||||||
ret = A2DP_DECODER_DECODE_ERROR;
|
ret = A2DP_DECODER_DECODE_ERROR;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
ss_to_24bit_buf((int32_t *) output, (int32_t *) ss_pcm_buff, output_samples * 2);
|
ss_to_24bit_buf((int32_t *)output, (int32_t *)ss_pcm_buff,
|
||||||
|
output_samples * 2);
|
||||||
output_byte = output_samples * 8;
|
output_byte = output_samples * 8;
|
||||||
|
|
||||||
|
|
||||||
output += output_byte;
|
output += output_byte;
|
||||||
ASSERT(SCALABLE_FRAME_SIZE == output_samples, "scalable_decode output mismatch samples:%d", output_samples);
|
ASSERT(SCALABLE_FRAME_SIZE == output_samples,
|
||||||
|
"scalable_decode output mismatch samples:%d", output_samples);
|
||||||
lastframe_info.sequenceNumber = decoder_frame_p->sequenceNumber;
|
lastframe_info.sequenceNumber = decoder_frame_p->sequenceNumber;
|
||||||
lastframe_info.timestamp = decoder_frame_p->timestamp;
|
lastframe_info.timestamp = decoder_frame_p->timestamp;
|
||||||
lastframe_info.curSubSequenceNumber = 0;
|
lastframe_info.curSubSequenceNumber = 0;
|
||||||
|
@ -478,23 +486,21 @@ int a2dp_audio_scalable_mcu_decode_frame(uint8_t * buffer, uint32_t buffer_bytes
|
||||||
lastframe_info.undecode_frames = a2dp_audio_list_length(list) - 1;
|
lastframe_info.undecode_frames = a2dp_audio_list_length(list) - 1;
|
||||||
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
||||||
a2dp_audio_list_remove(list, decoder_frame_p);
|
a2dp_audio_list_remove(list, decoder_frame_p);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
exit:
|
||||||
|
|
||||||
exit:
|
|
||||||
if (cache_underflow) {
|
if (cache_underflow) {
|
||||||
lastframe_info.undecode_frames = 0;
|
lastframe_info.undecode_frames = 0;
|
||||||
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
||||||
ret = A2DP_DECODER_CACHE_UNDERFLOW_ERROR;
|
ret = A2DP_DECODER_CACHE_UNDERFLOW_ERROR;
|
||||||
}
|
}
|
||||||
//TRACE(0,"abd");
|
// TRACE(0,"abd");
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_decode_frame(uint8_t * buffer, uint32_t buffer_bytes)
|
static int a2dp_audio_scalable_decode_frame(uint8_t *buffer,
|
||||||
{
|
uint32_t buffer_bytes) {
|
||||||
#ifdef A2DP_CP_ACCEL
|
#ifdef A2DP_CP_ACCEL
|
||||||
return a2dp_cp_scalable_mcu_decode(buffer, buffer_bytes);
|
return a2dp_cp_scalable_mcu_decode(buffer, buffer_bytes);
|
||||||
#else
|
#else
|
||||||
|
@ -502,8 +508,9 @@ static int a2dp_audio_scalable_decode_frame(uint8_t * buffer, uint32_t buffer_by
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_preparse_packet(btif_media_header_t * header, uint8_t * buffer, uint32_t buffer_bytes)
|
static int a2dp_audio_scalable_preparse_packet(btif_media_header_t *header,
|
||||||
{
|
uint8_t *buffer,
|
||||||
|
uint32_t buffer_bytes) {
|
||||||
lastframe_info.sequenceNumber = header->sequenceNumber;
|
lastframe_info.sequenceNumber = header->sequenceNumber;
|
||||||
lastframe_info.timestamp = header->timestamp;
|
lastframe_info.timestamp = header->timestamp;
|
||||||
lastframe_info.curSubSequenceNumber = 0;
|
lastframe_info.curSubSequenceNumber = 0;
|
||||||
|
@ -514,39 +521,43 @@ static int a2dp_audio_scalable_preparse_packet(btif_media_header_t * header, uin
|
||||||
lastframe_info.undecode_frames = 0;
|
lastframe_info.undecode_frames = 0;
|
||||||
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
a2dp_audio_decoder_internal_lastframe_info_set(&lastframe_info);
|
||||||
|
|
||||||
TRACE(3,"%s seq:%d timestamp:%08x", __func__, header->sequenceNumber, header->timestamp);
|
TRACE(3, "%s seq:%d timestamp:%08x", __func__, header->sequenceNumber,
|
||||||
|
header->timestamp);
|
||||||
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void *a2dp_audio_scalable_frame_malloc(uint32_t packet_len)
|
static void *a2dp_audio_scalable_frame_malloc(uint32_t packet_len) {
|
||||||
{
|
|
||||||
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
||||||
uint8_t *buffer = NULL;
|
uint8_t *buffer = NULL;
|
||||||
|
|
||||||
buffer = (uint8_t *) a2dp_audio_heap_malloc(SCALABLE_READBUF_SIZE);
|
buffer = (uint8_t *)a2dp_audio_heap_malloc(SCALABLE_READBUF_SIZE);
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
decoder_frame_p =
|
||||||
a2dp_audio_heap_malloc(sizeof(a2dp_audio_scalable_decoder_frame_t));
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_heap_malloc(
|
||||||
|
sizeof(a2dp_audio_scalable_decoder_frame_t));
|
||||||
decoder_frame_p->buffer = buffer;
|
decoder_frame_p->buffer = buffer;
|
||||||
decoder_frame_p->buffer_len = packet_len;
|
decoder_frame_p->buffer_len = packet_len;
|
||||||
return (void *)decoder_frame_p;
|
return (void *)decoder_frame_p;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void a2dp_audio_scalable_free(void *packet)
|
static void a2dp_audio_scalable_free(void *packet) {
|
||||||
{
|
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p =
|
||||||
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *) packet;
|
(a2dp_audio_scalable_decoder_frame_t *)packet;
|
||||||
a2dp_audio_heap_free(decoder_frame_p->buffer);
|
a2dp_audio_heap_free(decoder_frame_p->buffer);
|
||||||
a2dp_audio_heap_free(decoder_frame_p);
|
a2dp_audio_heap_free(decoder_frame_p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_store_packet(btif_media_header_t * header, uint8_t * buffer, uint32_t buffer_bytes)
|
static int a2dp_audio_scalable_store_packet(btif_media_header_t *header,
|
||||||
{
|
uint8_t *buffer,
|
||||||
|
uint32_t buffer_bytes) {
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
int nRet = A2DP_DECODER_NO_ERROR;
|
int nRet = A2DP_DECODER_NO_ERROR;
|
||||||
if (a2dp_audio_list_length(list) < SCALABLE_MTU_LIMITER) {
|
if (a2dp_audio_list_length(list) < SCALABLE_MTU_LIMITER) {
|
||||||
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p =
|
||||||
a2dp_audio_scalable_frame_malloc(buffer_bytes);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_scalable_frame_malloc(
|
||||||
TRACE_A2DP_DECODER_D("%s seq:%d len:%d", __func__, header->sequenceNumber, buffer_bytes);
|
buffer_bytes);
|
||||||
|
TRACE_A2DP_DECODER_D("%s seq:%d len:%d", __func__, header->sequenceNumber,
|
||||||
|
buffer_bytes);
|
||||||
decoder_frame_p->sequenceNumber = header->sequenceNumber;
|
decoder_frame_p->sequenceNumber = header->sequenceNumber;
|
||||||
decoder_frame_p->timestamp = header->timestamp;
|
decoder_frame_p->timestamp = header->timestamp;
|
||||||
memcpy(decoder_frame_p->buffer, buffer, buffer_bytes);
|
memcpy(decoder_frame_p->buffer, buffer, buffer_bytes);
|
||||||
|
@ -554,15 +565,15 @@ static int a2dp_audio_scalable_store_packet(btif_media_header_t * header, uint8_
|
||||||
a2dp_audio_list_append(list, decoder_frame_p);
|
a2dp_audio_list_append(list, decoder_frame_p);
|
||||||
nRet = A2DP_DECODER_NO_ERROR;
|
nRet = A2DP_DECODER_NO_ERROR;
|
||||||
} else {
|
} else {
|
||||||
TRACE(2,"%s list full current len:%d", __func__, a2dp_audio_list_length(list));
|
TRACE(2, "%s list full current len:%d", __func__,
|
||||||
|
a2dp_audio_list_length(list));
|
||||||
nRet = A2DP_DECODER_MTU_LIMTER_ERROR;
|
nRet = A2DP_DECODER_MTU_LIMTER_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_discards_packet(uint32_t packets)
|
static int a2dp_audio_scalable_discards_packet(uint32_t packets) {
|
||||||
{
|
|
||||||
int nRet = A2DP_DECODER_MEMORY_ERROR;
|
int nRet = A2DP_DECODER_MEMORY_ERROR;
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
|
@ -574,47 +585,48 @@ static int a2dp_audio_scalable_discards_packet(uint32_t packets)
|
||||||
|
|
||||||
if (packets <= a2dp_audio_list_length(list)) {
|
if (packets <= a2dp_audio_list_length(list)) {
|
||||||
for (uint8_t i = 0; i < packets; i++) {
|
for (uint8_t i = 0; i < packets; i++) {
|
||||||
if ((node = a2dp_audio_list_begin(list)) != NULL){
|
if ((node = a2dp_audio_list_begin(list)) != NULL) {
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
decoder_frame_p =
|
||||||
a2dp_audio_list_node(node);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
a2dp_audio_list_remove(list, decoder_frame_p);
|
a2dp_audio_list_remove(list, decoder_frame_p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
nRet = A2DP_DECODER_NO_ERROR;
|
nRet = A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(3,"%s packets:%d nRet:%d", __func__, packets, nRet);
|
TRACE(3, "%s packets:%d nRet:%d", __func__, packets, nRet);
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_headframe_info_get(A2DP_AUDIO_HEADFRAME_INFO_T* headframe_info)
|
static int a2dp_audio_scalable_headframe_info_get(
|
||||||
{
|
A2DP_AUDIO_HEADFRAME_INFO_T *headframe_info) {
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
a2dp_audio_scalable_decoder_frame_t *decoder_frame_p = NULL;
|
||||||
|
|
||||||
if (a2dp_audio_list_length(list)){
|
if (a2dp_audio_list_length(list)) {
|
||||||
if ((node = a2dp_audio_list_begin(list)) != NULL){
|
if ((node = a2dp_audio_list_begin(list)) != NULL) {
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
decoder_frame_p =
|
||||||
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
headframe_info->sequenceNumber = decoder_frame_p->sequenceNumber;
|
headframe_info->sequenceNumber = decoder_frame_p->sequenceNumber;
|
||||||
headframe_info->timestamp = decoder_frame_p->timestamp;
|
headframe_info->timestamp = decoder_frame_p->timestamp;
|
||||||
headframe_info->curSubSequenceNumber = 0;
|
headframe_info->curSubSequenceNumber = 0;
|
||||||
headframe_info->totalSubSequenceNumber = 0;
|
headframe_info->totalSubSequenceNumber = 0;
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
memset(headframe_info, 0, sizeof(A2DP_AUDIO_HEADFRAME_INFO_T));
|
memset(headframe_info, 0, sizeof(A2DP_AUDIO_HEADFRAME_INFO_T));
|
||||||
}
|
}
|
||||||
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_info_get(void *info)
|
static int a2dp_audio_scalable_info_get(void *info) {
|
||||||
{
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_synchronize_packet(A2DP_AUDIO_SYNCFRAME_INFO_T * sync_info, uint32_t mask)
|
static int
|
||||||
{
|
a2dp_audio_scalable_synchronize_packet(A2DP_AUDIO_SYNCFRAME_INFO_T *sync_info,
|
||||||
|
uint32_t mask) {
|
||||||
int nRet = A2DP_DECODER_SYNC_ERROR;
|
int nRet = A2DP_DECODER_SYNC_ERROR;
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
|
@ -628,11 +640,15 @@ static int a2dp_audio_scalable_synchronize_packet(A2DP_AUDIO_SYNCFRAME_INFO_T *
|
||||||
list_len = a2dp_audio_list_length(list);
|
list_len = a2dp_audio_list_length(list);
|
||||||
|
|
||||||
for (uint16_t i = 0; i < list_len; i++) {
|
for (uint16_t i = 0; i < list_len; i++) {
|
||||||
if ((node = a2dp_audio_list_begin(list)) != NULL){
|
if ((node = a2dp_audio_list_begin(list)) != NULL) {
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
decoder_frame_p =
|
||||||
a2dp_audio_list_node(node);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
if (A2DP_AUDIO_SYNCFRAME_CHK(decoder_frame_p->sequenceNumber == sync_info->sequenceNumber, A2DP_AUDIO_SYNCFRAME_MASK_SEQ, mask)&&
|
if (A2DP_AUDIO_SYNCFRAME_CHK(decoder_frame_p->sequenceNumber ==
|
||||||
A2DP_AUDIO_SYNCFRAME_CHK(decoder_frame_p->timestamp == sync_info->timestamp, A2DP_AUDIO_SYNCFRAME_MASK_TIMESTAMP, mask)) {
|
sync_info->sequenceNumber,
|
||||||
|
A2DP_AUDIO_SYNCFRAME_MASK_SEQ, mask) &&
|
||||||
|
A2DP_AUDIO_SYNCFRAME_CHK(decoder_frame_p->timestamp ==
|
||||||
|
sync_info->timestamp,
|
||||||
|
A2DP_AUDIO_SYNCFRAME_MASK_TIMESTAMP, mask)) {
|
||||||
nRet = A2DP_DECODER_NO_ERROR;
|
nRet = A2DP_DECODER_NO_ERROR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -642,19 +658,19 @@ static int a2dp_audio_scalable_synchronize_packet(A2DP_AUDIO_SYNCFRAME_INFO_T *
|
||||||
|
|
||||||
node = a2dp_audio_list_begin(list);
|
node = a2dp_audio_list_begin(list);
|
||||||
if (node) {
|
if (node) {
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
decoder_frame_p =
|
||||||
a2dp_audio_list_node(node);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
TRACE(4,"%s nRet:%d SEQ:%d timestamp:%d", __func__, nRet,
|
TRACE(4, "%s nRet:%d SEQ:%d timestamp:%d", __func__, nRet,
|
||||||
decoder_frame_p->sequenceNumber, decoder_frame_p->timestamp);
|
decoder_frame_p->sequenceNumber, decoder_frame_p->timestamp);
|
||||||
} else {
|
} else {
|
||||||
TRACE(2,"%s nRet:%d", __func__, nRet);
|
TRACE(2, "%s nRet:%d", __func__, nRet);
|
||||||
}
|
}
|
||||||
|
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int a2dp_audio_scalable_synchronize_dest_packet_mut(uint16_t packet_mut)
|
static int
|
||||||
{
|
a2dp_audio_scalable_synchronize_dest_packet_mut(uint16_t packet_mut) {
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
uint32_t list_len = 0;
|
uint32_t list_len = 0;
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
|
@ -664,51 +680,49 @@ static int a2dp_audio_scalable_synchronize_dest_packet_mut(uint16_t packet_mut)
|
||||||
if (list_len > packet_mut) {
|
if (list_len > packet_mut) {
|
||||||
do {
|
do {
|
||||||
node = a2dp_audio_list_begin(list);
|
node = a2dp_audio_list_begin(list);
|
||||||
if (node)
|
if (node) {
|
||||||
{
|
decoder_frame_p =
|
||||||
decoder_frame_p = (a2dp_audio_scalable_decoder_frame_t *)
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
a2dp_audio_list_node(node);
|
|
||||||
a2dp_audio_list_remove(list, decoder_frame_p);
|
a2dp_audio_list_remove(list, decoder_frame_p);
|
||||||
}
|
}
|
||||||
} while (a2dp_audio_list_length(list) > packet_mut);
|
} while (a2dp_audio_list_length(list) > packet_mut);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(2,"%s list:%d", __func__, a2dp_audio_list_length(list));
|
TRACE(2, "%s list:%d", __func__, a2dp_audio_list_length(list));
|
||||||
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_scalable_convert_list_to_samples(uint32_t *samples)
|
int a2dp_audio_scalable_convert_list_to_samples(uint32_t *samples) {
|
||||||
{
|
|
||||||
uint32_t list_len = 0;
|
uint32_t list_len = 0;
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
|
|
||||||
list_len = a2dp_audio_list_length(list);
|
list_len = a2dp_audio_list_length(list);
|
||||||
*samples = SCALABLE_FRAME_SIZE*list_len;
|
*samples = SCALABLE_FRAME_SIZE * list_len;
|
||||||
|
|
||||||
TRACE(3, "%s list:%d samples:%d", __func__, list_len, *samples);
|
TRACE(3, "%s list:%d samples:%d", __func__, list_len, *samples);
|
||||||
|
|
||||||
return A2DP_DECODER_NO_ERROR;
|
return A2DP_DECODER_NO_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
int a2dp_audio_scalable_discards_samples(uint32_t samples)
|
int a2dp_audio_scalable_discards_samples(uint32_t samples) {
|
||||||
{
|
|
||||||
int nRet = A2DP_DECODER_SYNC_ERROR;
|
int nRet = A2DP_DECODER_SYNC_ERROR;
|
||||||
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
list_t *list = a2dp_audio_context_p->audio_datapath.input_raw_packet_list;
|
||||||
a2dp_audio_scalable_decoder_frame_t *scalable_decoder_frame = NULL;
|
a2dp_audio_scalable_decoder_frame_t *scalable_decoder_frame = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
int need_remove_list = 0;
|
int need_remove_list = 0;
|
||||||
uint32_t list_samples = 0;
|
uint32_t list_samples = 0;
|
||||||
ASSERT(!(samples%SCALABLE_FRAME_SIZE), "%s samples err:%d", __func__, samples);
|
ASSERT(!(samples % SCALABLE_FRAME_SIZE), "%s samples err:%d", __func__,
|
||||||
|
samples);
|
||||||
|
|
||||||
a2dp_audio_scalable_convert_list_to_samples(&list_samples);
|
a2dp_audio_scalable_convert_list_to_samples(&list_samples);
|
||||||
if (list_samples >= samples){
|
if (list_samples >= samples) {
|
||||||
need_remove_list = samples/SCALABLE_FRAME_SIZE;
|
need_remove_list = samples / SCALABLE_FRAME_SIZE;
|
||||||
for (int i=0; i<need_remove_list; i++){
|
for (int i = 0; i < need_remove_list; i++) {
|
||||||
node = a2dp_audio_list_begin(list);
|
node = a2dp_audio_list_begin(list);
|
||||||
if (node)
|
if (node) {
|
||||||
{
|
scalable_decoder_frame =
|
||||||
scalable_decoder_frame = (a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
(a2dp_audio_scalable_decoder_frame_t *)a2dp_audio_list_node(node);
|
||||||
a2dp_audio_list_remove(list, scalable_decoder_frame);
|
a2dp_audio_list_remove(list, scalable_decoder_frame);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -735,5 +749,7 @@ A2DP_AUDIO_DECODER_T a2dp_audio_scalable_decoder_config = {
|
||||||
a2dp_audio_scalable_free,
|
a2dp_audio_scalable_free,
|
||||||
};
|
};
|
||||||
#else
|
#else
|
||||||
A2DP_AUDIO_DECODER_T a2dp_audio_scalable_decoder_config = { 0, };
|
A2DP_AUDIO_DECODER_T a2dp_audio_scalable_decoder_config = {
|
||||||
|
0,
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -13,25 +13,25 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "app_bt_trace.h"
|
#include "app_bt_trace.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
#include "cqueue.h"
|
|
||||||
#include "list.h"
|
|
||||||
#include "hal_aud.h"
|
|
||||||
#include "resources.h"
|
|
||||||
#include "app_thread.h"
|
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
#include "app_media_player.h"
|
#include "app_media_player.h"
|
||||||
#include "app_ring_merge.h"
|
#include "app_ring_merge.h"
|
||||||
|
#include "app_thread.h"
|
||||||
|
#include "cqueue.h"
|
||||||
|
#include "hal_aud.h"
|
||||||
|
#include "list.h"
|
||||||
#include "nvrecord.h"
|
#include "nvrecord.h"
|
||||||
|
#include "resources.h"
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
|
||||||
#include "a2dp_api.h"
|
#include "a2dp_api.h"
|
||||||
|
|
||||||
#include "btapp.h"
|
|
||||||
#include "app_bt_media_manager.h"
|
#include "app_bt_media_manager.h"
|
||||||
|
#include "btapp.h"
|
||||||
|
|
||||||
extern uint8_t __StackLimit[];
|
extern uint8_t __StackLimit[];
|
||||||
extern uint8_t __HeapLimit[];
|
extern uint8_t __HeapLimit[];
|
||||||
|
@ -41,12 +41,12 @@ static const size_t heap_size = __StackLimit - __HeapLimit - 512;
|
||||||
static bool app_audio_init = false;
|
static bool app_audio_init = false;
|
||||||
|
|
||||||
static uint32_t capture_audio_buff_size_used;
|
static uint32_t capture_audio_buff_size_used;
|
||||||
// from the bottom of the system available memory pool, size is APP_CAPTURE_AUDIO_BUFFER_SIZE
|
// from the bottom of the system available memory pool, size is
|
||||||
// can be overlayed with the sco used audio buffer
|
// APP_CAPTURE_AUDIO_BUFFER_SIZE can be overlayed with the sco used audio buffer
|
||||||
static uint8_t* capture_audio_buffer = __HeapLimit + heap_size - APP_CAPTURE_AUDIO_BUFFER_SIZE;
|
static uint8_t *capture_audio_buffer =
|
||||||
|
__HeapLimit + heap_size - APP_CAPTURE_AUDIO_BUFFER_SIZE;
|
||||||
|
|
||||||
int app_capture_audio_mempool_init(void)
|
int app_capture_audio_mempool_init(void) {
|
||||||
{
|
|
||||||
TRACE_AUD_HDL_I("[CAPMEM][INIT] size %d.", APP_CAPTURE_AUDIO_BUFFER_SIZE);
|
TRACE_AUD_HDL_I("[CAPMEM][INIT] size %d.", APP_CAPTURE_AUDIO_BUFFER_SIZE);
|
||||||
capture_audio_buff_size_used = 0;
|
capture_audio_buff_size_used = 0;
|
||||||
memset((uint8_t *)capture_audio_buffer, 0, APP_CAPTURE_AUDIO_BUFFER_SIZE);
|
memset((uint8_t *)capture_audio_buffer, 0, APP_CAPTURE_AUDIO_BUFFER_SIZE);
|
||||||
|
@ -54,35 +54,36 @@ int app_capture_audio_mempool_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t app_capture_audio_mempool_free_buff_size()
|
uint32_t app_capture_audio_mempool_free_buff_size() {
|
||||||
{
|
|
||||||
return APP_CAPTURE_AUDIO_BUFFER_SIZE - capture_audio_buff_size_used;
|
return APP_CAPTURE_AUDIO_BUFFER_SIZE - capture_audio_buff_size_used;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_capture_audio_mempool_get_buff(uint8_t **buff, uint32_t size)
|
int app_capture_audio_mempool_get_buff(uint8_t **buff, uint32_t size) {
|
||||||
{
|
|
||||||
uint32_t buff_size_free;
|
uint32_t buff_size_free;
|
||||||
uint8_t* capture_buf_addr = (uint8_t *)capture_audio_buffer;
|
uint8_t *capture_buf_addr = (uint8_t *)capture_audio_buffer;
|
||||||
buff_size_free = app_capture_audio_mempool_free_buff_size();
|
buff_size_free = app_capture_audio_mempool_free_buff_size();
|
||||||
|
|
||||||
if (size % 4){
|
if (size % 4) {
|
||||||
size = size + (4 - size % 4);
|
size = size + (4 - size % 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_AUD_HDL_I("[CAPMEM][GET] current free %d to allocate %d", buff_size_free, size);
|
TRACE_AUD_HDL_I("[CAPMEM][GET] current free %d to allocate %d",
|
||||||
|
buff_size_free, size);
|
||||||
|
|
||||||
ASSERT(size <= buff_size_free, "[%s] size = %d > free size = %d", __func__, size, buff_size_free);
|
ASSERT(size <= buff_size_free, "[%s] size = %d > free size = %d", __func__,
|
||||||
|
size, buff_size_free);
|
||||||
|
|
||||||
*buff = capture_buf_addr + capture_audio_buff_size_used;
|
*buff = capture_buf_addr + capture_audio_buff_size_used;
|
||||||
|
|
||||||
capture_audio_buff_size_used += size;
|
capture_audio_buff_size_used += size;
|
||||||
TRACE_AUD_HDL_I("[CAPMEM][GET] %d, now used %d left %d",
|
TRACE_AUD_HDL_I("[CAPMEM][GET] %d, now used %d left %d", size,
|
||||||
size, capture_audio_buff_size_used, app_capture_audio_mempool_free_buff_size());
|
capture_audio_buff_size_used,
|
||||||
|
app_capture_audio_mempool_free_buff_size());
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
osPoolDef (app_audio_status_mempool, 20, APP_AUDIO_STATUS);
|
osPoolDef(app_audio_status_mempool, 20, APP_AUDIO_STATUS);
|
||||||
osPoolId app_audio_status_mempool = NULL;
|
osPoolId app_audio_status_mempool = NULL;
|
||||||
|
|
||||||
// control queue access
|
// control queue access
|
||||||
|
@ -98,64 +99,52 @@ osMutexDef(app_audio_pcmbuff_mutex);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
list_t *audio_list;
|
list_t *audio_list;
|
||||||
}APP_AUDIO_CONFIG;
|
} APP_AUDIO_CONFIG;
|
||||||
|
|
||||||
APP_AUDIO_CONFIG app_audio_conifg = {
|
APP_AUDIO_CONFIG app_audio_conifg = {.audio_list = NULL};
|
||||||
.audio_list = NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void LOCK_APP_AUDIO_QUEUE()
|
void LOCK_APP_AUDIO_QUEUE() {
|
||||||
{
|
|
||||||
osMutexWait(g_app_audio_queue_mutex_id, osWaitForever);
|
osMutexWait(g_app_audio_queue_mutex_id, osWaitForever);
|
||||||
}
|
}
|
||||||
|
|
||||||
void UNLOCK_APP_AUDIO_QUEUE()
|
void UNLOCK_APP_AUDIO_QUEUE() { osMutexRelease(g_app_audio_queue_mutex_id); }
|
||||||
{
|
|
||||||
osMutexRelease(g_app_audio_queue_mutex_id);
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t app_audio_lr_balance(uint8_t *buf, uint32_t len, int8_t balance)
|
uint32_t app_audio_lr_balance(uint8_t *buf, uint32_t len, int8_t balance) {
|
||||||
{
|
short *balance_buf = (short *)buf;
|
||||||
short *balance_buf=(short *)buf;
|
uint32_t balance_len = len / 2;
|
||||||
uint32_t balance_len = len/2;
|
|
||||||
float factor;
|
float factor;
|
||||||
|
|
||||||
ASSERT((balance >= -100) && (balance <= 100), "balance = %d is invalid!", balance);
|
ASSERT((balance >= -100) && (balance <= 100), "balance = %d is invalid!",
|
||||||
|
balance);
|
||||||
|
|
||||||
if(balance > 0)
|
if (balance > 0) {
|
||||||
{
|
// reduce L channel
|
||||||
//reduce L channel
|
|
||||||
factor = 1 - 0.01 * balance;
|
factor = 1 - 0.01 * balance;
|
||||||
for(uint32_t i=0; i<balance_len;i+=2)
|
for (uint32_t i = 0; i < balance_len; i += 2) {
|
||||||
{
|
balance_buf[i] = (short)(factor * balance_buf[i]);
|
||||||
balance_buf[i] = (short) (factor * balance_buf[i]);
|
|
||||||
}
|
}
|
||||||
}
|
} else if (balance < 0) {
|
||||||
else if(balance < 0)
|
// reduce R channel
|
||||||
{
|
|
||||||
//reduce R channel
|
|
||||||
factor = 1 + 0.01 * balance;
|
factor = 1 + 0.01 * balance;
|
||||||
for(uint32_t i=0; i<balance_len;i+=2)
|
for (uint32_t i = 0; i < balance_len; i += 2) {
|
||||||
{
|
balance_buf[i + 1] = (short)(factor * balance_buf[i + 1]);
|
||||||
balance_buf[i+1] = (short) (factor * balance_buf[i+1]);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_audio_mempool_init_with_specific_size(uint32_t size)
|
void app_audio_mempool_init_with_specific_size(uint32_t size) {
|
||||||
{
|
|
||||||
syspool_init_specific_size(size);
|
syspool_init_specific_size(size);
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_audio_pcmbuff_init(uint8_t *buff, uint16_t len)
|
int app_audio_pcmbuff_init(uint8_t *buff, uint16_t len) {
|
||||||
{
|
|
||||||
if (app_audio_pcmbuff_mutex_id == NULL)
|
if (app_audio_pcmbuff_mutex_id == NULL)
|
||||||
app_audio_pcmbuff_mutex_id = osMutexCreate((osMutex(app_audio_pcmbuff_mutex)));
|
app_audio_pcmbuff_mutex_id =
|
||||||
|
osMutexCreate((osMutex(app_audio_pcmbuff_mutex)));
|
||||||
|
|
||||||
if ((buff == NULL)||(app_audio_pcmbuff_mutex_id == NULL))
|
if ((buff == NULL) || (app_audio_pcmbuff_mutex_id == NULL))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
||||||
|
@ -166,8 +155,7 @@ int app_audio_pcmbuff_init(uint8_t *buff, uint16_t len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_audio_pcmbuff_length(void)
|
int app_audio_pcmbuff_length(void) {
|
||||||
{
|
|
||||||
int len;
|
int len;
|
||||||
|
|
||||||
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
||||||
|
@ -177,8 +165,7 @@ int app_audio_pcmbuff_length(void)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_audio_pcmbuff_put(uint8_t *buff, uint16_t len)
|
int app_audio_pcmbuff_put(uint8_t *buff, uint16_t len) {
|
||||||
{
|
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
||||||
|
@ -188,20 +175,19 @@ int app_audio_pcmbuff_put(uint8_t *buff, uint16_t len)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_audio_pcmbuff_get(uint8_t *buff, uint16_t len)
|
int app_audio_pcmbuff_get(uint8_t *buff, uint16_t len) {
|
||||||
{
|
|
||||||
unsigned char *e1 = NULL, *e2 = NULL;
|
unsigned char *e1 = NULL, *e2 = NULL;
|
||||||
unsigned int len1 = 0, len2 = 0;
|
unsigned int len1 = 0, len2 = 0;
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
||||||
status = PeekCQueue(&app_audio_pcm_queue, len, &e1, &len1, &e2, &len2);
|
status = PeekCQueue(&app_audio_pcm_queue, len, &e1, &len1, &e2, &len2);
|
||||||
if (len==(len1+len2)){
|
if (len == (len1 + len2)) {
|
||||||
memcpy(buff,e1,len1);
|
memcpy(buff, e1, len1);
|
||||||
memcpy(buff+len1,e2,len2);
|
memcpy(buff + len1, e2, len2);
|
||||||
DeCQueue(&app_audio_pcm_queue, 0, len1);
|
DeCQueue(&app_audio_pcm_queue, 0, len1);
|
||||||
DeCQueue(&app_audio_pcm_queue, 0, len2);
|
DeCQueue(&app_audio_pcm_queue, 0, len2);
|
||||||
}else{
|
} else {
|
||||||
memset(buff, 0x00, len);
|
memset(buff, 0x00, len);
|
||||||
status = -1;
|
status = -1;
|
||||||
}
|
}
|
||||||
|
@ -210,8 +196,7 @@ int app_audio_pcmbuff_get(uint8_t *buff, uint16_t len)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_audio_pcmbuff_discard(uint16_t len)
|
int app_audio_pcmbuff_discard(uint16_t len) {
|
||||||
{
|
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
osMutexWait(app_audio_pcmbuff_mutex_id, osWaitForever);
|
||||||
|
@ -221,31 +206,29 @@ int app_audio_pcmbuff_discard(uint16_t len)
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((section(".fast_text_sram"))) app_audio_memcpy_16bit(int16_t *des, int16_t *src, int len)
|
void __attribute__((section(".fast_text_sram")))
|
||||||
{
|
app_audio_memcpy_16bit(int16_t *des, int16_t *src, int len) {
|
||||||
// Check input
|
// Check input
|
||||||
for(int i=0; i<len; i++)
|
for (int i = 0; i < len; i++) {
|
||||||
{
|
|
||||||
des[i] = src[i];
|
des[i] = src[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void __attribute__((section(".fast_text_sram"))) app_audio_memset_16bit(int16_t *des, int16_t val, int len)
|
void __attribute__((section(".fast_text_sram")))
|
||||||
{
|
app_audio_memset_16bit(int16_t *des, int16_t val, int len) {
|
||||||
// Check input
|
// Check input
|
||||||
for(int i=0; i<len; i++)
|
for (int i = 0; i < len; i++) {
|
||||||
{
|
|
||||||
des[i] = val;
|
des[i] = val;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __AUDIO_QUEUE_SUPPORT__
|
#ifdef __AUDIO_QUEUE_SUPPORT__
|
||||||
int app_audio_sendrequest_param(uint16_t id, uint8_t status, uint32_t ptr, uint32_t param)
|
int app_audio_sendrequest_param(uint16_t id, uint8_t status, uint32_t ptr,
|
||||||
{
|
uint32_t param) {
|
||||||
uint32_t audevt;
|
uint32_t audevt;
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
|
|
||||||
if(app_audio_init == false)
|
if (app_audio_init == false)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
msg.mod_id = APP_MODUAL_AUDIO;
|
msg.mod_id = APP_MODUAL_AUDIO;
|
||||||
|
@ -258,23 +241,20 @@ int app_audio_sendrequest_param(uint16_t id, uint8_t status, uint32_t ptr, uint3
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_audio_sendrequest(uint16_t id, uint8_t status, uint32_t ptr)
|
int app_audio_sendrequest(uint16_t id, uint8_t status, uint32_t ptr) {
|
||||||
{
|
|
||||||
return app_audio_sendrequest_param(id, status, ptr, 0);
|
return app_audio_sendrequest_param(id, status, ptr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern bool app_audio_list_playback_exist(void);
|
extern bool app_audio_list_playback_exist(void);
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
static uint8_t app_audio_get_list_playback_num(void)
|
static uint8_t app_audio_get_list_playback_num(void) {
|
||||||
{
|
|
||||||
APP_AUDIO_STATUS *audio_handle = NULL;
|
APP_AUDIO_STATUS *audio_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
uint8_t num=0;
|
uint8_t num = 0;
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node))
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
{
|
node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if(audio_handle == NULL)
|
if (audio_handle == NULL) {
|
||||||
{
|
|
||||||
return num;
|
return num;
|
||||||
}
|
}
|
||||||
if (audio_handle->id == APP_PLAY_BACK_AUDIO)
|
if (audio_handle->id == APP_PLAY_BACK_AUDIO)
|
||||||
|
@ -286,8 +266,7 @@ static uint8_t app_audio_get_list_playback_num(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool need_flush_flash_switch_audio = false;
|
static bool need_flush_flash_switch_audio = false;
|
||||||
void app_audio_switch_flash_flush_req(void)
|
void app_audio_switch_flash_flush_req(void) {
|
||||||
{
|
|
||||||
uint32_t lock;
|
uint32_t lock;
|
||||||
|
|
||||||
lock = int_lock();
|
lock = int_lock();
|
||||||
|
@ -295,8 +274,7 @@ void app_audio_switch_flash_flush_req(void)
|
||||||
int_unlock(lock);
|
int_unlock(lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_audio_switch_flash_proc(void)
|
static void app_audio_switch_flash_proc(void) {
|
||||||
{
|
|
||||||
// no need to do this across the audio switch,
|
// no need to do this across the audio switch,
|
||||||
// will use suspend flash erase to assure that no audio
|
// will use suspend flash erase to assure that no audio
|
||||||
// irq is missing for handling caused by long time global irq disabling
|
// irq is missing for handling caused by long time global irq disabling
|
||||||
|
@ -308,13 +286,13 @@ static void app_audio_switch_flash_proc(void)
|
||||||
bool need_flush_flash = false;
|
bool need_flush_flash = false;
|
||||||
|
|
||||||
lock = int_lock();
|
lock = int_lock();
|
||||||
if (need_flush_flash_switch_audio){
|
if (need_flush_flash_switch_audio) {
|
||||||
need_flush_flash_switch_audio = false;
|
need_flush_flash_switch_audio = false;
|
||||||
need_flush_flash = true;
|
need_flush_flash = true;
|
||||||
}
|
}
|
||||||
int_unlock(lock);
|
int_unlock(lock);
|
||||||
|
|
||||||
if (need_flush_flash){
|
if (need_flush_flash) {
|
||||||
#ifndef FPGA
|
#ifndef FPGA
|
||||||
nv_record_flash_flush();
|
nv_record_flash_flush();
|
||||||
#endif
|
#endif
|
||||||
|
@ -322,24 +300,20 @@ static void app_audio_switch_flash_proc(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef VOICE_DATAPATH
|
#ifdef VOICE_DATAPATH
|
||||||
static bool app_audio_handle_pre_processing(APP_MESSAGE_BODY *msg_body)
|
static bool app_audio_handle_pre_processing(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
uint16_t stream_type;
|
uint16_t stream_type;
|
||||||
APP_AUDIO_GET_AUD_ID(msg_body->message_ptr, stream_type);
|
APP_AUDIO_GET_AUD_ID(msg_body->message_ptr, stream_type);
|
||||||
|
|
||||||
bool isToResetCaptureStream = false;
|
bool isToResetCaptureStream = false;
|
||||||
if ((BT_STREAM_SBC == stream_type) || (BT_STREAM_MEDIA == stream_type))
|
if ((BT_STREAM_SBC == stream_type) || (BT_STREAM_MEDIA == stream_type)) {
|
||||||
{
|
if (app_audio_manager_capture_is_active()) {
|
||||||
if (app_audio_manager_capture_is_active())
|
|
||||||
{
|
|
||||||
isToResetCaptureStream = true;
|
isToResetCaptureStream = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isToResetCaptureStream)
|
if (isToResetCaptureStream) {
|
||||||
{
|
app_audio_manager_sendrequest(APP_BT_STREAM_MANAGER_STOP, BT_STREAM_CAPTURE,
|
||||||
app_audio_manager_sendrequest(APP_BT_STREAM_MANAGER_STOP,
|
0, 0);
|
||||||
BT_STREAM_CAPTURE, 0, 0);
|
|
||||||
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
msg.msg_body = *msg_body;
|
msg.msg_body = *msg_body;
|
||||||
|
@ -349,16 +323,13 @@ static bool app_audio_handle_pre_processing(APP_MESSAGE_BODY *msg_body)
|
||||||
BT_STREAM_CAPTURE, 0, 0);
|
BT_STREAM_CAPTURE, 0, 0);
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int app_audio_handle_process(APP_MESSAGE_BODY *msg_body)
|
static int app_audio_handle_process(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
int nRet = -1;
|
int nRet = -1;
|
||||||
|
|
||||||
APP_AUDIO_STATUS aud_status;
|
APP_AUDIO_STATUS aud_status;
|
||||||
|
@ -368,8 +339,7 @@ static int app_audio_handle_process(APP_MESSAGE_BODY *msg_body)
|
||||||
|
|
||||||
#ifdef VOICE_DATAPATH
|
#ifdef VOICE_DATAPATH
|
||||||
bool isContinue = app_audio_handle_pre_processing(msg_body);
|
bool isContinue = app_audio_handle_pre_processing(msg_body);
|
||||||
if (!isContinue)
|
if (!isContinue) {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -379,23 +349,16 @@ static int app_audio_handle_process(APP_MESSAGE_BODY *msg_body)
|
||||||
APP_AUDIO_GET_AUD_ID(msg_body->message_ptr, aud_status.aud_id);
|
APP_AUDIO_GET_AUD_ID(msg_body->message_ptr, aud_status.aud_id);
|
||||||
APP_AUDIO_GET_FREQ(msg_body->message_Param0, aud_status.freq);
|
APP_AUDIO_GET_FREQ(msg_body->message_Param0, aud_status.freq);
|
||||||
|
|
||||||
switch (aud_status.status)
|
switch (aud_status.status) {
|
||||||
{
|
|
||||||
case APP_BT_SETTING_OPEN:
|
case APP_BT_SETTING_OPEN:
|
||||||
#ifdef __AUDIO_QUEUE_SUPPORT__
|
#ifdef __AUDIO_QUEUE_SUPPORT__
|
||||||
TRACE_AUD_HDL_I(
|
TRACE_AUD_HDL_I("[OPEN] before status_id: 0x%x%s, aud_id: %d, len = %d",
|
||||||
"[OPEN] before status_id: 0x%x%s, aud_id: %d, len = %d",
|
aud_status.id, player2str(aud_status.id), aud_status.aud_id,
|
||||||
aud_status.id,
|
|
||||||
player2str(aud_status.id),
|
|
||||||
aud_status.aud_id,
|
|
||||||
list_length(app_audio_conifg.audio_list));
|
list_length(app_audio_conifg.audio_list));
|
||||||
|
|
||||||
if (app_audio_list_append(&aud_status))
|
if (app_audio_list_append(&aud_status)) {
|
||||||
{
|
|
||||||
app_bt_stream_open(&aud_status);
|
app_bt_stream_open(&aud_status);
|
||||||
TRACE_AUD_HDL_I(
|
TRACE_AUD_HDL_I("[OPEN] after status_id: 0x%x%s, len = %d", aud_status.id,
|
||||||
"[OPEN] after status_id: 0x%x%s, len = %d",
|
|
||||||
aud_status.id,
|
|
||||||
player2str(aud_status.id),
|
player2str(aud_status.id),
|
||||||
list_length(app_audio_conifg.audio_list));
|
list_length(app_audio_conifg.audio_list));
|
||||||
}
|
}
|
||||||
|
@ -408,30 +371,23 @@ static int app_audio_handle_process(APP_MESSAGE_BODY *msg_body)
|
||||||
app_audio_switch_flash_proc();
|
app_audio_switch_flash_proc();
|
||||||
#ifdef __AUDIO_QUEUE_SUPPORT__
|
#ifdef __AUDIO_QUEUE_SUPPORT__
|
||||||
APP_AUDIO_STATUS next_status;
|
APP_AUDIO_STATUS next_status;
|
||||||
TRACE_AUD_HDL_I(
|
TRACE_AUD_HDL_I("[CLOSE] current id: 0x%x%s", aud_status.id,
|
||||||
"[CLOSE] current id: 0x%x%s",
|
|
||||||
aud_status.id,
|
|
||||||
player2str(aud_status.id));
|
player2str(aud_status.id));
|
||||||
app_bt_stream_close(aud_status.id);
|
app_bt_stream_close(aud_status.id);
|
||||||
app_audio_switch_flash_proc();
|
app_audio_switch_flash_proc();
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
if (aud_status.id == APP_PLAY_BACK_AUDIO)
|
if (aud_status.id == APP_PLAY_BACK_AUDIO) {
|
||||||
{
|
|
||||||
TRACE_AUD_HDL_I("[CLOSE] list: %d", app_audio_get_list_playback_num());
|
TRACE_AUD_HDL_I("[CLOSE] list: %d", app_audio_get_list_playback_num());
|
||||||
if (app_audio_get_list_playback_num() == 1)
|
if (app_audio_get_list_playback_num() == 1) {
|
||||||
{
|
|
||||||
TRACE_AUD_HDL_I("=======>APP_BT_SETTING_CLOSE MEDIA");
|
TRACE_AUD_HDL_I("=======>APP_BT_SETTING_CLOSE MEDIA");
|
||||||
bt_media_stop(BT_STREAM_MEDIA, BT_DEVICE_ID_1);
|
bt_media_stop(BT_STREAM_MEDIA, BT_DEVICE_ID_1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
if (app_audio_list_rmv_callback(&aud_status, &next_status, APP_BT_SETTING_Q_POS_HEAD, false))
|
if (app_audio_list_rmv_callback(&aud_status, &next_status,
|
||||||
{
|
APP_BT_SETTING_Q_POS_HEAD, false)) {
|
||||||
TRACE_AUD_HDL_I(
|
TRACE_AUD_HDL_I("[CLOSE] %p, next id: 0x%x%s, status %d", &next_status,
|
||||||
"[CLOSE] %p, next id: 0x%x%s, status %d",
|
next_status.id, player2str(next_status.id),
|
||||||
&next_status,
|
|
||||||
next_status.id,
|
|
||||||
player2str(next_status.id),
|
|
||||||
next_status.status);
|
next_status.status);
|
||||||
app_bt_stream_open(&next_status);
|
app_bt_stream_open(&next_status);
|
||||||
}
|
}
|
||||||
|
@ -461,37 +417,33 @@ static int app_audio_handle_process(APP_MESSAGE_BODY *msg_body)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __AUDIO_QUEUE_SUPPORT__
|
#ifdef __AUDIO_QUEUE_SUPPORT__
|
||||||
static void app_audio_handle_free(void* data)
|
static void app_audio_handle_free(void *data) {
|
||||||
{
|
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
APP_AUDIO_STATUS * status = (APP_AUDIO_STATUS * )data;
|
APP_AUDIO_STATUS *status = (APP_AUDIO_STATUS *)data;
|
||||||
|
|
||||||
if(status->id == APP_PLAY_BACK_AUDIO)
|
if (status->id == APP_PLAY_BACK_AUDIO) {
|
||||||
{
|
TRACE_AUD_HDL_I("[HANDLE_FREE] , aud_id: 0x%x, type = 0x%x", status->aud_id,
|
||||||
TRACE_AUD_HDL_I("[HANDLE_FREE] , aud_id: 0x%x, type = 0x%x", status->aud_id, status->aud_type);
|
status->aud_type);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
osPoolFree (app_audio_status_mempool, data);
|
osPoolFree(app_audio_status_mempool, data);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_audio_list_create()
|
void app_audio_list_create() {
|
||||||
{
|
if (app_audio_conifg.audio_list == NULL) {
|
||||||
if (app_audio_conifg.audio_list == NULL)
|
|
||||||
{
|
|
||||||
app_audio_conifg.audio_list = list_new(app_audio_handle_free, NULL, NULL);
|
app_audio_conifg.audio_list = list_new(app_audio_handle_free, NULL, NULL);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_audio_list_stream_exist()
|
bool app_audio_list_stream_exist() {
|
||||||
{
|
|
||||||
APP_AUDIO_STATUS *audio_handle = NULL;
|
APP_AUDIO_STATUS *audio_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
|
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
|
node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
||||||
|
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if(audio_handle == NULL)
|
if (audio_handle == NULL) {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (audio_handle->id == APP_BT_STREAM_HFP_PCM ||
|
if (audio_handle->id == APP_BT_STREAM_HFP_PCM ||
|
||||||
|
@ -508,8 +460,7 @@ bool app_audio_list_stream_exist()
|
||||||
#ifdef __THIRDPARTY
|
#ifdef __THIRDPARTY
|
||||||
audio_handle->id == APP_BT_STREAM_THIRDPARTY_VOICE ||
|
audio_handle->id == APP_BT_STREAM_THIRDPARTY_VOICE ||
|
||||||
#endif
|
#endif
|
||||||
audio_handle->id == APP_BT_STREAM_A2DP_VENDOR
|
audio_handle->id == APP_BT_STREAM_A2DP_VENDOR) {
|
||||||
) {
|
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][EXIST] id 0x%x", audio_handle->id);
|
TRACE_AUD_HDL_I("[STREAM_LIST][EXIST] id 0x%x", audio_handle->id);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -518,28 +469,31 @@ bool app_audio_list_stream_exist()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_audio_list_filter_exist(APP_AUDIO_STATUS* aud_status)
|
bool app_audio_list_filter_exist(APP_AUDIO_STATUS *aud_status) {
|
||||||
{
|
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
APP_AUDIO_STATUS *audio_handle = NULL;
|
APP_AUDIO_STATUS *audio_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
uint8_t cnt = 0;
|
uint8_t cnt = 0;
|
||||||
|
|
||||||
if (aud_status->id == APP_PLAY_BACK_AUDIO){
|
if (aud_status->id == APP_PLAY_BACK_AUDIO) {
|
||||||
if(aud_status->aud_id == AUD_ID_BT_CALL_INCOMING_CALL) {
|
if (aud_status->aud_id == AUD_ID_BT_CALL_INCOMING_CALL) {
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
|
node != list_end(app_audio_conifg.audio_list);
|
||||||
|
node = list_next(node)) {
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if(audio_handle == NULL)
|
if (audio_handle == NULL) {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (audio_handle->id == APP_PLAY_BACK_AUDIO && audio_handle->aud_id == AUD_ID_BT_CALL_INCOMING_CALL) {
|
if (audio_handle->id == APP_PLAY_BACK_AUDIO &&
|
||||||
|
audio_handle->aud_id == AUD_ID_BT_CALL_INCOMING_CALL) {
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][FILTER] id 0x%x", audio_handle->id);
|
TRACE_AUD_HDL_I("[STREAM_LIST][FILTER] id 0x%x", audio_handle->id);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
|
node != list_end(app_audio_conifg.audio_list);
|
||||||
|
node = list_next(node)) {
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if (cnt++ > 1) {
|
if (cnt++ > 1) {
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][FILTER] cnt %d", cnt);
|
TRACE_AUD_HDL_I("[STREAM_LIST][FILTER] cnt %d", cnt);
|
||||||
|
@ -552,16 +506,15 @@ bool app_audio_list_filter_exist(APP_AUDIO_STATUS* aud_status)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_audio_list_playback_exist(void)
|
bool app_audio_list_playback_exist(void) {
|
||||||
{
|
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
APP_AUDIO_STATUS *audio_handle = NULL;
|
APP_AUDIO_STATUS *audio_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
|
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
|
node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if(audio_handle == NULL)
|
if (audio_handle == NULL) {
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (audio_handle->id == APP_PLAY_BACK_AUDIO) {
|
if (audio_handle->id == APP_PLAY_BACK_AUDIO) {
|
||||||
|
@ -573,202 +526,181 @@ bool app_audio_list_playback_exist(void)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_audio_list_playback_clear(void)
|
void app_audio_list_playback_clear(void) {
|
||||||
{
|
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
APP_AUDIO_STATUS *audio_handle = NULL;
|
APP_AUDIO_STATUS *audio_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
|
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
|
node != list_end(app_audio_conifg.audio_list); node = list_next(node)) {
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if(audio_handle == NULL)
|
if (audio_handle == NULL) {
|
||||||
{
|
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][CLR] find null\n ");
|
TRACE_AUD_HDL_I("[STREAM_LIST][CLR] find null\n ");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (audio_handle->id == APP_PLAY_BACK_AUDIO){
|
if (audio_handle->id == APP_PLAY_BACK_AUDIO) {
|
||||||
list_remove(app_audio_conifg.audio_list, list_node(node));
|
list_remove(app_audio_conifg.audio_list, list_node(node));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_audio_list_append(APP_AUDIO_STATUS* aud_status)
|
bool app_audio_list_append(APP_AUDIO_STATUS *aud_status) {
|
||||||
{
|
|
||||||
APP_AUDIO_STATUS *data_to_append = NULL;
|
APP_AUDIO_STATUS *data_to_append = NULL;
|
||||||
bool add_data_to_head_of_list = false;
|
bool add_data_to_head_of_list = false;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][APPEND] id 0x%x%s", aud_status->id, player2str(aud_status->id));
|
TRACE_AUD_HDL_I("[STREAM_LIST][APPEND] id 0x%x%s", aud_status->id,
|
||||||
|
player2str(aud_status->id));
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
if (aud_status->id == APP_PLAY_BACK_AUDIO)
|
if (aud_status->id == APP_PLAY_BACK_AUDIO) {
|
||||||
{
|
// ignore redundant ring ind from hfp...
|
||||||
//ignore redundant ring ind from hfp...
|
if (app_audio_list_filter_exist(aud_status)) {
|
||||||
if (app_audio_list_filter_exist(aud_status))
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app_audio_list_playback_exist())
|
if (app_audio_list_playback_exist()) {
|
||||||
{
|
if (list_length(app_audio_conifg.audio_list) >= MAX_AUDIO_BUF_LIST) {
|
||||||
if (list_length(app_audio_conifg.audio_list) >= MAX_AUDIO_BUF_LIST)
|
if (app_audio_list_stream_exist()) {
|
||||||
{
|
data_to_append =
|
||||||
if (app_audio_list_stream_exist())
|
(APP_AUDIO_STATUS *)osPoolCAlloc(app_audio_status_mempool);
|
||||||
{
|
if (data_to_append == NULL) {
|
||||||
data_to_append = (APP_AUDIO_STATUS *)osPoolCAlloc (app_audio_status_mempool);
|
|
||||||
if(data_to_append == NULL)
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memcpy(data_to_append, (const void *)list_front(app_audio_conifg.audio_list), sizeof(APP_AUDIO_STATUS));
|
memcpy(data_to_append,
|
||||||
|
(const void *)list_front(app_audio_conifg.audio_list),
|
||||||
|
sizeof(APP_AUDIO_STATUS));
|
||||||
add_data_to_head_of_list = true;
|
add_data_to_head_of_list = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
app_audio_list_clear();
|
app_audio_list_clear();
|
||||||
TRACE_AUD_HDL_E("[STREAM_LIST][APPEND] FIXME!!!!\n ");
|
TRACE_AUD_HDL_E("[STREAM_LIST][APPEND] FIXME!!!!\n ");
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ret = false;
|
ret = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
add_data_to_head_of_list = true;
|
add_data_to_head_of_list = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_to_append == NULL)
|
if (data_to_append == NULL) {
|
||||||
{
|
data_to_append = (APP_AUDIO_STATUS *)osPoolCAlloc(app_audio_status_mempool);
|
||||||
data_to_append = (APP_AUDIO_STATUS *)osPoolCAlloc (app_audio_status_mempool);
|
if (data_to_append == NULL) {
|
||||||
if(data_to_append == NULL)
|
|
||||||
{
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
memcpy(data_to_append, aud_status, sizeof(APP_AUDIO_STATUS));
|
memcpy(data_to_append, aud_status, sizeof(APP_AUDIO_STATUS));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (add_data_to_head_of_list)
|
if (add_data_to_head_of_list) {
|
||||||
{
|
list_prepend(app_audio_conifg.audio_list, (void *)data_to_append);
|
||||||
list_prepend(app_audio_conifg.audio_list, (void*)data_to_append);
|
} else {
|
||||||
}
|
list_append(app_audio_conifg.audio_list, (void *)data_to_append);
|
||||||
else
|
|
||||||
{
|
|
||||||
list_append(app_audio_conifg.audio_list, (void*)data_to_append);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][APPEND] id 0x%x%s status %d len %d ret %d", data_to_append->id, player2str(data_to_append->id), \
|
TRACE_AUD_HDL_I("[STREAM_LIST][APPEND] id 0x%x%s status %d len %d ret %d",
|
||||||
data_to_append->status, list_length(app_audio_conifg.audio_list), ret);
|
data_to_append->id, player2str(data_to_append->id),
|
||||||
|
data_to_append->status,
|
||||||
|
list_length(app_audio_conifg.audio_list), ret);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_audio_list_rmv_callback(APP_AUDIO_STATUS *status_close, APP_AUDIO_STATUS *status_next, enum APP_BT_AUDIO_Q_POS pos, bool pop_next)
|
bool app_audio_list_rmv_callback(APP_AUDIO_STATUS *status_close,
|
||||||
{
|
APP_AUDIO_STATUS *status_next,
|
||||||
|
enum APP_BT_AUDIO_Q_POS pos, bool pop_next) {
|
||||||
void *data_to_remove = NULL;
|
void *data_to_remove = NULL;
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
|
|
||||||
//for status: first bt_a2dp->APP_BT_SETTING_CLOSE,then ring-> APP_BT_SETTING_CLOSE
|
// for status: first bt_a2dp->APP_BT_SETTING_CLOSE,then ring->
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][RMV] audio list len %d close_id 0x%x%s", list_length(app_audio_conifg.audio_list), \
|
// APP_BT_SETTING_CLOSE
|
||||||
status_close->id, player2str(status_close->id));
|
TRACE_AUD_HDL_I("[STREAM_LIST][RMV] audio list len %d close_id 0x%x%s",
|
||||||
if(list_length(app_audio_conifg.audio_list) == 0)
|
list_length(app_audio_conifg.audio_list), status_close->id,
|
||||||
{
|
player2str(status_close->id));
|
||||||
|
if (list_length(app_audio_conifg.audio_list) == 0) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
APP_AUDIO_STATUS *audio_handle = NULL;
|
APP_AUDIO_STATUS *audio_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
if (status_close->id == APP_PLAY_BACK_AUDIO)
|
if (status_close->id == APP_PLAY_BACK_AUDIO) {
|
||||||
{
|
for (node = list_begin(app_audio_conifg.audio_list);
|
||||||
for (node = list_begin(app_audio_conifg.audio_list); node != list_end(app_audio_conifg.audio_list); node = list_next(node))
|
node != list_end(app_audio_conifg.audio_list);
|
||||||
{
|
node = list_next(node)) {
|
||||||
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
audio_handle = (APP_AUDIO_STATUS *)list_node(node);
|
||||||
if(audio_handle == NULL)
|
if (audio_handle == NULL) {
|
||||||
{
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (audio_handle->id == APP_PLAY_BACK_AUDIO)
|
if (audio_handle->id == APP_PLAY_BACK_AUDIO) {
|
||||||
{
|
|
||||||
list_node_t *nod_next = list_next(node);
|
list_node_t *nod_next = list_next(node);
|
||||||
data_to_remove = list_node(node);
|
data_to_remove = list_node(node);
|
||||||
|
|
||||||
if (pop_next)
|
if (pop_next) {
|
||||||
{
|
|
||||||
memcpy(status_next, list_node(node), sizeof(APP_AUDIO_STATUS));
|
memcpy(status_next, list_node(node), sizeof(APP_AUDIO_STATUS));
|
||||||
ret = true;
|
ret = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (nod_next != NULL)
|
if (nod_next != NULL) {
|
||||||
{
|
|
||||||
memcpy(status_next, list_node(nod_next), sizeof(APP_AUDIO_STATUS));
|
memcpy(status_next, list_node(nod_next), sizeof(APP_AUDIO_STATUS));
|
||||||
ASSERT(status_next->id == APP_PLAY_BACK_AUDIO, "[%s] 111ERROR: status_next->id != APP_PLAY_BACK_AUDIO", __func__);
|
ASSERT(status_next->id == APP_PLAY_BACK_AUDIO,
|
||||||
|
"[%s] 111ERROR: status_next->id != APP_PLAY_BACK_AUDIO",
|
||||||
|
__func__);
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
} else if (app_audio_list_stream_exist()) {
|
||||||
else if (app_audio_list_stream_exist())
|
|
||||||
{
|
|
||||||
void *indata = list_front(app_audio_conifg.audio_list);
|
void *indata = list_front(app_audio_conifg.audio_list);
|
||||||
if(indata == NULL)
|
if (indata == NULL) {
|
||||||
{
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
memcpy(status_next, indata, sizeof(APP_AUDIO_STATUS));
|
memcpy(status_next, indata, sizeof(APP_AUDIO_STATUS));
|
||||||
ASSERT(status_next->id != APP_PLAY_BACK_AUDIO, "[%s] 222ERROR: status_next->id != APP_PLAY_BACK_AUDIO", __func__);
|
ASSERT(status_next->id != APP_PLAY_BACK_AUDIO,
|
||||||
|
"[%s] 222ERROR: status_next->id != APP_PLAY_BACK_AUDIO",
|
||||||
|
__func__);
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
} else // maybe...a2dp send >> APP_BT_SETTING_CLOSE, when ring
|
||||||
else //maybe...a2dp send >> APP_BT_SETTING_CLOSE, when ring
|
|
||||||
#endif
|
#endif
|
||||||
{
|
{
|
||||||
if (app_audio_list_stream_exist())
|
if (app_audio_list_stream_exist()) {
|
||||||
{
|
if (pos == APP_BT_SETTING_Q_POS_HEAD) {
|
||||||
if(pos == APP_BT_SETTING_Q_POS_HEAD)
|
|
||||||
{
|
|
||||||
data_to_remove = list_front(app_audio_conifg.audio_list);
|
data_to_remove = list_front(app_audio_conifg.audio_list);
|
||||||
}
|
} else if (pos == APP_BT_SETTING_Q_POS_TAIL) {
|
||||||
else if (pos == APP_BT_SETTING_Q_POS_TAIL)
|
|
||||||
{
|
|
||||||
data_to_remove = list_back(app_audio_conifg.audio_list);
|
data_to_remove = list_back(app_audio_conifg.audio_list);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (data_to_remove)
|
if (data_to_remove) {
|
||||||
{
|
|
||||||
list_remove(app_audio_conifg.audio_list, data_to_remove);
|
list_remove(app_audio_conifg.audio_list, data_to_remove);
|
||||||
}
|
}
|
||||||
TRACE_AUD_HDL_I("[STREAM_LIST][RMV] end len:%d ret %d data %p", list_length(app_audio_conifg.audio_list), ret, data_to_remove);
|
TRACE_AUD_HDL_I("[STREAM_LIST][RMV] end len:%d ret %d data %p",
|
||||||
|
list_length(app_audio_conifg.audio_list), ret,
|
||||||
|
data_to_remove);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_audio_list_clear()
|
void app_audio_list_clear() { list_clear(app_audio_conifg.audio_list); }
|
||||||
{
|
|
||||||
list_clear(app_audio_conifg.audio_list);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void app_audio_open(void)
|
void app_audio_open(void) {
|
||||||
{
|
if (app_audio_init) {
|
||||||
if(app_audio_init)
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (g_app_audio_queue_mutex_id == NULL)
|
if (g_app_audio_queue_mutex_id == NULL) {
|
||||||
{
|
g_app_audio_queue_mutex_id =
|
||||||
g_app_audio_queue_mutex_id = osMutexCreate((osMutex(g_app_audio_queue_mutex)));
|
osMutexCreate((osMutex(g_app_audio_queue_mutex)));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
ASSERT(0, "[%s] ERROR: g_app_audio_queue_mutex_id != NULL", __func__);
|
ASSERT(0, "[%s] ERROR: g_app_audio_queue_mutex_id != NULL", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app_audio_status_mempool == NULL)
|
if (app_audio_status_mempool == NULL)
|
||||||
app_audio_status_mempool = osPoolCreate(osPool(app_audio_status_mempool));
|
app_audio_status_mempool = osPoolCreate(osPool(app_audio_status_mempool));
|
||||||
ASSERT(app_audio_status_mempool, "[%s] ERROR: app_audio_status_mempool != NULL", __func__);
|
ASSERT(app_audio_status_mempool,
|
||||||
|
"[%s] ERROR: app_audio_status_mempool != NULL", __func__);
|
||||||
|
|
||||||
#ifdef __AUDIO_QUEUE_SUPPORT__
|
#ifdef __AUDIO_QUEUE_SUPPORT__
|
||||||
app_audio_list_create();
|
app_audio_list_create();
|
||||||
|
@ -782,10 +714,7 @@ void app_audio_open(void)
|
||||||
app_audio_init = true;
|
app_audio_init = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_audio_close(void)
|
void app_audio_close(void) {
|
||||||
{
|
|
||||||
app_set_threadhandle(APP_MODUAL_AUDIO, NULL);
|
app_set_threadhandle(APP_MODUAL_AUDIO, NULL);
|
||||||
app_audio_init = false;
|
app_audio_init = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,69 +19,88 @@
|
||||||
// RX: Receive process
|
// RX: Receive process
|
||||||
// 16k: base 25M/208M(1300,1302) base 28M/104M(1400,1402)
|
// 16k: base 25M/208M(1300,1302) base 28M/104M(1400,1402)
|
||||||
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
||||||
| TX/RX | New | Old | description | MIPS(M) | Note |
|
| TX/RX | New | Old | description
|
||||||
| | | | | 16k 8k | |
|
| MIPS(M) | Note | | | | | | 16k 8k |
|
||||||
|
|
|
||||||
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
||||||
| | SPEECH_TX_DC_FILTER| | Direct Current filter | 1~2 \ | |
|
| | SPEECH_TX_DC_FILTER| | Direct
|
||||||
| | SPEECH_TX_AEC | SPEECH_ECHO_CANCEL | Acoustic Echo Cancellation(old) | 40 \ | HWFFT: 37 |
|
Current filter | 1~2 \ | | | |
|
||||||
| | SPEECH_TX_AEC2 | SPEECH_AEC_FIX | Acoustic Echo Cancellation(new) | 39 \ | enable NLP |
|
SPEECH_TX_AEC | SPEECH_ECHO_CANCEL | Acoustic Echo
|
||||||
| | SPEECH_TX_AEC3 | | Acoustic Echo Cancellation(new) | 14/18 \ | 2 filters/4 filters |
|
Cancellation(old) | 40 \ | HWFFT: 37 | | | SPEECH_TX_AEC2
|
||||||
| | SPEECH_TX_AEC2FLOAT| | Acoustic Echo Cancellation(new) | 23/22 \ | nlp/af(blocks=1) |
|
| SPEECH_AEC_FIX | Acoustic Echo Cancellation(new) | 39 \ |
|
||||||
| | SPEECH_TX_AEC2FLOAT| | Acoustic Echo Cancellation(ns) | 14/10 \ | banks=256/banks=128 |
|
enable NLP | | | SPEECH_TX_AEC3 | | Acoustic Echo
|
||||||
| | (ns_enabled) | | | 8/6 \ | banks=64/banks=32 |
|
Cancellation(new) | 14/18 \ | 2 filters/4 filters | | |
|
||||||
| | SPEECH_TX_NS | SPEECH_NOISE_SUPPRESS | 1 mic noise suppress(old) | 30 \ | HWFFT: 19 |
|
SPEECH_TX_AEC2FLOAT| | Acoustic Echo
|
||||||
| | SPEECH_TX_NS2 | LC_MMSE_NOISE_SUPPRESS | 1 mic noise suppress(new) | 16 \ | HWFFT: 12 |
|
Cancellation(new) | 23/22 \ | nlp/af(blocks=1) | | |
|
||||||
| | SPEECH_TX_NS3 | | 1 mic noise suppress(new) | 26 \ | |
|
SPEECH_TX_AEC2FLOAT| | Acoustic Echo
|
||||||
| | SPEECH_TX_NS2FLOAT | LC_MMSE_NOISE_SUPPRESS_FLOAT | 1 mic noise suppress(new float) | 12.5 \ | banks=64 |
|
Cancellation(ns) | 14/10 \ | banks=256/banks=128 | | | (ns_enabled)
|
||||||
| TX | SPEECH_TX_2MIC_NS | DUAL_MIC_DENOISE | 2 mic noise suppres(long space) | \ | |
|
| | | 8/6 \
|
||||||
| | SPEECH_TX_2MIC_NS2 | 2MIC_DENOISE | 2 mic noise suppres(short space) | 22 | delay_taps 5M |
|
| banks=64/banks=32 | | | SPEECH_TX_NS | SPEECH_NOISE_SUPPRESS |
|
||||||
| | freq_smooth_enable 1.5M | |
|
1 mic noise suppress(old) | 30 \ | HWFFT: 19 | | |
|
||||||
| | wnr_enable 1.5M |
|
SPEECH_TX_NS2 | LC_MMSE_NOISE_SUPPRESS | 1 mic noise
|
||||||
| | SPEECH_TX_2MIC_NS4 | SENSORMIC_DENOISE | sensor mic noise suppress | 31.5 | |
|
suppress(new) | 16 \ | HWFFT: 12 | | |
|
||||||
| | SPEECH_TX_2MIC_NS3 | FAR_FIELD_SPEECH_ENHANCEMENT | 2 mic noise suppres(far field) | \ | |
|
SPEECH_TX_NS3 | | 1 mic noise
|
||||||
| | SPEECH_TX_2MIC_NS5 | LEFTRIGHT_DENOISE | 2 mic noise suppr(left right end)| \ | |
|
suppress(new) | 26 \ | | | |
|
||||||
| | SPEECH_TX_2MIC_NS6 | FF_2MIC_DENOISE | 2 mic noise suppr(far field) | 70 | |
|
SPEECH_TX_NS2FLOAT | LC_MMSE_NOISE_SUPPRESS_FLOAT | 1 mic noise
|
||||||
| | SPEECH_TX_AGC | SPEECH_AGC | Automatic Gain Control | 3 | |
|
suppress(new float) | 12.5 \ | banks=64 | | TX |
|
||||||
| | SPEECH_TX_COMPEXP | | Compressor and expander | 4 | |
|
SPEECH_TX_2MIC_NS | DUAL_MIC_DENOISE | 2 mic noise
|
||||||
| | SPEECH_TX_EQ | SPEECH_WEIGHTING_FILTER_SUPPRESS | Default EQ | 0.5 \ | each section |
|
suppres(long space) | \ | | | |
|
||||||
|
SPEECH_TX_2MIC_NS2 | 2MIC_DENOISE | 2 mic noise
|
||||||
|
suppres(short space) | 22 | delay_taps 5M | | |
|
||||||
|
freq_smooth_enable 1.5M | | | | wnr_enable 1.5M | |
|
||||||
|
| SPEECH_TX_2MIC_NS4 | SENSORMIC_DENOISE | sensor mic noise
|
||||||
|
suppress | 31.5 | | | |
|
||||||
|
SPEECH_TX_2MIC_NS3 | FAR_FIELD_SPEECH_ENHANCEMENT | 2 mic noise suppres(far
|
||||||
|
field) | \ | | | | SPEECH_TX_2MIC_NS5 |
|
||||||
|
LEFTRIGHT_DENOISE | 2 mic noise suppr(left right end)| \ | | |
|
||||||
|
| SPEECH_TX_2MIC_NS6 | FF_2MIC_DENOISE | 2 mic noise suppr(far
|
||||||
|
field) | 70 | | | | SPEECH_TX_AGC |
|
||||||
|
SPEECH_AGC | Automatic Gain Control | 3 | | |
|
||||||
|
| SPEECH_TX_COMPEXP | | Compressor and
|
||||||
|
expander | 4 | | | | SPEECH_TX_EQ |
|
||||||
|
SPEECH_WEIGHTING_FILTER_SUPPRESS | Default EQ | 0.5 \
|
||||||
|
| each section |
|
||||||
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
||||||
| | SPEECH_RX_NS | SPEAKER_NOISE_SUPPRESS | 1 mic noise suppress(old) | 30 \ | |
|
| | SPEECH_RX_NS | SPEAKER_NOISE_SUPPRESS | 1 mic noise
|
||||||
| RX | SPEECH_RX_NS2 | LC_MMSE_NOISE_SUPPRESS_SPK | 1 mic noise suppress(new) | 16 \ | |
|
suppress(old) | 30 \ | | | RX |
|
||||||
| | SPEECH_RX_AGC | SPEECH_AGC_SPK | Automatic Gain Control | 3 | |
|
SPEECH_RX_NS2 | LC_MMSE_NOISE_SUPPRESS_SPK | 1 mic noise
|
||||||
| | SPEECH_RX_EQ | SPEAKER_WEIGHTING_FILTER_SUPPRESS | Default EQ | 0.5 \ | each section |
|
suppress(new) | 16 \ | | | |
|
||||||
|
SPEECH_RX_AGC | SPEECH_AGC_SPK | Automatic Gain Control
|
||||||
|
| 3 | | | | SPEECH_RX_EQ |
|
||||||
|
SPEAKER_WEIGHTING_FILTER_SUPPRESS | Default EQ | 0.5 \
|
||||||
|
| each section |
|
||||||
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
|-------|--------------------|-----------------------------------|----------------------------------|-----------|----------------------|
|
||||||
**/
|
**/
|
||||||
|
|
||||||
#include "plat_types.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "audio_dump.h"
|
|
||||||
#include "speech_cfg.h"
|
|
||||||
#include "bt_sco_chain.h"
|
#include "bt_sco_chain.h"
|
||||||
|
#include "audio_dump.h"
|
||||||
#include "bt_sco_chain_cfg.h"
|
#include "bt_sco_chain_cfg.h"
|
||||||
#include "bt_sco_chain_tuning.h"
|
#include "bt_sco_chain_tuning.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "plat_types.h"
|
||||||
|
#include "speech_cfg.h"
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
#include "app_anc.h"
|
#include "app_anc.h"
|
||||||
#endif
|
#endif
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
|
||||||
#if defined(SCO_CP_ACCEL)
|
#if defined(SCO_CP_ACCEL)
|
||||||
#include "hal_location.h"
|
|
||||||
#include "bt_sco_chain_cp.h"
|
#include "bt_sco_chain_cp.h"
|
||||||
|
#include "hal_location.h"
|
||||||
|
|
||||||
#define SCO_CP_ACCEL_ALGO_START() \
|
#define SCO_CP_ACCEL_ALGO_START() \
|
||||||
*_pcm_len = pcm_len; \
|
*_pcm_len = pcm_len; \
|
||||||
} \
|
} \
|
||||||
CP_TEXT_SRAM_LOC \
|
CP_TEXT_SRAM_LOC \
|
||||||
void _speech_tx_process_mid(short *pcm_buf, short *ref_buf, int *_pcm_len) \
|
void _speech_tx_process_mid(short *pcm_buf, short *ref_buf, int *_pcm_len) { \
|
||||||
{ \
|
|
||||||
int pcm_len = *_pcm_len;
|
int pcm_len = *_pcm_len;
|
||||||
|
|
||||||
#define SCO_CP_ACCEL_ALGO_END() \
|
#define SCO_CP_ACCEL_ALGO_END() \
|
||||||
*_pcm_len = pcm_len; \
|
*_pcm_len = pcm_len; \
|
||||||
} \
|
} \
|
||||||
void _speech_tx_process_post(short *pcm_buf, short *ref_buf, int *_pcm_len) \
|
void _speech_tx_process_post(short *pcm_buf, short *ref_buf, \
|
||||||
{ \
|
int *_pcm_len) { \
|
||||||
int pcm_len = *_pcm_len;
|
int pcm_len = *_pcm_len;
|
||||||
|
|
||||||
#define SPEECH_TX_AEC2FLOAT_CORE 1
|
#define SPEECH_TX_AEC2FLOAT_CORE 1
|
||||||
|
@ -125,7 +144,8 @@ static int32_t *tx_pcmbuf32 = NULL;
|
||||||
short *aec_echo_buf = NULL;
|
short *aec_echo_buf = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || \
|
||||||
|
defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
||||||
// Use to free buffer
|
// Use to free buffer
|
||||||
#if defined(SPEECH_TX_24BIT)
|
#if defined(SPEECH_TX_24BIT)
|
||||||
static int32_t *aec_echo_buf_ptr;
|
static int32_t *aec_echo_buf_ptr;
|
||||||
|
@ -152,7 +172,6 @@ SpeechFirCalibState *speech_tx_mic_fir_calib_st = NULL;
|
||||||
extern const SpeechFirCalibConfig speech_tx_mic_fir_calib_cfg;
|
extern const SpeechFirCalibConfig speech_tx_mic_fir_calib_cfg;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// AEC
|
// AEC
|
||||||
#if defined(SPEECH_TX_AEC)
|
#if defined(SPEECH_TX_AEC)
|
||||||
SpeechAecState *speech_tx_aec_st = NULL;
|
SpeechAecState *speech_tx_aec_st = NULL;
|
||||||
|
@ -167,15 +186,10 @@ SpeechAec2State *speech_tx_aec2_st = NULL;
|
||||||
short delay = 70;
|
short delay = 70;
|
||||||
short bufferstate[356];
|
short bufferstate[356];
|
||||||
short buf_out[256];
|
short buf_out[256];
|
||||||
void CODEC_OpVecCpy(
|
void CODEC_OpVecCpy(short *pshwDes, short *pshwSrc, short swLen) {
|
||||||
short *pshwDes,
|
|
||||||
short *pshwSrc,
|
|
||||||
short swLen)
|
|
||||||
{
|
|
||||||
short i = 0;
|
short i = 0;
|
||||||
|
|
||||||
for (i = 0; i < swLen; i++)
|
for (i = 0; i < swLen; i++) {
|
||||||
{
|
|
||||||
pshwDes[i] = pshwSrc[i];
|
pshwDes[i] = pshwSrc[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -189,7 +203,8 @@ static Ec2FloatState *speech_tx_aec2float_st = NULL;
|
||||||
|
|
||||||
// 2MIC NS
|
// 2MIC NS
|
||||||
#if defined(SPEECH_TX_2MIC_NS)
|
#if defined(SPEECH_TX_2MIC_NS)
|
||||||
// float mic2_ft_caliration[] = {0.395000,0.809000,0.939000,1.748000,1.904000,1.957000,1.944000,1.906000,1.935000,1.940000,1.937000,1.931000,1.929000,1.911000,1.887000,1.871000,1.846000,1.779000,1.748000,2.086000,2.055000,2.002000,1.903000,1.885000,1.854000,1.848000,1.848000,1.844000,1.852000,1.870000,1.866000,1.843000,1.838000,1.824000,1.861000,1.871000,1.866000,1.833000,1.800000,1.769000,1.749000,1.690000,1.664000,1.573000,1.602000,1.692000,1.759000,1.758000,1.698000,1.628000,1.525000,1.509000,1.492000,1.515000,1.530000,1.644000,1.653000,1.617000,1.667000,1.746000,1.663000,1.606000,1.560000,1.500000,1.579000,1.632000,1.623000,1.549000,1.524000,1.512000,1.493000,1.476000,1.421000,1.396000,1.386000,1.459000,1.463000,1.496000,1.568000,1.544000,1.555000,1.547000,1.619000,1.630000,1.574000,1.491000,1.414000,1.383000,1.352000,1.464000,1.474000,1.450000,1.419000,1.425000,1.411000,1.479000,1.517000,1.486000,1.428000,1.389000,1.330000,1.284000,1.267000,1.249000,1.256000,1.215000,1.250000,1.402000,1.386000,1.334000,1.287000,1.329000,1.337000,1.292000,1.226000,1.212000,1.142000,1.087000,1.086000,1.112000,1.145000,1.194000,1.163000,1.131000,1.162000,1.166000,1.259000,1.218000,1.218000,1.322000,1.347000,1.436000,1.890000,1.693000,1.591000,1.518000,1.422000,1.345000,1.331000,1.308000,1.330000,1.305000,1.218000,1.286000,1.340000,1.399000,1.406000,1.353000,1.280000,1.246000,1.185000,1.129000,1.014000,0.985000,0.981000,1.189000,1.533000,1.694000,1.613000,1.464000,1.419000,1.448000,1.449000,1.442000,1.367000,1.283000,1.232000,1.381000,1.484000,1.497000,1.554000,1.438000,1.365000,1.326000,1.332000,1.335000,1.367000,1.301000,1.288000,1.168000,1.103000,1.067000,1.026000,1.076000,1.126000,1.068000,1.045000,0.978000,0.926000,0.939000,0.854000,0.772000,0.902000,0.742000,1.073000,1.220000,1.177000,1.762000,1.573000,1.390000,1.406000,1.148000,1.054000,1.210000,1.344000,1.849000,2.078000,1.756000,1.646000,1.597000,1.447000,1.322000,1.279000,1.007000,0.921000,0.871000,0.864000,1.067000,1.129000,1.128000,1.027000,0.983000,0.889000,0.774000,0.759000,0.724000,0.949000,1.237000,1.499000,1.658000,1.837000,1.492000,1.452000,1.151000,1.100000,0.996000,0.986000,1.023000,1.071000,1.252000,1.295000,1.309000,1.343000,1.220000,1.161000,1.142000,1.041000,0.974000,0.885000,0.799000,0.669000,0.732000,0.953000,0.861000,0.881000,0.988000,0.891000};
|
// float mic2_ft_caliration[] =
|
||||||
|
// {0.395000,0.809000,0.939000,1.748000,1.904000,1.957000,1.944000,1.906000,1.935000,1.940000,1.937000,1.931000,1.929000,1.911000,1.887000,1.871000,1.846000,1.779000,1.748000,2.086000,2.055000,2.002000,1.903000,1.885000,1.854000,1.848000,1.848000,1.844000,1.852000,1.870000,1.866000,1.843000,1.838000,1.824000,1.861000,1.871000,1.866000,1.833000,1.800000,1.769000,1.749000,1.690000,1.664000,1.573000,1.602000,1.692000,1.759000,1.758000,1.698000,1.628000,1.525000,1.509000,1.492000,1.515000,1.530000,1.644000,1.653000,1.617000,1.667000,1.746000,1.663000,1.606000,1.560000,1.500000,1.579000,1.632000,1.623000,1.549000,1.524000,1.512000,1.493000,1.476000,1.421000,1.396000,1.386000,1.459000,1.463000,1.496000,1.568000,1.544000,1.555000,1.547000,1.619000,1.630000,1.574000,1.491000,1.414000,1.383000,1.352000,1.464000,1.474000,1.450000,1.419000,1.425000,1.411000,1.479000,1.517000,1.486000,1.428000,1.389000,1.330000,1.284000,1.267000,1.249000,1.256000,1.215000,1.250000,1.402000,1.386000,1.334000,1.287000,1.329000,1.337000,1.292000,1.226000,1.212000,1.142000,1.087000,1.086000,1.112000,1.145000,1.194000,1.163000,1.131000,1.162000,1.166000,1.259000,1.218000,1.218000,1.322000,1.347000,1.436000,1.890000,1.693000,1.591000,1.518000,1.422000,1.345000,1.331000,1.308000,1.330000,1.305000,1.218000,1.286000,1.340000,1.399000,1.406000,1.353000,1.280000,1.246000,1.185000,1.129000,1.014000,0.985000,0.981000,1.189000,1.533000,1.694000,1.613000,1.464000,1.419000,1.448000,1.449000,1.442000,1.367000,1.283000,1.232000,1.381000,1.484000,1.497000,1.554000,1.438000,1.365000,1.326000,1.332000,1.335000,1.367000,1.301000,1.288000,1.168000,1.103000,1.067000,1.026000,1.076000,1.126000,1.068000,1.045000,0.978000,0.926000,0.939000,0.854000,0.772000,0.902000,0.742000,1.073000,1.220000,1.177000,1.762000,1.573000,1.390000,1.406000,1.148000,1.054000,1.210000,1.344000,1.849000,2.078000,1.756000,1.646000,1.597000,1.447000,1.322000,1.279000,1.007000,0.921000,0.871000,0.864000,1.067000,1.129000,1.128000,1.027000,0.983000,0.889000,0.774000,0.759000,0.724000,0.949000,1.237000,1.499000,1.658000,1.837000,1.492000,1.452000,1.151000,1.100000,0.996000,0.986000,1.023000,1.071000,1.252000,1.295000,1.309000,1.343000,1.220000,1.161000,1.142000,1.041000,0.974000,0.885000,0.799000,0.669000,0.732000,0.953000,0.861000,0.881000,0.988000,0.891000};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS2)
|
#if defined(SPEECH_TX_2MIC_NS2)
|
||||||
|
@ -305,9 +320,9 @@ SpeechGainState *speech_rx_post_gain_st = NULL;
|
||||||
|
|
||||||
static bool dualmic_enable = true;
|
static bool dualmic_enable = true;
|
||||||
|
|
||||||
void switch_dualmic_status(void)
|
void switch_dualmic_status(void) {
|
||||||
{
|
TRACE(3, "[%s] dualmic status: %d -> %d", __FUNCTION__, dualmic_enable,
|
||||||
TRACE(3,"[%s] dualmic status: %d -> %d", __FUNCTION__, dualmic_enable, !dualmic_enable);
|
!dualmic_enable);
|
||||||
dualmic_enable ^= true;
|
dualmic_enable ^= true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -318,62 +333,62 @@ static int speech_rx_frame_len = 256;
|
||||||
static bool speech_tx_frame_resizer_enable = false;
|
static bool speech_tx_frame_resizer_enable = false;
|
||||||
static bool speech_rx_frame_resizer_enable = false;
|
static bool speech_rx_frame_resizer_enable = false;
|
||||||
|
|
||||||
static int32_t _speech_tx_process_(void *pcm_buf, void *ref_buf, int32_t *pcm_len);
|
static int32_t _speech_tx_process_(void *pcm_buf, void *ref_buf,
|
||||||
|
int32_t *pcm_len);
|
||||||
static int32_t _speech_rx_process_(void *pcm_buf, int32_t *pcm_len);
|
static int32_t _speech_rx_process_(void *pcm_buf, int32_t *pcm_len);
|
||||||
enum APP_SYSFREQ_FREQ_T speech_get_proper_sysfreq(int *needed_mips);
|
enum APP_SYSFREQ_FREQ_T speech_get_proper_sysfreq(int *needed_mips);
|
||||||
|
|
||||||
|
void *speech_get_ext_buff(int size) {
|
||||||
void *speech_get_ext_buff(int size)
|
|
||||||
{
|
|
||||||
void *pBuff = NULL;
|
void *pBuff = NULL;
|
||||||
if (size % 4)
|
if (size % 4) {
|
||||||
{
|
|
||||||
size = size + (4 - size % 4);
|
size = size + (4 - size % 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
pBuff = speech_calloc(size, sizeof(uint8_t));
|
pBuff = speech_calloc(size, sizeof(uint8_t));
|
||||||
TRACE(2,"[%s] len:%d", __func__, size);
|
TRACE(2, "[%s] len:%d", __func__, size);
|
||||||
|
|
||||||
return pBuff;
|
return pBuff;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_store_config(const SpeechConfig *cfg)
|
int speech_store_config(const SpeechConfig *cfg) {
|
||||||
{
|
if (speech_cfg) {
|
||||||
if (speech_cfg)
|
|
||||||
{
|
|
||||||
memcpy(speech_cfg, cfg, sizeof(SpeechConfig));
|
memcpy(speech_cfg, cfg, sizeof(SpeechConfig));
|
||||||
}
|
} else {
|
||||||
else
|
TRACE(1, "[%s] WARNING: Please phone call...", __func__);
|
||||||
{
|
|
||||||
TRACE(1,"[%s] WARNING: Please phone call...", __func__);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_tx_init(int sample_rate, int frame_len)
|
int speech_tx_init(int sample_rate, int frame_len) {
|
||||||
{
|
TRACE(3, "[%s] Start, sample_rate: %d, frame_len: %d", __func__, sample_rate,
|
||||||
TRACE(3,"[%s] Start, sample_rate: %d, frame_len: %d", __func__, sample_rate, frame_len);
|
frame_len);
|
||||||
|
|
||||||
#if defined(SPEECH_TX_DC_FILTER)
|
#if defined(SPEECH_TX_DC_FILTER)
|
||||||
int channel_num = SPEECH_TX_CHANNEL_NUM;
|
int channel_num = SPEECH_TX_CHANNEL_NUM;
|
||||||
int data_separation = 0;
|
int data_separation = 0;
|
||||||
|
|
||||||
speech_tx_dc_filter_st = speech_dc_filter_create(sample_rate, &speech_cfg->tx_dc_filter);
|
speech_tx_dc_filter_st =
|
||||||
speech_dc_filter_ctl(speech_tx_dc_filter_st, SPEECH_DC_FILTER_SET_CHANNEL_NUM, &channel_num);
|
speech_dc_filter_create(sample_rate, &speech_cfg->tx_dc_filter);
|
||||||
speech_dc_filter_ctl(speech_tx_dc_filter_st, SPEECH_DC_FILTER_SET_DATA_SEPARATION, &data_separation);
|
speech_dc_filter_ctl(speech_tx_dc_filter_st, SPEECH_DC_FILTER_SET_CHANNEL_NUM,
|
||||||
|
&channel_num);
|
||||||
|
speech_dc_filter_ctl(speech_tx_dc_filter_st,
|
||||||
|
SPEECH_DC_FILTER_SET_DATA_SEPARATION, &data_separation);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_MIC_CALIBRATION)
|
#if defined(SPEECH_TX_MIC_CALIBRATION)
|
||||||
speech_tx_mic_calib_st = speech_iir_calib_init(sample_rate, frame_len, &speech_tx_mic_calib_cfg);
|
speech_tx_mic_calib_st =
|
||||||
|
speech_iir_calib_init(sample_rate, frame_len, &speech_tx_mic_calib_cfg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_MIC_FIR_CALIBRATION)
|
#if defined(SPEECH_TX_MIC_FIR_CALIBRATION)
|
||||||
speech_tx_mic_fir_calib_st = speech_fir_calib_init(sample_rate, frame_len, &speech_tx_mic_fir_calib_cfg);
|
speech_tx_mic_fir_calib_st = speech_fir_calib_init(
|
||||||
|
sample_rate, frame_len, &speech_tx_mic_fir_calib_cfg);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || \
|
||||||
// #if !(defined(__AUDIO_RESAMPLE__) && defined(SW_SCO_RESAMPLE))
|
defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
||||||
|
// #if !(defined(__AUDIO_RESAMPLE__) && defined(SW_SCO_RESAMPLE))
|
||||||
aec_out_buf = (short *)speech_calloc(frame_len, sizeof(short));
|
aec_out_buf = (short *)speech_calloc(frame_len, sizeof(short));
|
||||||
#if defined(SPEECH_TX_24BIT)
|
#if defined(SPEECH_TX_24BIT)
|
||||||
aec_echo_buf = (int32_t *)speech_calloc(frame_len, sizeof(int32_t));
|
aec_echo_buf = (int32_t *)speech_calloc(frame_len, sizeof(int32_t));
|
||||||
|
@ -385,33 +400,42 @@ int speech_tx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC)
|
#if defined(SPEECH_TX_AEC)
|
||||||
speech_tx_aec_st = speech_aec_create(sample_rate, frame_len, &speech_cfg->tx_aec);
|
speech_tx_aec_st =
|
||||||
speech_aec_ctl(speech_tx_aec_st, SPEECH_AEC_GET_LIB_ST, &speech_tx_aec_lib_st);
|
speech_aec_create(sample_rate, frame_len, &speech_cfg->tx_aec);
|
||||||
|
speech_aec_ctl(speech_tx_aec_st, SPEECH_AEC_GET_LIB_ST,
|
||||||
|
&speech_tx_aec_lib_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC2)
|
#if defined(SPEECH_TX_AEC2)
|
||||||
speech_tx_aec2_st = speech_aec2_create(sample_rate, frame_len, &speech_cfg->tx_aec2);
|
speech_tx_aec2_st =
|
||||||
|
speech_aec2_create(sample_rate, frame_len, &speech_cfg->tx_aec2);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPEECH_TX_AEC3)
|
#if defined(SPEECH_TX_AEC3)
|
||||||
speech_tx_aec3_st = SubBandAec_init(sample_rate, frame_len, &speech_cfg->tx_aec3);
|
speech_tx_aec3_st =
|
||||||
|
SubBandAec_init(sample_rate, frame_len, &speech_cfg->tx_aec3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC2FLOAT)
|
||||||
speech_tx_aec2float_st = ec2float_create(sample_rate, frame_len, SPEECH_TX_AEC2FLOAT_CORE, &speech_cfg->tx_aec2float);
|
speech_tx_aec2float_st =
|
||||||
|
ec2float_create(sample_rate, frame_len, SPEECH_TX_AEC2FLOAT_CORE,
|
||||||
|
&speech_cfg->tx_aec2float);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS)
|
#if defined(SPEECH_TX_2MIC_NS)
|
||||||
dual_mic_denoise_init(sample_rate, frame_len, &speech_cfg->tx_2mic_ns, NULL);
|
dual_mic_denoise_init(sample_rate, frame_len, &speech_cfg->tx_2mic_ns, NULL);
|
||||||
// dual_mic_denoise_ctl(DUAL_MIC_DENOISE_SET_CALIBRATION_COEF, mic2_ft_caliration);
|
// dual_mic_denoise_ctl(DUAL_MIC_DENOISE_SET_CALIBRATION_COEF,
|
||||||
|
// mic2_ft_caliration);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS2)
|
#if defined(SPEECH_TX_2MIC_NS2)
|
||||||
speech_tx_2mic_ns2_st = speech_2mic_ns2_create(sample_rate, frame_len, &speech_cfg->tx_2mic_ns2);
|
speech_tx_2mic_ns2_st =
|
||||||
|
speech_2mic_ns2_create(sample_rate, frame_len, &speech_cfg->tx_2mic_ns2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #if defined(SPEECH_CS_VAD)
|
// #if defined(SPEECH_CS_VAD)
|
||||||
// speech_cs_vad_st = VAD_process_state_init(sample_rate, 64, &speech_cfg->cs_vad);
|
// speech_cs_vad_st = VAD_process_state_init(sample_rate, 64,
|
||||||
// #endif
|
// &speech_cfg->cs_vad);
|
||||||
|
// #endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS3)
|
#if defined(SPEECH_TX_2MIC_NS3)
|
||||||
far_field_speech_enhancement_init();
|
far_field_speech_enhancement_init();
|
||||||
|
@ -419,28 +443,34 @@ int speech_tx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS5)
|
#if defined(SPEECH_TX_2MIC_NS5)
|
||||||
speech_tx_2mic_ns5_st = leftright_denoise_create(sample_rate, 64, &speech_cfg->tx_2mic_ns5);
|
speech_tx_2mic_ns5_st =
|
||||||
|
leftright_denoise_create(sample_rate, 64, &speech_cfg->tx_2mic_ns5);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS6)
|
#if defined(SPEECH_TX_2MIC_NS6)
|
||||||
speech_tx_2mic_ns6_st = speech_ff_2mic_ns2_create(16000,128);
|
speech_tx_2mic_ns6_st = speech_ff_2mic_ns2_create(16000, 128);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
//speech_tx_2mic_ns4_st = sensormic_denoise_create(sample_rate, 64, &speech_cfg->tx_2mic_ns4);
|
// speech_tx_2mic_ns4_st = sensormic_denoise_create(sample_rate, 64,
|
||||||
speech_tx_2mic_ns4_st = sensormic_denoise_create(sample_rate, 128, 256, 31, &speech_cfg->tx_2mic_ns4);
|
// &speech_cfg->tx_2mic_ns4);
|
||||||
|
speech_tx_2mic_ns4_st = sensormic_denoise_create(sample_rate, 128, 256, 31,
|
||||||
|
&speech_cfg->tx_2mic_ns4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_3MIC_NS)
|
#if defined(SPEECH_TX_3MIC_NS)
|
||||||
speech_tx_3mic_ns_st = speech_3mic_ns_create(sample_rate, 64, &speech_cfg->tx_3mic_ns);
|
speech_tx_3mic_ns_st =
|
||||||
|
speech_3mic_ns_create(sample_rate, 64, &speech_cfg->tx_3mic_ns);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_3MIC_NS3)
|
#if defined(SPEECH_TX_3MIC_NS3)
|
||||||
speech_tx_3mic_ns3_st = triple_mic_denoise3_init(sample_rate, frame_len, &speech_cfg->tx_3mic_ns3);
|
speech_tx_3mic_ns3_st = triple_mic_denoise3_init(sample_rate, frame_len,
|
||||||
|
&speech_cfg->tx_3mic_ns3);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS)
|
#if defined(SPEECH_TX_NS)
|
||||||
speech_tx_ns_st = speech_ns_create(sample_rate, frame_len, &speech_cfg->tx_ns);
|
speech_tx_ns_st =
|
||||||
|
speech_ns_create(sample_rate, frame_len, &speech_cfg->tx_ns);
|
||||||
#if defined(SPEECH_TX_AEC)
|
#if defined(SPEECH_TX_AEC)
|
||||||
speech_ns_ctl(speech_tx_ns_st, SPEECH_NS_SET_AEC_STATE, speech_tx_aec_lib_st);
|
speech_ns_ctl(speech_tx_ns_st, SPEECH_NS_SET_AEC_STATE, speech_tx_aec_lib_st);
|
||||||
int32_t echo_supress = -39;
|
int32_t echo_supress = -39;
|
||||||
|
@ -449,7 +479,8 @@ int speech_tx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS2)
|
#if defined(SPEECH_TX_NS2)
|
||||||
speech_tx_ns2_st = speech_ns2_create(sample_rate, frame_len, &speech_cfg->tx_ns2);
|
speech_tx_ns2_st =
|
||||||
|
speech_ns2_create(sample_rate, frame_len, &speech_cfg->tx_ns2);
|
||||||
#if defined(SPEECH_TX_AEC)
|
#if defined(SPEECH_TX_AEC)
|
||||||
speech_ns2_set_echo_state(speech_tx_ns2_st, speech_tx_aec_lib_st);
|
speech_ns2_set_echo_state(speech_tx_ns2_st, speech_tx_aec_lib_st);
|
||||||
speech_ns2_set_echo_suppress(speech_tx_ns2_st, -40);
|
speech_ns2_set_echo_suppress(speech_tx_ns2_st, -40);
|
||||||
|
@ -457,7 +488,9 @@ int speech_tx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS2FLOAT)
|
#if defined(SPEECH_TX_NS2FLOAT)
|
||||||
speech_tx_ns2float_st = speech_ns2float_create(sample_rate, frame_len, SPEECH_TX_NS2FLOAT_CORE, &speech_cfg->tx_ns2float);
|
speech_tx_ns2float_st =
|
||||||
|
speech_ns2float_create(sample_rate, frame_len, SPEECH_TX_NS2FLOAT_CORE,
|
||||||
|
&speech_cfg->tx_ns2float);
|
||||||
#if defined(SPEECH_TX_AEC)
|
#if defined(SPEECH_TX_AEC)
|
||||||
speech_ns2float_set_echo_state(speech_tx_ns2float_st, speech_tx_aec_lib_st);
|
speech_ns2float_set_echo_state(speech_tx_ns2float_st, speech_tx_aec_lib_st);
|
||||||
speech_ns2float_set_echo_suppress(speech_tx_ns2float_st, -40);
|
speech_ns2float_set_echo_suppress(speech_tx_ns2float_st, -40);
|
||||||
|
@ -473,15 +506,18 @@ int speech_tx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NOISE_GATE)
|
#if defined(SPEECH_TX_NOISE_GATE)
|
||||||
speech_tx_noise_gate_st = speech_noise_gate_create(sample_rate, frame_len, &speech_cfg->tx_noise_gate);
|
speech_tx_noise_gate_st = speech_noise_gate_create(
|
||||||
|
sample_rate, frame_len, &speech_cfg->tx_noise_gate);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_COMPEXP)
|
#if defined(SPEECH_TX_COMPEXP)
|
||||||
speech_tx_compexp_st = compexp_create(sample_rate, frame_len, &speech_cfg->tx_compexp);
|
speech_tx_compexp_st =
|
||||||
|
compexp_create(sample_rate, frame_len, &speech_cfg->tx_compexp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AGC)
|
#if defined(SPEECH_TX_AGC)
|
||||||
speech_tx_agc_st = agc_state_create(sample_rate, frame_len, &speech_cfg->tx_agc);
|
speech_tx_agc_st =
|
||||||
|
agc_state_create(sample_rate, frame_len, &speech_cfg->tx_agc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_EQ)
|
#if defined(SPEECH_TX_EQ)
|
||||||
|
@ -489,28 +525,33 @@ int speech_tx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_POST_GAIN)
|
#if defined(SPEECH_TX_POST_GAIN)
|
||||||
speech_tx_post_gain_st = speech_gain_create(sample_rate, frame_len, &speech_cfg->tx_post_gain);
|
speech_tx_post_gain_st =
|
||||||
|
speech_gain_create(sample_rate, frame_len, &speech_cfg->tx_post_gain);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRACE(1,"[%s] End", __func__);
|
TRACE(1, "[%s] End", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_rx_init(int sample_rate, int frame_len)
|
int speech_rx_init(int sample_rate, int frame_len) {
|
||||||
{
|
TRACE(3, "[%s] Start, sample_rate: %d, frame_len: %d", __func__, sample_rate,
|
||||||
TRACE(3,"[%s] Start, sample_rate: %d, frame_len: %d", __func__, sample_rate, frame_len);
|
frame_len);
|
||||||
|
|
||||||
#if defined (SPEECH_RX_NS)
|
#if defined(SPEECH_RX_NS)
|
||||||
speech_rx_ns_st = speech_ns_create(sample_rate, frame_len, &speech_cfg->rx_ns);
|
speech_rx_ns_st =
|
||||||
|
speech_ns_create(sample_rate, frame_len, &speech_cfg->rx_ns);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS2)
|
#if defined(SPEECH_RX_NS2)
|
||||||
speech_rx_ns2_st = speech_ns2_create(sample_rate, frame_len, &speech_cfg->rx_ns2);
|
speech_rx_ns2_st =
|
||||||
|
speech_ns2_create(sample_rate, frame_len, &speech_cfg->rx_ns2);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS2FLOAT)
|
#if defined(SPEECH_RX_NS2FLOAT)
|
||||||
speech_rx_ns2float_st = speech_ns2float_create(sample_rate, frame_len, SPEECH_RX_NS2FLOAT_CORE, &speech_cfg->rx_ns2float);
|
speech_rx_ns2float_st =
|
||||||
|
speech_ns2float_create(sample_rate, frame_len, SPEECH_RX_NS2FLOAT_CORE,
|
||||||
|
&speech_cfg->rx_ns2float);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS3)
|
#if defined(SPEECH_RX_NS3)
|
||||||
|
@ -518,7 +559,8 @@ int speech_rx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_AGC)
|
#if defined(SPEECH_RX_AGC)
|
||||||
speech_rx_agc_st = agc_state_create(sample_rate, frame_len, &speech_cfg->rx_agc);
|
speech_rx_agc_st =
|
||||||
|
agc_state_create(sample_rate, frame_len, &speech_cfg->rx_agc);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_EQ)
|
#if defined(SPEECH_RX_EQ)
|
||||||
|
@ -526,22 +568,21 @@ int speech_rx_init(int sample_rate, int frame_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_POST_GAIN)
|
#if defined(SPEECH_RX_POST_GAIN)
|
||||||
speech_rx_post_gain_st = speech_gain_create(sample_rate, frame_len, &speech_cfg->rx_post_gain);
|
speech_rx_post_gain_st =
|
||||||
|
speech_gain_create(sample_rate, frame_len, &speech_cfg->rx_post_gain);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRACE(1,"[%s] End", __func__);
|
TRACE(1, "[%s] End", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_init(int tx_sample_rate, int rx_sample_rate,
|
int speech_init(int tx_sample_rate, int rx_sample_rate, int tx_frame_ms,
|
||||||
int tx_frame_ms, int rx_frame_ms,
|
int rx_frame_ms, int sco_frame_ms, uint8_t *buf, int len) {
|
||||||
int sco_frame_ms,
|
TRACE(1, "[%s] Start...", __func__);
|
||||||
uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
TRACE(1,"[%s] Start...", __func__);
|
|
||||||
|
|
||||||
//ASSERT(frame_ms == SPEECH_PROCESS_FRAME_MS, "[%s] frame_ms(%d) != SPEECH_PROCESS_FRAME_MS(%d)", __func__,
|
// ASSERT(frame_ms == SPEECH_PROCESS_FRAME_MS, "[%s] frame_ms(%d) !=
|
||||||
|
// SPEECH_PROCESS_FRAME_MS(%d)", __func__,
|
||||||
// frame_ms,
|
// frame_ms,
|
||||||
// SPEECH_PROCESS_FRAME_MS);
|
// SPEECH_PROCESS_FRAME_MS);
|
||||||
|
|
||||||
|
@ -553,9 +594,9 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
speech_heap_init(buf, len);
|
speech_heap_init(buf, len);
|
||||||
|
|
||||||
#if defined(SCO_OPTIMIZE_FOR_RAM)
|
#if defined(SCO_OPTIMIZE_FOR_RAM)
|
||||||
TRACE(2,"[%s] sco_overlay_ram_buf_len = %d", __func__, sco_overlay_ram_buf_len);
|
TRACE(2, "[%s] sco_overlay_ram_buf_len = %d", __func__,
|
||||||
if (sco_overlay_ram_buf_len >= 1024)
|
sco_overlay_ram_buf_len);
|
||||||
{
|
if (sco_overlay_ram_buf_len >= 1024) {
|
||||||
speech_heap_add_block(sco_overlay_ram_buf, sco_overlay_ram_buf_len);
|
speech_heap_add_block(sco_overlay_ram_buf, sco_overlay_ram_buf_len);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -575,11 +616,13 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int aec_enable = 0;
|
int aec_enable = 0;
|
||||||
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || \
|
||||||
|
defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
||||||
aec_enable = 1;
|
aec_enable = 1;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int capture_sample_size = sizeof(int16_t), playback_sample_size = sizeof(int16_t);
|
int capture_sample_size = sizeof(int16_t),
|
||||||
|
playback_sample_size = sizeof(int16_t);
|
||||||
#if defined(SPEECH_TX_24BIT)
|
#if defined(SPEECH_TX_24BIT)
|
||||||
capture_sample_size = sizeof(int32_t);
|
capture_sample_size = sizeof(int32_t);
|
||||||
#endif
|
#endif
|
||||||
|
@ -587,22 +630,19 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
playback_sample_size = sizeof(int32_t);
|
playback_sample_size = sizeof(int32_t);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
CAPTURE_HANDLER_T tx_handler = (tx_frame_ms == sco_frame_ms) ? NULL : _speech_tx_process_;
|
CAPTURE_HANDLER_T tx_handler =
|
||||||
PLAYBACK_HANDLER_T rx_handler = (rx_frame_ms == sco_frame_ms) ? NULL : _speech_rx_process_;
|
(tx_frame_ms == sco_frame_ms) ? NULL : _speech_tx_process_;
|
||||||
|
PLAYBACK_HANDLER_T rx_handler =
|
||||||
|
(rx_frame_ms == sco_frame_ms) ? NULL : _speech_rx_process_;
|
||||||
|
|
||||||
speech_tx_frame_resizer_enable = (tx_handler != NULL);
|
speech_tx_frame_resizer_enable = (tx_handler != NULL);
|
||||||
speech_rx_frame_resizer_enable = (rx_handler != NULL);
|
speech_rx_frame_resizer_enable = (rx_handler != NULL);
|
||||||
|
|
||||||
if (speech_tx_frame_resizer_enable || speech_rx_frame_resizer_enable) {
|
if (speech_tx_frame_resizer_enable || speech_rx_frame_resizer_enable) {
|
||||||
speech_frame_resize_st = frame_resize_create(SPEECH_FRAME_MS_TO_LEN(tx_sample_rate, sco_frame_ms),
|
speech_frame_resize_st = frame_resize_create(
|
||||||
SPEECH_TX_CHANNEL_NUM,
|
SPEECH_FRAME_MS_TO_LEN(tx_sample_rate, sco_frame_ms),
|
||||||
speech_tx_frame_len,
|
SPEECH_TX_CHANNEL_NUM, speech_tx_frame_len, capture_sample_size,
|
||||||
capture_sample_size,
|
playback_sample_size, aec_enable, tx_handler, rx_handler);
|
||||||
playback_sample_size,
|
|
||||||
aec_enable,
|
|
||||||
tx_handler,
|
|
||||||
rx_handler
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SCO_CP_ACCEL)
|
#if defined(SCO_CP_ACCEL)
|
||||||
|
@ -615,7 +655,8 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
|
|
||||||
#if !defined(SCO_CP_ACCEL)
|
#if !defined(SCO_CP_ACCEL)
|
||||||
int needed_freq = 0;
|
int needed_freq = 0;
|
||||||
enum APP_SYSFREQ_FREQ_T min_system_freq = speech_get_proper_sysfreq(&needed_freq);
|
enum APP_SYSFREQ_FREQ_T min_system_freq =
|
||||||
|
speech_get_proper_sysfreq(&needed_freq);
|
||||||
enum APP_SYSFREQ_FREQ_T freq = hal_sysfreq_get();
|
enum APP_SYSFREQ_FREQ_T freq = hal_sysfreq_get();
|
||||||
|
|
||||||
if (freq < min_system_freq) {
|
if (freq < min_system_freq) {
|
||||||
|
@ -624,23 +665,24 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_BT_SCO, freq);
|
app_sysfreq_req(APP_SYSFREQ_USER_BT_SCO, freq);
|
||||||
|
|
||||||
int system_freq = hal_sys_timer_calc_cpu_freq(5, 0);
|
int system_freq = hal_sys_timer_calc_cpu_freq(5, 0);
|
||||||
TRACE(2,"[%s]: app_sysfreq_req %d", __FUNCTION__, freq);
|
TRACE(2, "[%s]: app_sysfreq_req %d", __FUNCTION__, freq);
|
||||||
TRACE(2,"[%s]: sys freq calc : %d\n", __FUNCTION__, system_freq);
|
TRACE(2, "[%s]: sys freq calc : %d\n", __FUNCTION__, system_freq);
|
||||||
|
|
||||||
if (system_freq <= needed_freq * 1000 * 1000) {
|
if (system_freq <= needed_freq * 1000 * 1000) {
|
||||||
TRACE(3,"[%s] WARNING: system freq(%d) seems to be lower than needed(%d).", __FUNCTION__, system_freq/1000000, needed_freq);
|
TRACE(3,
|
||||||
|
"[%s] WARNING: system freq(%d) seems to be lower than needed(%d).",
|
||||||
|
__FUNCTION__, system_freq / 1000000, needed_freq);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRACE(1,"[%s] End", __func__);
|
TRACE(1, "[%s] End", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_tx_deinit(void)
|
int speech_tx_deinit(void) {
|
||||||
{
|
TRACE(1, "[%s] Start...", __func__);
|
||||||
TRACE(1,"[%s] Start...", __func__);
|
|
||||||
|
|
||||||
#if defined(SPEECH_TX_POST_GAIN)
|
#if defined(SPEECH_TX_POST_GAIN)
|
||||||
speech_gain_destroy(speech_tx_post_gain_st);
|
speech_gain_destroy(speech_tx_post_gain_st);
|
||||||
|
@ -670,9 +712,9 @@ int speech_tx_deinit(void)
|
||||||
speech_2mic_ns2_destroy(speech_tx_2mic_ns2_st);
|
speech_2mic_ns2_destroy(speech_tx_2mic_ns2_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #if defined(SPEECH_CS_VAD)
|
// #if defined(SPEECH_CS_VAD)
|
||||||
// VAD_destroy(speech_cs_vad_st);
|
// VAD_destroy(speech_cs_vad_st);
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS3)
|
#if defined(SPEECH_TX_2MIC_NS3)
|
||||||
far_field_speech_enhancement_deinit();
|
far_field_speech_enhancement_deinit();
|
||||||
|
@ -734,7 +776,8 @@ int speech_tx_deinit(void)
|
||||||
ec2float_destroy(speech_tx_aec2float_st);
|
ec2float_destroy(speech_tx_aec2float_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || \
|
||||||
|
defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
||||||
speech_free(aec_echo_buf_ptr);
|
speech_free(aec_echo_buf_ptr);
|
||||||
speech_free(aec_out_buf);
|
speech_free(aec_out_buf);
|
||||||
#endif
|
#endif
|
||||||
|
@ -751,14 +794,13 @@ int speech_tx_deinit(void)
|
||||||
speech_dc_filter_destroy(speech_tx_dc_filter_st);
|
speech_dc_filter_destroy(speech_tx_dc_filter_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRACE(1,"[%s] End", __func__);
|
TRACE(1, "[%s] End", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_rx_deinit(void)
|
int speech_rx_deinit(void) {
|
||||||
{
|
TRACE(1, "[%s] Start...", __func__);
|
||||||
TRACE(1,"[%s] Start...", __func__);
|
|
||||||
|
|
||||||
#if defined(SPEECH_RX_POST_GAIN)
|
#if defined(SPEECH_RX_POST_GAIN)
|
||||||
speech_gain_destroy(speech_rx_post_gain_st);
|
speech_gain_destroy(speech_rx_post_gain_st);
|
||||||
|
@ -788,14 +830,13 @@ int speech_rx_deinit(void)
|
||||||
ns3_destroy(speech_rx_ns3_st);
|
ns3_destroy(speech_rx_ns3_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
TRACE(1,"[%s] End", __func__);
|
TRACE(1, "[%s] End", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_deinit(void)
|
int speech_deinit(void) {
|
||||||
{
|
TRACE(1, "[%s] Start...", __func__);
|
||||||
TRACE(1,"[%s] Start...", __func__);
|
|
||||||
|
|
||||||
speech_rx_deinit();
|
speech_rx_deinit();
|
||||||
speech_tx_deinit();
|
speech_tx_deinit();
|
||||||
|
@ -823,16 +864,16 @@ int speech_deinit(void)
|
||||||
|
|
||||||
size_t total = 0, used = 0, max_used = 0;
|
size_t total = 0, used = 0, max_used = 0;
|
||||||
speech_memory_info(&total, &used, &max_used);
|
speech_memory_info(&total, &used, &max_used);
|
||||||
TRACE(3,"SPEECH MALLOC MEM: total - %d, used - %d, max_used - %d.", total, used, max_used);
|
TRACE(3, "SPEECH MALLOC MEM: total - %d, used - %d, max_used - %d.", total,
|
||||||
|
used, max_used);
|
||||||
ASSERT(used == 0, "[%s] used != 0", __func__);
|
ASSERT(used == 0, "[%s] used != 0", __func__);
|
||||||
|
|
||||||
TRACE(1,"[%s] End", __func__);
|
TRACE(1, "[%s] End", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
float speech_tx_get_required_mips(void)
|
float speech_tx_get_required_mips(void) {
|
||||||
{
|
|
||||||
float mips = 0;
|
float mips = 0;
|
||||||
|
|
||||||
#if defined(SPEECH_TX_DC_FILTER)
|
#if defined(SPEECH_TX_DC_FILTER)
|
||||||
|
@ -871,9 +912,9 @@ float speech_tx_get_required_mips(void)
|
||||||
mips += speech_2mic_ns2_get_required_mips(speech_tx_2mic_ns2_st);
|
mips += speech_2mic_ns2_get_required_mips(speech_tx_2mic_ns2_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// #if defined(SPEECH_CS_VAD)
|
// #if defined(SPEECH_CS_VAD)
|
||||||
// mips += VAD_process_get_required_mips(speech_cs_vad_st);
|
// mips += VAD_process_get_required_mips(speech_cs_vad_st);
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS3)
|
#if defined(SPEECH_TX_2MIC_NS3)
|
||||||
mips += far_field_speech_enhancement_get_required_mips();
|
mips += far_field_speech_enhancement_get_required_mips();
|
||||||
|
@ -942,11 +983,10 @@ float speech_tx_get_required_mips(void)
|
||||||
return mips;
|
return mips;
|
||||||
}
|
}
|
||||||
|
|
||||||
float speech_rx_get_required_mips(void)
|
float speech_rx_get_required_mips(void) {
|
||||||
{
|
|
||||||
float mips = 0;
|
float mips = 0;
|
||||||
|
|
||||||
#if defined (SPEECH_RX_NS)
|
#if defined(SPEECH_RX_NS)
|
||||||
mips += speech_ns_get_required_mips(speech_rx_ns_st);
|
mips += speech_ns_get_required_mips(speech_rx_ns_st);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -977,15 +1017,13 @@ float speech_rx_get_required_mips(void)
|
||||||
return mips;
|
return mips;
|
||||||
}
|
}
|
||||||
|
|
||||||
float speech_get_required_mips(void)
|
float speech_get_required_mips(void) {
|
||||||
{
|
|
||||||
return speech_tx_get_required_mips() + speech_rx_get_required_mips();
|
return speech_tx_get_required_mips() + speech_rx_get_required_mips();
|
||||||
}
|
}
|
||||||
|
|
||||||
#define SYSTEM_BASE_MIPS (18)
|
#define SYSTEM_BASE_MIPS (18)
|
||||||
|
|
||||||
enum APP_SYSFREQ_FREQ_T speech_get_proper_sysfreq(int *needed_mips)
|
enum APP_SYSFREQ_FREQ_T speech_get_proper_sysfreq(int *needed_mips) {
|
||||||
{
|
|
||||||
enum APP_SYSFREQ_FREQ_T freq = APP_SYSFREQ_32K;
|
enum APP_SYSFREQ_FREQ_T freq = APP_SYSFREQ_32K;
|
||||||
int required_mips = (int)ceilf(speech_get_required_mips() + SYSTEM_BASE_MIPS);
|
int required_mips = (int)ceilf(speech_get_required_mips() + SYSTEM_BASE_MIPS);
|
||||||
|
|
||||||
|
@ -1005,8 +1043,7 @@ enum APP_SYSFREQ_FREQ_T speech_get_proper_sysfreq(int *needed_mips)
|
||||||
return freq;
|
return freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_set_config(const SpeechConfig *cfg)
|
int speech_set_config(const SpeechConfig *cfg) {
|
||||||
{
|
|
||||||
#if defined(SPEECH_TX_DC_FILTER)
|
#if defined(SPEECH_TX_DC_FILTER)
|
||||||
speech_dc_filter_set_config(speech_tx_dc_filter_st, &cfg->tx_dc_filter);
|
speech_dc_filter_set_config(speech_tx_dc_filter_st, &cfg->tx_dc_filter);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1017,10 +1054,11 @@ int speech_set_config(const SpeechConfig *cfg)
|
||||||
speech_aec2_set_config(speech_tx_aec2_st, &cfg->tx_aec2);
|
speech_aec2_set_config(speech_tx_aec2_st, &cfg->tx_aec2);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC2FLOAT)
|
||||||
ec2float_set_config(speech_tx_aec2float_st, &cfg->tx_aec2float, SPEECH_TX_AEC2FLOAT_CORE);
|
ec2float_set_config(speech_tx_aec2float_st, &cfg->tx_aec2float,
|
||||||
|
SPEECH_TX_AEC2FLOAT_CORE);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPEECH_TX_2MIC_NS)
|
#if defined(SPEECH_TX_2MIC_NS)
|
||||||
TRACE(1,"[%s] WARNING: Can not support tuning SPEECH_TX_2MIC_NS", __func__);
|
TRACE(1, "[%s] WARNING: Can not support tuning SPEECH_TX_2MIC_NS", __func__);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPEECH_TX_2MIC_NS2)
|
#if defined(SPEECH_TX_2MIC_NS2)
|
||||||
speech_2mic_ns2_set_config(speech_tx_2mic_ns2_st, &cfg->tx_2mic_ns2);
|
speech_2mic_ns2_set_config(speech_tx_2mic_ns2_st, &cfg->tx_2mic_ns2);
|
||||||
|
@ -1071,7 +1109,8 @@ int speech_set_config(const SpeechConfig *cfg)
|
||||||
speech_ns2_set_config(speech_rx_ns2_st, &cfg->rx_ns2);
|
speech_ns2_set_config(speech_rx_ns2_st, &cfg->rx_ns2);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPEECH_RX_NS2FLOAT)
|
#if defined(SPEECH_RX_NS2FLOAT)
|
||||||
speech_ns2float_set_config(speech_rx_ns2float_st, &cfg->rx_ns2float, SPEECH_RX_NS2FLOAT_CORE);
|
speech_ns2float_set_config(speech_rx_ns2float_st, &cfg->rx_ns2float,
|
||||||
|
SPEECH_RX_NS2FLOAT_CORE);
|
||||||
#endif
|
#endif
|
||||||
#if defined(SPEECH_RX_NS3)
|
#if defined(SPEECH_RX_NS3)
|
||||||
ns3_set_config(speech_rx_ns3_st, &cfg->rx_ns3);
|
ns3_set_config(speech_rx_ns3_st, &cfg->rx_ns3);
|
||||||
|
@ -1096,8 +1135,7 @@ int speech_set_config(const SpeechConfig *cfg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len) {
|
||||||
{
|
|
||||||
int pcm_len = *_pcm_len;
|
int pcm_len = *_pcm_len;
|
||||||
|
|
||||||
#if defined(BT_SCO_CHAIN_PROFILE)
|
#if defined(BT_SCO_CHAIN_PROFILE)
|
||||||
|
@ -1107,19 +1145,19 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
// TRACE(2,"[%s] pcm_len = %d", __func__, pcm_len);
|
// TRACE(2,"[%s] pcm_len = %d", __func__, pcm_len);
|
||||||
|
|
||||||
#ifdef AUDIO_DEBUG_V0_1_0
|
#ifdef AUDIO_DEBUG_V0_1_0
|
||||||
if (speech_tuning_get_status())
|
if (speech_tuning_get_status()) {
|
||||||
{
|
|
||||||
speech_set_config(speech_cfg);
|
speech_set_config(speech_cfg);
|
||||||
|
|
||||||
speech_tuning_set_status(false);
|
speech_tuning_set_status(false);
|
||||||
|
|
||||||
// If has MIPS problem, can move this block code into speech_rx_process or return directly
|
// If has MIPS problem, can move this block code into speech_rx_process or
|
||||||
// return 0
|
// return directly return 0
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_24BIT)
|
#if defined(SPEECH_TX_24BIT)
|
||||||
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || \
|
||||||
|
defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
||||||
tx_refbuf16 = (int16_t *)ref_buf;
|
tx_refbuf16 = (int16_t *)ref_buf;
|
||||||
tx_refbuf32 = (int32_t *)ref_buf;
|
tx_refbuf32 = (int32_t *)ref_buf;
|
||||||
for (int i = 0; i < pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM; i++) {
|
for (int i = 0; i < pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM; i++) {
|
||||||
|
@ -1154,9 +1192,12 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
speech_dc_filter_process(speech_tx_dc_filter_st, pcm_buf, pcm_len);
|
speech_dc_filter_process(speech_tx_dc_filter_st, pcm_buf, pcm_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2) && defined(AUDIO_DUMP) && defined(BT_SCO_CHAIN_AUDIO_DUMP)
|
#if (SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2) && defined(AUDIO_DUMP) && \
|
||||||
audio_dump_add_channel_data_from_multi_channels(0, pcm_buf, pcm_len / 2, 2, 0);
|
defined(BT_SCO_CHAIN_AUDIO_DUMP)
|
||||||
audio_dump_add_channel_data_from_multi_channels(1, pcm_buf, pcm_len / 2, 2, 1);
|
audio_dump_add_channel_data_from_multi_channels(0, pcm_buf, pcm_len / 2, 2,
|
||||||
|
0);
|
||||||
|
audio_dump_add_channel_data_from_multi_channels(1, pcm_buf, pcm_len / 2, 2,
|
||||||
|
1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_MIC_CALIBRATION)
|
#if defined(SPEECH_TX_MIC_CALIBRATION)
|
||||||
|
@ -1167,9 +1208,12 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
speech_fir_calib_process(speech_tx_mic_fir_calib_st, pcm_buf, pcm_len);
|
speech_fir_calib_process(speech_tx_mic_fir_calib_st, pcm_buf, pcm_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2) && defined(AUDIO_DUMP) && defined(BT_SCO_CHAIN_AUDIO_DUMP)
|
#if (SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2) && defined(AUDIO_DUMP) && \
|
||||||
audio_dump_add_channel_data_from_multi_channels(2, pcm_buf, pcm_len / 2, 2, 0);
|
defined(BT_SCO_CHAIN_AUDIO_DUMP)
|
||||||
audio_dump_add_channel_data_from_multi_channels(3, pcm_buf, pcm_len / 2, 2, 1);
|
audio_dump_add_channel_data_from_multi_channels(2, pcm_buf, pcm_len / 2, 2,
|
||||||
|
0);
|
||||||
|
audio_dump_add_channel_data_from_multi_channels(3, pcm_buf, pcm_len / 2, 2,
|
||||||
|
1);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS)
|
#if defined(SPEECH_TX_2MIC_NS)
|
||||||
|
@ -1187,7 +1231,8 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
if (dualmic_enable == true) {
|
if (dualmic_enable == true) {
|
||||||
#if defined(ANC_APP)
|
#if defined(ANC_APP)
|
||||||
sensormic_denoise_set_anc_status(speech_tx_2mic_ns4_st, app_anc_work_status());
|
sensormic_denoise_set_anc_status(speech_tx_2mic_ns4_st,
|
||||||
|
app_anc_work_status());
|
||||||
#endif
|
#endif
|
||||||
sensormic_denoise_process(speech_tx_2mic_ns4_st, pcm_buf, pcm_len, pcm_buf);
|
sensormic_denoise_process(speech_tx_2mic_ns4_st, pcm_buf, pcm_len, pcm_buf);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1206,7 +1251,7 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS6)
|
#if defined(SPEECH_TX_2MIC_NS6)
|
||||||
//TRACE(0,"NS6");
|
// TRACE(0,"NS6");
|
||||||
speech_2mic_ns6_process(speech_tx_2mic_ns6_st, pcm_buf, pcm_len, pcm_buf);
|
speech_2mic_ns6_process(speech_tx_2mic_ns6_st, pcm_buf, pcm_len, pcm_buf);
|
||||||
// Channel num: two-->one
|
// Channel num: two-->one
|
||||||
pcm_len >>= 1;
|
pcm_len >>= 1;
|
||||||
|
@ -1226,7 +1271,8 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
|
|
||||||
#if defined(BT_SCO_CHAIN_AUDIO_DUMP)
|
#if defined(BT_SCO_CHAIN_AUDIO_DUMP)
|
||||||
audio_dump_add_channel_data(0, pcm_buf, pcm_len);
|
audio_dump_add_channel_data(0, pcm_buf, pcm_len);
|
||||||
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC) || defined(SPEECH_TX_AEC2) || \
|
||||||
|
defined(SPEECH_TX_AEC3) || defined(SPEECH_TX_AEC2FLOAT)
|
||||||
audio_dump_add_channel_data(1, ref_buf, pcm_len);
|
audio_dump_add_channel_data(1, ref_buf, pcm_len);
|
||||||
#else
|
#else
|
||||||
audio_dump_add_channel_data(1, pcm_buf, pcm_len);
|
audio_dump_add_channel_data(1, pcm_buf, pcm_len);
|
||||||
|
@ -1247,7 +1293,7 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
CODEC_OpVecCpy(buf_out, bufferstate, pcm_len);
|
CODEC_OpVecCpy(buf_out, bufferstate, pcm_len);
|
||||||
CODEC_OpVecCpy(bufferstate, bufferstate + pcm_len, delay);
|
CODEC_OpVecCpy(bufferstate, bufferstate + pcm_len, delay);
|
||||||
SubBandAec_process(speech_tx_aec3_st, pcm_buf, buf_out, pcm_buf, pcm_len);
|
SubBandAec_process(speech_tx_aec3_st, pcm_buf, buf_out, pcm_buf, pcm_len);
|
||||||
//audio_dump_add_channel_data(1, pcm_buf, pcm_len);
|
// audio_dump_add_channel_data(1, pcm_buf, pcm_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SCO_CP_ACCEL_ALGO_START();
|
SCO_CP_ACCEL_ALGO_START();
|
||||||
|
@ -1255,10 +1301,13 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
#if defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC2FLOAT)
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
if (dualmic_enable == true)
|
if (dualmic_enable == true)
|
||||||
TRACE(2,"[%s] vad: %d", __FUNCTION__, sensormic_denoise_get_vad(speech_tx_2mic_ns4_st));
|
TRACE(2, "[%s] vad: %d", __FUNCTION__,
|
||||||
ec2float_set_external_vad(speech_tx_aec2float_st, sensormic_denoise_get_vad(speech_tx_2mic_ns4_st));
|
sensormic_denoise_get_vad(speech_tx_2mic_ns4_st));
|
||||||
|
ec2float_set_external_vad(speech_tx_aec2float_st,
|
||||||
|
sensormic_denoise_get_vad(speech_tx_2mic_ns4_st));
|
||||||
#endif
|
#endif
|
||||||
ec2float_process(speech_tx_aec2float_st, pcm_buf, ref_buf, pcm_len, aec_out_buf);
|
ec2float_process(speech_tx_aec2float_st, pcm_buf, ref_buf, pcm_len,
|
||||||
|
aec_out_buf);
|
||||||
speech_copy_int16(pcm_buf, aec_out_buf, pcm_len);
|
speech_copy_int16(pcm_buf, aec_out_buf, pcm_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1279,7 +1328,9 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
#if defined(SPEECH_TX_NS2FLOAT)
|
#if defined(SPEECH_TX_NS2FLOAT)
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
if (dualmic_enable == true)
|
if (dualmic_enable == true)
|
||||||
speech_ns2float_set_external_vad(speech_tx_ns2float_st, sensormic_denoise_get_vad(speech_tx_2mic_ns4_st));
|
speech_ns2float_set_external_vad(
|
||||||
|
speech_tx_ns2float_st,
|
||||||
|
sensormic_denoise_get_vad(speech_tx_2mic_ns4_st));
|
||||||
#endif
|
#endif
|
||||||
speech_ns2float_process(speech_tx_ns2float_st, pcm_buf, pcm_len);
|
speech_ns2float_process(speech_tx_ns2float_st, pcm_buf, pcm_len);
|
||||||
#endif
|
#endif
|
||||||
|
@ -1343,17 +1394,16 @@ void _speech_tx_process_pre(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
|
|
||||||
#if defined(BT_SCO_CHAIN_PROFILE)
|
#if defined(BT_SCO_CHAIN_PROFILE)
|
||||||
tx_end_ticks = hal_fast_sys_timer_get();
|
tx_end_ticks = hal_fast_sys_timer_get();
|
||||||
TRACE(2,"[%s] takes %d us", __FUNCTION__,
|
TRACE(2, "[%s] takes %d us", __FUNCTION__,
|
||||||
FAST_TICKS_TO_US(tx_end_ticks - tx_start_ticks));
|
FAST_TICKS_TO_US(tx_end_ticks - tx_start_ticks));
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(SCO_CP_ACCEL)
|
#if defined(SCO_CP_ACCEL)
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
int sco_cp_algo(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
int sco_cp_algo(short *pcm_buf, short *ref_buf, int *_pcm_len) {
|
||||||
{
|
|
||||||
#if defined(SCO_TRACE_CP_ACCEL)
|
#if defined(SCO_TRACE_CP_ACCEL)
|
||||||
TRACE(1,"[%s] ...", __func__);
|
TRACE(1, "[%s] ...", __func__);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_speech_tx_process_mid(pcm_buf, ref_buf, _pcm_len);
|
_speech_tx_process_mid(pcm_buf, ref_buf, _pcm_len);
|
||||||
|
@ -1362,8 +1412,7 @@ int sco_cp_algo(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t _speech_tx_process_(void *pcm_buf, void *ref_buf, int32_t *_pcm_len)
|
int32_t _speech_tx_process_(void *pcm_buf, void *ref_buf, int32_t *_pcm_len) {
|
||||||
{
|
|
||||||
_speech_tx_process_pre(pcm_buf, ref_buf, (int *)_pcm_len);
|
_speech_tx_process_pre(pcm_buf, ref_buf, (int *)_pcm_len);
|
||||||
#if defined(SCO_CP_ACCEL)
|
#if defined(SCO_CP_ACCEL)
|
||||||
sco_cp_process(pcm_buf, ref_buf, (int *)_pcm_len);
|
sco_cp_process(pcm_buf, ref_buf, (int *)_pcm_len);
|
||||||
|
@ -1373,8 +1422,7 @@ int32_t _speech_tx_process_(void *pcm_buf, void *ref_buf, int32_t *_pcm_len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t _speech_rx_process_(void *pcm_buf, int32_t *_pcm_len)
|
int32_t _speech_rx_process_(void *pcm_buf, int32_t *_pcm_len) {
|
||||||
{
|
|
||||||
int32_t pcm_len = *_pcm_len;
|
int32_t pcm_len = *_pcm_len;
|
||||||
|
|
||||||
#if defined(BT_SCO_CHAIN_PROFILE)
|
#if defined(BT_SCO_CHAIN_PROFILE)
|
||||||
|
@ -1400,8 +1448,7 @@ int32_t _speech_rx_process_(void *pcm_buf, int32_t *_pcm_len)
|
||||||
#if defined(SPEECH_RX_NS2)
|
#if defined(SPEECH_RX_NS2)
|
||||||
// fix 0dB signal
|
// fix 0dB signal
|
||||||
int16_t *pcm_buf16 = (int16_t *)pcm_buf;
|
int16_t *pcm_buf16 = (int16_t *)pcm_buf;
|
||||||
for(int i=0; i<pcm_len; i++)
|
for (int i = 0; i < pcm_len; i++) {
|
||||||
{
|
|
||||||
pcm_buf16[i] = (int16_t)(pcm_buf16[i] * 0.94);
|
pcm_buf16[i] = (int16_t)(pcm_buf16[i] * 0.94);
|
||||||
}
|
}
|
||||||
speech_ns2_process(speech_rx_ns2_st, pcm_buf, pcm_len);
|
speech_ns2_process(speech_rx_ns2_st, pcm_buf, pcm_len);
|
||||||
|
@ -1410,8 +1457,7 @@ int32_t _speech_rx_process_(void *pcm_buf, int32_t *_pcm_len)
|
||||||
#if defined(SPEECH_RX_NS2FLOAT)
|
#if defined(SPEECH_RX_NS2FLOAT)
|
||||||
// FIXME
|
// FIXME
|
||||||
int16_t *pcm_buf16 = (int16_t *)pcm_buf;
|
int16_t *pcm_buf16 = (int16_t *)pcm_buf;
|
||||||
for(int i=0; i<pcm_len; i++)
|
for (int i = 0; i < pcm_len; i++) {
|
||||||
{
|
|
||||||
pcm_buf16[i] = (int16_t)(pcm_buf16[i] * 0.94);
|
pcm_buf16[i] = (int16_t)(pcm_buf16[i] * 0.94);
|
||||||
}
|
}
|
||||||
speech_ns2float_process(speech_rx_ns2float_st, pcm_buf, pcm_len);
|
speech_ns2float_process(speech_rx_ns2float_st, pcm_buf, pcm_len);
|
||||||
|
@ -1452,31 +1498,31 @@ int32_t _speech_rx_process_(void *pcm_buf, int32_t *_pcm_len)
|
||||||
|
|
||||||
#if defined(BT_SCO_CHAIN_PROFILE)
|
#if defined(BT_SCO_CHAIN_PROFILE)
|
||||||
uint32_t end_ticks = hal_fast_sys_timer_get();
|
uint32_t end_ticks = hal_fast_sys_timer_get();
|
||||||
TRACE(2,"[%s] takes %d us", __FUNCTION__,
|
TRACE(2, "[%s] takes %d us", __FUNCTION__,
|
||||||
FAST_TICKS_TO_US(end_ticks - start_ticks));
|
FAST_TICKS_TO_US(end_ticks - start_ticks));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len)
|
int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len) {
|
||||||
{
|
|
||||||
if (speech_tx_frame_resizer_enable == false) {
|
if (speech_tx_frame_resizer_enable == false) {
|
||||||
_speech_tx_process_(pcm_buf, ref_buf, (int32_t *)pcm_len);
|
_speech_tx_process_(pcm_buf, ref_buf, (int32_t *)pcm_len);
|
||||||
} else {
|
} else {
|
||||||
// MUST use (int32_t *)??????
|
// MUST use (int32_t *)??????
|
||||||
frame_resize_process_capture(speech_frame_resize_st, pcm_buf, ref_buf, (int32_t *)pcm_len);
|
frame_resize_process_capture(speech_frame_resize_st, pcm_buf, ref_buf,
|
||||||
|
(int32_t *)pcm_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_rx_process(void *pcm_buf, int *pcm_len)
|
int speech_rx_process(void *pcm_buf, int *pcm_len) {
|
||||||
{
|
|
||||||
if (speech_rx_frame_resizer_enable == false) {
|
if (speech_rx_frame_resizer_enable == false) {
|
||||||
_speech_rx_process_(pcm_buf, (int32_t *)pcm_len);
|
_speech_rx_process_(pcm_buf, (int32_t *)pcm_len);
|
||||||
} else {
|
} else {
|
||||||
frame_resize_process_playback(speech_frame_resize_st, pcm_buf, (int32_t *)pcm_len);
|
frame_resize_process_playback(speech_frame_resize_st, pcm_buf,
|
||||||
|
(int32_t *)pcm_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -13,11 +13,13 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "plat_types.h"
|
|
||||||
#include "bt_sco_chain_cfg.h"
|
#include "bt_sco_chain_cfg.h"
|
||||||
|
#include "plat_types.h"
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
static float ff_fb_h[256] = {1.f, };
|
static float ff_fb_h[256] = {
|
||||||
|
1.f,
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_MIC_CALIBRATION)
|
#if defined(SPEECH_TX_MIC_CALIBRATION)
|
||||||
|
@ -27,28 +29,22 @@ static float ff_fb_h[256] = {1.f, };
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* mic_num(1~4): the number of microphones. The filter num is (mic_num - 1)
|
* mic_num(1~4): the number of microphones. The filter num is (mic_num - 1)
|
||||||
* calib: {bypass, gain, num, {type, frequency, gain, q}}. Please refer to SPEECH_TX_EQ section
|
* calib: {bypass, gain, num, {type, frequency, gain, q}}. Please refer to
|
||||||
* in this file
|
*SPEECH_TX_EQ section in this file Resource consumption: RAM: None FLASE:
|
||||||
* Resource consumption:
|
*None MIPS: fs = 16kHz, 0.5M/section; Note: None
|
||||||
* RAM: None
|
****************************************************************************************************/
|
||||||
* FLASE: None
|
const SpeechIirCalibConfig WEAK speech_tx_mic_calib_cfg = {
|
||||||
* MIPS: fs = 16kHz, 0.5M/section;
|
|
||||||
* Note:
|
|
||||||
* None
|
|
||||||
****************************************************************************************************/
|
|
||||||
const SpeechIirCalibConfig WEAK speech_tx_mic_calib_cfg =
|
|
||||||
{
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.mic_num = 2,
|
.mic_num = 2,
|
||||||
.calib = {
|
.calib =
|
||||||
{
|
{
|
||||||
.bypass = 0,
|
{.bypass = 0,
|
||||||
.gain = 0.f,
|
.gain = 0.f,
|
||||||
.num = 0,
|
.num = 0,
|
||||||
.params = {
|
.params =
|
||||||
|
{
|
||||||
{IIR_BIQUARD_LOWSHELF, 150, -2.5, 0.707},
|
{IIR_BIQUARD_LOWSHELF, 150, -2.5, 0.707},
|
||||||
}
|
}},
|
||||||
},
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
@ -67,14 +63,16 @@ const SpeechIirCalibConfig WEAK speech_tx_mic_calib_cfg =
|
||||||
* MIPS: fs = 16kHz, 0.5M/section;
|
* MIPS: fs = 16kHz, 0.5M/section;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
float mic2_ft_caliration[256] = {1.f, };
|
float mic2_ft_caliration[256] = {
|
||||||
const SpeechFirCalibConfig WEAK speech_tx_mic_fir_calib_cfg =
|
1.f,
|
||||||
{
|
};
|
||||||
|
const SpeechFirCalibConfig WEAK speech_tx_mic_fir_calib_cfg = {
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.mic_num = SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
.mic_num = SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
.delay = 0,
|
.delay = 0,
|
||||||
.calib = {
|
.calib =
|
||||||
|
{
|
||||||
{
|
{
|
||||||
.filter = mic2_ft_caliration,
|
.filter = mic2_ft_caliration,
|
||||||
.filter_length = ARRAY_SIZE(mic2_ft_caliration),
|
.filter_length = ARRAY_SIZE(mic2_ft_caliration),
|
||||||
|
@ -86,32 +84,30 @@ const SpeechFirCalibConfig WEAK speech_tx_mic_fir_calib_cfg =
|
||||||
const SpeechConfig WEAK speech_cfg_default = {
|
const SpeechConfig WEAK speech_cfg_default = {
|
||||||
|
|
||||||
#if defined(SPEECH_TX_DC_FILTER)
|
#if defined(SPEECH_TX_DC_FILTER)
|
||||||
.tx_dc_filter = {
|
.tx_dc_filter =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.gain = 0,
|
.gain = 0,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC)
|
#if defined(SPEECH_TX_AEC)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* delay(>0): delay samples from mic to speak, unit(sample).
|
* delay(>0): delay samples from mic to speak, unit(sample).
|
||||||
* leak_estimate(0~32767): echo supression value. This is a fixed mode. It has relatively large
|
* leak_estimate(0~32767): echo supression value. This is a fixed mode.
|
||||||
* echo supression and large damage to speech signal.
|
*It has relatively large echo supression and large damage to speech signal.
|
||||||
* leak_estimate_shift(0~8): echo supression value. if leak_estimate == 0, then leak_estimate_shift
|
* leak_estimate_shift(0~8): echo supression value. if leak_estimate ==
|
||||||
* can take effect. This is a adaptive mode. It has relatively small echo supression and also
|
*0, then leak_estimate_shift can take effect. This is a adaptive mode. It
|
||||||
* small damage to speech signal.
|
*has relatively small echo supression and also small damage to speech
|
||||||
* Resource consumption:
|
*signal. Resource consumption: RAM: None FLASE: None MIPS: fs =
|
||||||
* RAM: None
|
*16kHz, 40M; Note: If possible, use SPEECH_TX_AEC2FLOAT
|
||||||
* FLASE: None
|
****************************************************************************************************/
|
||||||
* MIPS: fs = 16kHz, 40M;
|
.tx_aec =
|
||||||
* Note:
|
{
|
||||||
* If possible, use SPEECH_TX_AEC2FLOAT
|
|
||||||
****************************************************************************************************/
|
|
||||||
.tx_aec = {
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.delay = 60,
|
.delay = 60,
|
||||||
.leak_estimate = 16383,
|
.leak_estimate = 16383,
|
||||||
|
@ -120,7 +116,7 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC2)
|
#if defined(SPEECH_TX_AEC2)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -134,8 +130,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz, enNlpEnable = 1, 39M;
|
* MIPS: fs = 16kHz, enNlpEnable = 1, 39M;
|
||||||
* Note:
|
* Note:
|
||||||
* If possible, use SPEECH_TX_AEC2FLOAT
|
* If possible, use SPEECH_TX_AEC2FLOAT
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_aec2 = {
|
.tx_aec2 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.enEAecEnable = 1,
|
.enEAecEnable = 1,
|
||||||
.enHpfEnable = 1,
|
.enHpfEnable = 1,
|
||||||
|
@ -152,31 +149,28 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC2FLOAT)
|
#if defined(SPEECH_TX_AEC2FLOAT)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* hpf_enabled(0/1): high pass filter enable or disable. Used to remove DC for Near and Ref signals.
|
* hpf_enabled(0/1): high pass filter enable or disable. Used to remove
|
||||||
* af_enabled(0/1): adaptive filter enable or disable. If the echo signal is very large, enable this
|
*DC for Near and Ref signals. af_enabled(0/1): adaptive filter enable or
|
||||||
* nlp_enabled(0/1): non-linear process enable or disable. Enable this by default.
|
*disable. If the echo signal is very large, enable this nlp_enabled(0/1):
|
||||||
* ns_enabled(0/1): noise supression enable or disable. Enable this by default.
|
*non-linear process enable or disable. Enable this by default.
|
||||||
* cng_enabled(0/1): comfort noise generator enable or disable.
|
* ns_enabled(0/1): noise supression enable or disable. Enable this by
|
||||||
|
*default. cng_enabled(0/1): comfort noise generator enable or disable.
|
||||||
* blocks(1~8): the length of adaptive filter = blocks * frame length
|
* blocks(1~8): the length of adaptive filter = blocks * frame length
|
||||||
* delay(>0): delay samples from mic to speak, unit(sample).
|
* delay(>0): delay samples from mic to speak, unit(sample).
|
||||||
* min_ovrd(1~6): supression factor, min_ovrd becomes larger and echo suppression becomes larger.
|
* min_ovrd(1~6): supression factor, min_ovrd becomes larger and echo
|
||||||
* target_supp(<0): target echo suppression, unit(dB)
|
*suppression becomes larger. target_supp(<0): target echo suppression,
|
||||||
* noise_supp(-30~0): noise suppression, unit(dB)
|
*unit(dB) noise_supp(-30~0): noise suppression, unit(dB) cng_type(0/1):
|
||||||
* cng_type(0/1): noise type(0: White noise; 1: Pink noise)
|
*noise type(0: White noise; 1: Pink noise) cng_level(<0): noise gain,
|
||||||
* cng_level(<0): noise gain, unit(dB)
|
*unit(dB) Resource consumption: RAM: None FLASE: None MIPS: fs =
|
||||||
* Resource consumption:
|
*16kHz; Note: This is the recommended AEC
|
||||||
* RAM: None
|
****************************************************************************************************/
|
||||||
* FLASE: None
|
.tx_aec2float =
|
||||||
* MIPS: fs = 16kHz;
|
{
|
||||||
* Note:
|
|
||||||
* This is the recommended AEC
|
|
||||||
****************************************************************************************************/
|
|
||||||
.tx_aec2float = {
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.hpf_enabled = false,
|
.hpf_enabled = false,
|
||||||
.af_enabled = false,
|
.af_enabled = false,
|
||||||
|
@ -198,14 +192,15 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AEC3)
|
#if defined(SPEECH_TX_AEC3)
|
||||||
.tx_aec3 = {
|
.tx_aec3 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.filter_size = 16,
|
.filter_size = 16,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS)
|
#if defined(SPEECH_TX_2MIC_NS)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* 2 MICs Noise Suppression
|
* 2 MICs Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -216,8 +211,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_2mic_ns = {
|
.tx_2mic_ns =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.alpha_h = 0.8,
|
.alpha_h = 0.8,
|
||||||
.alpha_slow = 0.9,
|
.alpha_slow = 0.9,
|
||||||
|
@ -233,26 +229,22 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS2)
|
#if defined(SPEECH_TX_2MIC_NS2)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* 2 MICs Noise Suppression
|
* 2 MICs Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* delay_taps(0~4): ceil{[d(MIC1~mouth) - d(MIC2~mouth)] / 2}.
|
* delay_taps(0~4): ceil{[d(MIC1~mouth) - d(MIC2~mouth)] / 2}.
|
||||||
* ceil: Returns the largest integer less than or equal to the specified data
|
* ceil: Returns the largest integer less than or equal to the
|
||||||
* d(MIC~mouth): The dinstance from MIC to mouth
|
*specified data d(MIC~mouth): The dinstance from MIC to mouth e.g. 0:
|
||||||
* e.g. 0: 0~2cm; 1: 2~4; 2: 5~6...
|
*0~2cm; 1: 2~4; 2: 5~6... freq_smooth_enable(1): Must enable
|
||||||
* freq_smooth_enable(1): Must enable
|
* wnr_enable(0/1): wind noise reduction enable or disable. This is also
|
||||||
* wnr_enable(0/1): wind noise reduction enable or disable. This is also useful for improving
|
*useful for improving noise suppression, but it also has some damage to
|
||||||
* noise suppression, but it also has some damage to speech signal.
|
*speech signal. Resource consumption: RAM: None FLASE: None MIPS: fs
|
||||||
* Resource consumption:
|
*= 16kHz, 32M; Note: None
|
||||||
* RAM: None
|
****************************************************************************************************/
|
||||||
* FLASE: None
|
.tx_2mic_ns2 =
|
||||||
* MIPS: fs = 16kHz, 32M;
|
{
|
||||||
* Note:
|
|
||||||
* None
|
|
||||||
****************************************************************************************************/
|
|
||||||
.tx_2mic_ns2 = {
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.delay_taps = 0.f,
|
.delay_taps = 0.f,
|
||||||
.freq_smooth_enable = 1,
|
.freq_smooth_enable = 1,
|
||||||
|
@ -261,28 +253,24 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS5)
|
#if defined(SPEECH_TX_2MIC_NS5)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* 2 MICs Noise Suppression
|
* 2 MICs Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* delay_taps(0~4): ceil{[d(MIC1~mouth) - d(MIC2~mouth)] / 2}. Default as 0
|
* delay_taps(0~4): ceil{[d(MIC1~mouth) - d(MIC2~mouth)] / 2}. Default
|
||||||
* ceil: Returns the largest integer less than or equal to the specified data
|
*as 0 ceil: Returns the largest integer less than or equal to the specified
|
||||||
* d(MIC~mouth): The dinstance from MIC to mouth
|
*data d(MIC~mouth): The dinstance from MIC to mouth e.g. 0: 0~2cm; 1: 2~4;
|
||||||
* e.g. 0: 0~2cm; 1: 2~4; 2: 5~6...
|
*2: 5~6... freq_smooth_enable(1): Must enable wnr_enable(0/1): wind noise
|
||||||
* freq_smooth_enable(1): Must enable
|
*reduction enable or disable. This is also useful for improving noise
|
||||||
* wnr_enable(0/1): wind noise reduction enable or disable. This is also useful for improving
|
*suppression, but it also has some damage to speech signal.
|
||||||
* noise suppression, but it also has some damage to speech signal.
|
* delay_enable(0/1): enable the delay_taps or not. Ideally, never need
|
||||||
* delay_enable(0/1): enable the delay_taps or not. Ideally, never need to enable the delay and
|
*to enable the delay and delay_taps will be a useless parameter. Resource
|
||||||
* delay_taps will be a useless parameter.
|
*consumption: RAM: None FLASE: None MIPS: fs = 16kHz, 32M; Note:
|
||||||
* Resource consumption:
|
|
||||||
* RAM: None
|
|
||||||
* FLASE: None
|
|
||||||
* MIPS: fs = 16kHz, 32M;
|
|
||||||
* Note:
|
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_2mic_ns5 = {
|
.tx_2mic_ns5 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.delay_taps = 0.0f,
|
.delay_taps = 0.0f,
|
||||||
.freq_smooth_enable = 1,
|
.freq_smooth_enable = 1,
|
||||||
|
@ -292,7 +280,7 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_2MIC_NS4)
|
#if defined(SPEECH_TX_2MIC_NS4)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* 2 MICs Noise Suppression
|
* 2 MICs Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -303,8 +291,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_2mic_ns4 = {
|
.tx_2mic_ns4 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.blend_en = 1,
|
.blend_en = 1,
|
||||||
// .left_gain = 1.0f,
|
// .left_gain = 1.0f,
|
||||||
|
@ -313,10 +302,14 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
.delay_tapsS = 0,
|
.delay_tapsS = 0,
|
||||||
// .delay_tapsC = 32,
|
// .delay_tapsC = 32,
|
||||||
//////////////////////////{{a0,a1,a2,a3,a4},{b0,b1,b2,b3,b4}}///////////////////////////
|
//////////////////////////{{a0,a1,a2,a3,a4},{b0,b1,b2,b3,b4}}///////////////////////////
|
||||||
// .coefH[0] = {1.0, -1.88561808316413, 1.55555555555556, -0.628539361054709, 0.111111111111111},
|
// .coefH[0] = {1.0, -1.88561808316413, 1.55555555555556,
|
||||||
// .coefH[1] = {0.323801506930344, -1.29520602772138, 1.94280904158206, -1.29520602772138, 0.323801506930344},
|
// -0.628539361054709, 0.111111111111111}, .coefH[1] =
|
||||||
// .coefL[0] = {1.0, -1.88561808316413, 1.55555555555556, -0.628539361054709, 0.111111111111111},
|
// {0.323801506930344, -1.29520602772138, 1.94280904158206,
|
||||||
// .coefL[1] = {0.00953182640298944, 0.0381273056119578, 0.0571909584179366, 0.0381273056119578, 0.00953182640298944},
|
// -1.29520602772138, 0.323801506930344}, .coefL[0] =
|
||||||
|
// {1.0, -1.88561808316413, 1.55555555555556, -0.628539361054709,
|
||||||
|
// 0.111111111111111}, .coefL[1] = {0.00953182640298944,
|
||||||
|
// 0.0381273056119578, 0.0571909584179366, 0.0381273056119578,
|
||||||
|
// 0.00953182640298944},
|
||||||
.crossover_freq = 1000,
|
.crossover_freq = 1000,
|
||||||
.ff_fb_coeff = ff_fb_h,
|
.ff_fb_coeff = ff_fb_h,
|
||||||
.ff_fb_coeff_len = ARRAY_SIZE(ff_fb_h),
|
.ff_fb_coeff_len = ARRAY_SIZE(ff_fb_h),
|
||||||
|
@ -324,24 +317,21 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_3MIC_NS)
|
#if defined(SPEECH_TX_3MIC_NS)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* 3 MICs Noise Suppression
|
* 3 MICs Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* delay_tapsM(0~4): MIC L/R delay samples. Refer to SPEECH_TX_2MIC_NS2 delay_taps
|
* delay_tapsM(0~4): MIC L/R delay samples. Refer to SPEECH_TX_2MIC_NS2
|
||||||
* delay_tapsS(0~4): MIC L/S delay samples. Refer to SPEECH_TX_2MIC_NS2 delay_taps
|
*delay_taps delay_tapsS(0~4): MIC L/S delay samples. Refer to
|
||||||
* freq_smooth_enable(1): Must enable
|
*SPEECH_TX_2MIC_NS2 delay_taps freq_smooth_enable(1): Must enable
|
||||||
* wnr_enable(0/1): wind noise reduction enable or disable. This is also useful for improving
|
* wnr_enable(0/1): wind noise reduction enable or disable. This is also
|
||||||
* noise suppression, but it also has some damage to speech signal.
|
*useful for improving noise suppression, but it also has some damage to
|
||||||
* Resource consumption:
|
*speech signal. Resource consumption: RAM: None FLASE: None MIPS: fs
|
||||||
* RAM: None
|
*= 16kHz; Note: None
|
||||||
* FLASE: None
|
****************************************************************************************************/
|
||||||
* MIPS: fs = 16kHz;
|
.tx_3mic_ns =
|
||||||
* Note:
|
{
|
||||||
* None
|
|
||||||
****************************************************************************************************/
|
|
||||||
.tx_3mic_ns = {
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.blend_en = 1,
|
.blend_en = 1,
|
||||||
.authen_en = 1,
|
.authen_en = 1,
|
||||||
|
@ -359,26 +349,22 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_3MIC_NS3)
|
#if defined(SPEECH_TX_3MIC_NS3)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* 3 MICs Noise Suppression
|
* 3 MICs Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* delay_taps(0~4): ceil{[d(MIC1~mouth) - d(MIC2~mouth)] / 2}.
|
* delay_taps(0~4): ceil{[d(MIC1~mouth) - d(MIC2~mouth)] / 2}.
|
||||||
* ceil: Returns the largest integer less than or equal to the specified data
|
* ceil: Returns the largest integer less than or equal to the
|
||||||
* d(MIC~mouth): The dinstance from MIC to mouth
|
*specified data d(MIC~mouth): The dinstance from MIC to mouth e.g. 0:
|
||||||
* e.g. 0: 0~2cm; 1: 2~4; 2: 5~6...
|
*0~2cm; 1: 2~4; 2: 5~6... freq_smooth_enable(1): Must enable
|
||||||
* freq_smooth_enable(1): Must enable
|
* wnr_enable(0/1): wind noise reduction enable or disable. This is also
|
||||||
* wnr_enable(0/1): wind noise reduction enable or disable. This is also useful for improving
|
*useful for improving noise suppression, but it also has some damage to
|
||||||
* noise suppression, but it also has some damage to speech signal.
|
*speech signal. Resource consumption: RAM: None FLASE: None MIPS: fs
|
||||||
* Resource consumption:
|
*= 16kHz, 32M; Note: None
|
||||||
* RAM: None
|
****************************************************************************************************/
|
||||||
* FLASE: None
|
.tx_3mic_ns3 =
|
||||||
* MIPS: fs = 16kHz, 32M;
|
{
|
||||||
* Note:
|
|
||||||
* None
|
|
||||||
****************************************************************************************************/
|
|
||||||
.tx_3mic_ns3 = {
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.endfire_enable = 1,
|
.endfire_enable = 1,
|
||||||
.broadside_enable = 1,
|
.broadside_enable = 1,
|
||||||
|
@ -389,7 +375,7 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS)
|
#if defined(SPEECH_TX_NS)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Noise Suppression
|
* Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -400,15 +386,16 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz, 30M;
|
* MIPS: fs = 16kHz, 30M;
|
||||||
* Note:
|
* Note:
|
||||||
* If possible, use SPEECH_TX_NS2 or SPEECH_TX_NS2FLOAT
|
* If possible, use SPEECH_TX_NS2 or SPEECH_TX_NS2FLOAT
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_ns = {
|
.tx_ns =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.denoise_dB = -12,
|
.denoise_dB = -12,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS2)
|
#if defined(SPEECH_TX_NS2)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Noise Suppression
|
* Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -423,15 +410,16 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz, 16M;
|
* MIPS: fs = 16kHz, 16M;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_ns2 = {
|
.tx_ns2 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.denoise_dB = -15,
|
.denoise_dB = -15,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS2FLOAT)
|
#if defined(SPEECH_TX_NS2FLOAT)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Noise Suppression
|
* Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -445,8 +433,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* Note:
|
* Note:
|
||||||
* This is a 'float' version for SPEECH_TX_NS2.
|
* This is a 'float' version for SPEECH_TX_NS2.
|
||||||
* It needs more MIPS and RAM, but can redece quantization noise.
|
* It needs more MIPS and RAM, but can redece quantization noise.
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_ns2float = {
|
.tx_ns2float =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.denoise_dB = -15,
|
.denoise_dB = -15,
|
||||||
.banks = 64,
|
.banks = 64,
|
||||||
|
@ -454,7 +443,7 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NS3)
|
#if defined(SPEECH_TX_NS3)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Noise Suppression
|
* Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -466,23 +455,24 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_ns3 = {
|
.tx_ns3 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.mode = NS3_SUPPRESSION_HIGH,
|
.mode = NS3_SUPPRESSION_HIGH,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_WNR)
|
#if defined(SPEECH_TX_WNR)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Wind Noise Suppression
|
* Wind Noise Suppression
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* lpf_cutoff: lowpass filter for wind noise detection
|
* lpf_cutoff: lowpass filter for wind noise detection
|
||||||
* hpf_cutoff: highpass filter for wind noise suppression
|
* hpf_cutoff: highpass filter for wind noise suppression
|
||||||
* power_ratio_thr: ratio of the power spectrum of the lower frequencies over the total power
|
* power_ratio_thr: ratio of the power spectrum of the lower frequencies
|
||||||
spectrum for all frequencies
|
over the total power spectrum for all frequencies
|
||||||
* power_thr: normalized power of the low frequencies
|
* power_thr: normalized power of the low frequencies
|
||||||
* Resource consumption:
|
* Resource consumption:
|
||||||
* RAM: None
|
* RAM: None
|
||||||
|
@ -490,8 +480,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_wnr = {
|
.tx_wnr =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.lpf_cutoff = 1000,
|
.lpf_cutoff = 1000,
|
||||||
.hpf_cutoff = 400,
|
.hpf_cutoff = 400,
|
||||||
|
@ -501,13 +492,13 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_NOISE_GATE)
|
#if defined(SPEECH_TX_NOISE_GATE)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Noise Gate
|
* Noise Gate
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* data_threshold(0~32767): distinguish between noise and speech, unit(sample).
|
* data_threshold(0~32767): distinguish between noise and speech,
|
||||||
* data_shift(1~3): 1: -6dB; 2: -12dB; 3: -18dB
|
*unit(sample). data_shift(1~3): 1: -6dB; 2: -12dB; 3: -18dB
|
||||||
* factor_up(float): attack time, unit(s)
|
* factor_up(float): attack time, unit(s)
|
||||||
* factor_down(float): release time, unit(s)
|
* factor_down(float): release time, unit(s)
|
||||||
* Resource consumption:
|
* Resource consumption:
|
||||||
|
@ -516,8 +507,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_noise_gate = {
|
.tx_noise_gate =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.data_threshold = 640,
|
.data_threshold = 640,
|
||||||
.data_shift = 1,
|
.data_shift = 1,
|
||||||
|
@ -527,7 +519,7 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_COMPEXP)
|
#if defined(SPEECH_TX_COMPEXP)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Compressor and expander
|
* Compressor and expander
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -539,8 +531,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_compexp = {
|
.tx_compexp =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.comp_threshold = -10.f,
|
.comp_threshold = -10.f,
|
||||||
.comp_ratio = 2.f,
|
.comp_ratio = 2.f,
|
||||||
|
@ -554,22 +547,21 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_AGC)
|
#if defined(SPEECH_TX_AGC)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Automatic Gain Control
|
* Automatic Gain Control
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* target_level(>0): signal can not exceed (-1 * target_level)dB.
|
* target_level(>0): signal can not exceed (-1 * target_level)dB.
|
||||||
* compression_gain(>0): excepted gain.
|
* compression_gain(>0): excepted gain.
|
||||||
* limiter_enable(0/1): 0: target_level does not take effect; 1: target_level takes effect.
|
* limiter_enable(0/1): 0: target_level does not take effect; 1:
|
||||||
* Resource consumption:
|
*target_level takes effect. Resource consumption: RAM: None FLASE: None
|
||||||
* RAM: None
|
|
||||||
* FLASE: None
|
|
||||||
* MIPS: fs = 16kHz, 3M;
|
* MIPS: fs = 16kHz, 3M;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_agc = {
|
.tx_agc =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.target_level = 3,
|
.target_level = 3,
|
||||||
.compression_gain = 6,
|
.compression_gain = 6,
|
||||||
|
@ -578,33 +570,31 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_EQ)
|
#if defined(SPEECH_TX_EQ)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Equalizer, implementation with 2 order iir filters
|
* Equalizer, implementation with 2 order iir filters
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* bypass(0/1): bypass enable or disable.
|
* bypass(0/1): bypass enable or disable.
|
||||||
* gain(float): normalized gain. It is usually less than or equal to 0
|
* gain(float): normalized gain. It is usually less than or equal to 0
|
||||||
* num(0~6): the number of EQs
|
* num(0~6): the number of EQs
|
||||||
* params: {type, frequency, gain, q}. It supports a lot of types, please refer to iirfilt.h file
|
* params: {type, frequency, gain, q}. It supports a lot of types,
|
||||||
* Resource consumption:
|
*please refer to iirfilt.h file Resource consumption: RAM: None FLASE:
|
||||||
* RAM: None
|
*None MIPS: fs = 16kHz, 0.5M/section; Note: None
|
||||||
* FLASE: None
|
****************************************************************************************************/
|
||||||
* MIPS: fs = 16kHz, 0.5M/section;
|
.tx_eq =
|
||||||
* Note:
|
{
|
||||||
* None
|
|
||||||
****************************************************************************************************/
|
|
||||||
.tx_eq = {
|
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.gain = 0.f,
|
.gain = 0.f,
|
||||||
.num = 1,
|
.num = 1,
|
||||||
.params = {
|
.params =
|
||||||
|
{
|
||||||
{IIR_BIQUARD_HPF, {{60, 0, 0.707f}}},
|
{IIR_BIQUARD_HPF, {{60, 0, 0.707f}}},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_TX_POST_GAIN)
|
#if defined(SPEECH_TX_POST_GAIN)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Linear Gain
|
* Linear Gain
|
||||||
* Parameters:
|
* Parameters:
|
||||||
|
@ -615,8 +605,9 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
* MIPS: fs = 16kHz;
|
* MIPS: fs = 16kHz;
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.tx_post_gain = {
|
.tx_post_gain =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.gain_dB = 6.0f,
|
.gain_dB = 6.0f,
|
||||||
},
|
},
|
||||||
|
@ -642,45 +633,48 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
// #endif
|
// #endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS)
|
#if defined(SPEECH_RX_NS)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_NS
|
* Refer to SPEECH_TX_NS
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_ns = {
|
.rx_ns =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.denoise_dB = -12,
|
.denoise_dB = -12,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS2)
|
#if defined(SPEECH_RX_NS2)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_NS2
|
* Refer to SPEECH_TX_NS2
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_ns2 = {
|
.rx_ns2 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.denoise_dB = -15,
|
.denoise_dB = -15,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS2FLOAT)
|
#if defined(SPEECH_RX_NS2FLOAT)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_NS2FLOAT
|
* Refer to SPEECH_TX_NS2FLOAT
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_ns2float = {
|
.rx_ns2float =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.denoise_dB = -15,
|
.denoise_dB = -15,
|
||||||
.banks = 64,
|
.banks = 64,
|
||||||
|
@ -688,30 +682,32 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NS3)
|
#if defined(SPEECH_RX_NS3)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Acoustic Echo Cancellation
|
* Acoustic Echo Cancellation
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_NS3
|
* Refer to SPEECH_TX_NS3
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_ns3 = {
|
.rx_ns3 =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.mode = NS3_SUPPRESSION_HIGH,
|
.mode = NS3_SUPPRESSION_HIGH,
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_NOISE_GATE)
|
#if defined(SPEECH_RX_NOISE_GATE)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Noise Gate
|
* Noise Gate
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_NOISE_GATE
|
* Refer to SPEECH_TX_NOISE_GATE
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_noise_gate = {
|
.rx_noise_gate =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.data_threshold = 640,
|
.data_threshold = 640,
|
||||||
.data_shift = 1,
|
.data_shift = 1,
|
||||||
|
@ -721,15 +717,16 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_COMPEXP)
|
#if defined(SPEECH_RX_COMPEXP)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Compressor and expander
|
* Compressor and expander
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_COMPEXP
|
* Refer to SPEECH_TX_COMPEXP
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_compexp = {
|
.rx_compexp =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.comp_threshold = -10.f,
|
.comp_threshold = -10.f,
|
||||||
.comp_slope = 0.5f,
|
.comp_slope = 0.5f,
|
||||||
|
@ -743,15 +740,16 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_AGC)
|
#if defined(SPEECH_RX_AGC)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Automatic Gain Control
|
* Automatic Gain Control
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_AGC
|
* Refer to SPEECH_TX_AGC
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_agc = {
|
.rx_agc =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.target_level = 3,
|
.target_level = 3,
|
||||||
.compression_gain = 6,
|
.compression_gain = 6,
|
||||||
|
@ -760,34 +758,37 @@ const SpeechConfig WEAK speech_cfg_default = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_EQ)
|
#if defined(SPEECH_RX_EQ)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Equalizer, implementation with 2 order iir filters
|
* Equalizer, implementation with 2 order iir filters
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_EQ
|
* Refer to SPEECH_TX_EQ
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_eq = {
|
.rx_eq =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.gain = 0.f,
|
.gain = 0.f,
|
||||||
.num = 1,
|
.num = 1,
|
||||||
.params = {
|
.params =
|
||||||
|
{
|
||||||
{IIR_BIQUARD_HPF, {{60, 0, 0.707f}}},
|
{IIR_BIQUARD_HPF, {{60, 0, 0.707f}}},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(SPEECH_RX_POST_GAIN)
|
#if defined(SPEECH_RX_POST_GAIN)
|
||||||
/****************************************************************************************************
|
/****************************************************************************************************
|
||||||
* Describtion:
|
* Describtion:
|
||||||
* Linear Gain
|
* Linear Gain
|
||||||
* Parameters:
|
* Parameters:
|
||||||
* Refer to SPEECH_TX_POST_GAIN
|
* Refer to SPEECH_TX_POST_GAIN
|
||||||
* Note:
|
* Note:
|
||||||
* None
|
* None
|
||||||
****************************************************************************************************/
|
****************************************************************************************************/
|
||||||
.rx_post_gain = {
|
.rx_post_gain =
|
||||||
|
{
|
||||||
.bypass = 0,
|
.bypass = 0,
|
||||||
.gain_dB = 6.0f,
|
.gain_dB = 6.0f,
|
||||||
},
|
},
|
||||||
|
|
|
@ -17,14 +17,18 @@
|
||||||
* Usage:
|
* Usage:
|
||||||
* 1. Enable SCO_CP_ACCEL ?= 1 to enable dual core in sco
|
* 1. Enable SCO_CP_ACCEL ?= 1 to enable dual core in sco
|
||||||
* 2. Enable SCO_TRACE_CP_ACCEL ?= 1 to see debug log.
|
* 2. Enable SCO_TRACE_CP_ACCEL ?= 1 to see debug log.
|
||||||
* 3. Change channel number if the algo(run in cp) input is more than one channel: sco_cp_init(speech_tx_frame_len, 1);
|
* 3. Change channel number if the algo(run in cp) input is more than one
|
||||||
* 4. The code between SCO_CP_ACCEL_ALGO_START(); and SCO_CP_ACCEL_ALGO_END(); will run in CP core.
|
*channel: sco_cp_init(speech_tx_frame_len, 1);
|
||||||
* 5. These algorithms will work in AP. Need to move this algorithms from overlay to fast ram.
|
* 4. The code between SCO_CP_ACCEL_ALGO_START(); and SCO_CP_ACCEL_ALGO_END();
|
||||||
|
*will run in CP core.
|
||||||
|
* 5. These algorithms will work in AP. Need to move this algorithms from
|
||||||
|
*overlay to fast ram.
|
||||||
*
|
*
|
||||||
* NOTE:
|
* NOTE:
|
||||||
* 1. spx fft and hw fft will share buffer, so just one core can use these fft.
|
* 1. spx fft and hw fft will share buffer, so just one core can use these
|
||||||
* 2. audio_dump_add_channel_data function can not work correctly in CP core, because
|
*fft.
|
||||||
* audio_dump_add_channel_data is possible called after audio_dump_run();
|
* 2. audio_dump_add_channel_data function can not work correctly in CP core,
|
||||||
|
*because audio_dump_add_channel_data is possible called after audio_dump_run();
|
||||||
* 3. AP and CP just can use 85%
|
* 3. AP and CP just can use 85%
|
||||||
*
|
*
|
||||||
*
|
*
|
||||||
|
@ -33,14 +37,14 @@
|
||||||
* 1. FFT, RAM, CODE overlay
|
* 1. FFT, RAM, CODE overlay
|
||||||
**/
|
**/
|
||||||
#if defined(SCO_CP_ACCEL)
|
#if defined(SCO_CP_ACCEL)
|
||||||
|
#include "cmsis_os.h"
|
||||||
#include "cp_accel.h"
|
#include "cp_accel.h"
|
||||||
#include "hal_location.h"
|
#include "hal_location.h"
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "cmsis_os.h"
|
#include "hal_trace.h"
|
||||||
#include "speech_cfg.h"
|
|
||||||
#include "math.h"
|
#include "math.h"
|
||||||
#include "norflash_api.h"
|
#include "norflash_api.h"
|
||||||
|
#include "speech_cfg.h"
|
||||||
|
|
||||||
// malloc data from pool in init function
|
// malloc data from pool in init function
|
||||||
#define FRAME_LEN_MAX (256)
|
#define FRAME_LEN_MAX (256)
|
||||||
|
@ -74,20 +78,21 @@ static CP_BSS_LOC int g_channel_num;
|
||||||
static int g_require_cnt = 0;
|
static int g_require_cnt = 0;
|
||||||
static int g_run_cnt = 0;
|
static int g_run_cnt = 0;
|
||||||
|
|
||||||
int sco_cp_process(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
int sco_cp_process(short *pcm_buf, short *ref_buf, int *_pcm_len) {
|
||||||
{
|
|
||||||
int32_t pcm_len = *_pcm_len;
|
int32_t pcm_len = *_pcm_len;
|
||||||
uint32_t wait_cnt = 0;
|
uint32_t wait_cnt = 0;
|
||||||
|
|
||||||
ASSERT(g_frame_len * g_channel_num == pcm_len, "[%s] g_frame_len(%d) * g_channel_num(%d) != pcm_len(%d)", __func__, g_frame_len, g_channel_num, pcm_len);
|
ASSERT(g_frame_len * g_channel_num == pcm_len,
|
||||||
|
"[%s] g_frame_len(%d) * g_channel_num(%d) != pcm_len(%d)", __func__,
|
||||||
|
g_frame_len, g_channel_num, pcm_len);
|
||||||
|
|
||||||
// Check CP has new data to get and can get data from buffer
|
// Check CP has new data to get and can get data from buffer
|
||||||
#if defined(SCO_TRACE_CP_ACCEL)
|
#if defined(SCO_TRACE_CP_ACCEL)
|
||||||
TRACE(4,"[%s] g_require_cnt: %d, status: %d, pcm_len: %d", __func__, g_require_cnt, g_cp_state, pcm_len);
|
TRACE(4, "[%s] g_require_cnt: %d, status: %d, pcm_len: %d", __func__,
|
||||||
|
g_require_cnt, g_cp_state, pcm_len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (g_cp_state == CP_SCO_STATE_WORKING)
|
while (g_cp_state == CP_SCO_STATE_WORKING) {
|
||||||
{
|
|
||||||
hal_sys_timer_delay_us(10);
|
hal_sys_timer_delay_us(10);
|
||||||
|
|
||||||
if (wait_cnt++ > 300000) { // 3s
|
if (wait_cnt++ > 300000) { // 3s
|
||||||
|
@ -95,11 +100,9 @@ int sco_cp_process(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (g_cp_state == CP_SCO_STATE_IDLE)
|
if (g_cp_state == CP_SCO_STATE_IDLE) {
|
||||||
{
|
|
||||||
speech_copy_int16(g_in_pcm_buf, pcm_buf, pcm_len);
|
speech_copy_int16(g_in_pcm_buf, pcm_buf, pcm_len);
|
||||||
if (ref_buf)
|
if (ref_buf) {
|
||||||
{
|
|
||||||
speech_copy_int16(g_in_ref_buf, ref_buf, pcm_len / g_channel_num);
|
speech_copy_int16(g_in_ref_buf, ref_buf, pcm_len / g_channel_num);
|
||||||
}
|
}
|
||||||
speech_copy_int16(pcm_buf, g_out_pcm_buf, g_pcm_len);
|
speech_copy_int16(pcm_buf, g_out_pcm_buf, g_pcm_len);
|
||||||
|
@ -108,10 +111,9 @@ int sco_cp_process(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
|
|
||||||
g_require_cnt++;
|
g_require_cnt++;
|
||||||
g_cp_state = CP_SCO_STATE_WORKING;
|
g_cp_state = CP_SCO_STATE_WORKING;
|
||||||
cp_accel_send_event_mcu2cp(CP_BUILD_ID(CP_TASK_SCO, CP_EVENT_SCO_PROCESSING));
|
cp_accel_send_event_mcu2cp(
|
||||||
}
|
CP_BUILD_ID(CP_TASK_SCO, CP_EVENT_SCO_PROCESSING));
|
||||||
else
|
} else {
|
||||||
{
|
|
||||||
// Multi channels to one channel
|
// Multi channels to one channel
|
||||||
#if 0
|
#if 0
|
||||||
for (int i = 0; i < pcm_len / g_channel_num; i++)
|
for (int i = 0; i < pcm_len / g_channel_num; i++)
|
||||||
|
@ -124,7 +126,7 @@ int sco_cp_process(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
|
|
||||||
// Check abs(g_require_cnt - g_run_cnt) > threshold, reset or assert
|
// Check abs(g_require_cnt - g_run_cnt) > threshold, reset or assert
|
||||||
|
|
||||||
TRACE(2,"[%s] ERROR: status = %d", __func__, g_cp_state);
|
TRACE(2, "[%s] ERROR: status = %d", __func__, g_cp_state);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -133,10 +135,9 @@ int sco_cp_process(short *pcm_buf, short *ref_buf, int *_pcm_len)
|
||||||
extern int sco_cp_algo(short *pcm_buf, short *ref_buf, int *_pcm_len);
|
extern int sco_cp_algo(short *pcm_buf, short *ref_buf, int *_pcm_len);
|
||||||
|
|
||||||
CP_TEXT_SRAM_LOC
|
CP_TEXT_SRAM_LOC
|
||||||
static unsigned int sco_cp_main(uint8_t event)
|
static unsigned int sco_cp_main(uint8_t event) {
|
||||||
{
|
|
||||||
#if defined(SCO_TRACE_CP_ACCEL)
|
#if defined(SCO_TRACE_CP_ACCEL)
|
||||||
TRACE(2,"[%s] g_run_cnt: %d", __func__, g_run_cnt);
|
TRACE(2, "[%s] g_run_cnt: %d", __func__, g_run_cnt);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// LOCK BUFFER
|
// LOCK BUFFER
|
||||||
|
@ -159,7 +160,7 @@ static unsigned int sco_cp_main(uint8_t event)
|
||||||
g_cp_state = CP_SCO_STATE_IDLE;
|
g_cp_state = CP_SCO_STATE_IDLE;
|
||||||
|
|
||||||
#if defined(SCO_TRACE_CP_ACCEL)
|
#if defined(SCO_TRACE_CP_ACCEL)
|
||||||
TRACE(1,"[%s] CP_SCO_STATE_IDLE", __func__);
|
TRACE(1, "[%s] CP_SCO_STATE_IDLE", __func__);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// UNLOCK BUFFER
|
// UNLOCK BUFFER
|
||||||
|
@ -167,21 +168,25 @@ static unsigned int sco_cp_main(uint8_t event)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct cp_task_desc TASK_DESC_SCO = {CP_ACCEL_STATE_CLOSED, sco_cp_main, NULL, NULL, NULL};
|
static struct cp_task_desc TASK_DESC_SCO = {CP_ACCEL_STATE_CLOSED, sco_cp_main,
|
||||||
int sco_cp_init(int frame_len, int channel_num)
|
NULL, NULL, NULL};
|
||||||
{
|
int sco_cp_init(int frame_len, int channel_num) {
|
||||||
TRACE(3,"[%s] frame_len: %d, channel_num: %d", __func__, frame_len, channel_num);
|
TRACE(3, "[%s] frame_len: %d, channel_num: %d", __func__, frame_len,
|
||||||
ASSERT(frame_len <= FRAME_LEN_MAX, "[%s] frame_len(%d) > FRAME_LEN_MAX", __func__, frame_len);
|
channel_num);
|
||||||
ASSERT(channel_num <= CHANNEL_NUM_MAX, "[%s] channel_num(%d) > CHANNEL_NUM_MAX", __func__, channel_num);
|
ASSERT(frame_len <= FRAME_LEN_MAX, "[%s] frame_len(%d) > FRAME_LEN_MAX",
|
||||||
|
__func__, frame_len);
|
||||||
|
ASSERT(channel_num <= CHANNEL_NUM_MAX,
|
||||||
|
"[%s] channel_num(%d) > CHANNEL_NUM_MAX", __func__, channel_num);
|
||||||
|
|
||||||
g_require_cnt = 0;
|
g_require_cnt = 0;
|
||||||
g_run_cnt = 0;
|
g_run_cnt = 0;
|
||||||
|
|
||||||
norflash_api_flush_disable(NORFLASH_API_USER_CP,(uint32_t)cp_accel_init_done);
|
norflash_api_flush_disable(NORFLASH_API_USER_CP,
|
||||||
|
(uint32_t)cp_accel_init_done);
|
||||||
cp_accel_open(CP_TASK_SCO, &TASK_DESC_SCO);
|
cp_accel_open(CP_TASK_SCO, &TASK_DESC_SCO);
|
||||||
|
|
||||||
uint32_t cnt=0;
|
uint32_t cnt = 0;
|
||||||
while(cp_accel_init_done() == false) {
|
while (cp_accel_init_done() == false) {
|
||||||
hal_sys_timer_delay_us(100);
|
hal_sys_timer_delay_us(100);
|
||||||
|
|
||||||
cnt++;
|
cnt++;
|
||||||
|
@ -189,7 +194,7 @@ int sco_cp_init(int frame_len, int channel_num)
|
||||||
if (cnt == 10 * 200) { // 200ms
|
if (cnt == 10 * 200) { // 200ms
|
||||||
ASSERT(0, "[%s] ERROR: Can not init cp!!!", __func__);
|
ASSERT(0, "[%s] ERROR: Can not init cp!!!", __func__);
|
||||||
} else {
|
} else {
|
||||||
TRACE(1, "[%s] Wait CP init done...%d(ms)", __func__, cnt/10);
|
TRACE(1, "[%s] Wait CP init done...%d(ms)", __func__, cnt / 10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -209,15 +214,13 @@ int sco_cp_init(int frame_len, int channel_num)
|
||||||
speech_set_int16(g_in_ref_buf, 0, g_frame_len);
|
speech_set_int16(g_in_ref_buf, 0, g_frame_len);
|
||||||
g_cp_state = CP_SCO_STATE_IDLE;
|
g_cp_state = CP_SCO_STATE_IDLE;
|
||||||
|
|
||||||
TRACE(2,"[%s] status = %d", __func__, g_cp_state);
|
TRACE(2, "[%s] status = %d", __func__, g_cp_state);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int sco_cp_deinit(void)
|
int sco_cp_deinit(void) {
|
||||||
{
|
TRACE(1, "[%s] ...", __func__);
|
||||||
TRACE(1,"[%s] ...", __func__);
|
|
||||||
|
|
||||||
cp_accel_close(CP_TASK_SCO);
|
cp_accel_close(CP_TASK_SCO);
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
|
#include "audio_dump.h"
|
||||||
#include "bt_sco_chain.h"
|
#include "bt_sco_chain.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "speech_cfg.h"
|
||||||
#include "speech_memory.h"
|
#include "speech_memory.h"
|
||||||
#include "speech_utils.h"
|
#include "speech_utils.h"
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "audio_dump.h"
|
|
||||||
#include "speech_cfg.h"
|
|
||||||
|
|
||||||
#if defined(SPEECH_TX_24BIT)
|
#if defined(SPEECH_TX_24BIT)
|
||||||
int32_t *aec_echo_buf = NULL;
|
int32_t *aec_echo_buf = NULL;
|
||||||
|
@ -27,11 +27,8 @@ static short *aec_echo_buf_ptr;
|
||||||
SpeechDcFilterState *speech_tx_dc_filter_st = NULL;
|
SpeechDcFilterState *speech_tx_dc_filter_st = NULL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int speech_init(int tx_sample_rate, int rx_sample_rate,
|
int speech_init(int tx_sample_rate, int rx_sample_rate, int tx_frame_ms,
|
||||||
int tx_frame_ms, int rx_frame_ms,
|
int rx_frame_ms, int sco_frame_ms, uint8_t *buf, int len) {
|
||||||
int sco_frame_ms,
|
|
||||||
uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
// we shoule keep a minmum buffer for speech heap
|
// we shoule keep a minmum buffer for speech heap
|
||||||
// MSBC_16K_SAMPLE_RATE = 0, 560 bytes
|
// MSBC_16K_SAMPLE_RATE = 0, 560 bytes
|
||||||
// MSBC_16K_SAMPLE_RATE = 1, 2568 bytes
|
// MSBC_16K_SAMPLE_RATE = 1, 2568 bytes
|
||||||
|
@ -61,9 +58,12 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
.gain = 0.f,
|
.gain = 0.f,
|
||||||
};
|
};
|
||||||
|
|
||||||
speech_tx_dc_filter_st = speech_dc_filter_create(tx_sample_rate, frame_len, &dc_filter_cfg);
|
speech_tx_dc_filter_st =
|
||||||
speech_dc_filter_ctl(speech_tx_dc_filter_st, SPEECH_DC_FILTER_SET_CHANNEL_NUM, &channel_num);
|
speech_dc_filter_create(tx_sample_rate, frame_len, &dc_filter_cfg);
|
||||||
speech_dc_filter_ctl(speech_tx_dc_filter_st, SPEECH_DC_FILTER_SET_DATA_SEPARATION, &data_separation);
|
speech_dc_filter_ctl(speech_tx_dc_filter_st, SPEECH_DC_FILTER_SET_CHANNEL_NUM,
|
||||||
|
&channel_num);
|
||||||
|
speech_dc_filter_ctl(speech_tx_dc_filter_st,
|
||||||
|
SPEECH_DC_FILTER_SET_DATA_SEPARATION, &data_separation);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_dump_init(frame_len, sizeof(int16_t), 3);
|
audio_dump_init(frame_len, sizeof(int16_t), 3);
|
||||||
|
@ -71,8 +71,7 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_deinit(void)
|
int speech_deinit(void) {
|
||||||
{
|
|
||||||
#if defined(SPEECH_TX_DC_FILTER)
|
#if defined(SPEECH_TX_DC_FILTER)
|
||||||
speech_dc_filter_destroy(speech_tx_dc_filter_st);
|
speech_dc_filter_destroy(speech_tx_dc_filter_st);
|
||||||
#endif
|
#endif
|
||||||
|
@ -81,7 +80,8 @@ int speech_deinit(void)
|
||||||
|
|
||||||
size_t total = 0, used = 0, max_used = 0;
|
size_t total = 0, used = 0, max_used = 0;
|
||||||
speech_memory_info(&total, &used, &max_used);
|
speech_memory_info(&total, &used, &max_used);
|
||||||
TRACE(3,"SPEECH MALLOC MEM: total - %d, used - %d, max_used - %d.", total, used, max_used);
|
TRACE(3, "SPEECH MALLOC MEM: total - %d, used - %d, max_used - %d.", total,
|
||||||
|
used, max_used);
|
||||||
ASSERT(used == 0, "[%s] used != 0", __func__);
|
ASSERT(used == 0, "[%s] used != 0", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -91,8 +91,7 @@ int speech_deinit(void)
|
||||||
extern void bt_sco_get_tdm_buffer(uint8_t **buf, uint32_t *len);
|
extern void bt_sco_get_tdm_buffer(uint8_t **buf, uint32_t *len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int speech_tx_process(void *_pcm_buf, void *_ref_buf, int *_pcm_len)
|
int speech_tx_process(void *_pcm_buf, void *_ref_buf, int *_pcm_len) {
|
||||||
{
|
|
||||||
#if defined(SPEECH_TX_24BIT)
|
#if defined(SPEECH_TX_24BIT)
|
||||||
int32_t *pcm_buf = (int32_t *)_pcm_buf;
|
int32_t *pcm_buf = (int32_t *)_pcm_buf;
|
||||||
int32_t *ref_buf = (int32_t *)_ref_buf;
|
int32_t *ref_buf = (int32_t *)_ref_buf;
|
||||||
|
@ -110,12 +109,18 @@ int speech_tx_process(void *_pcm_buf, void *_ref_buf, int *_pcm_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_dump_clear_up();
|
audio_dump_clear_up();
|
||||||
audio_dump_add_channel_data(0, ref_buf, pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
audio_dump_add_channel_data(0, ref_buf,
|
||||||
audio_dump_add_channel_data_from_multi_channels(1, pcm_buf, pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM, SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 0);
|
pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
||||||
audio_dump_add_channel_data_from_multi_channels(2, pcm_buf, pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM, SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 1);
|
audio_dump_add_channel_data_from_multi_channels(
|
||||||
|
1, pcm_buf, pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 0);
|
||||||
|
audio_dump_add_channel_data_from_multi_channels(
|
||||||
|
2, pcm_buf, pcm_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 1);
|
||||||
|
|
||||||
#if defined(BONE_SENSOR_TDM)
|
#if defined(BONE_SENSOR_TDM)
|
||||||
audio_dump_add_channel_data(3, bone_buf, pcm16_len/SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
audio_dump_add_channel_data(3, bone_buf,
|
||||||
|
pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_dump_run();
|
audio_dump_run();
|
||||||
|
@ -130,11 +135,12 @@ int speech_tx_process(void *_pcm_buf, void *_ref_buf, int *_pcm_len)
|
||||||
|
|
||||||
// Add your algrithm here and disable #if macro
|
// Add your algrithm here and disable #if macro
|
||||||
#if 1
|
#if 1
|
||||||
for (int i = 0, j = 0; i < pcm_len; i += SPEECH_CODEC_CAPTURE_CHANNEL_NUM, j++) {
|
for (int i = 0, j = 0; i < pcm_len;
|
||||||
|
i += SPEECH_CODEC_CAPTURE_CHANNEL_NUM, j++) {
|
||||||
// choose main microphone data
|
// choose main microphone data
|
||||||
pcm_buf[j] = pcm_buf[i];
|
pcm_buf[j] = pcm_buf[i];
|
||||||
// choose reference data, i.e. loopback
|
// choose reference data, i.e. loopback
|
||||||
//pcm16_buf[j] = ref16_buf[j];
|
// pcm16_buf[j] = ref16_buf[j];
|
||||||
}
|
}
|
||||||
pcm_len /= SPEECH_CODEC_CAPTURE_CHANNEL_NUM;
|
pcm_len /= SPEECH_CODEC_CAPTURE_CHANNEL_NUM;
|
||||||
#endif
|
#endif
|
||||||
|
@ -148,8 +154,7 @@ int speech_tx_process(void *_pcm_buf, void *_ref_buf, int *_pcm_len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_rx_process(void *pcm_buf, int *pcm_len)
|
int speech_rx_process(void *pcm_buf, int *pcm_len) {
|
||||||
{
|
|
||||||
// Add your algorithm here
|
// Add your algorithm here
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
|
@ -1,12 +1,12 @@
|
||||||
|
#include "audio_dump.h"
|
||||||
#include "bt_sco_chain.h"
|
#include "bt_sco_chain.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
#include "speech_memory.h"
|
#include "speech_memory.h"
|
||||||
#include "speech_utils.h"
|
#include "speech_utils.h"
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "audio_dump.h"
|
|
||||||
#include "vcp-api.h"
|
|
||||||
#include "spf-postapi.h"
|
#include "spf-postapi.h"
|
||||||
|
#include "vcp-api.h"
|
||||||
|
|
||||||
#define ALANGO_TRACE(s, ...) TRACE(1,"%s: " s, __FUNCTION__, ## __VA_ARGS__)
|
#define ALANGO_TRACE(s, ...) TRACE(1, "%s: " s, __FUNCTION__, ##__VA_ARGS__)
|
||||||
|
|
||||||
short *aec_echo_buf = NULL;
|
short *aec_echo_buf = NULL;
|
||||||
|
|
||||||
|
@ -17,7 +17,7 @@ static void *mem;
|
||||||
|
|
||||||
extern void *voicebtpcm_get_ext_buff(int size);
|
extern void *voicebtpcm_get_ext_buff(int size);
|
||||||
|
|
||||||
extern char* vcp_errorv(err_t err);
|
extern char *vcp_errorv(err_t err);
|
||||||
|
|
||||||
extern PROFILE_TYPE(t) alango_profile;
|
extern PROFILE_TYPE(t) alango_profile;
|
||||||
|
|
||||||
|
@ -28,8 +28,8 @@ mem_reg_t reg[NUM_MEM_REGIONS];
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM >= 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM >= 2
|
||||||
static int16_t *deinterleaved_buf = NULL;
|
static int16_t *deinterleaved_buf = NULL;
|
||||||
|
|
||||||
static void deinterleave_audio(int16_t *dst, int16_t *src, uint32_t len, uint32_t ch_num)
|
static void deinterleave_audio(int16_t *dst, int16_t *src, uint32_t len,
|
||||||
{
|
uint32_t ch_num) {
|
||||||
uint32_t samples_per_channel = len / ch_num;
|
uint32_t samples_per_channel = len / ch_num;
|
||||||
|
|
||||||
for (uint32_t i = 0; i < samples_per_channel; i++) {
|
for (uint32_t i = 0; i < samples_per_channel; i++) {
|
||||||
|
@ -40,11 +40,8 @@ static void deinterleave_audio(int16_t *dst, int16_t *src, uint32_t len, uint32_
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int speech_init(int tx_sample_rate, int rx_sample_rate,
|
int speech_init(int tx_sample_rate, int rx_sample_rate, int tx_frame_ms,
|
||||||
int tx_frame_ms, int rx_frame_ms,
|
int rx_frame_ms, int sco_frame_ms, uint8_t *buf, int len) {
|
||||||
int sco_frame_ms,
|
|
||||||
uint8_t *buf, int len)
|
|
||||||
{
|
|
||||||
speech_heap_init(buf, len);
|
speech_heap_init(buf, len);
|
||||||
|
|
||||||
int frame_len = SPEECH_FRAME_MS_TO_LEN(tx_sample_rate, tx_frame_ms);
|
int frame_len = SPEECH_FRAME_MS_TO_LEN(tx_sample_rate, tx_frame_ms);
|
||||||
|
@ -58,36 +55,43 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
err_t err = vcp_check_profile(curr_profile);
|
err_t err = vcp_check_profile(curr_profile);
|
||||||
if (err.err) {
|
if (err.err) {
|
||||||
if (err.err == ERR_INVALID_CRC)
|
if (err.err == ERR_INVALID_CRC)
|
||||||
ALANGO_TRACE(0,"Profile error: Invalid CRC!");
|
ALANGO_TRACE(0, "Profile error: Invalid CRC!");
|
||||||
else
|
else
|
||||||
ALANGO_TRACE(1,"Profile error: %d", err.err);
|
ALANGO_TRACE(1, "Profile error: %d", err.err);
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(frame_len % curr_profile->p_gen->frlen == 0, "Profile error: frame_len(%d) should be divided by frlen(%d)", frame_len, curr_profile->p_gen->frlen);
|
ASSERT(frame_len % curr_profile->p_gen->frlen == 0,
|
||||||
|
"Profile error: frame_len(%d) should be divided by frlen(%d)",
|
||||||
|
frame_len, curr_profile->p_gen->frlen);
|
||||||
|
|
||||||
unsigned int smem = vcp_get_hook_size();
|
unsigned int smem = vcp_get_hook_size();
|
||||||
mem = speech_malloc(smem);
|
mem = speech_malloc(smem);
|
||||||
|
|
||||||
vcp_get_mem_size(curr_profile, reg, mem);
|
vcp_get_mem_size(curr_profile, reg, mem);
|
||||||
|
|
||||||
ALANGO_TRACE(0,"Hello, I am VCP8!");
|
ALANGO_TRACE(0, "Hello, I am VCP8!");
|
||||||
|
|
||||||
for (int i = 0; i < NUM_MEM_REGIONS; i++) {
|
for (int i = 0; i < NUM_MEM_REGIONS; i++) {
|
||||||
reg[i].mem = (void *)speech_malloc(reg[i].size);
|
reg[i].mem = (void *)speech_malloc(reg[i].size);
|
||||||
ALANGO_TRACE(2,"I need %d bytes of memory in memory region %d to work.\n", reg[i].size, i + 1);
|
ALANGO_TRACE(2, "I need %d bytes of memory in memory region %d to work.\n",
|
||||||
|
reg[i].size, i + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
err = vcp_init_debug(curr_profile, reg);
|
err = vcp_init_debug(curr_profile, reg);
|
||||||
if (err.err == ERR_NOT_ENOUGH_MEMORY) {
|
if (err.err == ERR_NOT_ENOUGH_MEMORY) {
|
||||||
ALANGO_TRACE(2,"%d more bytes needed in region %d!\n", -reg[err.pid].size, err.pid);
|
ALANGO_TRACE(2, "%d more bytes needed in region %d!\n", -reg[err.pid].size,
|
||||||
|
err.pid);
|
||||||
} else if (err.err == ERR_UNKNOWN) {
|
} else if (err.err == ERR_UNKNOWN) {
|
||||||
ALANGO_TRACE(0,"vcp_init_debug() returns UNKNOWN error\n!");
|
ALANGO_TRACE(0, "vcp_init_debug() returns UNKNOWN error\n!");
|
||||||
} else if (err.err != ERR_NO_ERROR) {
|
} else if (err.err != ERR_NO_ERROR) {
|
||||||
ALANGO_TRACE(2,"vcp_init_debug() returns error %d, pid %d!\n", err.err, err.pid);
|
ALANGO_TRACE(2, "vcp_init_debug() returns error %d, pid %d!\n", err.err,
|
||||||
|
err.pid);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM >= 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM >= 2
|
||||||
deinterleaved_buf = speech_malloc(curr_profile->p_gen->frlen * SPEECH_CODEC_CAPTURE_CHANNEL_NUM * sizeof(int16_t));
|
deinterleaved_buf =
|
||||||
|
speech_malloc(curr_profile->p_gen->frlen *
|
||||||
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM * sizeof(int16_t));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_dump_init(frame_len, sizeof(int16_t), 3);
|
audio_dump_init(frame_len, sizeof(int16_t), 3);
|
||||||
|
@ -95,8 +99,7 @@ int speech_init(int tx_sample_rate, int rx_sample_rate,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_deinit(void)
|
int speech_deinit(void) {
|
||||||
{
|
|
||||||
speech_free(aec_echo_buf_ptr);
|
speech_free(aec_echo_buf_ptr);
|
||||||
speech_free(mem);
|
speech_free(mem);
|
||||||
|
|
||||||
|
@ -109,7 +112,8 @@ int speech_deinit(void)
|
||||||
|
|
||||||
size_t total = 0, used = 0, max_used = 0;
|
size_t total = 0, used = 0, max_used = 0;
|
||||||
speech_memory_info(&total, &used, &max_used);
|
speech_memory_info(&total, &used, &max_used);
|
||||||
TRACE(3,"SPEECH MALLOC MEM: total - %d, used - %d, max_used - %d.", total, used, max_used);
|
TRACE(3, "SPEECH MALLOC MEM: total - %d, used - %d, max_used - %d.", total,
|
||||||
|
used, max_used);
|
||||||
ASSERT(used == 0, "[%s] used != 0", __func__);
|
ASSERT(used == 0, "[%s] used != 0", __func__);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -119,8 +123,7 @@ int speech_deinit(void)
|
||||||
extern void bt_sco_get_tdm_buffer(uint8_t **buf, uint32_t *len);
|
extern void bt_sco_get_tdm_buffer(uint8_t **buf, uint32_t *len);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len)
|
int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len) {
|
||||||
{
|
|
||||||
int16_t *pcm16_buf = (int16_t *)pcm_buf;
|
int16_t *pcm16_buf = (int16_t *)pcm_buf;
|
||||||
int16_t *ref16_buf = (int16_t *)ref_buf;
|
int16_t *ref16_buf = (int16_t *)ref_buf;
|
||||||
int pcm16_len = *pcm_len;
|
int pcm16_len = *pcm_len;
|
||||||
|
@ -132,12 +135,18 @@ int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_dump_clear_up();
|
audio_dump_clear_up();
|
||||||
audio_dump_add_channel_data(0, ref_buf, pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
audio_dump_add_channel_data(0, ref_buf,
|
||||||
audio_dump_add_channel_data_from_multi_channels(1, pcm16_buf, pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM, SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 0);
|
pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
||||||
audio_dump_add_channel_data_from_multi_channels(2, pcm16_buf, pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM, SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 1);
|
audio_dump_add_channel_data_from_multi_channels(
|
||||||
|
1, pcm16_buf, pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 0);
|
||||||
|
audio_dump_add_channel_data_from_multi_channels(
|
||||||
|
2, pcm16_buf, pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM, 1);
|
||||||
|
|
||||||
#if defined(BONE_SENSOR_TDM)
|
#if defined(BONE_SENSOR_TDM)
|
||||||
audio_dump_add_channel_data(3, bone_buf, pcm16_len/SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
audio_dump_add_channel_data(3, bone_buf,
|
||||||
|
pcm16_len / SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
audio_dump_run();
|
audio_dump_run();
|
||||||
|
@ -152,16 +161,24 @@ int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len)
|
||||||
}
|
}
|
||||||
pcm16_len /= SPEECH_CODEC_CAPTURE_CHANNEL_NUM;
|
pcm16_len /= SPEECH_CODEC_CAPTURE_CHANNEL_NUM;
|
||||||
#else
|
#else
|
||||||
for (int i = 0, j = 0; i < pcm16_len; i += curr_profile->p_gen->frlen * SPEECH_CODEC_CAPTURE_CHANNEL_NUM, j += curr_profile->p_gen->frlen) {
|
for (int i = 0, j = 0; i < pcm16_len;
|
||||||
|
i += curr_profile->p_gen->frlen * SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
|
j += curr_profile->p_gen->frlen) {
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM >= 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM >= 2
|
||||||
deinterleave_audio(deinterleaved_buf, &pcm16_buf[i], curr_profile->p_gen->frlen * SPEECH_CODEC_CAPTURE_CHANNEL_NUM, SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
deinterleave_audio(deinterleaved_buf, &pcm16_buf[i],
|
||||||
err_t err = vcp_process_tx(reg, deinterleaved_buf, &ref16_buf[j], &pcm16_buf[j]);
|
curr_profile->p_gen->frlen *
|
||||||
//memcpy(&pcm16_buf[j], deinterleaved_buf, curr_profile->p_gen->frlen * sizeof(int16_t));
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM,
|
||||||
|
SPEECH_CODEC_CAPTURE_CHANNEL_NUM);
|
||||||
|
err_t err =
|
||||||
|
vcp_process_tx(reg, deinterleaved_buf, &ref16_buf[j], &pcm16_buf[j]);
|
||||||
|
// memcpy(&pcm16_buf[j], deinterleaved_buf, curr_profile->p_gen->frlen *
|
||||||
|
// sizeof(int16_t));
|
||||||
#else
|
#else
|
||||||
err_t err = vcp_process_tx(reg, &pcm16_buf[i], &ref16_buf[j], &pcm16_buf[j]);
|
err_t err =
|
||||||
|
vcp_process_tx(reg, &pcm16_buf[i], &ref16_buf[j], &pcm16_buf[j]);
|
||||||
#endif
|
#endif
|
||||||
if (err.err != ERR_NO_ERROR) {
|
if (err.err != ERR_NO_ERROR) {
|
||||||
ALANGO_TRACE(1,"vcp_process_tx error: %d", err.err);
|
ALANGO_TRACE(1, "vcp_process_tx error: %d", err.err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pcm16_len /= SPEECH_CODEC_CAPTURE_CHANNEL_NUM;
|
pcm16_len /= SPEECH_CODEC_CAPTURE_CHANNEL_NUM;
|
||||||
|
@ -176,15 +193,14 @@ int speech_tx_process(void *pcm_buf, void *ref_buf, int *pcm_len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_rx_process(void *pcm_buf, int *pcm_len)
|
int speech_rx_process(void *pcm_buf, int *pcm_len) {
|
||||||
{
|
|
||||||
int16_t *pcm16_buf = (int16_t *)pcm_buf;
|
int16_t *pcm16_buf = (int16_t *)pcm_buf;
|
||||||
int pcm16_len = *pcm_len;
|
int pcm16_len = *pcm_len;
|
||||||
|
|
||||||
for (int i = 0; i < pcm16_len; i += curr_profile->p_gen->frlen) {
|
for (int i = 0; i < pcm16_len; i += curr_profile->p_gen->frlen) {
|
||||||
err_t err = vcp_process_rx(reg, &pcm16_buf[i], &pcm16_buf[i]);
|
err_t err = vcp_process_rx(reg, &pcm16_buf[i], &pcm16_buf[i]);
|
||||||
if (err.err != ERR_NO_ERROR) {
|
if (err.err != ERR_NO_ERROR) {
|
||||||
ALANGO_TRACE(1,"vcp_process_tx error: %d", err.err);
|
ALANGO_TRACE(1, "vcp_process_tx error: %d", err.err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,8 +13,8 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "bt_sco_chain_cfg.h"
|
|
||||||
#include "aud_section.h"
|
#include "aud_section.h"
|
||||||
|
#include "bt_sco_chain_cfg.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
|
||||||
static bool speech_tuning_status = false;
|
static bool speech_tuning_status = false;
|
||||||
|
@ -29,8 +29,7 @@ typedef struct {
|
||||||
|
|
||||||
static AUDIO_SECTION_SPEECH_CFG_T audio_section_speech_cfg;
|
static AUDIO_SECTION_SPEECH_CFG_T audio_section_speech_cfg;
|
||||||
|
|
||||||
int store_speech_cfg_into_audio_section(SpeechConfig *cfg)
|
int store_speech_cfg_into_audio_section(SpeechConfig *cfg) {
|
||||||
{
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
|
|
||||||
memcpy(&audio_section_speech_cfg.cfg, cfg, sizeof(SpeechConfig));
|
memcpy(&audio_section_speech_cfg.cfg, cfg, sizeof(SpeechConfig));
|
||||||
|
@ -39,21 +38,16 @@ int store_speech_cfg_into_audio_section(SpeechConfig *cfg)
|
||||||
(uint8_t *)&audio_section_speech_cfg,
|
(uint8_t *)&audio_section_speech_cfg,
|
||||||
sizeof(AUDIO_SECTION_SPEECH_CFG_T));
|
sizeof(AUDIO_SECTION_SPEECH_CFG_T));
|
||||||
|
|
||||||
|
if (res) {
|
||||||
if(res)
|
TRACE(2, "[%s] ERROR: res = %d", __func__, res);
|
||||||
{
|
} else {
|
||||||
TRACE(2,"[%s] ERROR: res = %d", __func__, res);
|
TRACE(1, "[%s] Store speech cfg into audio section!!!", __func__);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TRACE(1,"[%s] Store speech cfg into audio section!!!", __func__);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *load_speech_cfg_from_audio_section(void)
|
void *load_speech_cfg_from_audio_section(void) {
|
||||||
{
|
|
||||||
int res = 0;
|
int res = 0;
|
||||||
res = audio_section_load_cfg(AUDIO_SECTION_DEVICE_SPEECH,
|
res = audio_section_load_cfg(AUDIO_SECTION_DEVICE_SPEECH,
|
||||||
(uint8_t *)&audio_section_speech_cfg,
|
(uint8_t *)&audio_section_speech_cfg,
|
||||||
|
@ -61,14 +55,11 @@ void *load_speech_cfg_from_audio_section(void)
|
||||||
|
|
||||||
void *res_ptr = NULL;
|
void *res_ptr = NULL;
|
||||||
|
|
||||||
if (res)
|
if (res) {
|
||||||
{
|
TRACE(2, "[%s] ERROR: res = %d", __func__, res);
|
||||||
TRACE(2,"[%s] ERROR: res = %d", __func__, res);
|
|
||||||
res_ptr = NULL;
|
res_ptr = NULL;
|
||||||
}
|
} else {
|
||||||
else
|
TRACE(1, "[%s] Load speech cfg from audio section!!!", __func__);
|
||||||
{
|
|
||||||
TRACE(1,"[%s] Load speech cfg from audio section!!!", __func__);
|
|
||||||
res_ptr = (void *)&audio_section_speech_cfg.cfg;
|
res_ptr = (void *)&audio_section_speech_cfg.cfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -76,105 +67,91 @@ void *load_speech_cfg_from_audio_section(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int speech_tuning_set_status(bool en)
|
int speech_tuning_set_status(bool en) {
|
||||||
{
|
|
||||||
speech_tuning_status = en;
|
speech_tuning_status = en;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool speech_tuning_get_status(void)
|
bool speech_tuning_get_status(void) { return speech_tuning_status; }
|
||||||
{
|
|
||||||
return speech_tuning_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
uint32_t speech_tuning_check(unsigned char *buf, uint32_t len)
|
uint32_t speech_tuning_check(unsigned char *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t res = 0;
|
uint32_t res = 0;
|
||||||
|
|
||||||
// Check valid
|
// Check valid
|
||||||
uint32_t config_size = sizeof(SpeechConfig);
|
uint32_t config_size = sizeof(SpeechConfig);
|
||||||
|
|
||||||
if (config_size != len)
|
if (config_size != len) {
|
||||||
{
|
TRACE(2, "[speech tuning] len(%d) != config_size(%d)", len, config_size);
|
||||||
TRACE(2,"[speech tuning] len(%d) != config_size(%d)", len, config_size);
|
|
||||||
res = 1;
|
res = 1;
|
||||||
}
|
} else {
|
||||||
else
|
TRACE(1, "[speech tuning] len(%d) is OK", len);
|
||||||
{
|
// SpeechConfig POSSIBLY_UNUSED *cfg = (SpeechConfig *)buf;
|
||||||
TRACE(1,"[speech tuning] len(%d) is OK", len);
|
|
||||||
//SpeechConfig POSSIBLY_UNUSED *cfg = (SpeechConfig *)buf;
|
|
||||||
|
|
||||||
// Test parameters
|
// Test parameters
|
||||||
//#if defined(SPEECH_TX_2MIC_NS2)
|
//#if defined(SPEECH_TX_2MIC_NS2)
|
||||||
// TRACE(1,"[speech tuning] TX: delay_taps(x100): %d", (int)(cfg->tx_2mic_ns2.delay_taps * 100));
|
// TRACE(1,"[speech tuning] TX: delay_taps(x100): %d",
|
||||||
//#endif
|
// (int)(cfg->tx_2mic_ns2.delay_taps * 100));
|
||||||
//#if defined(SPEECH_TX_NOISE_GATE)
|
//#endif
|
||||||
// TRACE(1,"[speech tuning] TX: data_threshold: %d", cfg->tx_noise_gate.data_threshold);
|
//#if defined(SPEECH_TX_NOISE_GATE)
|
||||||
//#endif
|
// TRACE(1,"[speech tuning] TX: data_threshold: %d",
|
||||||
//#if defined(SPEECH_TX_EQ)
|
// cfg->tx_noise_gate.data_threshold);
|
||||||
// TRACE(1,"[speech tuning] TX: eq num: %d", cfg->tx_eq.num);
|
//#endif
|
||||||
//#endif
|
//#if defined(SPEECH_TX_EQ)
|
||||||
//#if defined(SPEECH_RX_EQ)
|
// TRACE(1,"[speech tuning] TX: eq num: %d", cfg->tx_eq.num);
|
||||||
// TRACE(1,"[speech tuning] RX: eq num: %d", cfg->rx_eq.num);
|
//#endif
|
||||||
//#endif
|
//#if defined(SPEECH_RX_EQ)
|
||||||
|
// TRACE(1,"[speech tuning] RX: eq num: %d", cfg->rx_eq.num);
|
||||||
|
//#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t speech_tuning_rx_callback(unsigned char *buf, uint32_t len)
|
uint32_t speech_tuning_rx_callback(unsigned char *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t res = 0;
|
uint32_t res = 0;
|
||||||
|
|
||||||
res = speech_tuning_check(buf, len);
|
res = speech_tuning_check(buf, len);
|
||||||
|
|
||||||
if (res)
|
if (res) {
|
||||||
{
|
TRACE(1, "[speech tuning] ERROR: Send check res = %d", res);
|
||||||
TRACE(1,"[speech tuning] ERROR: Send check res = %d", res);
|
TRACE(0, "[Speech Tuning] res : 1; info : Send len(%d) != config_size(%d);",
|
||||||
TRACE(0,"[Speech Tuning] res : 1; info : Send len(%d) != config_size(%d);", len, sizeof(SpeechConfig));
|
len, sizeof(SpeechConfig));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// Save cfg
|
// Save cfg
|
||||||
speech_store_config((SpeechConfig *)buf);
|
speech_store_config((SpeechConfig *)buf);
|
||||||
|
|
||||||
// Set status
|
// Set status
|
||||||
speech_tuning_set_status(true);
|
speech_tuning_set_status(true);
|
||||||
|
|
||||||
TRACE(0,"[speech tuning] OK: Send cfg");
|
TRACE(0, "[speech tuning] OK: Send cfg");
|
||||||
TRACE(0,"[Speech Tuning] res : 0;");
|
TRACE(0, "[Speech Tuning] res : 0;");
|
||||||
}
|
}
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef AUDIO_SECTION_ENABLE
|
#ifdef AUDIO_SECTION_ENABLE
|
||||||
uint32_t speech_tuning_burn_rx_callback(unsigned char *buf, uint32_t len)
|
uint32_t speech_tuning_burn_rx_callback(unsigned char *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t res = 0;
|
uint32_t res = 0;
|
||||||
|
|
||||||
res = speech_tuning_check(buf, len);
|
res = speech_tuning_check(buf, len);
|
||||||
|
|
||||||
if (res)
|
if (res) {
|
||||||
{
|
TRACE(1, "[speech tuning] ERROR: Burn check res = %d", res);
|
||||||
TRACE(1,"[speech tuning] ERROR: Burn check res = %d", res);
|
TRACE(0, "[Speech Tuning] res : 1; info : Burn len(%d) != config_size(%d);",
|
||||||
TRACE(0,"[Speech Tuning] res : 1; info : Burn len(%d) != config_size(%d);", len, sizeof(SpeechConfig));
|
len, sizeof(SpeechConfig));
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
res = store_speech_cfg_into_audio_section((SpeechConfig *)buf);
|
res = store_speech_cfg_into_audio_section((SpeechConfig *)buf);
|
||||||
|
|
||||||
if(res)
|
if (res) {
|
||||||
{
|
TRACE(1, "[speech tuning] ERROR: Store res = %d", res);
|
||||||
TRACE(1,"[speech tuning] ERROR: Store res = %d", res);
|
|
||||||
res += 100;
|
res += 100;
|
||||||
TRACE(0,"[Speech Tuning] res : 2; info : Do not enable AUDIO_SECTION_ENABLE;");
|
TRACE(0, "[Speech Tuning] res : 2; info : Do not enable "
|
||||||
}
|
"AUDIO_SECTION_ENABLE;");
|
||||||
else
|
} else {
|
||||||
{
|
TRACE(0, "[speech tuning] OK: Store cfg");
|
||||||
TRACE(0,"[speech tuning] OK: Store cfg");
|
TRACE(0, "[Speech Tuning] res : 0;");
|
||||||
TRACE(0,"[Speech Tuning] res : 0;");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,13 +159,15 @@ uint32_t speech_tuning_burn_rx_callback(unsigned char *buf, uint32_t len)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int speech_tuning_init(void)
|
int speech_tuning_init(void) {
|
||||||
{
|
|
||||||
#if defined(HAL_TRACE_RX_ENABLE) && !defined(SPEECH_TX_THIRDPARTY)
|
#if defined(HAL_TRACE_RX_ENABLE) && !defined(SPEECH_TX_THIRDPARTY)
|
||||||
hal_trace_rx_register("Speech Tuning", (HAL_TRACE_RX_CALLBACK_T)speech_tuning_rx_callback);
|
hal_trace_rx_register("Speech Tuning",
|
||||||
|
(HAL_TRACE_RX_CALLBACK_T)speech_tuning_rx_callback);
|
||||||
|
|
||||||
#ifdef AUDIO_SECTION_ENABLE
|
#ifdef AUDIO_SECTION_ENABLE
|
||||||
hal_trace_rx_register("Speech Tuning Burn", (HAL_TRACE_RX_CALLBACK_T)speech_tuning_burn_rx_callback);
|
hal_trace_rx_register(
|
||||||
|
"Speech Tuning Burn",
|
||||||
|
(HAL_TRACE_RX_CALLBACK_T)speech_tuning_burn_rx_callback);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -198,15 +177,13 @@ int speech_tuning_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_tuning_open(void)
|
int speech_tuning_open(void) {
|
||||||
{
|
|
||||||
#ifdef AUDIO_SECTION_ENABLE
|
#ifdef AUDIO_SECTION_ENABLE
|
||||||
SpeechConfig *speech_cfg_load = NULL;
|
SpeechConfig *speech_cfg_load = NULL;
|
||||||
|
|
||||||
speech_cfg_load = (SpeechConfig *)load_speech_cfg_from_audio_section();
|
speech_cfg_load = (SpeechConfig *)load_speech_cfg_from_audio_section();
|
||||||
|
|
||||||
if (speech_cfg_load)
|
if (speech_cfg_load) {
|
||||||
{
|
|
||||||
speech_store_config(speech_cfg_load);
|
speech_store_config(speech_cfg_load);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -216,8 +193,7 @@ int speech_tuning_open(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int speech_tuning_close(void)
|
int speech_tuning_close(void) {
|
||||||
{
|
|
||||||
speech_tuning_set_status(false);
|
speech_tuning_set_status(false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -17,23 +17,22 @@
|
||||||
#include "mbed.h"
|
#include "mbed.h"
|
||||||
#endif
|
#endif
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#ifdef MBED
|
#ifdef MBED
|
||||||
//#include "rtos.h"
|
//#include "rtos.h"
|
||||||
#endif
|
#endif
|
||||||
#ifdef MBED
|
#ifdef MBED
|
||||||
#include "SDFileSystem.h"
|
#include "SDFileSystem.h"
|
||||||
#endif
|
#endif
|
||||||
|
#include "app_audio.h"
|
||||||
#include "cqueue.h"
|
#include "cqueue.h"
|
||||||
#include "hal_uart.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "app_audio.h"
|
#include "hal_uart.h"
|
||||||
|
|
||||||
|
|
||||||
// BT
|
// BT
|
||||||
|
|
||||||
|
@ -44,7 +43,7 @@ osMutexDef(g_voicecvsd_queue_mutex);
|
||||||
|
|
||||||
/* cvsd queue */
|
/* cvsd queue */
|
||||||
#define VOICECVSD_TEMP_BUFFER_SIZE 128
|
#define VOICECVSD_TEMP_BUFFER_SIZE 128
|
||||||
#define VOICECVSD_QUEUE_SIZE (VOICECVSD_TEMP_BUFFER_SIZE*20)
|
#define VOICECVSD_QUEUE_SIZE (VOICECVSD_TEMP_BUFFER_SIZE * 20)
|
||||||
CQueue voicecvsd_queue;
|
CQueue voicecvsd_queue;
|
||||||
|
|
||||||
static enum APP_AUDIO_CACHE_T voicecvsd_cache_status = APP_AUDIO_CACHE_QTY;
|
static enum APP_AUDIO_CACHE_T voicecvsd_cache_status = APP_AUDIO_CACHE_QTY;
|
||||||
|
@ -52,8 +51,7 @@ static enum APP_AUDIO_CACHE_T voicecvsd_cache_status = APP_AUDIO_CACHE_QTY;
|
||||||
#define LOCK_VOICECVSD_QUEUE() \
|
#define LOCK_VOICECVSD_QUEUE() \
|
||||||
osMutexWait(g_voicecvsd_queue_mutex_id, osWaitForever)
|
osMutexWait(g_voicecvsd_queue_mutex_id, osWaitForever)
|
||||||
|
|
||||||
#define UNLOCK_VOICECVSD_QUEUE() \
|
#define UNLOCK_VOICECVSD_QUEUE() osMutexRelease(g_voicecvsd_queue_mutex_id)
|
||||||
osMutexRelease(g_voicecvsd_queue_mutex_id)
|
|
||||||
|
|
||||||
void xLOCK_VOICECVSD_QUEUE(void)
|
void xLOCK_VOICECVSD_QUEUE(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,34 +14,32 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "cqueue.h"
|
#include "cqueue.h"
|
||||||
#include "hal_uart.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
#include "hal_uart.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
uint8_t digmic_buf[100*1024];
|
uint8_t digmic_buf[100 * 1024];
|
||||||
uint32_t digmic_buf_len = 0;
|
uint32_t digmic_buf_len = 0;
|
||||||
|
|
||||||
uint32_t dig_mic_audio_more_data(uint8_t *buf, uint32_t len)
|
uint32_t dig_mic_audio_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
TRACE(2, "%s:%d\n", __func__, __LINE__);
|
||||||
TRACE(2,"%s:%d\n", __func__, __LINE__);
|
|
||||||
memcpy(buf, digmic_buf, len);
|
memcpy(buf, digmic_buf, len);
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
uint32_t dig_mic_audio_data_come(uint8_t *buf, uint32_t len)
|
uint32_t dig_mic_audio_data_come(uint8_t *buf, uint32_t len) {
|
||||||
{
|
TRACE(2, "%s:%d\n", __func__, __LINE__);
|
||||||
TRACE(2,"%s:%d\n", __func__, __LINE__);
|
|
||||||
|
|
||||||
memcpy(digmic_buf + digmic_buf_len, buf, len);
|
memcpy(digmic_buf + digmic_buf_len, buf, len);
|
||||||
|
|
||||||
#if 1
|
#if 1
|
||||||
digmic_buf_len = (digmic_buf_len + len)%(100*1024);
|
digmic_buf_len = (digmic_buf_len + len) % (100 * 1024);
|
||||||
#endif
|
#endif
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,15 +14,15 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "cqueue.h"
|
#include "cqueue.h"
|
||||||
#include "hal_uart.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
#include "hal_uart.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#ifdef RTOS
|
#ifdef RTOS
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -33,30 +33,28 @@ osMutexDef(g_flac_queue_mutex);
|
||||||
|
|
||||||
/* flac queue */
|
/* flac queue */
|
||||||
#define FLAC_TEMP_BUFFER_SIZE 2048
|
#define FLAC_TEMP_BUFFER_SIZE 2048
|
||||||
#define FLAC_QUEUE_SIZE (FLAC_TEMP_BUFFER_SIZE*4)
|
#define FLAC_QUEUE_SIZE (FLAC_TEMP_BUFFER_SIZE * 4)
|
||||||
unsigned char flac_queue_buf[FLAC_QUEUE_SIZE];
|
unsigned char flac_queue_buf[FLAC_QUEUE_SIZE];
|
||||||
CQueue flac_queue;
|
CQueue flac_queue;
|
||||||
static uint32_t ok_to_decode = 0;
|
static uint32_t ok_to_decode = 0;
|
||||||
|
|
||||||
#define LOCK_FLAC_QUEUE() \
|
#define LOCK_FLAC_QUEUE() osMutexWait(g_flac_queue_mutex_id, osWaitForever)
|
||||||
osMutexWait(g_flac_queue_mutex_id, osWaitForever)
|
|
||||||
|
|
||||||
#define UNLOCK_FLAC_QUEUE() \
|
#define UNLOCK_FLAC_QUEUE() osMutexRelease(g_flac_queue_mutex_id)
|
||||||
osMutexRelease(g_flac_queue_mutex_id)
|
|
||||||
|
|
||||||
static void copy_one_trace_to_two_track_16bits(uint16_t *src_buf, uint16_t *dst_buf, uint32_t src_len)
|
static void copy_one_trace_to_two_track_16bits(uint16_t *src_buf,
|
||||||
{
|
uint16_t *dst_buf,
|
||||||
|
uint32_t src_len) {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
for (i = 0; i < src_len; ++i) {
|
for (i = 0; i < src_len; ++i) {
|
||||||
dst_buf[i*2 + 0] = dst_buf[i*2 + 1] = src_buf[i];
|
dst_buf[i * 2 + 0] = dst_buf[i * 2 + 1] = src_buf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int store_flac_buffer(unsigned char *buf, unsigned int len)
|
int store_flac_buffer(unsigned char *buf, unsigned int len) {
|
||||||
{
|
|
||||||
LOCK_FLAC_QUEUE();
|
LOCK_FLAC_QUEUE();
|
||||||
EnCQueue(&flac_queue, buf, len);
|
EnCQueue(&flac_queue, buf, len);
|
||||||
if (LengthOfCQueue(&flac_queue) > FLAC_TEMP_BUFFER_SIZE*2) {
|
if (LengthOfCQueue(&flac_queue) > FLAC_TEMP_BUFFER_SIZE * 2) {
|
||||||
ok_to_decode = 1;
|
ok_to_decode = 1;
|
||||||
}
|
}
|
||||||
UNLOCK_FLAC_QUEUE();
|
UNLOCK_FLAC_QUEUE();
|
||||||
|
@ -64,40 +62,41 @@ int store_flac_buffer(unsigned char *buf, unsigned int len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int decode_flac_frame(unsigned char *pcm_buffer, unsigned int pcm_len)
|
int decode_flac_frame(unsigned char *pcm_buffer, unsigned int pcm_len) {
|
||||||
{
|
|
||||||
uint32_t r = 0, got_len = 0;
|
uint32_t r = 0, got_len = 0;
|
||||||
unsigned char *e1 = NULL, *e2 = NULL;
|
unsigned char *e1 = NULL, *e2 = NULL;
|
||||||
unsigned int len1 = 0, len2 = 0;
|
unsigned int len1 = 0, len2 = 0;
|
||||||
get_again:
|
get_again:
|
||||||
LOCK_FLAC_QUEUE();
|
LOCK_FLAC_QUEUE();
|
||||||
r = PeekCQueue(&flac_queue, (pcm_len - got_len)/2, &e1, &len1, &e2, &len2);
|
r = PeekCQueue(&flac_queue, (pcm_len - got_len) / 2, &e1, &len1, &e2, &len2);
|
||||||
UNLOCK_FLAC_QUEUE();
|
UNLOCK_FLAC_QUEUE();
|
||||||
|
|
||||||
if(r == CQ_ERR || len1 == 0) {
|
if (r == CQ_ERR || len1 == 0) {
|
||||||
osDelay(2);
|
osDelay(2);
|
||||||
goto get_again;
|
goto get_again;
|
||||||
}
|
}
|
||||||
|
|
||||||
//memcpy(pcm_buffer + got_len, e1, len1);
|
// memcpy(pcm_buffer + got_len, e1, len1);
|
||||||
copy_one_trace_to_two_track_16bits((uint16_t *)e1, (uint16_t *)(pcm_buffer + got_len), len1/2);
|
copy_one_trace_to_two_track_16bits(
|
||||||
|
(uint16_t *)e1, (uint16_t *)(pcm_buffer + got_len), len1 / 2);
|
||||||
|
|
||||||
LOCK_FLAC_QUEUE();
|
LOCK_FLAC_QUEUE();
|
||||||
DeCQueue(&flac_queue, 0, len1);
|
DeCQueue(&flac_queue, 0, len1);
|
||||||
UNLOCK_FLAC_QUEUE();
|
UNLOCK_FLAC_QUEUE();
|
||||||
|
|
||||||
got_len += len1*2;
|
got_len += len1 * 2;
|
||||||
|
|
||||||
if (len2 != 0) {
|
if (len2 != 0) {
|
||||||
//memcpy(pcm_buffer + got_len, e2, len2);
|
// memcpy(pcm_buffer + got_len, e2, len2);
|
||||||
copy_one_trace_to_two_track_16bits((uint16_t *)e2, (uint16_t *)(pcm_buffer + got_len), len2/2);
|
copy_one_trace_to_two_track_16bits(
|
||||||
|
(uint16_t *)e2, (uint16_t *)(pcm_buffer + got_len), len2 / 2);
|
||||||
|
|
||||||
LOCK_FLAC_QUEUE();
|
LOCK_FLAC_QUEUE();
|
||||||
DeCQueue(&flac_queue, 0, len2);
|
DeCQueue(&flac_queue, 0, len2);
|
||||||
UNLOCK_FLAC_QUEUE();
|
UNLOCK_FLAC_QUEUE();
|
||||||
}
|
}
|
||||||
|
|
||||||
got_len += len2*2;
|
got_len += len2 * 2;
|
||||||
|
|
||||||
if (got_len < pcm_len)
|
if (got_len < pcm_len)
|
||||||
goto get_again;
|
goto get_again;
|
||||||
|
@ -105,31 +104,28 @@ get_again:
|
||||||
return pcm_len;
|
return pcm_len;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t flac_audio_data_come(uint8_t *buf, uint32_t len)
|
uint32_t flac_audio_data_come(uint8_t *buf, uint32_t len) {
|
||||||
{
|
TRACE(1, "data come %d\n", len);
|
||||||
TRACE(1,"data come %d\n", len);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t flac_audio_more_data(uint8_t *buf, uint32_t len)
|
uint32_t flac_audio_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
uint32_t l = 0;
|
uint32_t l = 0;
|
||||||
//uint32_t cur_ticks = 0, ticks = 0;
|
// uint32_t cur_ticks = 0, ticks = 0;
|
||||||
|
|
||||||
if (ok_to_decode == 0)
|
if (ok_to_decode == 0)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
//ticks = hal_sys_timer_get();
|
// ticks = hal_sys_timer_get();
|
||||||
l = decode_flac_frame(buf, len);
|
l = decode_flac_frame(buf, len);
|
||||||
//cur_ticks = hal_sys_timer_get();
|
// cur_ticks = hal_sys_timer_get();
|
||||||
// TRACE(1,"flac %d t\n", (cur_ticks-ticks));
|
// TRACE(1,"flac %d t\n", (cur_ticks-ticks));
|
||||||
|
|
||||||
return l;
|
return l;
|
||||||
}
|
}
|
||||||
|
|
||||||
int flac_audio_init(void)
|
int flac_audio_init(void) {
|
||||||
{
|
|
||||||
g_flac_queue_mutex_id = osMutexCreate((osMutex(g_flac_queue_mutex)));
|
g_flac_queue_mutex_id = osMutexCreate((osMutex(g_flac_queue_mutex)));
|
||||||
/* flac queue*/
|
/* flac queue*/
|
||||||
InitCQueue(&flac_queue, FLAC_QUEUE_SIZE, (unsigned char *)&flac_queue_buf);
|
InitCQueue(&flac_queue, FLAC_QUEUE_SIZE, (unsigned char *)&flac_queue_buf);
|
||||||
|
|
|
@ -15,57 +15,61 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifdef CHIP_BEST1000
|
#ifdef CHIP_BEST1000
|
||||||
|
|
||||||
|
#include "app_audio.h"
|
||||||
|
#include "app_overlay.h"
|
||||||
|
#include "app_utils.h"
|
||||||
|
#include "audiobuffer.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
#include "cmsis.h"
|
#include "cmsis.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "cqueue.h"
|
||||||
#include "fmdec.h"
|
#include "fmdec.h"
|
||||||
#include "hal_dma.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "hal_cmu.h"
|
|
||||||
#include "hal_analogif.h"
|
#include "hal_analogif.h"
|
||||||
#include "hal_chipid.h"
|
#include "hal_chipid.h"
|
||||||
#include "audioflinger.h"
|
#include "hal_cmu.h"
|
||||||
#include "audiobuffer.h"
|
#include "hal_dma.h"
|
||||||
#include "cqueue.h"
|
#include "hal_timer.h"
|
||||||
#include "app_audio.h"
|
#include "hal_trace.h"
|
||||||
#include "app_utils.h"
|
|
||||||
#include "app_overlay.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
//#define FM_DEBUG 1
|
//#define FM_DEBUG 1
|
||||||
|
|
||||||
#define FM_DIGITAL_REG(a) *(volatile uint32_t *)(a)
|
#define FM_DIGITAL_REG(a) *(volatile uint32_t *)(a)
|
||||||
#define fm_read_rf_reg(reg,val) hal_analogif_reg_read(reg,val)
|
#define fm_read_rf_reg(reg, val) hal_analogif_reg_read(reg, val)
|
||||||
#define fm_write_rf_reg(reg,val) hal_analogif_reg_write(reg,val)
|
#define fm_write_rf_reg(reg, val) hal_analogif_reg_write(reg, val)
|
||||||
|
|
||||||
#define FM_FRAME_NUM 4
|
#define FM_FRAME_NUM 4
|
||||||
#define FM_SAMPLE_NUM NUMOFSAMPLE
|
#define FM_SAMPLE_NUM NUMOFSAMPLE
|
||||||
|
|
||||||
#ifdef ATAN2_HARDWARE
|
#ifdef ATAN2_HARDWARE
|
||||||
#ifdef FM_NEWMODE
|
#ifdef FM_NEWMODE
|
||||||
#define FM_SAMPLE_BUFFER_SIZE (FM_FRAME_NUM*FM_SAMPLE_NUM*4)
|
#define FM_SAMPLE_BUFFER_SIZE (FM_FRAME_NUM * FM_SAMPLE_NUM * 4)
|
||||||
#else
|
#else
|
||||||
#define FM_SAMPLE_BUFFER_SIZE (FM_FRAME_NUM*FM_SAMPLE_NUM/2*4)
|
#define FM_SAMPLE_BUFFER_SIZE (FM_FRAME_NUM * FM_SAMPLE_NUM / 2 * 4)
|
||||||
#endif
|
#endif
|
||||||
#else
|
#else
|
||||||
#define FM_SAMPLE_BUFFER_SIZE (FM_FRAME_NUM*FM_SAMPLE_NUM*4)
|
#define FM_SAMPLE_BUFFER_SIZE (FM_FRAME_NUM * FM_SAMPLE_NUM * 4)
|
||||||
#endif
|
#endif
|
||||||
#define FM_AUDIO_BUFFER_SIZE (4096)
|
#define FM_AUDIO_BUFFER_SIZE (4096)
|
||||||
|
|
||||||
extern int app_bt_stream_local_volume_get(void);
|
extern int app_bt_stream_local_volume_get(void);
|
||||||
static int32_t *fm_sample_buffer_p;
|
static int32_t *fm_sample_buffer_p;
|
||||||
|
|
||||||
static void fm_handler(uint8_t chan, uint32_t remains, uint32_t error, struct HAL_DMA_DESC_T *lli)
|
static void fm_handler(uint8_t chan, uint32_t remains, uint32_t error,
|
||||||
{
|
struct HAL_DMA_DESC_T *lli) {
|
||||||
static int cnt = 0;
|
static int cnt = 0;
|
||||||
int16_t fm_decbuf[(FM_SAMPLE_NUM/9)];
|
int16_t fm_decbuf[(FM_SAMPLE_NUM / 9)];
|
||||||
FmDemodulate((int16_t *)(fm_sample_buffer_p +((cnt%FM_FRAME_NUM)*FM_SAMPLE_NUM)), fm_decbuf,FM_SAMPLE_NUM);
|
FmDemodulate(
|
||||||
|
(int16_t *)(fm_sample_buffer_p + ((cnt % FM_FRAME_NUM) * FM_SAMPLE_NUM)),
|
||||||
|
fm_decbuf, FM_SAMPLE_NUM);
|
||||||
cnt++;
|
cnt++;
|
||||||
app_audio_pcmbuff_put((uint8_t *)fm_decbuf, (FM_SAMPLE_NUM/9)<<1);
|
app_audio_pcmbuff_put((uint8_t *)fm_decbuf, (FM_SAMPLE_NUM / 9) << 1);
|
||||||
FmDemodulate((int16_t *)(fm_sample_buffer_p +((cnt%FM_FRAME_NUM)*FM_SAMPLE_NUM)), fm_decbuf,FM_SAMPLE_NUM);
|
FmDemodulate(
|
||||||
|
(int16_t *)(fm_sample_buffer_p + ((cnt % FM_FRAME_NUM) * FM_SAMPLE_NUM)),
|
||||||
|
fm_decbuf, FM_SAMPLE_NUM);
|
||||||
cnt++;
|
cnt++;
|
||||||
app_audio_pcmbuff_put((uint8_t *)fm_decbuf, (FM_SAMPLE_NUM/9)<<1);
|
app_audio_pcmbuff_put((uint8_t *)fm_decbuf, (FM_SAMPLE_NUM / 9) << 1);
|
||||||
|
|
||||||
#ifdef FM_DEBUG
|
#ifdef FM_DEBUG
|
||||||
{
|
{
|
||||||
|
@ -74,87 +78,80 @@ static void fm_handler(uint8_t chan, uint32_t remains, uint32_t error, struct HA
|
||||||
uint32_t cur_ticks;
|
uint32_t cur_ticks;
|
||||||
|
|
||||||
cur_ticks = hal_sys_timer_get();
|
cur_ticks = hal_sys_timer_get();
|
||||||
if (!preTicks){
|
if (!preTicks) {
|
||||||
preTicks = cur_ticks;
|
preTicks = cur_ticks;
|
||||||
}else{
|
} else {
|
||||||
diff_ticks = TICKS_TO_MS(cur_ticks - preTicks);
|
diff_ticks = TICKS_TO_MS(cur_ticks - preTicks);
|
||||||
preTicks = cur_ticks;
|
preTicks = cur_ticks;
|
||||||
}
|
}
|
||||||
TRACE(3,"[fm_handler] diff=%d add:%d remain:%d input", diff_ticks, (FM_SAMPLE_NUM/9)<<1, app_audio_pcmbuff_length());
|
TRACE(3, "[fm_handler] diff=%d add:%d remain:%d input", diff_ticks,
|
||||||
|
(FM_SAMPLE_NUM / 9) << 1, app_audio_pcmbuff_length());
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t fm_pcm_more_data(uint8_t *buf, uint32_t len)
|
uint32_t fm_pcm_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
app_audio_pcmbuff_get(buf, len);
|
app_audio_pcmbuff_get(buf, len);
|
||||||
#ifdef FM_DEBUG
|
#ifdef FM_DEBUG
|
||||||
{
|
{
|
||||||
static uint32_t preTicks;
|
static uint32_t preTicks;
|
||||||
uint32_t diff_ticks = 0;
|
uint32_t diff_ticks = 0;
|
||||||
uint32_t cur_ticks= hal_sys_timer_get();
|
uint32_t cur_ticks = hal_sys_timer_get();
|
||||||
if (!preTicks){
|
if (!preTicks) {
|
||||||
preTicks = cur_ticks;
|
preTicks = cur_ticks;
|
||||||
}else{
|
} else {
|
||||||
diff_ticks = TICKS_TO_MS(cur_ticks - preTicks);
|
diff_ticks = TICKS_TO_MS(cur_ticks - preTicks);
|
||||||
preTicks = cur_ticks;
|
preTicks = cur_ticks;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(5,"[fm_pcm_more_data] diff=%d get:%d remain:%d output isr:0x%08x cnt:%d", diff_ticks, len/2, app_audio_pcmbuff_length(), FM_DIGITAL_REG(0x40160020), FM_DIGITAL_REG(0x40160028));
|
TRACE(
|
||||||
|
5,
|
||||||
|
"[fm_pcm_more_data] diff=%d get:%d remain:%d output isr:0x%08x cnt:%d",
|
||||||
|
diff_ticks, len / 2, app_audio_pcmbuff_length(),
|
||||||
|
FM_DIGITAL_REG(0x40160020), FM_DIGITAL_REG(0x40160028));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t fm_capture_more_data(uint8_t *buf, uint32_t len)
|
uint32_t fm_capture_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
fm_handler(0, 0, 0, NULL);
|
||||||
fm_handler(0,0,0,NULL);
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fm_radio_digit_init(void)
|
void fm_radio_digit_init(void) {
|
||||||
{
|
FM_DIGITAL_REG(0xd0350244) = (FM_DIGITAL_REG(0xd0350244) & ~0x01fff) |
|
||||||
FM_DIGITAL_REG(0xd0350244) = (FM_DIGITAL_REG(0xd0350244) & ~0x01fff) | 0x20f; //-890k -> 0 if_shift, for 110.5292m adc
|
0x20f; //-890k -> 0 if_shift, for 110.5292m adc
|
||||||
|
|
||||||
// FM_DIGITAL_REG(0x40180e0c) = 0x34;
|
|
||||||
//FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~0x18000) | 0x18000;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// FM_DIGITAL_REG(0x40180e0c) = 0x34;
|
||||||
|
// FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~0x18000) |
|
||||||
|
// 0x18000;
|
||||||
|
|
||||||
#ifdef ATAN2_HARDWARE
|
#ifdef ATAN2_HARDWARE
|
||||||
|
|
||||||
|
|
||||||
FM_DIGITAL_REG(0xd0330038) |= (1 << 11);
|
FM_DIGITAL_REG(0xd0330038) |= (1 << 11);
|
||||||
FM_DIGITAL_REG(0xd0330038) |= (1 << 17);
|
FM_DIGITAL_REG(0xd0330038) |= (1 << 17);
|
||||||
FM_DIGITAL_REG(0xd0350248) = 0x80c00000;
|
FM_DIGITAL_REG(0xd0350248) = 0x80c00000;
|
||||||
// FM_DIGITAL_REG(0x40160030) = 1;
|
// FM_DIGITAL_REG(0x40160030) = 1;
|
||||||
// FM_DIGITAL_REG(0x40160000) = 0x21;
|
// FM_DIGITAL_REG(0x40160000) = 0x21;
|
||||||
|
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FM_DIGITAL_REG(0xd0330038) |= (1 << 11);
|
FM_DIGITAL_REG(0xd0330038) |= (1 << 11);
|
||||||
FM_DIGITAL_REG(0xd0350248) = 0x80c00000;
|
FM_DIGITAL_REG(0xd0350248) = 0x80c00000;
|
||||||
// FM_DIGITAL_REG(0x40160030) = 1;
|
// FM_DIGITAL_REG(0x40160030) = 1;
|
||||||
// FM_DIGITAL_REG(0x40160000) = 1;
|
// FM_DIGITAL_REG(0x40160000) = 1;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef SINGLECHANLE
|
#ifdef SINGLECHANLE
|
||||||
//0x4000a010 bit2 写0 单channel dac
|
// 0x4000a010 bit2 写0 单channel dac
|
||||||
FM_DIGITAL_REG(0x4000a010) = (1 << 5) |(1<<4);
|
FM_DIGITAL_REG(0x4000a010) = (1 << 5) | (1 << 4);
|
||||||
#else
|
#else
|
||||||
|
|
||||||
FM_DIGITAL_REG(0x4000a010) = (1 << 5) | (1 << 2)|(1<<4);
|
FM_DIGITAL_REG(0x4000a010) = (1 << 5) | (1 << 2) | (1 << 4);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
FM_DIGITAL_REG(0x4000a020) = ~0UL;
|
FM_DIGITAL_REG(0x4000a020) = ~0UL;
|
||||||
FM_DIGITAL_REG(0x4000a02c) = 4;
|
FM_DIGITAL_REG(0x4000a02c) = 4;
|
||||||
FM_DIGITAL_REG(0x4000a030) = 4;
|
FM_DIGITAL_REG(0x4000a030) = 4;
|
||||||
|
@ -191,37 +188,36 @@ void fm_radio_digit_init(void)
|
||||||
FM_DIGITAL_REG(0x4000a04c) = 0x00005100;
|
FM_DIGITAL_REG(0x4000a04c) = 0x00005100;
|
||||||
// FM_DIGITAL_REG(0x40010010) = 0;
|
// FM_DIGITAL_REG(0x40010010) = 0;
|
||||||
// FM_DIGITAL_REG(0x40010014) = 0x03a80005;
|
// FM_DIGITAL_REG(0x40010014) = 0x03a80005;
|
||||||
//FM_DIGITAL_REG(0x40010018) = 0x00200019;
|
// FM_DIGITAL_REG(0x40010018) = 0x00200019;
|
||||||
FM_DIGITAL_REG(0x4000a050) = 0x24200000; //for adc_div_3_6 bypass
|
FM_DIGITAL_REG(0x4000a050) = 0x24200000; // for adc_div_3_6 bypass
|
||||||
FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~0x780) | 0x380; // for channel 1 adc volume, bit10~7
|
FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~0x780) |
|
||||||
FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~0x18000) | 0x18000; // for dual channel adc/dac
|
0x380; // for channel 1 adc volume, bit10~7
|
||||||
|
FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~0x18000) |
|
||||||
|
0x18000; // for dual channel adc/dac
|
||||||
|
|
||||||
#ifdef SINGLECHANLE
|
#ifdef SINGLECHANLE
|
||||||
//0x4000a050 bit16 写0 单channel dac for codec
|
// 0x4000a050 bit16 写0 单channel dac for codec
|
||||||
FM_DIGITAL_REG(0x4000a050) =(FM_DIGITAL_REG(0x4000a050) & ~ (1 << 16));
|
FM_DIGITAL_REG(0x4000a050) = (FM_DIGITAL_REG(0x4000a050) & ~(1 << 16));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
FM_DIGITAL_REG(0x4000a048) = (FM_DIGITAL_REG(0x4000a048) & ~0x00000f00) |
|
||||||
FM_DIGITAL_REG(0x4000a048) = (FM_DIGITAL_REG(0x4000a048) & ~0x00000f00) | 0x40000900; //set for sdm gain
|
0x40000900; // set for sdm gain
|
||||||
FM_DIGITAL_REG(0x4000a044) = (FM_DIGITAL_REG(0x4000a044) & ~0x60000000) | 0x60000000; //for adc en, and dac en
|
FM_DIGITAL_REG(0x4000a044) = (FM_DIGITAL_REG(0x4000a044) & ~0x60000000) |
|
||||||
|
0x60000000; // for adc en, and dac en
|
||||||
|
|
||||||
// Start DAC
|
// Start DAC
|
||||||
FM_DIGITAL_REG(0x4000a010) |= (1 << 1);
|
FM_DIGITAL_REG(0x4000a010) |= (1 << 1);
|
||||||
|
|
||||||
|
// Delay 2 ms
|
||||||
|
// for (volatile int kk = 0; kk < 1000/64; kk++);
|
||||||
// Delay 2 ms
|
|
||||||
// for (volatile int kk = 0; kk < 1000/64; kk++);
|
|
||||||
osDelay(2);
|
osDelay(2);
|
||||||
|
|
||||||
//hal_sys_timer_delay(MS_TO_TICKS(2));
|
// hal_sys_timer_delay(MS_TO_TICKS(2));
|
||||||
// Start ADC
|
// Start ADC
|
||||||
// FM_DIGITAL_REG(0x4000a010) |= (1 << 0);
|
// FM_DIGITAL_REG(0x4000a010) |= (1 << 0);
|
||||||
|
|
||||||
|
|
||||||
#ifdef ATAN2_HARDWARE
|
#ifdef ATAN2_HARDWARE
|
||||||
|
|
||||||
|
|
||||||
#ifdef FM_NEWMODE
|
#ifdef FM_NEWMODE
|
||||||
FM_DIGITAL_REG(0x40160030) = 1;
|
FM_DIGITAL_REG(0x40160030) = 1;
|
||||||
FM_DIGITAL_REG(0x40160000) = 0x1;
|
FM_DIGITAL_REG(0x40160000) = 0x1;
|
||||||
|
@ -232,18 +228,16 @@ void fm_radio_digit_init(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
//start FM
|
// start FM
|
||||||
FM_DIGITAL_REG(0x40160030) = 1;
|
FM_DIGITAL_REG(0x40160030) = 1;
|
||||||
FM_DIGITAL_REG(0x40160000) =1;
|
FM_DIGITAL_REG(0x40160000) = 1;
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
int fm_radio_analog_init(void)
|
int fm_radio_analog_init(void) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
// fm initial
|
// fm initial
|
||||||
|
@ -251,132 +245,123 @@ int fm_radio_analog_init(void)
|
||||||
rfspi_wvalue( 8'h01 , 16'b1010_1101_1111_1111 ) ; // power on fm lna
|
rfspi_wvalue( 8'h01 , 16'b1010_1101_1111_1111 ) ; // power on fm lna
|
||||||
rfspi_wvalue( 8'h02 , 16'b1000_0000_1001_0100 ) ; // reg_fm_lna_pu_mixersw
|
rfspi_wvalue( 8'h02 , 16'b1000_0000_1001_0100 ) ; // reg_fm_lna_pu_mixersw
|
||||||
|
|
||||||
rfspi_wvalue( 8'h1a , 16'b0101_0000_1011_0000 ) ; // reg_bt_vco_fm_buff_vctrl_dr=1
|
rfspi_wvalue( 8'h1a , 16'b0101_0000_1011_0000 ) ; //
|
||||||
|
reg_bt_vco_fm_buff_vctrl_dr=1
|
||||||
|
|
||||||
rfspi_wvalue( 8'h18 , 16'b0000_0110_1000_0000 ) ; // power on vco
|
rfspi_wvalue( 8'h18 , 16'b0000_0110_1000_0000 ) ; // power on vco
|
||||||
|
|
||||||
rfspi_wvalue( 8'h19 , 16'b0110_0100_0100_0000 ) ; // reg_bt_vco_fm_buff_vctrl
|
rfspi_wvalue( 8'h19 , 16'b0110_0100_0100_0000 ) ; // reg_bt_vco_fm_buff_vctrl
|
||||||
rfspi_wvalue( 8'h1d , 16'b0111_1000_1010_0100 ) ; // reg_bt_rfpll_pu_dr
|
rfspi_wvalue( 8'h1d , 16'b0111_1000_1010_0100 ) ; // reg_bt_rfpll_pu_dr
|
||||||
rfspi_wvalue( 8'h1c , 16'b0000_0000_1100_1000 ) ; // reg_bt_vco_fm_lo_en reg_bt_vco_fm_div_ctrl=8
|
rfspi_wvalue( 8'h1c , 16'b0000_0000_1100_1000 ) ; // reg_bt_vco_fm_lo_en
|
||||||
|
reg_bt_vco_fm_div_ctrl=8
|
||||||
|
|
||||||
rfspi_wvalue( 8'h0a , 16'b0001_0010_0010_1111 ) ; // reg_btfm_flt_fm_en
|
rfspi_wvalue( 8'h0a , 16'b0001_0010_0010_1111 ) ; // reg_btfm_flt_fm_en
|
||||||
|
|
||||||
rfspi_wvalue( 8'h2d , 16'b0000_0111_1000_0010 ) ; // bb ldo on reg_bb_ldo_pu_vddr15a_dr
|
rfspi_wvalue( 8'h2d , 16'b0000_0111_1000_0010 ) ; // bb ldo on
|
||||||
rfspi_wvalue( 8'h07 , 16'b0000_0010_1011_1001 ) ; // reg_btfm_flt_pu_dr
|
reg_bb_ldo_pu_vddr15a_dr rfspi_wvalue( 8'h07 , 16'b0000_0010_1011_1001 ) ; //
|
||||||
|
reg_btfm_flt_pu_dr
|
||||||
|
|
||||||
rfspi_wvalue( 8'h2a , 16'b0001_0110_1100_0000 ) ; // reg_bt_rfpll_sdm_freq_dr
|
rfspi_wvalue( 8'h2a , 16'b0001_0110_1100_0000 ) ; // reg_bt_rfpll_sdm_freq_dr
|
||||||
rfspi_wvalue( 8'h26 , 16'b0000_0000_0000_0000 ) ; // vco freq[31:16] ( 2400 + x )*2^25/26MHZ*N (2400+x= frf)
|
rfspi_wvalue( 8'h26 , 16'b0000_0000_0000_0000 ) ; // vco freq[31:16] ( 2400 +
|
||||||
rfspi_wvalue( 8'h25 , 16'b0000_0000_0000_0000 ) ; // vco freq[15:00] fm_freq = frf/(4*reg_bt_vco_fm_div_ctrl)
|
x )*2^25/26MHZ*N (2400+x= frf) rfspi_wvalue( 8'h25 , 16'b0000_0000_0000_0000 )
|
||||||
rfspi_wvalue( 8'h17 , 16'b1000_0000_0000_0000 ) ; // reg_bt_vco_calen
|
; // vco freq[15:00] fm_freq = frf/(4*reg_bt_vco_fm_div_ctrl) rfspi_wvalue(
|
||||||
|
8'h17 , 16'b1000_0000_0000_0000 ) ; // reg_bt_vco_calen
|
||||||
|
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x2c, 0b0111000001011100); // dig_vtoi_en
|
||||||
|
fm_write_rf_reg(0x01, 0b1010110111111111); // power on fm lna
|
||||||
|
fm_write_rf_reg(0x02, 0b1000000010010100); // reg_fm_lna_pu_mixersw
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x1a, 0b0101000010110000); // reg_bt_vco_fm_buff_vctrl_dr=1
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x18, 0b0000011010000000); // power on vco
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x19, 0b0110010001000000); // reg_bt_vco_fm_buff_vctrl
|
||||||
|
fm_write_rf_reg(0x1d, 0b0111100010100100); // reg_bt_rfpll_pu_dr
|
||||||
|
fm_write_rf_reg(
|
||||||
|
0x1c, 0b0000000011001000); // reg_bt_vco_fm_lo_en reg_bt_vco_fm_div_ctrl=8
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x0a, 0b0001001000101111); // reg_btfm_flt_fm_en
|
||||||
|
|
||||||
fm_write_rf_reg( 0x2c , 0b0111000001011100 ) ; // dig_vtoi_en
|
fm_write_rf_reg(0x2d,
|
||||||
fm_write_rf_reg( 0x01 , 0b1010110111111111 ) ; // power on fm lna
|
0b0000011110000010); // bb ldo on reg_bb_ldo_pu_vddr15a_dr
|
||||||
fm_write_rf_reg( 0x02 , 0b1000000010010100 ) ; // reg_fm_lna_pu_mixersw
|
fm_write_rf_reg(0x07, 0b0000001010111001); // reg_btfm_flt_pu_dr
|
||||||
|
|
||||||
fm_write_rf_reg( 0x1a , 0b0101000010110000 ) ; // reg_bt_vco_fm_buff_vctrl_dr=1
|
|
||||||
|
|
||||||
fm_write_rf_reg( 0x18 , 0b0000011010000000 ) ; // power on vco
|
|
||||||
|
|
||||||
fm_write_rf_reg( 0x19 , 0b0110010001000000 ) ; // reg_bt_vco_fm_buff_vctrl
|
|
||||||
fm_write_rf_reg( 0x1d , 0b0111100010100100 ) ; // reg_bt_rfpll_pu_dr
|
|
||||||
fm_write_rf_reg( 0x1c , 0b0000000011001000 ) ; // reg_bt_vco_fm_lo_en reg_bt_vco_fm_div_ctrl=8
|
|
||||||
|
|
||||||
fm_write_rf_reg( 0x0a , 0b0001001000101111 ) ; // reg_btfm_flt_fm_en
|
|
||||||
|
|
||||||
fm_write_rf_reg( 0x2d , 0b0000011110000010 ) ; // bb ldo on reg_bb_ldo_pu_vddr15a_dr
|
|
||||||
fm_write_rf_reg( 0x07 , 0b0000001010111001 ) ; // reg_btfm_flt_pu_dr
|
|
||||||
|
|
||||||
fm_write_rf_reg( 0x2a , 0b0001011011000000 ) ; // reg_bt_rfpll_sdm_freq_dr
|
|
||||||
fm_write_rf_reg( 0x26 , 0b0000000000000000 ) ; // vco freq[31:16] ( 2400 + x )*2^25/26MHZ*N (2400+x= frf)
|
|
||||||
fm_write_rf_reg( 0x25 , 0b0000000000000000 ) ; // vco freq[15:00] fm_freq = frf/(4*reg_bt_vco_fm_div_ctrl)
|
|
||||||
fm_write_rf_reg( 0x17 , 0b1000000000000000 ) ; // reg_bt_vco_calen
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//adc也要开的话,需要配 cmu
|
|
||||||
//0x40000060[29] = 1 最好先读再写,否则把别的bit冲掉了。
|
|
||||||
|
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x2a, 0b0001011011000000); // reg_bt_rfpll_sdm_freq_dr
|
||||||
|
fm_write_rf_reg(0x26, 0b0000000000000000); // vco freq[31:16] ( 2400 + x
|
||||||
|
// )*2^25/26MHZ*N (2400+x= frf)
|
||||||
|
fm_write_rf_reg(0x25, 0b0000000000000000); // vco freq[15:00] fm_freq =
|
||||||
|
// frf/(4*reg_bt_vco_fm_div_ctrl)
|
||||||
|
fm_write_rf_reg(0x17, 0b1000000000000000); // reg_bt_vco_calen
|
||||||
|
|
||||||
|
// adc也要开的话,需要配 cmu
|
||||||
|
// 0x40000060[29] = 1 最好先读再写,否则把别的bit冲掉了。
|
||||||
|
|
||||||
//ÐèÒªÅäÖõÄspi¼Ä´æÆ÷£ºana interface:
|
//ÐèÒªÅäÖõÄspi¼Ä´æÆ÷£ºana interface:
|
||||||
|
|
||||||
//0x05 = 0xFCB1 // Audio Pll
|
// 0x05 = 0xFCB1 // Audio Pll
|
||||||
//0x06 = 0x881C
|
// 0x06 = 0x881C
|
||||||
//0x31 = 0x0100 // audio_freq_en
|
// 0x31 = 0x0100 // audio_freq_en
|
||||||
//0x37 = 0x1000 // codec_bbpll1_fm_adc_clk_en
|
// 0x37 = 0x1000 // codec_bbpll1_fm_adc_clk_en
|
||||||
//0x31 = 0x0130 // codec_tx_en_ldac codec_tx_en_rdac
|
// 0x31 = 0x0130 // codec_tx_en_ldac codec_tx_en_rdac
|
||||||
|
|
||||||
|
ret = fm_write_rf_reg(0x05, 0xfcb1);
|
||||||
ret = fm_write_rf_reg(0x05 , 0xfcb1);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = fm_write_rf_reg(0x06 , 0x881c);
|
ret = fm_write_rf_reg(0x06, 0x881c);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = fm_write_rf_reg(0x3a , 0xe644);
|
ret = fm_write_rf_reg(0x3a, 0xe644);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = fm_write_rf_reg(0x31 , 0x0100);
|
ret = fm_write_rf_reg(0x31, 0x0100);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = fm_write_rf_reg(0x37 , 0x1000);
|
ret = fm_write_rf_reg(0x37, 0x1000);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
ret = fm_write_rf_reg(0x31 , 0x01f0);
|
ret = fm_write_rf_reg(0x31, 0x01f0);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delay 32ms
|
||||||
//delay 32ms
|
|
||||||
osDelay(32);
|
osDelay(32);
|
||||||
|
|
||||||
|
ret = fm_write_rf_reg(0x31, 0x0130);
|
||||||
ret = fm_write_rf_reg(0x31 , 0x0130);
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
//[FM_RX]
|
//[FM_RX]
|
||||||
fm_write_rf_reg(0x01,0x91ff); //pu fm
|
fm_write_rf_reg(0x01, 0x91ff); // pu fm
|
||||||
fm_write_rf_reg(0x2d,0x07fa); //ldo on
|
fm_write_rf_reg(0x2d, 0x07fa); // ldo on
|
||||||
fm_write_rf_reg(0x2e,0x6aaa); //tune fm filter IF
|
fm_write_rf_reg(0x2e, 0x6aaa); // tune fm filter IF
|
||||||
fm_write_rf_reg(0x02,0xe694);
|
fm_write_rf_reg(0x02, 0xe694);
|
||||||
fm_write_rf_reg(0x03,0xfe3a);
|
fm_write_rf_reg(0x03, 0xfe3a);
|
||||||
fm_write_rf_reg(0x04,0x52a8);
|
fm_write_rf_reg(0x04, 0x52a8);
|
||||||
fm_write_rf_reg(0x07,0x02b9);
|
fm_write_rf_reg(0x07, 0x02b9);
|
||||||
fm_write_rf_reg(0x0a,0x1a2c);
|
fm_write_rf_reg(0x0a, 0x1a2c);
|
||||||
fm_write_rf_reg(0x0b,0x402b);
|
fm_write_rf_reg(0x0b, 0x402b);
|
||||||
fm_write_rf_reg(0x0c,0x7584);
|
fm_write_rf_reg(0x0c, 0x7584);
|
||||||
fm_write_rf_reg(0x0e,0x0000);
|
fm_write_rf_reg(0x0e, 0x0000);
|
||||||
fm_write_rf_reg(0x0f,0x2e18);
|
fm_write_rf_reg(0x0f, 0x2e18);
|
||||||
fm_write_rf_reg(0x10,0x02b4);
|
fm_write_rf_reg(0x10, 0x02b4);
|
||||||
fm_write_rf_reg(0x13,0x0a48);
|
fm_write_rf_reg(0x13, 0x0a48);
|
||||||
|
|
||||||
//[vco init]
|
//[vco init]
|
||||||
fm_write_rf_reg(0x18,0x077f);
|
fm_write_rf_reg(0x18, 0x077f);
|
||||||
fm_write_rf_reg(0x19,0x3ff8);
|
fm_write_rf_reg(0x19, 0x3ff8);
|
||||||
fm_write_rf_reg(0x1a,0xc090);
|
fm_write_rf_reg(0x1a, 0xc090);
|
||||||
fm_write_rf_reg(0x1b,0x0f88);
|
fm_write_rf_reg(0x1b, 0x0f88);
|
||||||
fm_write_rf_reg(0x1c,0x04c6); //[3:0] 5,6,7,8 --> vco/2
|
fm_write_rf_reg(0x1c, 0x04c6); //[3:0] 5,6,7,8 --> vco/2
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -388,7 +373,7 @@ void fm_radio_poweron(void)
|
||||||
osDelay(2000);
|
osDelay(2000);
|
||||||
|
|
||||||
{
|
{
|
||||||
//wakp interface
|
// wakp interface
|
||||||
unsigned short read_val;
|
unsigned short read_val;
|
||||||
|
|
||||||
fm_read_rf_reg(0x50, &read_val);
|
fm_read_rf_reg(0x50, &read_val);
|
||||||
|
@ -397,52 +382,48 @@ void fm_radio_poweron(void)
|
||||||
pmu_fm_config(1);
|
pmu_fm_config(1);
|
||||||
|
|
||||||
fm_write_rf_reg(0x0c, 0x3584);
|
fm_write_rf_reg(0x0c, 0x3584);
|
||||||
if(hal_get_chip_metal_id() == HAL_CHIP_METAL_ID_2 || hal_get_chip_metal_id() == HAL_CHIP_METAL_ID_3) ////
|
if (hal_get_chip_metal_id() == HAL_CHIP_METAL_ID_2 ||
|
||||||
|
hal_get_chip_metal_id() == HAL_CHIP_METAL_ID_3) ////
|
||||||
{
|
{
|
||||||
FM_DIGITAL_REG(0xc00003b4)=0x00060020;//turn off bt sleep
|
FM_DIGITAL_REG(0xc00003b4) = 0x00060020; // turn off bt sleep
|
||||||
}
|
} else if (hal_get_chip_metal_id() == HAL_CHIP_METAL_ID_4) {
|
||||||
else if(hal_get_chip_metal_id() == HAL_CHIP_METAL_ID_4)
|
FM_DIGITAL_REG(0xc00003b0) = 0x00060020; // turn off bt sleep
|
||||||
{
|
} else {
|
||||||
FM_DIGITAL_REG(0xc00003b0)=0x00060020;//turn off bt sleep
|
FM_DIGITAL_REG(0xc00003ac) = 0x00060020; // turn off bt sleep
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
FM_DIGITAL_REG(0xc00003ac)=0x00060020;//turn off bt sleep
|
|
||||||
}
|
}
|
||||||
FM_DIGITAL_REG(0xd0330038) = 0x00008D0D;
|
FM_DIGITAL_REG(0xd0330038) = 0x00008D0D;
|
||||||
FM_DIGITAL_REG(0xd0340020)=0x010E01C0;// open ana rxon for open adc clk
|
FM_DIGITAL_REG(0xd0340020) = 0x010E01C0; // open ana rxon for open adc clk
|
||||||
//fm_write_rf_reg(0x02, 0xe694);
|
// fm_write_rf_reg(0x02, 0xe694);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* fm_radio_get_ext_buff(int size)
|
void *fm_radio_get_ext_buff(int size) {
|
||||||
{
|
|
||||||
uint8_t *pBuff = NULL;
|
uint8_t *pBuff = NULL;
|
||||||
size = size+size%4;
|
size = size + size % 4;
|
||||||
app_audio_mempool_get_buff(&pBuff, size);
|
app_audio_mempool_get_buff(&pBuff, size);
|
||||||
return (void*)pBuff;
|
return (void *)pBuff;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fm_radio_player(bool on)
|
int fm_radio_player(bool on) {
|
||||||
{
|
|
||||||
static struct AF_STREAM_CONFIG_T stream_cfg;
|
static struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
uint8_t *buff = NULL;
|
uint8_t *buff = NULL;
|
||||||
|
|
||||||
TRACE(2,"fm_radio_player work:%d op:%d", isRun, on);
|
TRACE(2, "fm_radio_player work:%d op:%d", isRun, on);
|
||||||
if (isRun==on)
|
if (isRun == on)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (on){
|
if (on) {
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_52M);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_52M);
|
||||||
app_audio_mempool_init();
|
app_audio_mempool_init();
|
||||||
fm_radio_poweron();
|
fm_radio_poweron();
|
||||||
fm_radio_analog_init();
|
fm_radio_analog_init();
|
||||||
fm_radio_digit_init();
|
fm_radio_digit_init();
|
||||||
osDelay(200);
|
osDelay(200);
|
||||||
buff = (uint8_t *)fm_radio_get_ext_buff(FM_AUDIO_BUFFER_SIZE*2);
|
buff = (uint8_t *)fm_radio_get_ext_buff(FM_AUDIO_BUFFER_SIZE * 2);
|
||||||
app_audio_pcmbuff_init(buff, FM_AUDIO_BUFFER_SIZE*2);
|
app_audio_pcmbuff_init(buff, FM_AUDIO_BUFFER_SIZE * 2);
|
||||||
fm_sample_buffer_p = (int32_t *)fm_radio_get_ext_buff(FM_SAMPLE_BUFFER_SIZE);
|
fm_sample_buffer_p =
|
||||||
#if FPGA==0
|
(int32_t *)fm_radio_get_ext_buff(FM_SAMPLE_BUFFER_SIZE);
|
||||||
|
#if FPGA == 0
|
||||||
app_overlay_select(APP_OVERLAY_FM);
|
app_overlay_select(APP_OVERLAY_FM);
|
||||||
#endif
|
#endif
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
|
@ -459,7 +440,7 @@ int fm_radio_player(bool on)
|
||||||
stream_cfg.bits = AUD_BITS_16;
|
stream_cfg.bits = AUD_BITS_16;
|
||||||
stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
||||||
stream_cfg.sample_rate = AUD_SAMPRATE_48000;
|
stream_cfg.sample_rate = AUD_SAMPRATE_48000;
|
||||||
#if FPGA==0
|
#if FPGA == 0
|
||||||
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
||||||
#else
|
#else
|
||||||
stream_cfg.device = AUD_STREAM_USE_EXT_CODEC;
|
stream_cfg.device = AUD_STREAM_USE_EXT_CODEC;
|
||||||
|
@ -472,7 +453,7 @@ int fm_radio_player(bool on)
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
|
|
||||||
}else{
|
} else {
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
|
@ -480,50 +461,45 @@ int fm_radio_player(bool on)
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
|
||||||
}
|
}
|
||||||
|
|
||||||
isRun=on;
|
isRun = on;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int fm_tune(uint32_t freqkhz)
|
int fm_tune(uint32_t freqkhz) {
|
||||||
{
|
|
||||||
uint32_t reg;
|
uint32_t reg;
|
||||||
unsigned long long tmp = 0;
|
unsigned long long tmp = 0;
|
||||||
|
|
||||||
|
|
||||||
//[rfpll_cal]
|
//[rfpll_cal]
|
||||||
fm_write_rf_reg(0x21,0x3979); // ref sel 52MHz
|
fm_write_rf_reg(0x21, 0x3979); // ref sel 52MHz
|
||||||
fm_write_rf_reg(0x22,0x7A22); // doubler setting
|
fm_write_rf_reg(0x22, 0x7A22); // doubler setting
|
||||||
fm_write_rf_reg(0x23,0x0380);
|
fm_write_rf_reg(0x23, 0x0380);
|
||||||
fm_write_rf_reg(0x2b,0x32a0); // sdm
|
fm_write_rf_reg(0x2b, 0x32a0); // sdm
|
||||||
fm_write_rf_reg(0x2a,0x12d1); // cal ini
|
fm_write_rf_reg(0x2a, 0x12d1); // cal ini
|
||||||
|
|
||||||
//(freq(Mhz)-0.89(Mhz))*(2^28)*3/26
|
//(freq(Mhz)-0.89(Mhz))*(2^28)*3/26
|
||||||
tmp = freqkhz;
|
tmp = freqkhz;
|
||||||
reg =(((tmp-890))<<27)*3/13/1000;
|
reg = (((tmp - 890)) << 27) * 3 / 13 / 1000;
|
||||||
|
|
||||||
fm_write_rf_reg(0x25, (reg&0xffff0000)>>16);
|
fm_write_rf_reg(0x25, (reg & 0xffff0000) >> 16);
|
||||||
fm_write_rf_reg(0x26, reg&0x0000ffff);
|
fm_write_rf_reg(0x26, reg & 0x0000ffff);
|
||||||
|
|
||||||
fm_write_rf_reg(0x1d,0x58e4); // pll_cal_en
|
fm_write_rf_reg(0x1d, 0x58e4); // pll_cal_en
|
||||||
fm_write_rf_reg(0xf7,0x5597); // rst and enable pll_cal clk
|
fm_write_rf_reg(0xf7, 0x5597); // rst and enable pll_cal clk
|
||||||
fm_write_rf_reg(0xf7,0x55d7); // rst and enable pll_cal clk
|
fm_write_rf_reg(0xf7, 0x55d7); // rst and enable pll_cal clk
|
||||||
fm_write_rf_reg(0x1d,0x7ae4); // pll cal start
|
fm_write_rf_reg(0x1d, 0x7ae4); // pll cal start
|
||||||
fm_write_rf_reg(0xff,0x0000); // wait 100us
|
fm_write_rf_reg(0xff, 0x0000); // wait 100us
|
||||||
|
|
||||||
osDelay(20);
|
osDelay(20);
|
||||||
|
|
||||||
|
fm_write_rf_reg(0x1d, 0x7ac4); // close pll loop
|
||||||
fm_write_rf_reg(0x1d,0x7ac4); // close pll loop
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void fm_test_main(void)
|
void fm_test_main(void) {
|
||||||
{
|
|
||||||
fm_radio_player(true);
|
fm_radio_player(true);
|
||||||
osDelay(20);
|
osDelay(20);
|
||||||
fm_tune(90500);
|
fm_tune(90500);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -14,20 +14,19 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "cqueue.h"
|
#include "cqueue.h"
|
||||||
#include "hal_uart.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
#include "hal_uart.h"
|
||||||
|
#include <math.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
// BT
|
// BT
|
||||||
|
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
/* mutex */
|
/* mutex */
|
||||||
osMutexId g_voicemsbc_queue_mutex_id;
|
osMutexId g_voicemsbc_queue_mutex_id;
|
||||||
|
@ -35,7 +34,7 @@ osMutexDef(g_voicemsbc_queue_mutex);
|
||||||
|
|
||||||
/* msbc queue */
|
/* msbc queue */
|
||||||
#define VOICEMSBC_TEMP_BUFFER_SIZE 128
|
#define VOICEMSBC_TEMP_BUFFER_SIZE 128
|
||||||
#define VOICEMSBC_QUEUE_SIZE (VOICEMSBC_TEMP_BUFFER_SIZE*100)
|
#define VOICEMSBC_QUEUE_SIZE (VOICEMSBC_TEMP_BUFFER_SIZE * 100)
|
||||||
unsigned char voicemsbc_queue_buf[VOICEMSBC_QUEUE_SIZE];
|
unsigned char voicemsbc_queue_buf[VOICEMSBC_QUEUE_SIZE];
|
||||||
CQueue voicemsbc_queue;
|
CQueue voicemsbc_queue;
|
||||||
static uint32_t ok_to_decode = 0;
|
static uint32_t ok_to_decode = 0;
|
||||||
|
@ -43,8 +42,7 @@ static uint32_t ok_to_decode = 0;
|
||||||
#define LOCK_VOICEMSBC_QUEUE() \
|
#define LOCK_VOICEMSBC_QUEUE() \
|
||||||
osMutexWait(g_voicemsbc_queue_mutex_id, osWaitForever)
|
osMutexWait(g_voicemsbc_queue_mutex_id, osWaitForever)
|
||||||
|
|
||||||
#define UNLOCK_VOICEMSBC_QUEUE() \
|
#define UNLOCK_VOICEMSBC_QUEUE() osMutexRelease(g_voicemsbc_queue_mutex_id)
|
||||||
osMutexRelease(g_voicemsbc_queue_mutex_id)
|
|
||||||
|
|
||||||
static void dump_buffer_to_psram(char *buf, unsigned int len)
|
static void dump_buffer_to_psram(char *buf, unsigned int len)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,9 +1,10 @@
|
||||||
#include <stdbool.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include "plc_utils.h"
|
#include "plc_utils.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#if defined(CHIP_BEST1400) || defined(CHIP_BEST1402) || defined(CHIP_BEST2300P) || defined(CHIP_BEST2300A)
|
#if defined(CHIP_BEST1400) || defined(CHIP_BEST1402) || \
|
||||||
|
defined(CHIP_BEST2300P) || defined(CHIP_BEST2300A)
|
||||||
#define MSBC_MUTE_PATTERN (0x55)
|
#define MSBC_MUTE_PATTERN (0x55)
|
||||||
#else
|
#else
|
||||||
#define MSBC_MUTE_PATTERN (0x00)
|
#define MSBC_MUTE_PATTERN (0x00)
|
||||||
|
@ -19,9 +20,8 @@
|
||||||
//#define ENABLE_PAD_CHECK
|
//#define ENABLE_PAD_CHECK
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if msbc frame is filled by 10+ samples in the trail, crc maybe not detect this
|
* if msbc frame is filled by 10+ samples in the trail, crc maybe not detect
|
||||||
* satuation.
|
* this satuation. Do not check this by default
|
||||||
* Do not check this by default
|
|
||||||
*/
|
*/
|
||||||
//#define ENABLE_TRAILING_ZERO_CHECK
|
//#define ENABLE_TRAILING_ZERO_CHECK
|
||||||
|
|
||||||
|
@ -58,12 +58,10 @@ static const uint8_t sbc_crc_tbl[256] = {
|
||||||
0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, 0xB2, 0xAF, 0x88, 0x95,
|
0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43, 0xB2, 0xAF, 0x88, 0x95,
|
||||||
0xC6, 0xDB, 0xFC, 0xE1, 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09,
|
0xC6, 0xDB, 0xFC, 0xE1, 0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09,
|
||||||
0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, 0x97, 0x8A, 0xAD, 0xB0,
|
0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C, 0x97, 0x8A, 0xAD, 0xB0,
|
||||||
0xE3, 0xFE, 0xD9, 0xC4
|
0xE3, 0xFE, 0xD9, 0xC4};
|
||||||
};
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn)
|
static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn) {
|
||||||
{
|
|
||||||
uint8_t sn1, sn2;
|
uint8_t sn1, sn2;
|
||||||
#ifdef ENABLE_CRC_CHECK
|
#ifdef ENABLE_CRC_CHECK
|
||||||
uint8_t fcs = 0x0F;
|
uint8_t fcs = 0x0F;
|
||||||
|
@ -73,15 +71,12 @@ static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn)
|
||||||
#endif
|
#endif
|
||||||
*sn = 0xff;
|
*sn = 0xff;
|
||||||
#if defined(MSBC_SYNC_HACKER)
|
#if defined(MSBC_SYNC_HACKER)
|
||||||
if (((buf[0] != 0x01) && (buf[0] != 0x00)) ||
|
if (((buf[0] != 0x01) && (buf[0] != 0x00)) || ((buf[1] & 0x0f) != 0x08) ||
|
||||||
((buf[1] & 0x0f) != 0x08) ||
|
|
||||||
(buf[2] != 0xad)) {
|
(buf[2] != 0xad)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
if ((buf[0] != 0x01) ||
|
if ((buf[0] != 0x01) || ((buf[1] & 0x0f) != 0x08) || (buf[2] != 0xad)) {
|
||||||
((buf[1] & 0x0f) != 0x08) ||
|
|
||||||
(buf[2] != 0xad)) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -108,8 +103,7 @@ static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn)
|
||||||
/* Sum the whole byte */
|
/* Sum the whole byte */
|
||||||
fcs = sbc_crc_tbl[fcs ^ buf[ind]];
|
fcs = sbc_crc_tbl[fcs ^ buf[ind]];
|
||||||
ind = ind + 1;
|
ind = ind + 1;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (sb == 7) {
|
if (sb == 7) {
|
||||||
/* Sum the next 4 bits */
|
/* Sum the next 4 bits */
|
||||||
|
|
||||||
|
@ -119,8 +113,7 @@ static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn)
|
||||||
bit = (uint8_t)((0x01 & (buf[ind] >> shift--)) ^ (fcs >> 7));
|
bit = (uint8_t)((0x01 & (buf[ind] >> shift--)) ^ (fcs >> 7));
|
||||||
if (bit) {
|
if (bit) {
|
||||||
fcs = (uint8_t)(((fcs << 1) | bit) ^ 0x1C);
|
fcs = (uint8_t)(((fcs << 1) | bit) ^ 0x1C);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
fcs = (uint8_t)((fcs << 1));
|
fcs = (uint8_t)((fcs << 1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -129,7 +122,7 @@ static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn)
|
||||||
|
|
||||||
bitOffset += 4;
|
bitOffset += 4;
|
||||||
}
|
}
|
||||||
//TRACE(2,"msbc crc:%d fcs:%d", crc,fcs);
|
// TRACE(2,"msbc crc:%d fcs:%d", crc,fcs);
|
||||||
if (crc != fcs)
|
if (crc != fcs)
|
||||||
return -4;
|
return -4;
|
||||||
#endif
|
#endif
|
||||||
|
@ -147,8 +140,7 @@ static int sco_parse_synchronization_header(uint8_t *buf, uint8_t *sn)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_BLE_CONFLICT_CHECK
|
#ifdef ENABLE_BLE_CONFLICT_CHECK
|
||||||
static bool memcmp_U8(uint8_t *x, uint8_t *y, uint16_t size)
|
static bool memcmp_U8(uint8_t *x, uint8_t *y, uint16_t size) {
|
||||||
{
|
|
||||||
for (int i = 0; i < size; i++) {
|
for (int i = 0; i < size; i++) {
|
||||||
if (x[i] != y[i])
|
if (x[i] != y[i])
|
||||||
return true;
|
return true;
|
||||||
|
@ -157,12 +149,13 @@ static bool memcmp_U8(uint8_t *x, uint8_t *y, uint16_t size)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// when signal is mute, msbc data remains the same except seq num. We should check history flag,
|
// when signal is mute, msbc data remains the same except seq num. We should
|
||||||
// otherwise a single conflict may be detected twice
|
// check history flag, otherwise a single conflict may be detected twice
|
||||||
static bool update_ble_sco_conflict(PacketLossState* st, uint8_t *last_pkt, uint8_t *pkt)
|
static bool update_ble_sco_conflict(PacketLossState *st, uint8_t *last_pkt,
|
||||||
{
|
uint8_t *pkt) {
|
||||||
// do not check padding byte as it maybe useless when msbc_offset is 1
|
// do not check padding byte as it maybe useless when msbc_offset is 1
|
||||||
bool ret = (st->prev_ble_sco_conflict_flag[1] == false && memcmp_U8(last_pkt, pkt, MSBC_PKTSIZE - 1) == false);
|
bool ret = (st->prev_ble_sco_conflict_flag[1] == false &&
|
||||||
|
memcmp_U8(last_pkt, pkt, MSBC_PKTSIZE - 1) == false);
|
||||||
|
|
||||||
memcpy(&last_pkt[0], &last_pkt[MSBC_PKTSIZE], MSBC_PKTSIZE);
|
memcpy(&last_pkt[0], &last_pkt[MSBC_PKTSIZE], MSBC_PKTSIZE);
|
||||||
memcpy(&last_pkt[MSBC_PKTSIZE], pkt, MSBC_PKTSIZE);
|
memcpy(&last_pkt[MSBC_PKTSIZE], pkt, MSBC_PKTSIZE);
|
||||||
|
@ -170,8 +163,7 @@ static bool update_ble_sco_conflict(PacketLossState* st, uint8_t *last_pkt, uint
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool check_ble_sco_conflict(PacketLossState* st, bool ret)
|
static bool check_ble_sco_conflict(PacketLossState *st, bool ret) {
|
||||||
{
|
|
||||||
st->prev_ble_sco_conflict_flag[1] = st->prev_ble_sco_conflict_flag[0];
|
st->prev_ble_sco_conflict_flag[1] = st->prev_ble_sco_conflict_flag[0];
|
||||||
st->prev_ble_sco_conflict_flag[0] = ret;
|
st->prev_ble_sco_conflict_flag[0] = ret;
|
||||||
|
|
||||||
|
@ -179,8 +171,7 @@ static bool check_ble_sco_conflict(PacketLossState* st, bool ret)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static bool msbc_check_controller_mute_pattern(uint8_t *pkt, uint8_t pattern)
|
static bool msbc_check_controller_mute_pattern(uint8_t *pkt, uint8_t pattern) {
|
||||||
{
|
|
||||||
// do not check padding byte as it maybe useless when msbc_offset is 1
|
// do not check padding byte as it maybe useless when msbc_offset is 1
|
||||||
for (int i = 0; i < MSBC_PKTSIZE - 1; i++)
|
for (int i = 0; i < MSBC_PKTSIZE - 1; i++)
|
||||||
if (pkt[i] != pattern)
|
if (pkt[i] != pattern)
|
||||||
|
@ -190,8 +181,7 @@ static bool msbc_check_controller_mute_pattern(uint8_t *pkt, uint8_t pattern)
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ENABLE_TRAILING_ZERO_CHECK
|
#ifdef ENABLE_TRAILING_ZERO_CHECK
|
||||||
static int msbc_check_pkt_trailing_zeros(uint8_t *pkt)
|
static int msbc_check_pkt_trailing_zeros(uint8_t *pkt) {
|
||||||
{
|
|
||||||
int idx = MSBC_PKTSIZE;
|
int idx = MSBC_PKTSIZE;
|
||||||
|
|
||||||
for (int i = MSBC_PKTSIZE - 1; i >= 0; i--) {
|
for (int i = MSBC_PKTSIZE - 1; i >= 0; i--) {
|
||||||
|
@ -205,22 +195,21 @@ static int msbc_check_pkt_trailing_zeros(uint8_t *pkt)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static uint8_t get_next_sequence_num(uint8_t seq_num)
|
static uint8_t get_next_sequence_num(uint8_t seq_num) {
|
||||||
{
|
|
||||||
return (seq_num + 1 == 4) ? 0 : (seq_num + 1);
|
return (seq_num + 1 == 4) ? 0 : (seq_num + 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void packet_loss_detection_init(PacketLossState *st)
|
void packet_loss_detection_init(PacketLossState *st) {
|
||||||
{
|
|
||||||
st->last_seq_num = 0xff;
|
st->last_seq_num = 0xff;
|
||||||
|
|
||||||
memset(st->last_pkt, 0, sizeof(st->last_pkt));
|
memset(st->last_pkt, 0, sizeof(st->last_pkt));
|
||||||
memset(st->prev_ble_sco_conflict_flag, 0, sizeof(st->prev_ble_sco_conflict_flag));
|
memset(st->prev_ble_sco_conflict_flag, 0,
|
||||||
|
sizeof(st->prev_ble_sco_conflict_flag));
|
||||||
memset(st->hist, 0, sizeof(st->hist));
|
memset(st->hist, 0, sizeof(st->hist));
|
||||||
}
|
}
|
||||||
|
|
||||||
plc_type_t packet_loss_detection_process(PacketLossState *st, uint8_t *sbc_buf)
|
plc_type_t packet_loss_detection_process(PacketLossState *st,
|
||||||
{
|
uint8_t *sbc_buf) {
|
||||||
plc_type_t plc_type = PLC_TYPE_PASS;
|
plc_type_t plc_type = PLC_TYPE_PASS;
|
||||||
|
|
||||||
#ifdef ENABLE_BLE_CONFLICT_CHECK
|
#ifdef ENABLE_BLE_CONFLICT_CHECK
|
||||||
|
@ -267,22 +256,18 @@ plc_type_t packet_loss_detection_process(PacketLossState *st, uint8_t *sbc_buf)
|
||||||
if (st->last_seq_num == 0xff) {
|
if (st->last_seq_num == 0xff) {
|
||||||
if (seq_num == 0xff) {
|
if (seq_num == 0xff) {
|
||||||
plc_type = PLC_TYPE_SEQUENCE_DISCONTINUE;
|
plc_type = PLC_TYPE_SEQUENCE_DISCONTINUE;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
plc_type = PLC_TYPE_PASS;
|
plc_type = PLC_TYPE_PASS;
|
||||||
}
|
}
|
||||||
st->last_seq_num = seq_num;
|
st->last_seq_num = seq_num;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
if (seq_num == 0xff) {
|
if (seq_num == 0xff) {
|
||||||
st->last_seq_num = 0xff;
|
st->last_seq_num = 0xff;
|
||||||
plc_type = PLC_TYPE_SEQUENCE_DISCONTINUE;
|
plc_type = PLC_TYPE_SEQUENCE_DISCONTINUE;
|
||||||
}
|
} else if (seq_num == get_next_sequence_num(st->last_seq_num)) {
|
||||||
else if (seq_num == get_next_sequence_num(st->last_seq_num)) {
|
|
||||||
st->last_seq_num = seq_num;
|
st->last_seq_num = seq_num;
|
||||||
plc_type = PLC_TYPE_PASS;
|
plc_type = PLC_TYPE_PASS;
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
st->last_seq_num = 0xff;
|
st->last_seq_num = 0xff;
|
||||||
plc_type = PLC_TYPE_SEQUENCE_DISCONTINUE;
|
plc_type = PLC_TYPE_SEQUENCE_DISCONTINUE;
|
||||||
}
|
}
|
||||||
|
@ -298,10 +283,10 @@ plc_type_t packet_loss_detection_process(PacketLossState *st, uint8_t *sbc_buf)
|
||||||
return plc_type;
|
return plc_type;
|
||||||
}
|
}
|
||||||
|
|
||||||
void packet_loss_detection_update_histogram(PacketLossState *st, plc_type_t plc_type)
|
void packet_loss_detection_update_histogram(PacketLossState *st,
|
||||||
{
|
plc_type_t plc_type) {
|
||||||
if (plc_type < 0 || plc_type >= PLC_TYPE_NUM) {
|
if (plc_type < 0 || plc_type >= PLC_TYPE_NUM) {
|
||||||
TRACE(2,"[%s] plc type %d is invalid", __FUNCTION__, plc_type);
|
TRACE(2, "[%s] plc type %d is invalid", __FUNCTION__, plc_type);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -313,16 +298,16 @@ void packet_loss_detection_update_histogram(PacketLossState *st, plc_type_t plc_
|
||||||
st->hist[plc_type] += 1;
|
st->hist[plc_type] += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void packet_loss_detection_report(PacketLossState *st)
|
void packet_loss_detection_report(PacketLossState *st) {
|
||||||
{
|
|
||||||
uint32_t packet_loss_num = 0;
|
uint32_t packet_loss_num = 0;
|
||||||
|
|
||||||
for (uint8_t i = 1; i < PLC_TYPE_NUM; i++) {
|
for (uint8_t i = 1; i < PLC_TYPE_NUM; i++) {
|
||||||
TRACE(3,"[%s] plc type %d occurs %d times", __FUNCTION__, i, st->hist[i]);
|
TRACE(3, "[%s] plc type %d occurs %d times", __FUNCTION__, i, st->hist[i]);
|
||||||
packet_loss_num += st->hist[i];
|
packet_loss_num += st->hist[i];
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t packet_total_num = st->hist[0] + packet_loss_num;
|
uint32_t packet_total_num = st->hist[0] + packet_loss_num;
|
||||||
TRACE(4,"[%s] packet loss percent %d/10000(%d/%d)", __FUNCTION__,
|
TRACE(4, "[%s] packet loss percent %d/10000(%d/%d)", __FUNCTION__,
|
||||||
(int32_t)(10000.f * packet_loss_num/ packet_total_num), packet_loss_num, packet_total_num);
|
(int32_t)(10000.f * packet_loss_num / packet_total_num),
|
||||||
|
packet_loss_num, packet_total_num);
|
||||||
}
|
}
|
File diff suppressed because it is too large
Load Diff
|
@ -15,28 +15,28 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
/* rbpcmbuf source */
|
/* rbpcmbuf source */
|
||||||
/* pcmbuf management & af control & mixer */
|
/* pcmbuf management & af control & mixer */
|
||||||
#include <string.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef MBED
|
#ifdef MBED
|
||||||
#include "mbed.h"
|
#include "mbed.h"
|
||||||
#include "rtos.h"
|
#include "rtos.h"
|
||||||
#endif
|
#endif
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "cqueue.h"
|
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
#include "cqueue.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
|
||||||
#include "rbplay.h"
|
|
||||||
#include "rbpcmbuf.h"
|
#include "rbpcmbuf.h"
|
||||||
|
#include "rbplay.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#define RB_PCMBUF_DMA_BUFFER_SIZE (1024*12)
|
#define RB_PCMBUF_DMA_BUFFER_SIZE (1024 * 12)
|
||||||
#define RB_PCMBUF_MEDIA_BUFFER_SIZE (1024*12)
|
#define RB_PCMBUF_MEDIA_BUFFER_SIZE (1024 * 12)
|
||||||
#define RB_DECODE_OUT_BUFFER_SIZE 1024
|
#define RB_DECODE_OUT_BUFFER_SIZE 1024
|
||||||
|
|
||||||
static uint8_t *rb_decode_out_buff;
|
static uint8_t *rb_decode_out_buff;
|
||||||
|
@ -47,17 +47,17 @@ static osMutexId _rb_media_buf_queue_mutex_id = NULL;
|
||||||
static osMutexDef(_rb_media_buf_queue_mutex);
|
static osMutexDef(_rb_media_buf_queue_mutex);
|
||||||
|
|
||||||
#define LOCK_MEDIA_BUF_QUEUE() \
|
#define LOCK_MEDIA_BUF_QUEUE() \
|
||||||
if(osErrorISR == osMutexWait(_rb_media_buf_queue_mutex_id, osWaitForever)) {\
|
if (osErrorISR == \
|
||||||
error("%s LOCK_MEDIA_BUF_QUEUE from IRQ!!!!!!!\n",__func__);\
|
osMutexWait(_rb_media_buf_queue_mutex_id, osWaitForever)) { \
|
||||||
}\
|
error("%s LOCK_MEDIA_BUF_QUEUE from IRQ!!!!!!!\n", __func__); \
|
||||||
|
}
|
||||||
|
|
||||||
#define UNLOCK_MEDIA_BUF_QUEUE() \
|
#define UNLOCK_MEDIA_BUF_QUEUE() \
|
||||||
if(osErrorISR == osMutexRelease(_rb_media_buf_queue_mutex_id)){ \
|
if (osErrorISR == osMutexRelease(_rb_media_buf_queue_mutex_id)) { \
|
||||||
error("%s UNLOCK_MEDIA_BUF_QUEUE from IRQ!!!!!!\n"); \
|
error("%s UNLOCK_MEDIA_BUF_QUEUE from IRQ!!!!!!\n"); \
|
||||||
} \
|
}
|
||||||
|
|
||||||
static uint32_t rbplay_more_data(uint8_t *buf, uint32_t len)
|
static uint32_t rbplay_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
CQItemType *e1 = NULL;
|
CQItemType *e1 = NULL;
|
||||||
CQItemType *e2 = NULL;
|
CQItemType *e2 = NULL;
|
||||||
unsigned int len1 = 0;
|
unsigned int len1 = 0;
|
||||||
|
@ -83,16 +83,17 @@ static uint32_t rbplay_more_data(uint8_t *buf, uint32_t len)
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uint8_t rb_ctl_get_vol(void);
|
extern uint8_t rb_ctl_get_vol(void);
|
||||||
void rb_pcmbuf_init(void)
|
void rb_pcmbuf_init(void) {
|
||||||
{
|
|
||||||
info("pcmbuff init");
|
info("pcmbuff init");
|
||||||
if(!_rb_media_buf_queue_mutex_id)
|
if (!_rb_media_buf_queue_mutex_id)
|
||||||
_rb_media_buf_queue_mutex_id = osMutexCreate((osMutex(_rb_media_buf_queue_mutex)));
|
_rb_media_buf_queue_mutex_id =
|
||||||
|
osMutexCreate((osMutex(_rb_media_buf_queue_mutex)));
|
||||||
|
|
||||||
app_audio_mempool_init();
|
app_audio_mempool_init();
|
||||||
|
|
||||||
app_audio_mempool_get_buff(&rb_pcmbuf_media_buf, RB_PCMBUF_MEDIA_BUFFER_SIZE);
|
app_audio_mempool_get_buff(&rb_pcmbuf_media_buf, RB_PCMBUF_MEDIA_BUFFER_SIZE);
|
||||||
InitCQueue(&rb_pcmbuf_media_buf_queue, RB_PCMBUF_MEDIA_BUFFER_SIZE, (unsigned char *)rb_pcmbuf_media_buf);
|
InitCQueue(&rb_pcmbuf_media_buf_queue, RB_PCMBUF_MEDIA_BUFFER_SIZE,
|
||||||
|
(unsigned char *)rb_pcmbuf_media_buf);
|
||||||
|
|
||||||
app_audio_mempool_get_buff(&rbplay_dma_buffer, RB_PCMBUF_DMA_BUFFER_SIZE);
|
app_audio_mempool_get_buff(&rbplay_dma_buffer, RB_PCMBUF_DMA_BUFFER_SIZE);
|
||||||
app_audio_mempool_get_buff(&rb_decode_out_buff, RB_DECODE_OUT_BUFFER_SIZE);
|
app_audio_mempool_get_buff(&rb_decode_out_buff, RB_DECODE_OUT_BUFFER_SIZE);
|
||||||
|
@ -111,30 +112,27 @@ void rb_pcmbuf_init(void)
|
||||||
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(rbplay_dma_buffer);
|
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(rbplay_dma_buffer);
|
||||||
stream_cfg.data_size = RB_PCMBUF_DMA_BUFFER_SIZE;
|
stream_cfg.data_size = RB_PCMBUF_DMA_BUFFER_SIZE;
|
||||||
|
|
||||||
af_stream_open(AUD_STREAM_ID_0,AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
af_stream_start(AUD_STREAM_ID_0,AUD_STREAM_PLAYBACK);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *rb_pcmbuf_request_buffer(int *size)
|
void *rb_pcmbuf_request_buffer(int *size) {
|
||||||
{
|
|
||||||
*size = RB_DECODE_OUT_BUFFER_SIZE / 4;
|
*size = RB_DECODE_OUT_BUFFER_SIZE / 4;
|
||||||
return rb_decode_out_buff;
|
return rb_decode_out_buff;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_pcmbuf_write(unsigned int size)
|
void rb_pcmbuf_write(unsigned int size) {
|
||||||
{
|
int ret;
|
||||||
int ret ;
|
|
||||||
do {
|
do {
|
||||||
LOCK_MEDIA_BUF_QUEUE();
|
LOCK_MEDIA_BUF_QUEUE();
|
||||||
ret = EnCQueue(&rb_pcmbuf_media_buf_queue, (CQItemType *)rb_decode_out_buff, size*(2*2));
|
ret = EnCQueue(&rb_pcmbuf_media_buf_queue, (CQItemType *)rb_decode_out_buff,
|
||||||
|
size * (2 * 2));
|
||||||
UNLOCK_MEDIA_BUF_QUEUE();
|
UNLOCK_MEDIA_BUF_QUEUE();
|
||||||
osThreadYield();
|
osThreadYield();
|
||||||
} while (ret == CQ_ERR);
|
} while (ret == CQ_ERR);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_pcmbuf_stop(void)
|
void rb_pcmbuf_stop(void) {
|
||||||
{
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_stop(AUD_STREAM_ID_0,AUD_STREAM_PLAYBACK);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0,AUD_STREAM_PLAYBACK);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,34 +16,34 @@
|
||||||
/* rbplay source */
|
/* rbplay source */
|
||||||
/* playback control & rockbox codec porting & codec thread */
|
/* playback control & rockbox codec porting & codec thread */
|
||||||
|
|
||||||
#include <string.h>
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
#ifdef MBED
|
#ifdef MBED
|
||||||
#include "mbed.h"
|
#include "mbed.h"
|
||||||
#include "rtos.h"
|
#include "rtos.h"
|
||||||
#endif
|
#endif
|
||||||
#include "metadata.h"
|
#include "app_overlay.h"
|
||||||
|
#include "apps.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
#include "codecs.h"
|
#include "codecs.h"
|
||||||
#include "eq_export.h"
|
#include "eq_export.h"
|
||||||
#include "hal_overlay.h"
|
#include "hal_overlay.h"
|
||||||
#include "app_overlay.h"
|
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "apps.h"
|
#include "metadata.h"
|
||||||
|
|
||||||
#include "rbpcmbuf.h"
|
#include "app_key.h"
|
||||||
#include "rbplaysd.h"
|
|
||||||
#include "app_thread.h"
|
#include "app_thread.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
#include "app_key.h"
|
#include "rbpcmbuf.h"
|
||||||
#include "rbplay.h"
|
#include "rbplay.h"
|
||||||
|
#include "rbplaysd.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
#ifdef __TWS__
|
#ifdef __TWS__
|
||||||
|
@ -51,25 +51,27 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// TODO: remove
|
// TODO: remove
|
||||||
#define BT_STREAM_RBCODEC 0x10 //from rockbox decoder
|
#define BT_STREAM_RBCODEC 0x10 // from rockbox decoder
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
void flac_codec_main(int r);
|
void flac_codec_main(int r);
|
||||||
void flac_codec_run(void);
|
void flac_codec_run(void);
|
||||||
void wav_codec_main(int r);
|
void wav_codec_main(int r);
|
||||||
void wav_codec_run(void);
|
void wav_codec_run(void);
|
||||||
void mpa_codec_main(int r);
|
void mpa_codec_main(int r);
|
||||||
void mpa_codec_run(void);
|
void mpa_codec_run(void);
|
||||||
void ape_codec_main(int r);
|
void ape_codec_main(int r);
|
||||||
void ape_codec_run(void);
|
void ape_codec_run(void);
|
||||||
void sbc_codec_main(int r);
|
void sbc_codec_main(int r);
|
||||||
void sbc_codec_run(void);
|
void sbc_codec_run(void);
|
||||||
}
|
}
|
||||||
|
|
||||||
extern void rb_pcm_player_open(enum AUD_BITS_T bits,enum AUD_SAMPRATE_T sample_rate,enum AUD_CHANNEL_NUM_T channel_num,uint8_t vol) ;
|
extern void rb_pcm_player_open(enum AUD_BITS_T bits,
|
||||||
|
enum AUD_SAMPRATE_T sample_rate,
|
||||||
|
enum AUD_CHANNEL_NUM_T channel_num, uint8_t vol);
|
||||||
|
|
||||||
#if defined(__TWS__)
|
#if defined(__TWS__)
|
||||||
typedef struct _rb_tws_codec_info{
|
typedef struct _rb_tws_codec_info {
|
||||||
uint8_t update_codec_info;
|
uint8_t update_codec_info;
|
||||||
int32_t sample_freq;
|
int32_t sample_freq;
|
||||||
uint8_t channel_num;
|
uint8_t channel_num;
|
||||||
|
@ -87,12 +89,13 @@ typedef struct {
|
||||||
} RBTHREAD_MSG_BLOCK;
|
} RBTHREAD_MSG_BLOCK;
|
||||||
|
|
||||||
#define RBTHREAD_MAILBOX_MAX (10)
|
#define RBTHREAD_MAILBOX_MAX (10)
|
||||||
osMailQDef (rb_decode_mailbox, RBTHREAD_MAILBOX_MAX, RBTHREAD_MSG_BLOCK);
|
osMailQDef(rb_decode_mailbox, RBTHREAD_MAILBOX_MAX, RBTHREAD_MSG_BLOCK);
|
||||||
int rb_decode_mailbox_put(RBTHREAD_MSG_BLOCK* msg_src);
|
int rb_decode_mailbox_put(RBTHREAD_MSG_BLOCK *msg_src);
|
||||||
static osMailQId rb_decode_mailbox = NULL;
|
static osMailQId rb_decode_mailbox = NULL;
|
||||||
|
|
||||||
static void rb_decode_thread(void const *argument);
|
static void rb_decode_thread(void const *argument);
|
||||||
osThreadDef(rb_decode_thread, osPriorityAboveNormal, 1, 1024 * 2, "rb_decorder");
|
osThreadDef(rb_decode_thread, osPriorityAboveNormal, 1, 1024 * 2,
|
||||||
|
"rb_decorder");
|
||||||
|
|
||||||
// rbcodec info
|
// rbcodec info
|
||||||
static int song_fd;
|
static int song_fd;
|
||||||
|
@ -118,19 +121,15 @@ extern void app_rbplay_exit(void);
|
||||||
extern void bt_change_to_iic(APP_KEY_STATUS *status, void *param);
|
extern void bt_change_to_iic(APP_KEY_STATUS *status, void *param);
|
||||||
|
|
||||||
extern void rb_thread_send_switch(bool next);
|
extern void rb_thread_send_switch(bool next);
|
||||||
extern void rb_thread_send_status_change(void );
|
extern void rb_thread_send_status_change(void);
|
||||||
|
|
||||||
enum APP_SYSFREQ_FREQ_T rb_player_get_work_freq(void);
|
enum APP_SYSFREQ_FREQ_T rb_player_get_work_freq(void);
|
||||||
|
|
||||||
static void rb_player_sync_close_done(void)
|
static void rb_player_sync_close_done(void) { thread_tid_waiter = NULL; }
|
||||||
{
|
|
||||||
thread_tid_waiter = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
extern void rb_check_stream_reconfig(int32_t freq, uint8_t ch);
|
extern void rb_check_stream_reconfig(int32_t freq, uint8_t ch);
|
||||||
static void f_codec_pcmbuf_insert_callback(
|
static void f_codec_pcmbuf_insert_callback(const void *ch1, const void *ch2,
|
||||||
const void *ch1, const void *ch2, int count)
|
int count) {
|
||||||
{
|
|
||||||
struct dsp_buffer src;
|
struct dsp_buffer src;
|
||||||
struct dsp_buffer dst;
|
struct dsp_buffer dst;
|
||||||
|
|
||||||
|
@ -140,7 +139,7 @@ static void f_codec_pcmbuf_insert_callback(
|
||||||
src.proc_mask = 0;
|
src.proc_mask = 0;
|
||||||
|
|
||||||
if (rb_codec_running() == 0)
|
if (rb_codec_running() == 0)
|
||||||
return ;
|
return;
|
||||||
|
|
||||||
#ifndef __TWS__
|
#ifndef __TWS__
|
||||||
while (src.remcount > 0) {
|
while (src.remcount > 0) {
|
||||||
|
@ -160,17 +159,19 @@ static void f_codec_pcmbuf_insert_callback(
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
|
|
||||||
if(codec_info.update_codec_info){
|
if (codec_info.update_codec_info) {
|
||||||
rb_set_sbc_encoder_freq_ch(codec_info.sample_freq, codec_info.channel_num); //should call this to set trigger timer
|
rb_set_sbc_encoder_freq_ch(
|
||||||
|
codec_info.sample_freq,
|
||||||
|
codec_info.channel_num); // should call this to set trigger timer
|
||||||
rb_check_stream_reconfig(codec_info.sample_freq, codec_info.channel_num);
|
rb_check_stream_reconfig(codec_info.sample_freq, codec_info.channel_num);
|
||||||
codec_info.update_codec_info = 0;
|
codec_info.update_codec_info = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(tws_local_player_need_tran_2_slave()){
|
if (tws_local_player_need_tran_2_slave()) {
|
||||||
rb_tws_start_master_player(BT_STREAM_RBCODEC);
|
rb_tws_start_master_player(BT_STREAM_RBCODEC);
|
||||||
}
|
}
|
||||||
while(1){
|
while (1) {
|
||||||
uint8_t * pcm_buff = NULL;
|
uint8_t *pcm_buff = NULL;
|
||||||
dst.remcount = 0;
|
dst.remcount = 0;
|
||||||
dst.bufcount = MIN(src.remcount, 128); /* Arbitrary min request */
|
dst.bufcount = MIN(src.remcount, 128); /* Arbitrary min request */
|
||||||
dst.p16out = (short *)rb_pcmbuf_request_buffer(&dst.bufcount);
|
dst.p16out = (short *)rb_pcmbuf_request_buffer(&dst.bufcount);
|
||||||
|
@ -180,7 +181,7 @@ static void f_codec_pcmbuf_insert_callback(
|
||||||
dsp_process(ci->dsp, &src, &dst);
|
dsp_process(ci->dsp, &src, &dst);
|
||||||
|
|
||||||
if (dst.remcount > 0) {
|
if (dst.remcount > 0) {
|
||||||
while(rb_push_pcm_in_tws_buffer(pcm_buff, dst.remcount*2*2) == 0){
|
while (rb_push_pcm_in_tws_buffer(pcm_buff, dst.remcount * 2 * 2) == 0) {
|
||||||
osDelay(2);
|
osDelay(2);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -192,46 +193,39 @@ static void f_codec_pcmbuf_insert_callback(
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void f_audio_codec_update_elapsed(unsigned long elapsed)
|
static void f_audio_codec_update_elapsed(unsigned long elapsed) {
|
||||||
{
|
// info("Update elapsed: %d", elapsed);
|
||||||
//info("Update elapsed: %d", elapsed);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t f_codec_filebuf_callback(void *ptr, size_t size)
|
static size_t f_codec_filebuf_callback(void *ptr, size_t size) {
|
||||||
{
|
|
||||||
ssize_t ret;
|
ssize_t ret;
|
||||||
ret = read(song_fd, ptr, size);
|
ret = read(song_fd, ptr, size);
|
||||||
if(ret < 0) {
|
if (ret < 0) {
|
||||||
error("File read error: %d",ret);
|
error("File read error: %d", ret);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * f_codec_request_buffer_callback(size_t *realsize, size_t reqsize)
|
static void *f_codec_request_buffer_callback(size_t *realsize, size_t reqsize) {
|
||||||
{
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void * f_codec_advance_buffer_callback(size_t amount)
|
static void *f_codec_advance_buffer_callback(size_t amount) {
|
||||||
{
|
|
||||||
off_t ret = lseek(song_fd, (off_t)(ci->curpos + amount), SEEK_SET);
|
off_t ret = lseek(song_fd, (off_t)(ci->curpos + amount), SEEK_SET);
|
||||||
if(ret < 0) {
|
if (ret < 0) {
|
||||||
error("File seek fail");
|
error("File seek fail");
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
ci->curpos += amount;
|
ci->curpos += amount;
|
||||||
return (void *)ci;
|
return (void *)ci;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool f_codec_seek_buffer_callback(size_t newpos)
|
static bool f_codec_seek_buffer_callback(size_t newpos) {
|
||||||
{
|
|
||||||
off_t ret = lseek(song_fd, (off_t)newpos, SEEK_SET);
|
off_t ret = lseek(song_fd, (off_t)newpos, SEEK_SET);
|
||||||
if(ret < 0) {
|
if (ret < 0) {
|
||||||
error("File seek fail");
|
error("File seek fail");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -240,48 +234,38 @@ static bool f_codec_seek_buffer_callback(size_t newpos)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void f_codec_seek_complete_callback(void)
|
static void f_codec_seek_complete_callback(void) {
|
||||||
{
|
|
||||||
info("Seek complete");
|
info("Seek complete");
|
||||||
dsp_configure(ci->dsp, DSP_FLUSH, 0);
|
dsp_configure(ci->dsp, DSP_FLUSH, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void f_audio_codec_update_offset(size_t offset)
|
static void f_audio_codec_update_offset(size_t offset) {}
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
static void f_codec_configure_callback(int setting, intptr_t value)
|
static void f_codec_configure_callback(int setting, intptr_t value) {
|
||||||
{
|
|
||||||
dsp_configure(ci->dsp, setting, value);
|
dsp_configure(ci->dsp, setting, value);
|
||||||
#ifdef __TWS__
|
#ifdef __TWS__
|
||||||
if(setting == DSP_SET_FREQUENCY){
|
if (setting == DSP_SET_FREQUENCY) {
|
||||||
if(codec_info.sample_freq != value)
|
if (codec_info.sample_freq != value)
|
||||||
codec_info.update_codec_info = 1;
|
codec_info.update_codec_info = 1;
|
||||||
codec_info.sample_freq = value;
|
codec_info.sample_freq = value;
|
||||||
}
|
} else if (setting == DSP_SET_STEREO_MODE) {
|
||||||
else if(setting == DSP_SET_STEREO_MODE){
|
if (codec_info.channel_num != (value == STEREO_MONO ? 1 : 2))
|
||||||
if(codec_info.channel_num != (value == STEREO_MONO ? 1 : 2))
|
|
||||||
codec_info.update_codec_info = 1;
|
codec_info.update_codec_info = 1;
|
||||||
codec_info.channel_num = value == STEREO_MONO ? 1 : 2;
|
codec_info.channel_num = value == STEREO_MONO ? 1 : 2;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum codec_command_action f_codec_get_command_callback(intptr_t *param)
|
static enum codec_command_action f_codec_get_command_callback(intptr_t *param) {
|
||||||
{
|
|
||||||
if (rb_decode_halt_flag == 1)
|
if (rb_decode_halt_flag == 1)
|
||||||
return CODEC_ACTION_HALT ;
|
return CODEC_ACTION_HALT;
|
||||||
|
|
||||||
return CODEC_ACTION_NULL;
|
return CODEC_ACTION_NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool f_codec_loop_track_callback(void)
|
static bool f_codec_loop_track_callback(void) { return false; }
|
||||||
{
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void init_ci_file(void)
|
static void init_ci_file(void) {
|
||||||
{
|
|
||||||
ci->codec_get_buffer = 0;
|
ci->codec_get_buffer = 0;
|
||||||
ci->pcmbuf_insert = f_codec_pcmbuf_insert_callback;
|
ci->pcmbuf_insert = f_codec_pcmbuf_insert_callback;
|
||||||
ci->set_elapsed = f_audio_codec_update_elapsed;
|
ci->set_elapsed = f_audio_codec_update_elapsed;
|
||||||
|
@ -296,8 +280,7 @@ static void init_ci_file(void)
|
||||||
ci->loop_track = f_codec_loop_track_callback;
|
ci->loop_track = f_codec_loop_track_callback;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rb_play_init(void)
|
static void rb_play_init(void) {
|
||||||
{
|
|
||||||
init_dsp();
|
init_dsp();
|
||||||
|
|
||||||
init_ci_file();
|
init_ci_file();
|
||||||
|
@ -307,24 +290,21 @@ static void rb_play_init(void)
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_play_codec_init(void)
|
void rb_play_codec_init(void) {
|
||||||
{
|
|
||||||
RBTHREAD_MSG_BLOCK msg;
|
RBTHREAD_MSG_BLOCK msg;
|
||||||
msg.evt = (uint32_t)RB_CTRL_CMD_CODEC_INIT;
|
msg.evt = (uint32_t)RB_CTRL_CMD_CODEC_INIT;
|
||||||
msg.arg = (uint32_t)0;
|
msg.arg = (uint32_t)0;
|
||||||
rb_decode_mailbox_put(&msg);
|
rb_decode_mailbox_put(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_play_codec_run(void)
|
void rb_play_codec_run(void) {
|
||||||
{
|
|
||||||
RBTHREAD_MSG_BLOCK msg;
|
RBTHREAD_MSG_BLOCK msg;
|
||||||
msg.evt = (uint32_t)RB_CTRL_CMD_CODEC_RUN;
|
msg.evt = (uint32_t)RB_CTRL_CMD_CODEC_RUN;
|
||||||
msg.arg = (uint32_t)0;
|
msg.arg = (uint32_t)0;
|
||||||
rb_decode_mailbox_put(&msg);
|
rb_decode_mailbox_put(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rb_codec_init_desc(void )
|
static int rb_codec_init_desc(void) {
|
||||||
{
|
|
||||||
info("Init decode format: %d", song_format);
|
info("Init decode format: %d", song_format);
|
||||||
|
|
||||||
switch (song_format) {
|
switch (song_format) {
|
||||||
|
@ -361,10 +341,9 @@ static int rb_codec_init_desc(void )
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rb_codec_loop_on(void)
|
static int rb_codec_loop_on(void) {
|
||||||
{
|
|
||||||
#ifdef __TWS__
|
#ifdef __TWS__
|
||||||
//set start transfer to slave
|
// set start transfer to slave
|
||||||
tws_local_player_set_tran_2_slave_flag(1);
|
tws_local_player_set_tran_2_slave_flag(1);
|
||||||
#endif
|
#endif
|
||||||
switch (song_format) {
|
switch (song_format) {
|
||||||
|
@ -394,11 +373,10 @@ static int rb_codec_loop_on(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int rb_thread_process_evt(RB_CTRL_CMD_T evt)
|
static int rb_thread_process_evt(RB_CTRL_CMD_T evt) {
|
||||||
{
|
|
||||||
info("Decode event:%d", evt);
|
info("Decode event:%d", evt);
|
||||||
|
|
||||||
switch(evt) {
|
switch (evt) {
|
||||||
case RB_CTRL_CMD_CODEC_INIT:
|
case RB_CTRL_CMD_CODEC_INIT:
|
||||||
rb_decode_halt_flag = 0;
|
rb_decode_halt_flag = 0;
|
||||||
|
|
||||||
|
@ -427,36 +405,35 @@ static int rb_thread_process_evt(RB_CTRL_CMD_T evt)
|
||||||
#endif
|
#endif
|
||||||
song_fd = 0;
|
song_fd = 0;
|
||||||
rb_decode_halt_flag = 1;
|
rb_decode_halt_flag = 1;
|
||||||
if(thread_tid_waiter) {
|
if (thread_tid_waiter) {
|
||||||
rb_player_sync_close_done();
|
rb_player_sync_close_done();
|
||||||
} else {
|
} else {
|
||||||
rb_thread_send_status_change();
|
rb_thread_send_status_change();
|
||||||
rb_thread_send_switch(true);
|
rb_thread_send_switch(true);
|
||||||
}
|
}
|
||||||
#ifdef __TWS__
|
#ifdef __TWS__
|
||||||
//should update codec info after play one music
|
// should update codec info after play one music
|
||||||
codec_info.update_codec_info = 1;
|
codec_info.update_codec_info = 1;
|
||||||
#endif
|
#endif
|
||||||
rbplay_loop_on = 0;
|
rbplay_loop_on = 0;
|
||||||
info("Play end");
|
info("Play end");
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
error("Unkown rb cmd %d\n",evt);
|
error("Unkown rb cmd %d\n", evt);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rb_decode_mailbox_put(RBTHREAD_MSG_BLOCK* msg_src)
|
int rb_decode_mailbox_put(RBTHREAD_MSG_BLOCK *msg_src) {
|
||||||
{
|
|
||||||
osStatus status;
|
osStatus status;
|
||||||
|
|
||||||
RBTHREAD_MSG_BLOCK *msg_p = NULL;
|
RBTHREAD_MSG_BLOCK *msg_p = NULL;
|
||||||
|
|
||||||
msg_p = (RBTHREAD_MSG_BLOCK*)osMailAlloc(rb_decode_mailbox, 0);
|
msg_p = (RBTHREAD_MSG_BLOCK *)osMailAlloc(rb_decode_mailbox, 0);
|
||||||
if(!msg_p) {
|
if (!msg_p) {
|
||||||
TRACE(3,"%s fail, evt:%d,arg=%d \n",__func__,msg_src->evt,msg_src->arg);
|
TRACE(3, "%s fail, evt:%d,arg=%d \n", __func__, msg_src->evt, msg_src->arg);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -468,8 +445,7 @@ int rb_decode_mailbox_put(RBTHREAD_MSG_BLOCK* msg_src)
|
||||||
return (int)status;
|
return (int)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rb_decode_mailbox_free(RBTHREAD_MSG_BLOCK* msg_p)
|
int rb_decode_mailbox_free(RBTHREAD_MSG_BLOCK *msg_p) {
|
||||||
{
|
|
||||||
osStatus status;
|
osStatus status;
|
||||||
|
|
||||||
status = osMailFree(rb_decode_mailbox, msg_p);
|
status = osMailFree(rb_decode_mailbox, msg_p);
|
||||||
|
@ -477,8 +453,7 @@ int rb_decode_mailbox_free(RBTHREAD_MSG_BLOCK* msg_p)
|
||||||
return (int)status;
|
return (int)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rb_decode_mailbox_get(RBTHREAD_MSG_BLOCK** msg_p)
|
int rb_decode_mailbox_get(RBTHREAD_MSG_BLOCK **msg_p) {
|
||||||
{
|
|
||||||
osEvent evt;
|
osEvent evt;
|
||||||
evt = osMailGet(rb_decode_mailbox, osWaitForever);
|
evt = osMailGet(rb_decode_mailbox, osWaitForever);
|
||||||
if (evt.status == osEventMail) {
|
if (evt.status == osEventMail) {
|
||||||
|
@ -488,34 +463,31 @@ int rb_decode_mailbox_get(RBTHREAD_MSG_BLOCK** msg_p)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rb_decode_thread(void const *argument)
|
static void rb_decode_thread(void const *argument) {
|
||||||
{
|
|
||||||
RB_CTRL_CMD_T action;
|
RB_CTRL_CMD_T action;
|
||||||
RBTHREAD_MSG_BLOCK* msg_p;
|
RBTHREAD_MSG_BLOCK *msg_p;
|
||||||
|
|
||||||
while(1) {
|
while (1) {
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_PLAYER, APP_SYSFREQ_32K);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_PLAYER, APP_SYSFREQ_32K);
|
||||||
// evt = osSignalWait(0, osWaitForever);
|
// evt = osSignalWait(0, osWaitForever);
|
||||||
if(0 == rb_decode_mailbox_get(&msg_p)) {
|
if (0 == rb_decode_mailbox_get(&msg_p)) {
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_PLAYER, APP_SYSFREQ_104M);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_PLAYER, APP_SYSFREQ_104M);
|
||||||
|
|
||||||
action = (RB_CTRL_CMD_T) msg_p->evt;
|
action = (RB_CTRL_CMD_T)msg_p->evt;
|
||||||
rb_caller_tid = (osThreadId) msg_p->arg ;
|
rb_caller_tid = (osThreadId)msg_p->arg;
|
||||||
|
|
||||||
TRACE(3,"[%s] action:%d ,tid,0x%x", __func__, action,rb_caller_tid);
|
TRACE(3, "[%s] action:%d ,tid,0x%x", __func__, action, rb_caller_tid);
|
||||||
rb_thread_process_evt(action);
|
rb_thread_process_evt(action);
|
||||||
|
|
||||||
rb_decode_mailbox_free(msg_p);
|
rb_decode_mailbox_free(msg_p);
|
||||||
if( rb_caller_tid)
|
if (rb_caller_tid)
|
||||||
osSignalSet(rb_decode_tid, 0x1203);
|
osSignalSet(rb_decode_tid, 0x1203);
|
||||||
rb_caller_tid = NULL;
|
rb_caller_tid = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_rbplay_open(void)
|
int app_rbplay_open(void) {
|
||||||
{
|
|
||||||
if (rb_decode_tid != NULL) {
|
if (rb_decode_tid != NULL) {
|
||||||
warn("Decode thread reopen");
|
warn("Decode thread reopen");
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -536,40 +508,30 @@ int app_rbplay_open(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int rb_codec_running(void)
|
int rb_codec_running(void) { return ((rb_decode_halt_flag == 0) ? 1 : 0); }
|
||||||
{
|
|
||||||
return ((rb_decode_halt_flag == 0)?1:0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void rb_codec_set_halt(int halt)
|
void rb_codec_set_halt(int halt) { rb_decode_halt_flag = halt; }
|
||||||
{
|
|
||||||
rb_decode_halt_flag = halt;
|
|
||||||
}
|
|
||||||
|
|
||||||
void rb_thread_set_decode_vars(int fd, int type ,void* id3)
|
void rb_thread_set_decode_vars(int fd, int type, void *id3) {
|
||||||
{
|
song_fd = fd;
|
||||||
song_fd =fd;
|
|
||||||
song_format = type;
|
song_format = type;
|
||||||
current_id3 = (struct mp3entry *)id3;
|
current_id3 = (struct mp3entry *)id3;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_player_sync_set_wait_thread(osThreadId tid)
|
void rb_player_sync_set_wait_thread(osThreadId tid) {
|
||||||
{
|
if (rbplay_loop_on)
|
||||||
if(rbplay_loop_on)
|
|
||||||
thread_tid_waiter = tid;
|
thread_tid_waiter = tid;
|
||||||
else
|
else
|
||||||
thread_tid_waiter = NULL;
|
thread_tid_waiter = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
void rb_player_sync_wait_close(void )
|
void rb_player_sync_wait_close(void) {
|
||||||
{
|
while (NULL != thread_tid_waiter) {
|
||||||
while(NULL != thread_tid_waiter) {
|
|
||||||
osThreadYield();
|
osThreadYield();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
enum APP_SYSFREQ_FREQ_T rb_player_get_work_freq(void)
|
enum APP_SYSFREQ_FREQ_T rb_player_get_work_freq(void) {
|
||||||
{
|
|
||||||
enum APP_SYSFREQ_FREQ_T freq;
|
enum APP_SYSFREQ_FREQ_T freq;
|
||||||
|
|
||||||
hal_sysfreq_print();
|
hal_sysfreq_print();
|
||||||
|
@ -577,22 +539,22 @@ enum APP_SYSFREQ_FREQ_T rb_player_get_work_freq(void)
|
||||||
info("bitrate:%d freq:%d\n", ci->id3->bitrate, ci->id3->frequency);
|
info("bitrate:%d freq:%d\n", ci->id3->bitrate, ci->id3->frequency);
|
||||||
#ifndef __TWS__
|
#ifndef __TWS__
|
||||||
enum AUD_SAMPRATE_T sample_rate = AUD_SAMPRATE_44100;
|
enum AUD_SAMPRATE_T sample_rate = AUD_SAMPRATE_44100;
|
||||||
sample_rate =(enum AUD_SAMPRATE_T ) ci->id3->frequency;
|
sample_rate = (enum AUD_SAMPRATE_T)ci->id3->frequency;
|
||||||
if(sample_rate > AUD_SAMPRATE_48000)
|
if (sample_rate > AUD_SAMPRATE_48000)
|
||||||
freq = APP_SYSFREQ_208M;
|
freq = APP_SYSFREQ_208M;
|
||||||
else if (sample_rate > AUD_SAMPRATE_44100)
|
else if (sample_rate > AUD_SAMPRATE_44100)
|
||||||
freq = APP_SYSFREQ_104M;
|
freq = APP_SYSFREQ_104M;
|
||||||
else
|
else
|
||||||
freq = APP_SYSFREQ_52M;
|
freq = APP_SYSFREQ_52M;
|
||||||
|
|
||||||
if(ci->id3->bitrate > 192)
|
if (ci->id3->bitrate > 192)
|
||||||
freq = APP_SYSFREQ_208M;
|
freq = APP_SYSFREQ_208M;
|
||||||
else if (ci->id3->bitrate > 128)
|
else if (ci->id3->bitrate > 128)
|
||||||
freq = APP_SYSFREQ_104M;
|
freq = APP_SYSFREQ_104M;
|
||||||
else
|
else
|
||||||
freq = APP_SYSFREQ_52M;
|
freq = APP_SYSFREQ_52M;
|
||||||
|
|
||||||
switch( song_format ) {
|
switch (song_format) {
|
||||||
case AFMT_APE:
|
case AFMT_APE:
|
||||||
freq = APP_SYSFREQ_208M;
|
freq = APP_SYSFREQ_208M;
|
||||||
break;
|
break;
|
||||||
|
@ -611,5 +573,3 @@ enum APP_SYSFREQ_FREQ_T rb_player_get_work_freq(void)
|
||||||
info("Decode thread run at: %d", freq);
|
info("Decode thread run at: %d", freq);
|
||||||
return freq;
|
return freq;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -16,18 +16,18 @@
|
||||||
/* rbplay source */
|
/* rbplay source */
|
||||||
/* playback control & rockbox codec porting & codec thread */
|
/* playback control & rockbox codec porting & codec thread */
|
||||||
|
|
||||||
#include <string.h>
|
#include <ctype.h>
|
||||||
|
#include <fcntl.h>
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <fcntl.h>
|
#include <stdlib.h>
|
||||||
#include <ctype.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
#include <unistd.h>
|
||||||
|
|
||||||
|
#include "SDFileSystem.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "metadata.h"
|
#include "metadata.h"
|
||||||
#include "SDFileSystem.h"
|
|
||||||
#include "rbplaysd.h"
|
#include "rbplaysd.h"
|
||||||
#include "utils.h"
|
#include "utils.h"
|
||||||
|
|
||||||
|
@ -41,8 +41,7 @@ static playlist_item sd_curritem;
|
||||||
|
|
||||||
playlist_struct sd_playlist;
|
playlist_struct sd_playlist;
|
||||||
|
|
||||||
static void playlist_insert(playlist_item* item)
|
static void playlist_insert(playlist_item *item) {
|
||||||
{
|
|
||||||
int fd;
|
int fd;
|
||||||
fd = open(PLAYLIST_PATH, O_RDWR | O_CREAT);
|
fd = open(PLAYLIST_PATH, O_RDWR | O_CREAT);
|
||||||
if (fd <= 0) {
|
if (fd <= 0) {
|
||||||
|
@ -55,8 +54,7 @@ static void playlist_insert(playlist_item* item)
|
||||||
close(fd);
|
close(fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool sdcard_mount(void)
|
static bool sdcard_mount(void) {
|
||||||
{
|
|
||||||
if (sdfs) {
|
if (sdfs) {
|
||||||
info("SD card already mount");
|
info("SD card already mount");
|
||||||
return true;
|
return true;
|
||||||
|
@ -80,16 +78,15 @@ static bool sdcard_mount(void)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_rbplay_gen_playlist(playlist_struct *list)
|
static void app_rbplay_gen_playlist(playlist_struct *list) {
|
||||||
{
|
|
||||||
struct dirent *p;
|
struct dirent *p;
|
||||||
DIR *d;
|
DIR *d;
|
||||||
uint32_t total;
|
uint32_t total;
|
||||||
int fd = 0;
|
int fd = 0;
|
||||||
struct mp3entry current_id3;
|
struct mp3entry current_id3;
|
||||||
playlist_item* sd_curritem_p = &sd_curritem;
|
playlist_item *sd_curritem_p = &sd_curritem;
|
||||||
|
|
||||||
memset(list,0x0,sizeof(playlist_struct));
|
memset(list, 0x0, sizeof(playlist_struct));
|
||||||
|
|
||||||
d = opendir("/" SD_LABEL);
|
d = opendir("/" SD_LABEL);
|
||||||
if (!d) {
|
if (!d) {
|
||||||
|
@ -104,7 +101,7 @@ static void app_rbplay_gen_playlist(playlist_struct *list)
|
||||||
if (probe_file_format(p->d_name) == AFMT_UNKNOWN)
|
if (probe_file_format(p->d_name) == AFMT_UNKNOWN)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
memset(&sd_curritem,0x0,sizeof(playlist_item));
|
memset(&sd_curritem, 0x0, sizeof(playlist_item));
|
||||||
sd_curritem.song_idx = total;
|
sd_curritem.song_idx = total;
|
||||||
|
|
||||||
sprintf(sd_curritem.file_path, "/" SD_LABEL "/%s", p->d_name);
|
sprintf(sd_curritem.file_path, "/" SD_LABEL "/%s", p->d_name);
|
||||||
|
@ -122,7 +119,8 @@ static void app_rbplay_gen_playlist(playlist_struct *list)
|
||||||
get_metadata(¤t_id3, fd, sd_curritem.file_path);
|
get_metadata(¤t_id3, fd, sd_curritem.file_path);
|
||||||
close(fd);
|
close(fd);
|
||||||
|
|
||||||
if(current_id3.bitrate == 0 || current_id3.filesize == 0 || current_id3.length == 0)
|
if (current_id3.bitrate == 0 || current_id3.filesize == 0 ||
|
||||||
|
current_id3.length == 0)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
info("bits:%d, type:%d, freq:%d", current_id3.bitrate,
|
info("bits:%d, type:%d, freq:%d", current_id3.bitrate,
|
||||||
|
@ -137,50 +135,53 @@ static void app_rbplay_gen_playlist(playlist_struct *list)
|
||||||
#ifdef PARSER_DETAIL
|
#ifdef PARSER_DETAIL
|
||||||
char *str;
|
char *str;
|
||||||
str = current_id3.title;
|
str = current_id3.title;
|
||||||
if(str != NULL) {
|
if (str != NULL) {
|
||||||
memset(sd_curritem_p->title,0x0,MP3_TITLE_LEN);
|
memset(sd_curritem_p->title, 0x0, MP3_TITLE_LEN);
|
||||||
memcpy(sd_curritem_p->title ,str,strlen(str)>MP3_TITLE_LEN?MP3_TITLE_LEN:strlen(str));
|
memcpy(sd_curritem_p->title, str,
|
||||||
|
strlen(str) > MP3_TITLE_LEN ? MP3_TITLE_LEN : strlen(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
str = current_id3.artist;
|
str = current_id3.artist;
|
||||||
if(str != NULL) {
|
if (str != NULL) {
|
||||||
memset(sd_curritem_p->artist,0x0,MP3_ARTIST_LEN);
|
memset(sd_curritem_p->artist, 0x0, MP3_ARTIST_LEN);
|
||||||
memcpy(sd_curritem_p->artist ,str,strlen(str)>MP3_ARTIST_LEN?MP3_ARTIST_LEN:strlen(str));
|
memcpy(sd_curritem_p->artist, str,
|
||||||
|
strlen(str) > MP3_ARTIST_LEN ? MP3_ARTIST_LEN : strlen(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
str = current_id3.album;
|
str = current_id3.album;
|
||||||
if(str != NULL) {
|
if (str != NULL) {
|
||||||
memset(sd_curritem_p->album,0x0,MP3_ALBUM_LEN);
|
memset(sd_curritem_p->album, 0x0, MP3_ALBUM_LEN);
|
||||||
memcpy(sd_curritem_p->album ,str,strlen(str)>MP3_ALBUM_LEN?MP3_ALBUM_LEN:strlen(str));
|
memcpy(sd_curritem_p->album, str,
|
||||||
|
strlen(str) > MP3_ALBUM_LEN ? MP3_ALBUM_LEN : strlen(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
str = current_id3.genre_string;
|
str = current_id3.genre_string;
|
||||||
if(str != NULL) {
|
if (str != NULL) {
|
||||||
memset(sd_curritem_p->genre,0x0,MP3_GENRE_LEN);
|
memset(sd_curritem_p->genre, 0x0, MP3_GENRE_LEN);
|
||||||
memcpy(sd_curritem_p->genre ,str,strlen(str)>MP3_GENRE_LEN?MP3_GENRE_LEN:strlen(str));
|
memcpy(sd_curritem_p->genre, str,
|
||||||
|
strlen(str) > MP3_GENRE_LEN ? MP3_GENRE_LEN : strlen(str));
|
||||||
}
|
}
|
||||||
|
|
||||||
str = current_id3.composer;
|
str = current_id3.composer;
|
||||||
if(str != NULL) {
|
if (str != NULL) {
|
||||||
memset(sd_curritem_p->composer,0x0,MP3_COMPOSER_LEN);
|
memset(sd_curritem_p->composer, 0x0, MP3_COMPOSER_LEN);
|
||||||
memcpy(sd_curritem_p->composer ,str,strlen(str)>MP3_COMPOSER_LEN?MP3_COMPOSER_LEN:strlen(str));
|
memcpy(sd_curritem_p->composer, str,
|
||||||
|
strlen(str) > MP3_COMPOSER_LEN ? MP3_COMPOSER_LEN : strlen(str));
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
playlist_insert(sd_curritem_p);
|
playlist_insert(sd_curritem_p);
|
||||||
total++;
|
total++;
|
||||||
}
|
}
|
||||||
|
|
||||||
list->total_songs = total ;
|
list->total_songs = total;
|
||||||
list->current_item = sd_curritem_p;
|
list->current_item = sd_curritem_p;
|
||||||
|
|
||||||
closedir(d);
|
closedir(d);
|
||||||
info("---------%d audio file searched---------" , total);
|
info("---------%d audio file searched---------", total);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_rbplay_load_playlist(playlist_struct *list)
|
void app_rbplay_load_playlist(playlist_struct *list) {
|
||||||
{
|
if (sdcard_mount() == false)
|
||||||
if(sdcard_mount() == false)
|
|
||||||
return;
|
return;
|
||||||
|
|
||||||
remove(PLAYLIST_PATH);
|
remove(PLAYLIST_PATH);
|
||||||
|
@ -188,10 +189,9 @@ void app_rbplay_load_playlist(playlist_struct *list)
|
||||||
app_rbplay_gen_playlist(list);
|
app_rbplay_gen_playlist(list);
|
||||||
}
|
}
|
||||||
|
|
||||||
playlist_item *app_rbplay_get_playitem(const int idx)
|
playlist_item *app_rbplay_get_playitem(const int idx) {
|
||||||
{
|
|
||||||
int fd;
|
int fd;
|
||||||
if(idx >= sd_playlist.total_songs) {
|
if (idx >= sd_playlist.total_songs) {
|
||||||
warn("Index exceed: %d / %d", idx, sd_playlist.total_songs);
|
warn("Index exceed: %d / %d", idx, sd_playlist.total_songs);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -212,8 +212,7 @@ playlist_item *app_rbplay_get_playitem(const int idx)
|
||||||
return sd_playlist.current_item;
|
return sd_playlist.current_item;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_ctl_remove_file(const int idx)
|
int app_ctl_remove_file(const int idx) {
|
||||||
{
|
|
||||||
playlist_item *item = app_rbplay_get_playitem(idx);
|
playlist_item *item = app_rbplay_get_playitem(idx);
|
||||||
if (!item)
|
if (!item)
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -221,5 +220,3 @@ int app_ctl_remove_file(const int idx)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,13 +13,13 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "audio_dump.h"
|
||||||
#include "audioflinger.h"
|
#include "audioflinger.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "audio_dump.h"
|
|
||||||
// #include "local_wav.h"
|
// #include "local_wav.h"
|
||||||
|
|
||||||
#define CHANNEL_NUM (2)
|
#define CHANNEL_NUM (2)
|
||||||
|
@ -31,11 +31,9 @@
|
||||||
#define SAMPLE_BITS (16)
|
#define SAMPLE_BITS (16)
|
||||||
#define SAMPLE_BYTES (SAMPLE_BITS / 8)
|
#define SAMPLE_BYTES (SAMPLE_BITS / 8)
|
||||||
|
|
||||||
|
|
||||||
#define TX_SAMPLE_RATE (16000)
|
#define TX_SAMPLE_RATE (16000)
|
||||||
#define RX_SAMPLE_RATE (16000)
|
#define RX_SAMPLE_RATE (16000)
|
||||||
|
|
||||||
|
|
||||||
#define TX_FRAME_LEN (256)
|
#define TX_FRAME_LEN (256)
|
||||||
#define RX_FRAME_LEN (256)
|
#define RX_FRAME_LEN (256)
|
||||||
|
|
||||||
|
@ -58,13 +56,12 @@ static uint32_t POSSIBLY_UNUSED codec_playback_cnt = 0;
|
||||||
|
|
||||||
#define CODEC_STREAM_ID AUD_STREAM_ID_0
|
#define CODEC_STREAM_ID AUD_STREAM_ID_0
|
||||||
|
|
||||||
static uint32_t codec_capture_callback(uint8_t *buf, uint32_t len)
|
static uint32_t codec_capture_callback(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
int POSSIBLY_UNUSED pcm_len = len / sizeof(VOICE_PCM_T) / CHANNEL_NUM;
|
int POSSIBLY_UNUSED pcm_len = len / sizeof(VOICE_PCM_T) / CHANNEL_NUM;
|
||||||
VOICE_PCM_T POSSIBLY_UNUSED *pcm_buf[CHANNEL_NUM];
|
VOICE_PCM_T POSSIBLY_UNUSED *pcm_buf[CHANNEL_NUM];
|
||||||
int interval_len = len * 2 / CHANNEL_NUM;
|
int interval_len = len * 2 / CHANNEL_NUM;
|
||||||
|
|
||||||
for (int i=0; i<CHANNEL_NUM; i++) {
|
for (int i = 0; i < CHANNEL_NUM; i++) {
|
||||||
pcm_buf[i] = (VOICE_PCM_T *)(buf + i * interval_len);
|
pcm_buf[i] = (VOICE_PCM_T *)(buf + i * interval_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,13 +74,12 @@ static uint32_t codec_capture_callback(uint8_t *buf, uint32_t len)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t codec_playback_callback(uint8_t *buf, uint32_t len)
|
static uint32_t codec_playback_callback(uint8_t *buf, uint32_t len) {
|
||||||
{
|
|
||||||
int POSSIBLY_UNUSED pcm_len = len / sizeof(VOICE_PCM_T) / CHANNEL_NUM;
|
int POSSIBLY_UNUSED pcm_len = len / sizeof(VOICE_PCM_T) / CHANNEL_NUM;
|
||||||
VOICE_PCM_T POSSIBLY_UNUSED *pcm_buf[CHANNEL_NUM];
|
VOICE_PCM_T POSSIBLY_UNUSED *pcm_buf[CHANNEL_NUM];
|
||||||
int interval_len = len * 2 / CHANNEL_NUM;
|
int interval_len = len * 2 / CHANNEL_NUM;
|
||||||
|
|
||||||
for (int i=0; i<CHANNEL_NUM; i++) {
|
for (int i = 0; i < CHANNEL_NUM; i++) {
|
||||||
pcm_buf[i] = (VOICE_PCM_T *)(buf + i * interval_len);
|
pcm_buf[i] = (VOICE_PCM_T *)(buf + i * interval_len);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,8 +88,7 @@ static uint32_t codec_playback_callback(uint8_t *buf, uint32_t len)
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_start(bool on)
|
static int voice_start(bool on) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
enum APP_SYSFREQ_FREQ_T freq = APP_SYSFREQ_208M;
|
enum APP_SYSFREQ_FREQ_T freq = APP_SYSFREQ_208M;
|
||||||
|
@ -109,7 +104,8 @@ static int voice_start(bool on)
|
||||||
af_set_priority(AF_USER_TEST, osPriorityHigh);
|
af_set_priority(AF_USER_TEST, osPriorityHigh);
|
||||||
|
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, freq);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, freq);
|
||||||
TRACE(2, "[%s] sys freq calc : %d\n", __func__, hal_sys_timer_calc_cpu_freq(5, 0));
|
TRACE(2, "[%s] sys freq calc : %d\n", __func__,
|
||||||
|
hal_sys_timer_calc_cpu_freq(5, 0));
|
||||||
|
|
||||||
// Initialize Cqueue
|
// Initialize Cqueue
|
||||||
codec_capture_cnt = 0;
|
codec_capture_cnt = 0;
|
||||||
|
@ -127,7 +123,8 @@ static int voice_start(bool on)
|
||||||
stream_cfg.handler = codec_capture_callback;
|
stream_cfg.handler = codec_capture_callback;
|
||||||
stream_cfg.data_ptr = codec_capture_buf;
|
stream_cfg.data_ptr = codec_capture_buf;
|
||||||
|
|
||||||
TRACE(3, "[%s] codec capture sample_rate: %d, data_size: %d", __func__, stream_cfg.sample_rate, stream_cfg.data_size);
|
TRACE(3, "[%s] codec capture sample_rate: %d, data_size: %d", __func__,
|
||||||
|
stream_cfg.sample_rate, stream_cfg.data_size);
|
||||||
af_stream_open(CODEC_STREAM_ID, AUD_STREAM_CAPTURE, &stream_cfg);
|
af_stream_open(CODEC_STREAM_ID, AUD_STREAM_CAPTURE, &stream_cfg);
|
||||||
ASSERT(ret == 0, "codec capture failed: %d", ret);
|
ASSERT(ret == 0, "codec capture failed: %d", ret);
|
||||||
|
|
||||||
|
@ -143,7 +140,8 @@ static int voice_start(bool on)
|
||||||
stream_cfg.handler = codec_playback_callback;
|
stream_cfg.handler = codec_playback_callback;
|
||||||
stream_cfg.data_ptr = codec_playback_buf;
|
stream_cfg.data_ptr = codec_playback_buf;
|
||||||
|
|
||||||
TRACE(3, "[%s] codec playback sample_rate: %d, data_size: %d", __func__, stream_cfg.sample_rate, stream_cfg.data_size);
|
TRACE(3, "[%s] codec playback sample_rate: %d, data_size: %d", __func__,
|
||||||
|
stream_cfg.sample_rate, stream_cfg.data_size);
|
||||||
af_stream_open(CODEC_STREAM_ID, AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(CODEC_STREAM_ID, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
ASSERT(ret == 0, "codec playback failed: %d", ret);
|
ASSERT(ret == 0, "codec playback failed: %d", ret);
|
||||||
|
|
||||||
|
@ -152,9 +150,7 @@ static int voice_start(bool on)
|
||||||
// Start
|
// Start
|
||||||
af_stream_start(CODEC_STREAM_ID, AUD_STREAM_CAPTURE);
|
af_stream_start(CODEC_STREAM_ID, AUD_STREAM_CAPTURE);
|
||||||
af_stream_start(CODEC_STREAM_ID, AUD_STREAM_PLAYBACK);
|
af_stream_start(CODEC_STREAM_ID, AUD_STREAM_PLAYBACK);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// Close stream
|
// Close stream
|
||||||
af_stream_stop(CODEC_STREAM_ID, AUD_STREAM_PLAYBACK);
|
af_stream_stop(CODEC_STREAM_ID, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_stop(CODEC_STREAM_ID, AUD_STREAM_CAPTURE);
|
af_stream_stop(CODEC_STREAM_ID, AUD_STREAM_CAPTURE);
|
||||||
|
@ -171,13 +167,12 @@ static int voice_start(bool on)
|
||||||
TRACE(1, "[%s] OFF", __func__);
|
TRACE(1, "[%s] OFF", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
isRun=on;
|
isRun = on;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool voice_test_status = true;
|
static bool voice_test_status = true;
|
||||||
void voice_test(void)
|
void voice_test(void) {
|
||||||
{
|
|
||||||
TRACE(2, "[%s] status = %d", __func__, voice_test_status);
|
TRACE(2, "[%s] status = %d", __func__, voice_test_status);
|
||||||
|
|
||||||
voice_start(voice_test_status);
|
voice_start(voice_test_status);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -17,23 +17,22 @@
|
||||||
#include "mbed.h"
|
#include "mbed.h"
|
||||||
#endif
|
#endif
|
||||||
// Standard C Included Files
|
// Standard C Included Files
|
||||||
#include <string.h>
|
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include <stdlib.h>
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "hal_uart.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "hal_uart.h"
|
||||||
|
|
||||||
/*!
|
/*!
|
||||||
* * @brief Standard Winodws PCM wave file header length
|
* * @brief Standard Winodws PCM wave file header length
|
||||||
* */
|
* */
|
||||||
#define WAVE_FILE_HEADER_SIZE 0x2CU
|
#define WAVE_FILE_HEADER_SIZE 0x2CU
|
||||||
|
|
||||||
typedef struct wave_header
|
typedef struct wave_header {
|
||||||
{
|
|
||||||
uint8_t riff[4];
|
uint8_t riff[4];
|
||||||
uint32_t size;
|
uint32_t size;
|
||||||
uint8_t waveFlag[4];
|
uint8_t waveFlag[4];
|
||||||
|
@ -52,11 +51,10 @@ typedef struct wave_header
|
||||||
/*!
|
/*!
|
||||||
* * @brief Wave file structure
|
* * @brief Wave file structure
|
||||||
* */
|
* */
|
||||||
typedef struct wave_file
|
typedef struct wave_file {
|
||||||
{
|
|
||||||
wave_header_t header;
|
wave_header_t header;
|
||||||
uint32_t *data;
|
uint32_t *data;
|
||||||
}wave_file_t;
|
} wave_file_t;
|
||||||
|
|
||||||
/* player */
|
/* player */
|
||||||
static unsigned int g_total_play_count = 0;
|
static unsigned int g_total_play_count = 0;
|
||||||
|
@ -66,40 +64,37 @@ static unsigned int g_curr_play_index = 0;
|
||||||
wave_file_t g_wave_file_info;
|
wave_file_t g_wave_file_info;
|
||||||
static char g_wav_header[WAVE_FILE_HEADER_SIZE];
|
static char g_wav_header[WAVE_FILE_HEADER_SIZE];
|
||||||
FILE *g_wave_file_handle = NULL;
|
FILE *g_wave_file_handle = NULL;
|
||||||
static int32_t (*wav_file_playback_callback)(int32_t ) = NULL;
|
static int32_t (*wav_file_playback_callback)(int32_t) = NULL;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
// Code
|
// Code
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
void wav_file_set_playeback_cb(int32_t (* cb)(int32_t))
|
void wav_file_set_playeback_cb(int32_t (*cb)(int32_t)) {
|
||||||
{
|
|
||||||
wav_file_playback_callback = cb;
|
wav_file_playback_callback = cb;
|
||||||
}
|
}
|
||||||
bool wav_file_isplaydone(void)
|
bool wav_file_isplaydone(void) {
|
||||||
{
|
return (g_curr_play_index >= g_total_play_count) ? true : false;
|
||||||
return (g_curr_play_index >= g_total_play_count)? true : false;
|
|
||||||
}
|
}
|
||||||
uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len)
|
uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
// static uint32_t g_preIrqTime = 0;
|
||||||
// static uint32_t g_preIrqTime = 0;
|
|
||||||
uint32_t reallen = 0;
|
uint32_t reallen = 0;
|
||||||
// int32_t stime,etime;
|
// int32_t stime,etime;
|
||||||
int32_t status;
|
int32_t status;
|
||||||
|
|
||||||
/* play done ? */
|
/* play done ? */
|
||||||
if(wav_file_isplaydone()) {
|
if (wav_file_isplaydone()) {
|
||||||
memset(buf, 0, len);
|
memset(buf, 0, len);
|
||||||
status = 0;
|
status = 0;
|
||||||
if (wav_file_playback_callback)
|
if (wav_file_playback_callback)
|
||||||
wav_file_playback_callback(status);
|
wav_file_playback_callback(status);
|
||||||
return (len);
|
return (len);
|
||||||
}
|
}
|
||||||
// stime = hal_sys_timer_get();
|
// stime = hal_sys_timer_get();
|
||||||
/* read file */
|
/* read file */
|
||||||
if (g_wave_file_handle)
|
if (g_wave_file_handle)
|
||||||
reallen = fread(buf, 1, len, g_wave_file_handle);
|
reallen = fread(buf, 1, len, g_wave_file_handle);
|
||||||
// etime = hal_sys_timer_get();
|
// etime = hal_sys_timer_get();
|
||||||
if (reallen != len){
|
if (reallen != len) {
|
||||||
memset(buf, 0, len);
|
memset(buf, 0, len);
|
||||||
status = -1;
|
status = -1;
|
||||||
if (wav_file_playback_callback)
|
if (wav_file_playback_callback)
|
||||||
|
@ -107,8 +102,10 @@ uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len)
|
||||||
return (len);
|
return (len);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TRACE(5,"wav_file_audio_more_data irqDur:%d fsSpend:%d, readbuff:0x%08x %d/%d\n ", TICKS_TO_MS(stime - g_preIrqTime),TICKS_TO_MS(etime - stime),buf,reallen,len);
|
// TRACE(5,"wav_file_audio_more_data irqDur:%d fsSpend:%d, readbuff:0x%08x
|
||||||
// g_preIrqTime = stime;
|
// %d/%d\n ", TICKS_TO_MS(stime - g_preIrqTime),TICKS_TO_MS(etime -
|
||||||
|
// stime),buf,reallen,len);
|
||||||
|
// g_preIrqTime = stime;
|
||||||
|
|
||||||
/* walk index */
|
/* walk index */
|
||||||
g_curr_play_index += reallen;
|
g_curr_play_index += reallen;
|
||||||
|
@ -116,15 +113,13 @@ uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len)
|
||||||
return reallen;
|
return reallen;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t get_wav_data(wave_file_t *waveFile)
|
uint32_t get_wav_data(wave_file_t *waveFile) {
|
||||||
{
|
|
||||||
uint8_t *dataTemp = (uint8_t *)waveFile->data;
|
uint8_t *dataTemp = (uint8_t *)waveFile->data;
|
||||||
|
|
||||||
// check for RIFF
|
// check for RIFF
|
||||||
memcpy(waveFile->header.riff, dataTemp, 4);
|
memcpy(waveFile->header.riff, dataTemp, 4);
|
||||||
dataTemp += 4;
|
dataTemp += 4;
|
||||||
if( memcmp( (uint8_t*)waveFile->header.riff, "RIFF", 4) )
|
if (memcmp((uint8_t *)waveFile->header.riff, "RIFF", 4)) {
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -132,21 +127,19 @@ uint32_t get_wav_data(wave_file_t *waveFile)
|
||||||
memcpy(&waveFile->header.size, dataTemp, 4);
|
memcpy(&waveFile->header.size, dataTemp, 4);
|
||||||
dataTemp += 4;
|
dataTemp += 4;
|
||||||
|
|
||||||
TRACE(1,"WAV header size [%d]\n", waveFile->header.size);
|
TRACE(1, "WAV header size [%d]\n", waveFile->header.size);
|
||||||
|
|
||||||
// .wav file flag
|
// .wav file flag
|
||||||
memcpy(waveFile->header.waveFlag, dataTemp, 4);
|
memcpy(waveFile->header.waveFlag, dataTemp, 4);
|
||||||
dataTemp += 4;
|
dataTemp += 4;
|
||||||
if( memcmp( (uint8_t*)waveFile->header.waveFlag, "WAVE", 4) )
|
if (memcmp((uint8_t *)waveFile->header.waveFlag, "WAVE", 4)) {
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fmt
|
// fmt
|
||||||
memcpy(waveFile->header.fmt, dataTemp, 4);
|
memcpy(waveFile->header.fmt, dataTemp, 4);
|
||||||
dataTemp += 4;
|
dataTemp += 4;
|
||||||
if( memcmp( (uint8_t*)waveFile->header.fmt, "fmt ", 4) )
|
if (memcmp((uint8_t *)waveFile->header.fmt, "fmt ", 4)) {
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -162,7 +155,7 @@ uint32_t get_wav_data(wave_file_t *waveFile)
|
||||||
memcpy(&waveFile->header.channels, dataTemp, 4);
|
memcpy(&waveFile->header.channels, dataTemp, 4);
|
||||||
dataTemp += 2;
|
dataTemp += 2;
|
||||||
|
|
||||||
TRACE(1,"WAV channels [%d]\n", waveFile->header.channels);
|
TRACE(1, "WAV channels [%d]\n", waveFile->header.channels);
|
||||||
|
|
||||||
// Sample Rate in Hz
|
// Sample Rate in Hz
|
||||||
memcpy(&waveFile->header.sampFreq, dataTemp, 4);
|
memcpy(&waveFile->header.sampFreq, dataTemp, 4);
|
||||||
|
@ -170,8 +163,8 @@ uint32_t get_wav_data(wave_file_t *waveFile)
|
||||||
memcpy(&waveFile->header.byteRate, dataTemp, 4);
|
memcpy(&waveFile->header.byteRate, dataTemp, 4);
|
||||||
dataTemp += 4;
|
dataTemp += 4;
|
||||||
|
|
||||||
TRACE(1,"WAV sample_rate [%d]\n", waveFile->header.sampFreq);
|
TRACE(1, "WAV sample_rate [%d]\n", waveFile->header.sampFreq);
|
||||||
TRACE(1,"WAV byteRate [%d]\n", waveFile->header.byteRate);
|
TRACE(1, "WAV byteRate [%d]\n", waveFile->header.byteRate);
|
||||||
|
|
||||||
// quantize bytes for per samp point
|
// quantize bytes for per samp point
|
||||||
memcpy(&waveFile->header.blockAlign, dataTemp, 4);
|
memcpy(&waveFile->header.blockAlign, dataTemp, 4);
|
||||||
|
@ -179,13 +172,12 @@ uint32_t get_wav_data(wave_file_t *waveFile)
|
||||||
memcpy(&waveFile->header.bitSamp, dataTemp, 4);
|
memcpy(&waveFile->header.bitSamp, dataTemp, 4);
|
||||||
dataTemp += 2;
|
dataTemp += 2;
|
||||||
|
|
||||||
TRACE(1,"WAV bitSamp [%d]\n", waveFile->header.bitSamp);
|
TRACE(1, "WAV bitSamp [%d]\n", waveFile->header.bitSamp);
|
||||||
|
|
||||||
// Data
|
// Data
|
||||||
memcpy(waveFile->header.dataFlag, dataTemp, 4);
|
memcpy(waveFile->header.dataFlag, dataTemp, 4);
|
||||||
dataTemp += 4;
|
dataTemp += 4;
|
||||||
if( memcmp( (uint8_t*)waveFile->header.dataFlag, "data ", 4) )
|
if (memcmp((uint8_t *)waveFile->header.dataFlag, "data ", 4)) {
|
||||||
{
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
memcpy(&waveFile->header.length, dataTemp, 4);
|
memcpy(&waveFile->header.length, dataTemp, 4);
|
||||||
|
@ -194,20 +186,17 @@ uint32_t get_wav_data(wave_file_t *waveFile)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void audio_wav_init(wave_file_t *newWav) {
|
||||||
void audio_wav_init(wave_file_t *newWav)
|
|
||||||
{
|
|
||||||
get_wav_data(newWav);
|
get_wav_data(newWav);
|
||||||
|
|
||||||
// Configure the play audio g_format
|
// Configure the play audio g_format
|
||||||
//g_format.bits = newWav->header.bitSamp;
|
// g_format.bits = newWav->header.bitSamp;
|
||||||
//g_format.sample_rate = newWav->header.sampFreq;
|
// g_format.sample_rate = newWav->header.sampFreq;
|
||||||
//g_format.mclk = 256 * g_format.sample_rate ;
|
// g_format.mclk = 256 * g_format.sample_rate ;
|
||||||
//g_format.mono_streo = (sai_mono_streo_t)((newWav->header.channels) - 1);
|
// g_format.mono_streo = (sai_mono_streo_t)((newWav->header.channels) - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t play_wav_file(char *file_path)
|
uint32_t play_wav_file(char *file_path) {
|
||||||
{
|
|
||||||
uint32_t bytesToRead = 0;
|
uint32_t bytesToRead = 0;
|
||||||
|
|
||||||
wave_file_t *newWav = &g_wave_file_info;
|
wave_file_t *newWav = &g_wave_file_info;
|
||||||
|
@ -216,8 +205,8 @@ uint32_t play_wav_file(char *file_path)
|
||||||
|
|
||||||
g_wave_file_handle = fopen(file_path, "rb");
|
g_wave_file_handle = fopen(file_path, "rb");
|
||||||
|
|
||||||
if(g_wave_file_handle == NULL) {
|
if (g_wave_file_handle == NULL) {
|
||||||
TRACE(1,"WAV file %s open fail\n", file_path);
|
TRACE(1, "WAV file %s open fail\n", file_path);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -228,7 +217,8 @@ uint32_t play_wav_file(char *file_path)
|
||||||
audio_wav_init(newWav);
|
audio_wav_init(newWav);
|
||||||
|
|
||||||
// Remove header size from byte count
|
// Remove header size from byte count
|
||||||
// Adjust note duration by divider value, wav tables in pcm_data.h are 200ms by default
|
// Adjust note duration by divider value, wav tables in pcm_data.h are 200ms
|
||||||
|
// by default
|
||||||
bytesToRead = (newWav->header.length - WAVE_FILE_HEADER_SIZE);
|
bytesToRead = (newWav->header.length - WAVE_FILE_HEADER_SIZE);
|
||||||
|
|
||||||
g_curr_play_index = 0;
|
g_curr_play_index = 0;
|
||||||
|
@ -237,12 +227,11 @@ uint32_t play_wav_file(char *file_path)
|
||||||
return newWav->header.sampFreq;
|
return newWav->header.sampFreq;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t stop_wav_file(void)
|
uint32_t stop_wav_file(void) {
|
||||||
{
|
|
||||||
memset(&g_wave_file_info, 0, sizeof(g_wave_file_info));
|
memset(&g_wave_file_info, 0, sizeof(g_wave_file_info));
|
||||||
g_curr_play_index = 0;
|
g_curr_play_index = 0;
|
||||||
g_total_play_count = 0;
|
g_total_play_count = 0;
|
||||||
if (g_wave_file_handle){
|
if (g_wave_file_handle) {
|
||||||
fclose(g_wave_file_handle);
|
fclose(g_wave_file_handle);
|
||||||
g_wave_file_handle = NULL;
|
g_wave_file_handle = NULL;
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -13,22 +13,22 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdio.h"
|
#include "app_audio.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "app_audio.h"
|
#include "stdio.h"
|
||||||
|
|
||||||
#include "a2dp_api.h"
|
#include "a2dp_api.h"
|
||||||
#include "app_bt.h"
|
#include "app_bt.h"
|
||||||
#include "btapp.h"
|
#include "btapp.h"
|
||||||
#include "usb_audio_app.h"
|
|
||||||
#include "btusb_audio.h"
|
#include "btusb_audio.h"
|
||||||
|
#include "usb_audio_app.h"
|
||||||
|
|
||||||
extern void btusbaudio_entry(void);
|
extern void btusbaudio_entry(void);
|
||||||
extern void btusbaudio_exit(void);
|
extern void btusbaudio_exit(void);
|
||||||
extern a2dp_stream_t* app_bt_get_steam(enum BT_DEVICE_ID_T id);
|
extern a2dp_stream_t *app_bt_get_steam(enum BT_DEVICE_ID_T id);
|
||||||
extern int app_bt_get_bt_addr(enum BT_DEVICE_ID_T id,bt_bdaddr_t *bdaddr);
|
extern int app_bt_get_bt_addr(enum BT_DEVICE_ID_T id, bt_bdaddr_t *bdaddr);
|
||||||
extern bool app_bt_a2dp_service_is_connected(void);
|
extern bool app_bt_a2dp_service_is_connected(void);
|
||||||
int app_bt_A2DP_OpenStream(a2dp_stream_t *Stream, bt_bdaddr_t *Addr);
|
int app_bt_A2DP_OpenStream(a2dp_stream_t *Stream, bt_bdaddr_t *Addr);
|
||||||
int app_bt_A2DP_CloseStream(a2dp_stream_t *Stream);
|
int app_bt_A2DP_CloseStream(a2dp_stream_t *Stream);
|
||||||
|
@ -38,94 +38,83 @@ static bool btusb_usb_is_on = false;
|
||||||
static enum BTUSB_MODE btusb_mode = BTUSB_MODE_INVALID;
|
static enum BTUSB_MODE btusb_mode = BTUSB_MODE_INVALID;
|
||||||
static bool btusb_bt_audio_is_suspend = false;
|
static bool btusb_bt_audio_is_suspend = false;
|
||||||
|
|
||||||
#define BT_USB_DEBUG() //TRACE(2,"_debug: %s,%d",__func__,__LINE__)
|
#define BT_USB_DEBUG() // TRACE(2,"_debug: %s,%d",__func__,__LINE__)
|
||||||
extern struct BT_DEVICE_T app_bt_device;
|
extern struct BT_DEVICE_T app_bt_device;
|
||||||
|
|
||||||
static void _btusb_stream_open(unsigned int timeout_ms)
|
static void _btusb_stream_open(unsigned int timeout_ms) {
|
||||||
{
|
|
||||||
a2dp_stream_t *stream = NULL;
|
a2dp_stream_t *stream = NULL;
|
||||||
bt_bdaddr_t bdaddr;
|
bt_bdaddr_t bdaddr;
|
||||||
uint32_t stime = 0;
|
uint32_t stime = 0;
|
||||||
uint32_t etime = 0;
|
uint32_t etime = 0;
|
||||||
|
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
//BT_USB_DEBUG();
|
// BT_USB_DEBUG();
|
||||||
stream = (a2dp_stream_t*)app_bt_get_steam(BT_DEVICE_ID_1);
|
stream = (a2dp_stream_t *)app_bt_get_steam(BT_DEVICE_ID_1);
|
||||||
|
|
||||||
app_bt_get_bt_addr(BT_DEVICE_ID_1,&bdaddr);
|
app_bt_get_bt_addr(BT_DEVICE_ID_1, &bdaddr);
|
||||||
if(stream)
|
if (stream) {
|
||||||
{
|
// struct BT_DEVICE_T *bt_dev = &app_bt_device;
|
||||||
//struct BT_DEVICE_T *bt_dev = &app_bt_device;
|
// A2DP_Register((a2dp_stream_t
|
||||||
//A2DP_Register((a2dp_stream_t *)bt_dev->a2dp_stream[BT_DEVICE_ID_1]->a2dp_stream, &a2dp_avdtpcodec, NULL, (A2dpCallback) a2dp_callback);
|
// *)bt_dev->a2dp_stream[BT_DEVICE_ID_1]->a2dp_stream, &a2dp_avdtpcodec,
|
||||||
//AVRCP_Register((AvrcpChannel *)bt_dev->avrcp_channel[BT_DEVICE_ID_1]->avrcp_channel_handle, (AvrcpCallback)avrcp_callback_CT, BTIF_AVRCP_CT_CATEGORY_1 | BTIF_AVRCP_CT_CATEGORY_2 | BTIF_AVRCP_TG_CATEGORY_2);
|
// NULL, (A2dpCallback) a2dp_callback); AVRCP_Register((AvrcpChannel
|
||||||
|
// *)bt_dev->avrcp_channel[BT_DEVICE_ID_1]->avrcp_channel_handle,
|
||||||
|
// (AvrcpCallback)avrcp_callback_CT, BTIF_AVRCP_CT_CATEGORY_1 |
|
||||||
|
// BTIF_AVRCP_CT_CATEGORY_2 | BTIF_AVRCP_TG_CATEGORY_2);
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
osDelay(10);
|
osDelay(10);
|
||||||
app_bt_A2DP_OpenStream(stream,&bdaddr);
|
app_bt_A2DP_OpenStream(stream, &bdaddr);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
while(1)
|
while (1) {
|
||||||
{
|
if (app_bt_a2dp_service_is_connected()) {
|
||||||
if(app_bt_a2dp_service_is_connected()){
|
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
TRACE(1,"_debug: a2dp service connected, wait time = 0x%x.",TICKS_TO_MS(etime - stime));
|
TRACE(1, "_debug: a2dp service connected, wait time = 0x%x.",
|
||||||
|
TICKS_TO_MS(etime - stime));
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
if(TICKS_TO_MS(etime - stime) >= timeout_ms)
|
if (TICKS_TO_MS(etime - stime) >= timeout_ms) {
|
||||||
{
|
TRACE(1, "_debug: a2dp service connect timeout = 0x%x.",
|
||||||
TRACE(1,"_debug: a2dp service connect timeout = 0x%x.",
|
|
||||||
TICKS_TO_MS(etime - stime));
|
TICKS_TO_MS(etime - stime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
osDelay(10);
|
osDelay(10);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//BT_USB_DEBUG();
|
// BT_USB_DEBUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void _btusb_stream_close(unsigned int timeout_ms)
|
static void _btusb_stream_close(unsigned int timeout_ms) {
|
||||||
{
|
|
||||||
a2dp_stream_t *stream = NULL;
|
a2dp_stream_t *stream = NULL;
|
||||||
uint32_t stime = 0;
|
uint32_t stime = 0;
|
||||||
uint32_t etime = 0;
|
uint32_t etime = 0;
|
||||||
|
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
stream = (a2dp_stream_t*)app_bt_get_steam(BT_DEVICE_ID_1);
|
stream = (a2dp_stream_t *)app_bt_get_steam(BT_DEVICE_ID_1);
|
||||||
if(stream)
|
if (stream) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
app_bt_A2DP_CloseStream(stream);
|
app_bt_A2DP_CloseStream(stream);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
while(1)
|
while (1) {
|
||||||
{
|
if (!app_bt_a2dp_service_is_connected()) {
|
||||||
if(!app_bt_a2dp_service_is_connected()){
|
// struct BT_DEVICE_T *bt_dev = &app_bt_device;
|
||||||
//struct BT_DEVICE_T *bt_dev = &app_bt_device;
|
// AVRCP_Deregister(bt_dev->avrcp_channel[BT_DEVICE_ID_1]->avrcp_channel_handle);
|
||||||
//AVRCP_Deregister(bt_dev->avrcp_channel[BT_DEVICE_ID_1]->avrcp_channel_handle);
|
// A2DP_Deregister(stream);
|
||||||
//A2DP_Deregister(stream);
|
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
TRACE(1,"a2dp service diconnected, wait time = 0x%x.",
|
TRACE(1, "a2dp service diconnected, wait time = 0x%x.",
|
||||||
TICKS_TO_MS(etime - stime));
|
TICKS_TO_MS(etime - stime));
|
||||||
break;
|
break;
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
etime = hal_sys_timer_get();
|
etime = hal_sys_timer_get();
|
||||||
if(TICKS_TO_MS(etime - stime) >= timeout_ms)
|
if (TICKS_TO_MS(etime - stime) >= timeout_ms) {
|
||||||
{
|
TRACE(1, "a2dp service diconnect timeout = 0x%x.",
|
||||||
TRACE(1,"a2dp service diconnect timeout = 0x%x.",
|
|
||||||
TICKS_TO_MS(etime - stime));
|
TICKS_TO_MS(etime - stime));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -135,173 +124,137 @@ static void _btusb_stream_close(unsigned int timeout_ms)
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void btusb_usbaudio_entry(void)
|
static void btusb_usbaudio_entry(void) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
btusbaudio_entry();
|
btusbaudio_entry();
|
||||||
btusb_usb_is_on = true ;
|
btusb_usb_is_on = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void btusb_usbaudio_open(void)
|
void btusb_usbaudio_open(void) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
if(!btusb_usb_is_on)
|
if (!btusb_usb_is_on) {
|
||||||
{
|
|
||||||
btusb_usbaudio_entry();
|
btusb_usbaudio_entry();
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
usb_audio_app(1);
|
usb_audio_app(1);
|
||||||
}
|
}
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
void btusb_usbaudio_close(void)
|
void btusb_usbaudio_close(void) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
if(btusb_usb_is_on)
|
if (btusb_usb_is_on) {
|
||||||
{
|
|
||||||
usb_audio_app(0);
|
usb_audio_app(0);
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void btusb_btaudio_close(bool is_wait)
|
void btusb_btaudio_close(bool is_wait) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
//if(!btusb_bt_audio_is_suspend)
|
// if(!btusb_bt_audio_is_suspend)
|
||||||
{
|
{
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
if(is_wait)
|
if (is_wait) {
|
||||||
{
|
app_audio_sendrequest(APP_PLAY_BACK_AUDIO,
|
||||||
app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_CLOSEALL, 0);
|
(uint8_t)APP_BT_SETTING_CLOSEALL, 0);
|
||||||
_btusb_stream_close(BTUSB_OUTTIME_MS);
|
_btusb_stream_close(BTUSB_OUTTIME_MS);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
_btusb_stream_close(0);
|
_btusb_stream_close(0);
|
||||||
}
|
}
|
||||||
btusb_bt_audio_is_suspend = true;
|
btusb_bt_audio_is_suspend = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void btusb_btaudio_open(bool is_wait)
|
void btusb_btaudio_open(bool is_wait) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
//if(btusb_bt_audio_is_suspend)
|
// if(btusb_bt_audio_is_suspend)
|
||||||
{
|
|
||||||
TRACE(2,"%s: %d.",__func__,__LINE__);
|
|
||||||
if(is_wait)
|
|
||||||
{
|
{
|
||||||
|
TRACE(2, "%s: %d.", __func__, __LINE__);
|
||||||
|
if (is_wait) {
|
||||||
_btusb_stream_open(BTUSB_OUTTIME_MS);
|
_btusb_stream_open(BTUSB_OUTTIME_MS);
|
||||||
app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_CLOSE, 0);
|
app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_CLOSE,
|
||||||
app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_SETUP, 0);
|
0);
|
||||||
}
|
app_audio_sendrequest(APP_PLAY_BACK_AUDIO, (uint8_t)APP_BT_SETTING_SETUP,
|
||||||
else
|
0);
|
||||||
{
|
} else {
|
||||||
_btusb_stream_open(0);
|
_btusb_stream_open(0);
|
||||||
}
|
}
|
||||||
TRACE(2,"%s: %d.",__func__,__LINE__);
|
TRACE(2, "%s: %d.", __func__, __LINE__);
|
||||||
btusb_bt_audio_is_suspend = false;
|
btusb_bt_audio_is_suspend = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void btusb_switch(enum BTUSB_MODE mode)
|
void btusb_switch(enum BTUSB_MODE mode) {
|
||||||
{
|
// BT_USB_DEBUG();
|
||||||
//BT_USB_DEBUG();
|
if (mode != BTUSB_MODE_BT && mode != BTUSB_MODE_USB) {
|
||||||
if(mode != BTUSB_MODE_BT && mode != BTUSB_MODE_USB)
|
ASSERT(0, "%s:%d, mode = %d.", __func__, __LINE__, mode);
|
||||||
{
|
|
||||||
ASSERT(0, "%s:%d, mode = %d.",__func__,__LINE__,mode);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if(btusb_mode == mode) {
|
if (btusb_mode == mode) {
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(btusb_mode == BTUSB_MODE_INVALID)
|
if (btusb_mode == BTUSB_MODE_INVALID) {
|
||||||
{
|
if (mode == BTUSB_MODE_BT) {
|
||||||
if(mode == BTUSB_MODE_BT) {
|
TRACE(1, "%s: switch to BT mode.", __func__);
|
||||||
TRACE(1,"%s: switch to BT mode.",__func__);
|
|
||||||
btusb_mode = BTUSB_MODE_BT;
|
btusb_mode = BTUSB_MODE_BT;
|
||||||
}
|
} else {
|
||||||
else {
|
TRACE(1, "%s: switch to USB mode.", __func__);
|
||||||
TRACE(1,"%s: switch to USB mode.",__func__);
|
// btusb_btaudio_close(true);
|
||||||
//btusb_btaudio_close(true);
|
|
||||||
osDelay(500);
|
osDelay(500);
|
||||||
btusb_usbaudio_open();
|
btusb_usbaudio_open();
|
||||||
btusb_mode = BTUSB_MODE_USB;
|
btusb_mode = BTUSB_MODE_USB;
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
if (mode == BTUSB_MODE_BT) {
|
||||||
{
|
TRACE(1, "%s: switch to BT mode.", __func__);
|
||||||
if(mode == BTUSB_MODE_BT) {
|
if (btusb_usb_is_on) {
|
||||||
TRACE(1,"%s: switch to BT mode.",__func__);
|
TRACE(1, "%s: btusb_usbaudio_close.", __func__);
|
||||||
if(btusb_usb_is_on)
|
|
||||||
{
|
|
||||||
TRACE(1,"%s: btusb_usbaudio_close.",__func__);
|
|
||||||
btusb_usbaudio_close();
|
btusb_usbaudio_close();
|
||||||
TRACE(1,"%s: btusb_usbaudio_close done.",__func__);
|
TRACE(1, "%s: btusb_usbaudio_close done.", __func__);
|
||||||
osDelay(500);
|
osDelay(500);
|
||||||
}
|
}
|
||||||
btusb_mode = BTUSB_MODE_BT;
|
btusb_mode = BTUSB_MODE_BT;
|
||||||
btusb_btaudio_open(true);
|
btusb_btaudio_open(true);
|
||||||
TRACE(1,"%s: switch to BT mode done.",__func__);
|
TRACE(1, "%s: switch to BT mode done.", __func__);
|
||||||
}
|
} else {
|
||||||
else {
|
if (btapp_hfp_is_call_active() == 1) {
|
||||||
if(btapp_hfp_is_call_active() == 1)
|
TRACE(1, "%s: hfp is call active.", __func__);
|
||||||
{
|
|
||||||
TRACE(1,"%s: hfp is call active.",__func__);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
TRACE(1,"%s: switch to USB mode.",__func__);
|
TRACE(1, "%s: switch to USB mode.", __func__);
|
||||||
btusb_btaudio_close(true);
|
btusb_btaudio_close(true);
|
||||||
TRACE(1,"%s: btusb_btaudio_close done.",__func__);
|
TRACE(1, "%s: btusb_btaudio_close done.", __func__);
|
||||||
osDelay(500);
|
osDelay(500);
|
||||||
btusb_usbaudio_open();
|
btusb_usbaudio_open();
|
||||||
btusb_mode = BTUSB_MODE_USB;
|
btusb_mode = BTUSB_MODE_USB;
|
||||||
TRACE(1,"%s: switch to USB mode done.",__func__);
|
TRACE(1, "%s: switch to USB mode done.", __func__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool btusb_is_bt_mode(void)
|
bool btusb_is_bt_mode(void) {
|
||||||
{
|
|
||||||
BT_USB_DEBUG();
|
BT_USB_DEBUG();
|
||||||
return btusb_mode == BTUSB_MODE_BT ? true : false;
|
return btusb_mode == BTUSB_MODE_BT ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool btusb_is_usb_mode(void)
|
bool btusb_is_usb_mode(void) {
|
||||||
{
|
|
||||||
return btusb_mode == BTUSB_MODE_USB ? true : false;
|
return btusb_mode == BTUSB_MODE_USB ? true : false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#if defined(BT_USB_AUDIO_DUAL_MODE_TEST)
|
#if defined(BT_USB_AUDIO_DUAL_MODE_TEST)
|
||||||
void test_btusb_switch(void)
|
void test_btusb_switch(void) {
|
||||||
{
|
if (btusb_mode == BTUSB_MODE_BT) {
|
||||||
if(btusb_mode == BTUSB_MODE_BT)
|
|
||||||
{
|
|
||||||
btusb_switch(BTUSB_MODE_USB);
|
btusb_switch(BTUSB_MODE_USB);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
btusb_switch(BTUSB_MODE_BT);
|
btusb_switch(BTUSB_MODE_BT);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_btusb_switch_to_bt(void)
|
void test_btusb_switch_to_bt(void) { btusb_switch(BTUSB_MODE_BT); }
|
||||||
{
|
|
||||||
btusb_switch(BTUSB_MODE_BT);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_btusb_switch_to_usb(void)
|
void test_btusb_switch_to_usb(void) { btusb_switch(BTUSB_MODE_USB); }
|
||||||
{
|
|
||||||
btusb_switch(BTUSB_MODE_USB);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,22 +13,21 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "usbaudio_thread.h"
|
||||||
|
#include "app_utils.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "app_utils.h"
|
|
||||||
#include "usb_audio_app.h"
|
#include "usb_audio_app.h"
|
||||||
#include "usbaudio_thread.h"
|
|
||||||
|
|
||||||
static void usb_thread(void const *argument);
|
static void usb_thread(void const *argument);
|
||||||
osThreadDef(usb_thread, osPriorityHigh, 1, 2048, "usb");
|
osThreadDef(usb_thread, osPriorityHigh, 1, 2048, "usb");
|
||||||
|
|
||||||
osMailQDef (usb_mailbox, USB_MAILBOX_MAX, USB_MESSAGE);
|
osMailQDef(usb_mailbox, USB_MAILBOX_MAX, USB_MESSAGE);
|
||||||
static osMailQId usb_mailbox = NULL;
|
static osMailQId usb_mailbox = NULL;
|
||||||
static uint8_t usb_mailbox_cnt = 0;
|
static uint8_t usb_mailbox_cnt = 0;
|
||||||
#define USBAUDIO_DEBUG TRACE
|
#define USBAUDIO_DEBUG TRACE
|
||||||
static int usb_mailbox_init(void)
|
static int usb_mailbox_init(void) {
|
||||||
{
|
USBAUDIO_DEBUG("%s,%d", __func__, __LINE__);
|
||||||
USBAUDIO_DEBUG("%s,%d",__func__,__LINE__);
|
|
||||||
usb_mailbox = osMailCreate(osMailQ(usb_mailbox), NULL);
|
usb_mailbox = osMailCreate(osMailQ(usb_mailbox), NULL);
|
||||||
if (usb_mailbox == NULL) {
|
if (usb_mailbox == NULL) {
|
||||||
USBAUDIO_DEBUG("Failed to Create usb_mailbox\n");
|
USBAUDIO_DEBUG("Failed to Create usb_mailbox\n");
|
||||||
|
@ -38,19 +37,17 @@ static int usb_mailbox_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_mailbox_put(USB_MESSAGE* msg_src)
|
int usb_mailbox_put(USB_MESSAGE *msg_src) {
|
||||||
{
|
|
||||||
osStatus status;
|
osStatus status;
|
||||||
USB_MESSAGE *msg_p = NULL;
|
USB_MESSAGE *msg_p = NULL;
|
||||||
|
|
||||||
USBAUDIO_DEBUG("%s,%d",__func__,__LINE__);
|
USBAUDIO_DEBUG("%s,%d", __func__, __LINE__);
|
||||||
if(usb_mailbox_cnt >= 1)
|
if (usb_mailbox_cnt >= 1) {
|
||||||
{
|
USBAUDIO_DEBUG("%s,%d usb_mailbox_cnt = %d.", __func__, __LINE__,
|
||||||
USBAUDIO_DEBUG("%s,%d usb_mailbox_cnt = %d.",
|
usb_mailbox_cnt);
|
||||||
__func__,__LINE__,usb_mailbox_cnt);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
msg_p = (USB_MESSAGE*)osMailAlloc(usb_mailbox, 0);
|
msg_p = (USB_MESSAGE *)osMailAlloc(usb_mailbox, 0);
|
||||||
ASSERT(msg_p, "osMailAlloc error");
|
ASSERT(msg_p, "osMailAlloc error");
|
||||||
msg_p->id = msg_src->id;
|
msg_p->id = msg_src->id;
|
||||||
msg_p->ptr = msg_src->ptr;
|
msg_p->ptr = msg_src->ptr;
|
||||||
|
@ -60,53 +57,51 @@ int usb_mailbox_put(USB_MESSAGE* msg_src)
|
||||||
status = osMailPut(usb_mailbox, msg_p);
|
status = osMailPut(usb_mailbox, msg_p);
|
||||||
if (osOK == status)
|
if (osOK == status)
|
||||||
usb_mailbox_cnt++;
|
usb_mailbox_cnt++;
|
||||||
USBAUDIO_DEBUG("%s,%d,usb_mailbox_cnt = %d.",__func__,__LINE__,usb_mailbox_cnt);
|
USBAUDIO_DEBUG("%s,%d,usb_mailbox_cnt = %d.", __func__, __LINE__,
|
||||||
|
usb_mailbox_cnt);
|
||||||
return (int)status;
|
return (int)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_mailbox_free(USB_MESSAGE* msg_p)
|
int usb_mailbox_free(USB_MESSAGE *msg_p) {
|
||||||
{
|
|
||||||
osStatus status;
|
osStatus status;
|
||||||
|
|
||||||
USBAUDIO_DEBUG("%s,%d",__func__,__LINE__);
|
USBAUDIO_DEBUG("%s,%d", __func__, __LINE__);
|
||||||
status = osMailFree(usb_mailbox, msg_p);
|
status = osMailFree(usb_mailbox, msg_p);
|
||||||
if (osOK == status)
|
if (osOK == status)
|
||||||
usb_mailbox_cnt--;
|
usb_mailbox_cnt--;
|
||||||
USBAUDIO_DEBUG("%s,%d,usb_mailbox_cnt = %d.",__func__,__LINE__,usb_mailbox_cnt);
|
USBAUDIO_DEBUG("%s,%d,usb_mailbox_cnt = %d.", __func__, __LINE__,
|
||||||
|
usb_mailbox_cnt);
|
||||||
return (int)status;
|
return (int)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_mailbox_get(USB_MESSAGE **msg_p)
|
int usb_mailbox_get(USB_MESSAGE **msg_p) {
|
||||||
{
|
|
||||||
osEvent evt;
|
osEvent evt;
|
||||||
evt = osMailGet(usb_mailbox, osWaitForever);
|
evt = osMailGet(usb_mailbox, osWaitForever);
|
||||||
if (evt.status == osEventMail) {
|
if (evt.status == osEventMail) {
|
||||||
*msg_p = (USB_MESSAGE*)evt.value.p;
|
*msg_p = (USB_MESSAGE *)evt.value.p;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_thread(void const *argument)
|
static void usb_thread(void const *argument) {
|
||||||
{
|
|
||||||
// USB_FUNC_T usb_funcp;
|
// USB_FUNC_T usb_funcp;
|
||||||
USBAUDIO_DEBUG("%s,%d",__func__,__LINE__);
|
USBAUDIO_DEBUG("%s,%d", __func__, __LINE__);
|
||||||
while(1){
|
while (1) {
|
||||||
USB_MESSAGE *msg_p = NULL;
|
USB_MESSAGE *msg_p = NULL;
|
||||||
|
|
||||||
if (!usb_mailbox_get(&msg_p)) {
|
if (!usb_mailbox_get(&msg_p)) {
|
||||||
//TRACE(2,"_debug: %s,%d",__func__,__LINE__);
|
// TRACE(2,"_debug: %s,%d",__func__,__LINE__);
|
||||||
USBAUDIO_DEBUG("usb_thread: id = 0x%x, ptr = 0x%x,param0 = 0x%x,param1 = 0x%x.",
|
USBAUDIO_DEBUG(
|
||||||
msg_p->id,msg_p->ptr,msg_p->param0,msg_p->param1);
|
"usb_thread: id = 0x%x, ptr = 0x%x,param0 = 0x%x,param1 = 0x%x.",
|
||||||
|
msg_p->id, msg_p->ptr, msg_p->param0, msg_p->param1);
|
||||||
usb_mailbox_free(msg_p);
|
usb_mailbox_free(msg_p);
|
||||||
usb_audio_app_loop();
|
usb_audio_app_loop();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_enqueue_cmd(uint32_t data)
|
static void usb_enqueue_cmd(uint32_t data) {
|
||||||
{
|
|
||||||
USB_MESSAGE usb_msg;
|
USB_MESSAGE usb_msg;
|
||||||
|
|
||||||
usb_msg.id = 0;
|
usb_msg.id = 0;
|
||||||
|
@ -116,13 +111,12 @@ static void usb_enqueue_cmd(uint32_t data)
|
||||||
usb_mailbox_put(&usb_msg);
|
usb_mailbox_put(&usb_msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
int usb_os_init(void)
|
int usb_os_init(void) {
|
||||||
{
|
|
||||||
osThreadId usb_tid;
|
osThreadId usb_tid;
|
||||||
|
|
||||||
USBAUDIO_DEBUG("%s,%d",__func__,__LINE__);
|
USBAUDIO_DEBUG("%s,%d", __func__, __LINE__);
|
||||||
if (usb_mailbox_init()) {
|
if (usb_mailbox_init()) {
|
||||||
USBAUDIO_DEBUG("_debug: %s,%d",__func__,__LINE__);
|
USBAUDIO_DEBUG("_debug: %s,%d", __func__, __LINE__);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
usb_tid = osThreadCreate(osThread(usb_thread), NULL);
|
usb_tid = osThreadCreate(osThread(usb_thread), NULL);
|
||||||
|
@ -135,5 +129,3 @@ int usb_os_init(void)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -14,20 +14,19 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifdef __PC_CMD_UART__
|
#ifdef __PC_CMD_UART__
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "list.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "app_thread.h"
|
|
||||||
#include "app_cmd.h"
|
#include "app_cmd.h"
|
||||||
|
#include "app_thread.h"
|
||||||
|
#include "audio_process.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
#include "hal_cmd.h"
|
#include "hal_cmd.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "audio_process.h"
|
#include "list.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
#define APP_CMD_TRACE(s,...) TRACE(s, ##__VA_ARGS__)
|
#define APP_CMD_TRACE(s, ...) TRACE(s, ##__VA_ARGS__)
|
||||||
|
|
||||||
void cmd_event_process(hal_cmd_rx_status_t status)
|
void cmd_event_process(hal_cmd_rx_status_t status) {
|
||||||
{
|
APP_CMD_TRACE(1, "%s", __func__);
|
||||||
APP_CMD_TRACE(1,"%s",__func__);
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
msg.mod_id = APP_MODUAL_CMD;
|
msg.mod_id = APP_MODUAL_CMD;
|
||||||
msg.msg_body.message_id = status;
|
msg.msg_body.message_id = status;
|
||||||
|
@ -36,17 +35,15 @@ void cmd_event_process(hal_cmd_rx_status_t status)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_cmd_handle_process(APP_MESSAGE_BODY *msg_body)
|
static int app_cmd_handle_process(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
hal_cmd_run((hal_cmd_rx_status_t)msg_body->message_id);
|
hal_cmd_run((hal_cmd_rx_status_t)msg_body->message_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t app_cmd_flag = 0;
|
uint8_t app_cmd_flag = 0;
|
||||||
|
|
||||||
void app_cmd_open(void)
|
void app_cmd_open(void) {
|
||||||
{
|
APP_CMD_TRACE(1, "%s", __func__);
|
||||||
APP_CMD_TRACE(1,"%s",__func__);
|
|
||||||
|
|
||||||
app_cmd_flag = 1;
|
app_cmd_flag = 1;
|
||||||
|
|
||||||
|
@ -56,11 +53,9 @@ void app_cmd_open(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_cmd_close(void)
|
void app_cmd_close(void) {
|
||||||
{
|
APP_CMD_TRACE(1, "%s", __func__);
|
||||||
APP_CMD_TRACE(1,"%s",__func__);
|
if (app_cmd_flag) {
|
||||||
if(app_cmd_flag)
|
|
||||||
{
|
|
||||||
app_cmd_flag = 0;
|
app_cmd_flag = 0;
|
||||||
hal_cmd_close();
|
hal_cmd_close();
|
||||||
app_set_threadhandle(APP_MODUAL_CMD, NULL);
|
app_set_threadhandle(APP_MODUAL_CMD, NULL);
|
||||||
|
@ -68,4 +63,3 @@ void app_cmd_close(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -13,32 +13,32 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "stdint.h"
|
|
||||||
#include "app_spec_ostimer.h"
|
#include "app_spec_ostimer.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
|
#include "stdint.h"
|
||||||
|
|
||||||
/// Create timer
|
/// Create timer
|
||||||
osStatus app_spec_timer_create (SPEC_TIMER_CTX_T *spec_timer_ctx, const osTimerDef_t *timer_def, os_timer_type type, void *argument)
|
osStatus app_spec_timer_create(SPEC_TIMER_CTX_T *spec_timer_ctx,
|
||||||
{
|
const osTimerDef_t *timer_def,
|
||||||
|
os_timer_type type, void *argument) {
|
||||||
spec_timer_ctx->type = type;
|
spec_timer_ctx->type = type;
|
||||||
spec_timer_ctx->argument = argument;
|
spec_timer_ctx->argument = argument;
|
||||||
spec_timer_ctx->timerid = osTimerCreate(timer_def, type, spec_timer_ctx);
|
spec_timer_ctx->timerid = osTimerCreate(timer_def, type, spec_timer_ctx);
|
||||||
return spec_timer_ctx->timerid ? osOK: osErrorOS;
|
return spec_timer_ctx->timerid ? osOK : osErrorOS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Start or restart timer
|
/// Start or restart timer
|
||||||
osStatus app_spec_timer_start (SPEC_TIMER_CTX_T *spec_timer_ctx, uint32_t millisec)
|
osStatus app_spec_timer_start(SPEC_TIMER_CTX_T *spec_timer_ctx,
|
||||||
{
|
uint32_t millisec) {
|
||||||
osStatus status;
|
osStatus status;
|
||||||
|
|
||||||
//TRACE(1,"%s", __func__);
|
// TRACE(1,"%s", __func__);
|
||||||
if (millisec > UINT16_MAX){
|
if (millisec > UINT16_MAX) {
|
||||||
spec_timer_ctx->interval = millisec;
|
spec_timer_ctx->interval = millisec;
|
||||||
spec_timer_ctx->ctx = millisec;
|
spec_timer_ctx->ctx = millisec;
|
||||||
status = osTimerStart(spec_timer_ctx->timerid, UINT16_MAX);
|
status = osTimerStart(spec_timer_ctx->timerid, UINT16_MAX);
|
||||||
}else{
|
} else {
|
||||||
spec_timer_ctx->interval = millisec;
|
spec_timer_ctx->interval = millisec;
|
||||||
spec_timer_ctx->ctx = millisec;
|
spec_timer_ctx->ctx = millisec;
|
||||||
status = osTimerStart(spec_timer_ctx->timerid, (uint32_t)millisec);
|
status = osTimerStart(spec_timer_ctx->timerid, (uint32_t)millisec);
|
||||||
|
@ -48,31 +48,28 @@ osStatus app_spec_timer_start (SPEC_TIMER_CTX_T *spec_timer_ctx, uint32_t millis
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Stop timer
|
/// Stop timer
|
||||||
osStatus app_spec_timer_stop (SPEC_TIMER_CTX_T *spec_timer_ctx)
|
osStatus app_spec_timer_stop(SPEC_TIMER_CTX_T *spec_timer_ctx) {
|
||||||
{
|
|
||||||
return osTimerStop(spec_timer_ctx->timerid);
|
return osTimerStop(spec_timer_ctx->timerid);
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Delete timer
|
/// Delete timer
|
||||||
osStatus app_spec_timer_delete (SPEC_TIMER_CTX_T *spec_timer_ctx)
|
osStatus app_spec_timer_delete(SPEC_TIMER_CTX_T *spec_timer_ctx) {
|
||||||
{
|
|
||||||
return osTimerDelete(spec_timer_ctx->timerid);
|
return osTimerDelete(spec_timer_ctx->timerid);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_spec_timer_handler(void const *para)
|
void app_spec_timer_handler(void const *para) {
|
||||||
{
|
|
||||||
SPEC_TIMER_CTX_T *spec_timer_ctx = (SPEC_TIMER_CTX_T *)para;
|
SPEC_TIMER_CTX_T *spec_timer_ctx = (SPEC_TIMER_CTX_T *)para;
|
||||||
|
|
||||||
if (spec_timer_ctx->ctx > UINT16_MAX){
|
if (spec_timer_ctx->ctx > UINT16_MAX) {
|
||||||
spec_timer_ctx->ctx -= UINT16_MAX;
|
spec_timer_ctx->ctx -= UINT16_MAX;
|
||||||
if (spec_timer_ctx->ctx > UINT16_MAX){
|
if (spec_timer_ctx->ctx > UINT16_MAX) {
|
||||||
osTimerStart(spec_timer_ctx->timerid, UINT16_MAX);
|
osTimerStart(spec_timer_ctx->timerid, UINT16_MAX);
|
||||||
}else{
|
} else {
|
||||||
osTimerStart(spec_timer_ctx->timerid, spec_timer_ctx->ctx);
|
osTimerStart(spec_timer_ctx->timerid, spec_timer_ctx->ctx);
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
(*spec_timer_ctx->ptimer)(spec_timer_ctx->argument);
|
(*spec_timer_ctx->ptimer)(spec_timer_ctx->argument);
|
||||||
if (spec_timer_ctx->type == osTimerPeriodic){
|
if (spec_timer_ctx->type == osTimerPeriodic) {
|
||||||
app_spec_timer_start(spec_timer_ctx, spec_timer_ctx->interval);
|
app_spec_timer_start(spec_timer_ctx, spec_timer_ctx->interval);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,51 +13,49 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "app_utils.h"
|
|
||||||
#include "app_thread.h"
|
#include "app_thread.h"
|
||||||
|
#include "app_utils.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
|
||||||
static APP_MOD_HANDLER_T mod_handler[APP_MODUAL_NUM];
|
static APP_MOD_HANDLER_T mod_handler[APP_MODUAL_NUM];
|
||||||
|
|
||||||
static void app_thread(void const *argument);
|
static void app_thread(void const *argument);
|
||||||
osThreadDef(app_thread, osPriorityHigh, 1, 1024*3, "app_thread");
|
osThreadDef(app_thread, osPriorityHigh, 1, 1024 * 3, "app_thread");
|
||||||
|
|
||||||
osMailQDef (app_mailbox, APP_MAILBOX_MAX, APP_MESSAGE_BLOCK);
|
osMailQDef(app_mailbox, APP_MAILBOX_MAX, APP_MESSAGE_BLOCK);
|
||||||
static osMailQId app_mailbox = NULL;
|
static osMailQId app_mailbox = NULL;
|
||||||
static uint8_t app_mailbox_cnt = 0;
|
static uint8_t app_mailbox_cnt = 0;
|
||||||
osThreadId app_thread_tid;
|
osThreadId app_thread_tid;
|
||||||
|
|
||||||
static int app_mailbox_init(void)
|
static int app_mailbox_init(void) {
|
||||||
{
|
|
||||||
app_mailbox = osMailCreate(osMailQ(app_mailbox), NULL);
|
app_mailbox = osMailCreate(osMailQ(app_mailbox), NULL);
|
||||||
if (app_mailbox == NULL) {
|
if (app_mailbox == NULL) {
|
||||||
TRACE(0,"Failed to Create app_mailbox\n");
|
TRACE(0, "Failed to Create app_mailbox\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
app_mailbox_cnt = 0;
|
app_mailbox_cnt = 0;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_mailbox_put(APP_MESSAGE_BLOCK* msg_src)
|
int app_mailbox_put(APP_MESSAGE_BLOCK *msg_src) {
|
||||||
{
|
|
||||||
osStatus status;
|
osStatus status;
|
||||||
|
|
||||||
APP_MESSAGE_BLOCK *msg_p = NULL;
|
APP_MESSAGE_BLOCK *msg_p = NULL;
|
||||||
|
|
||||||
msg_p = (APP_MESSAGE_BLOCK*)osMailAlloc(app_mailbox, 0);
|
msg_p = (APP_MESSAGE_BLOCK *)osMailAlloc(app_mailbox, 0);
|
||||||
|
|
||||||
if (!msg_p){
|
if (!msg_p) {
|
||||||
osEvent evt;
|
osEvent evt;
|
||||||
TRACE_IMM(0,"osMailAlloc error dump");
|
TRACE_IMM(0, "osMailAlloc error dump");
|
||||||
for (uint8_t i=0; i<APP_MAILBOX_MAX; i++){
|
for (uint8_t i = 0; i < APP_MAILBOX_MAX; i++) {
|
||||||
evt = osMailGet(app_mailbox, 0);
|
evt = osMailGet(app_mailbox, 0);
|
||||||
if (evt.status == osEventMail) {
|
if (evt.status == osEventMail) {
|
||||||
TRACE_IMM(9,"cnt:%d mod:%d src:%08x tim:%d id:%x ptr:%08x para:%08x/%08x/%08x",
|
TRACE_IMM(
|
||||||
i,
|
9,
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->mod_id,
|
"cnt:%d mod:%d src:%08x tim:%d id:%x ptr:%08x para:%08x/%08x/%08x",
|
||||||
|
i, ((APP_MESSAGE_BLOCK *)(evt.value.p))->mod_id,
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->src_thread,
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->src_thread,
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->system_time,
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->system_time,
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_id,
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_id,
|
||||||
|
@ -65,12 +63,12 @@ int app_mailbox_put(APP_MESSAGE_BLOCK* msg_src)
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param0,
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param0,
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param1,
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param1,
|
||||||
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param2);
|
((APP_MESSAGE_BLOCK *)(evt.value.p))->msg_body.message_Param2);
|
||||||
}else{
|
} else {
|
||||||
TRACE_IMM(2,"cnt:%d %d", i, evt.status);
|
TRACE_IMM(2, "cnt:%d %d", i, evt.status);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TRACE_IMM(0,"osMailAlloc error dump end");
|
TRACE_IMM(0, "osMailAlloc error dump end");
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(msg_p, "osMailAlloc error");
|
ASSERT(msg_p, "osMailAlloc error");
|
||||||
|
@ -90,8 +88,7 @@ int app_mailbox_put(APP_MESSAGE_BLOCK* msg_src)
|
||||||
return (int)status;
|
return (int)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_mailbox_free(APP_MESSAGE_BLOCK* msg_p)
|
int app_mailbox_free(APP_MESSAGE_BLOCK *msg_p) {
|
||||||
{
|
|
||||||
osStatus status;
|
osStatus status;
|
||||||
|
|
||||||
status = osMailFree(app_mailbox, msg_p);
|
status = osMailFree(app_mailbox, msg_p);
|
||||||
|
@ -101,8 +98,7 @@ int app_mailbox_free(APP_MESSAGE_BLOCK* msg_p)
|
||||||
return (int)status;
|
return (int)status;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_mailbox_get(APP_MESSAGE_BLOCK** msg_p)
|
int app_mailbox_get(APP_MESSAGE_BLOCK **msg_p) {
|
||||||
{
|
|
||||||
osEvent evt;
|
osEvent evt;
|
||||||
evt = osMailGet(app_mailbox, osWaitForever);
|
evt = osMailGet(app_mailbox, osWaitForever);
|
||||||
if (evt.status == osEventMail) {
|
if (evt.status == osEventMail) {
|
||||||
|
@ -112,9 +108,8 @@ int app_mailbox_get(APP_MESSAGE_BLOCK** msg_p)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_thread(void const *argument)
|
static void app_thread(void const *argument) {
|
||||||
{
|
while (1) {
|
||||||
while(1){
|
|
||||||
APP_MESSAGE_BLOCK *msg_p = NULL;
|
APP_MESSAGE_BLOCK *msg_p = NULL;
|
||||||
|
|
||||||
if (!app_mailbox_get(&msg_p)) {
|
if (!app_mailbox_get(&msg_p)) {
|
||||||
|
@ -122,7 +117,7 @@ static void app_thread(void const *argument)
|
||||||
if (mod_handler[msg_p->mod_id]) {
|
if (mod_handler[msg_p->mod_id]) {
|
||||||
int ret = mod_handler[msg_p->mod_id](&(msg_p->msg_body));
|
int ret = mod_handler[msg_p->mod_id](&(msg_p->msg_body));
|
||||||
if (ret)
|
if (ret)
|
||||||
TRACE(2,"mod_handler[%d] ret=%d", msg_p->mod_id, ret);
|
TRACE(2, "mod_handler[%d] ret=%d", msg_p->mod_id, ret);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
app_mailbox_free(msg_p);
|
app_mailbox_free(msg_p);
|
||||||
|
@ -130,35 +125,29 @@ static void app_thread(void const *argument)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_os_init(void)
|
int app_os_init(void) {
|
||||||
{
|
|
||||||
if (app_mailbox_init())
|
if (app_mailbox_init())
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
app_thread_tid = osThreadCreate(osThread(app_thread), NULL);
|
app_thread_tid = osThreadCreate(osThread(app_thread), NULL);
|
||||||
if (app_thread_tid == NULL) {
|
if (app_thread_tid == NULL) {
|
||||||
TRACE(0,"Failed to Create app_thread\n");
|
TRACE(0, "Failed to Create app_thread\n");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_set_threadhandle(enum APP_MODUAL_ID_T mod_id, APP_MOD_HANDLER_T handler)
|
int app_set_threadhandle(enum APP_MODUAL_ID_T mod_id,
|
||||||
{
|
APP_MOD_HANDLER_T handler) {
|
||||||
if (mod_id>=APP_MODUAL_NUM)
|
if (mod_id >= APP_MODUAL_NUM)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
mod_handler[mod_id] = handler;
|
mod_handler[mod_id] = handler;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void * app_os_tid_get(void)
|
void *app_os_tid_get(void) { return (void *)app_thread_tid; }
|
||||||
{
|
|
||||||
return (void *)app_thread_tid;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool app_is_module_registered(enum APP_MODUAL_ID_T mod_id)
|
bool app_is_module_registered(enum APP_MODUAL_ID_T mod_id) {
|
||||||
{
|
|
||||||
return mod_handler[mod_id];
|
return mod_handler[mod_id];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,8 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifndef __APP_THREAD_H__
|
#ifndef __APP_THREAD_H__
|
||||||
#define __APP_THREAD_H__
|
#define __APP_THREAD_H__
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -71,22 +73,23 @@ typedef struct {
|
||||||
|
|
||||||
typedef int (*APP_MOD_HANDLER_T)(APP_MESSAGE_BODY *);
|
typedef int (*APP_MOD_HANDLER_T)(APP_MESSAGE_BODY *);
|
||||||
|
|
||||||
int app_mailbox_put(APP_MESSAGE_BLOCK* msg_src);
|
int app_mailbox_put(APP_MESSAGE_BLOCK *msg_src);
|
||||||
|
|
||||||
int app_mailbox_free(APP_MESSAGE_BLOCK* msg_p);
|
int app_mailbox_free(APP_MESSAGE_BLOCK *msg_p);
|
||||||
|
|
||||||
int app_mailbox_get(APP_MESSAGE_BLOCK** msg_p);
|
int app_mailbox_get(APP_MESSAGE_BLOCK **msg_p);
|
||||||
|
|
||||||
int app_os_init(void);
|
int app_os_init(void);
|
||||||
|
|
||||||
int app_set_threadhandle(enum APP_MODUAL_ID_T mod_id, APP_MOD_HANDLER_T handler);
|
int app_set_threadhandle(enum APP_MODUAL_ID_T mod_id,
|
||||||
|
APP_MOD_HANDLER_T handler);
|
||||||
|
|
||||||
void * app_os_tid_get(void);
|
void *app_os_tid_get(void);
|
||||||
|
|
||||||
bool app_is_module_registered(enum APP_MODUAL_ID_T mod_id);
|
bool app_is_module_registered(enum APP_MODUAL_ID_T mod_id);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif//__FMDEC_H__
|
#endif //__FMDEC_H__
|
||||||
|
|
|
@ -13,13 +13,13 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_utils.h"
|
||||||
|
#include "analog.h"
|
||||||
#include "cmsis.h"
|
#include "cmsis.h"
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
#include "hal_wdt.h"
|
#include "hal_wdt.h"
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
#include "analog.h"
|
|
||||||
#include "app_utils.h"
|
|
||||||
#ifdef RTOS
|
#ifdef RTOS
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -41,19 +41,16 @@
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* NOTE:
|
* NOTE:
|
||||||
* The macro QOS_USERS works only when the APP_SYSFREQ_USER_APP_XXX is not large than
|
* The macro QOS_USERS works only when the APP_SYSFREQ_USER_APP_XXX is not large
|
||||||
* 32, currently this works, but if the are more user, another way needed
|
* than 32, currently this works, but if the are more user, another way needed
|
||||||
*/
|
*/
|
||||||
#define QOS_USERS ((1 << (APP_SYSFREQ_USER_AI_VOICE)) | \
|
#define QOS_USERS \
|
||||||
(1 << (APP_SYSFREQ_USER_BT_A2DP)))
|
((1 << (APP_SYSFREQ_USER_AI_VOICE)) | (1 << (APP_SYSFREQ_USER_BT_A2DP)))
|
||||||
|
|
||||||
static const uint32_t freq_map[] = {
|
static const uint32_t freq_map[] = {
|
||||||
[HAL_CMU_FREQ_32K] = FREQ_FREE,
|
[HAL_CMU_FREQ_32K] = FREQ_FREE, [HAL_CMU_FREQ_26M] = FREQ_26M,
|
||||||
[HAL_CMU_FREQ_26M] = FREQ_26M,
|
[HAL_CMU_FREQ_52M] = FREQ_52M, [HAL_CMU_FREQ_78M] = FREQ_78M,
|
||||||
[HAL_CMU_FREQ_52M] = FREQ_52M,
|
[HAL_CMU_FREQ_104M] = FREQ_104M, [HAL_CMU_FREQ_208M] = FREQ_208M,
|
||||||
[HAL_CMU_FREQ_78M] = FREQ_78M,
|
|
||||||
[HAL_CMU_FREQ_104M] = FREQ_104M,
|
|
||||||
[HAL_CMU_FREQ_208M] = FREQ_208M,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static const uint32_t user_map[] = {
|
static const uint32_t user_map[] = {
|
||||||
|
@ -89,8 +86,8 @@ static uint32_t qos_freqs_map;
|
||||||
*/
|
*/
|
||||||
static uint32_t qos_users_map;
|
static uint32_t qos_users_map;
|
||||||
|
|
||||||
static int app_qosfreq_req(enum APP_SYSFREQ_USER_T user, enum APP_SYSFREQ_FREQ_T freq)
|
static int app_qosfreq_req(enum APP_SYSFREQ_USER_T user,
|
||||||
{
|
enum APP_SYSFREQ_FREQ_T freq) {
|
||||||
int ret;
|
int ret;
|
||||||
int qos_freq_num = 0;
|
int qos_freq_num = 0;
|
||||||
uint32_t max_qos_freq = 0;
|
uint32_t max_qos_freq = 0;
|
||||||
|
@ -119,18 +116,18 @@ static int app_qosfreq_req(enum APP_SYSFREQ_USER_T user, enum APP_SYSFREQ_FREQ_T
|
||||||
qos_freqs_map &= ~(0xf << (4 * i));
|
qos_freqs_map &= ~(0xf << (4 * i));
|
||||||
qos_freqs_map |= freq << (4 * i);
|
qos_freqs_map |= freq << (4 * i);
|
||||||
qos_users_map |= 1 << user_idx;
|
qos_users_map |= 1 << user_idx;
|
||||||
} else { //release freq
|
} else { // release freq
|
||||||
qos_freqs_map &= ~(0xf << (4 * i));
|
qos_freqs_map &= ~(0xf << (4 * i));
|
||||||
qos_users_map &= ~ (1 << user_idx);
|
qos_users_map &= ~(1 << user_idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
//scan the qos_user_map and sum every user's request freq
|
// scan the qos_user_map and sum every user's request freq
|
||||||
for(i = 0; i < ARRAY_SIZE(user_map); i++) {
|
for (i = 0; i < ARRAY_SIZE(user_map); i++) {
|
||||||
if ((qos_users_map >> i) & 0x1) {
|
if ((qos_users_map >> i) & 0x1) {
|
||||||
uint32_t real_freq;
|
uint32_t real_freq;
|
||||||
int freq_num;
|
int freq_num;
|
||||||
|
|
||||||
freq_num = (qos_freqs_map >> (4 * i )) & 0xf;
|
freq_num = (qos_freqs_map >> (4 * i)) & 0xf;
|
||||||
real_freq = freq_map[freq_num];
|
real_freq = freq_map[freq_num];
|
||||||
max_qos_freq += real_freq;
|
max_qos_freq += real_freq;
|
||||||
}
|
}
|
||||||
|
@ -138,7 +135,7 @@ static int app_qosfreq_req(enum APP_SYSFREQ_USER_T user, enum APP_SYSFREQ_FREQ_T
|
||||||
|
|
||||||
for (i = 0; i < ARRAY_SIZE(freq_map); i++) {
|
for (i = 0; i < ARRAY_SIZE(freq_map); i++) {
|
||||||
if (i) {
|
if (i) {
|
||||||
if ((max_qos_freq > freq_map[i-1]) && (max_qos_freq <= freq_map[i])) {
|
if ((max_qos_freq > freq_map[i - 1]) && (max_qos_freq <= freq_map[i])) {
|
||||||
qos_freq_num = i;
|
qos_freq_num = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -160,21 +157,23 @@ static int app_qosfreq_req(enum APP_SYSFREQ_USER_T user, enum APP_SYSFREQ_FREQ_T
|
||||||
|
|
||||||
user = APP_SYSFREQ_USER_QOS;
|
user = APP_SYSFREQ_USER_QOS;
|
||||||
TRACE(2, "User %d require sysfreq %d", user, qos_freq_num);
|
TRACE(2, "User %d require sysfreq %d", user, qos_freq_num);
|
||||||
ret = hal_sysfreq_req((enum HAL_SYSFREQ_USER_T)user, (enum HAL_CMU_FREQ_T)qos_freq_num);
|
ret = hal_sysfreq_req((enum HAL_SYSFREQ_USER_T)user,
|
||||||
|
(enum HAL_CMU_FREQ_T)qos_freq_num);
|
||||||
|
|
||||||
int_unlock(lock);
|
int_unlock(lock);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_sysfreq_req(enum APP_SYSFREQ_USER_T user, enum APP_SYSFREQ_FREQ_T freq)
|
int app_sysfreq_req(enum APP_SYSFREQ_USER_T user,
|
||||||
{
|
enum APP_SYSFREQ_FREQ_T freq) {
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
// if user is qos user
|
// if user is qos user
|
||||||
if ((1 << user) & QOS_USERS) {
|
if ((1 << user) & QOS_USERS) {
|
||||||
ret = app_qosfreq_req(user, freq);
|
ret = app_qosfreq_req(user, freq);
|
||||||
} else { // if user is NOT qos user
|
} else { // if user is NOT qos user
|
||||||
ret = hal_sysfreq_req((enum HAL_SYSFREQ_USER_T)user, (enum HAL_CMU_FREQ_T)freq);
|
ret = hal_sysfreq_req((enum HAL_SYSFREQ_USER_T)user,
|
||||||
|
(enum HAL_CMU_FREQ_T)freq);
|
||||||
}
|
}
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -188,28 +187,24 @@ static osTimerId wdt_ping_timer_id;
|
||||||
osTimerDef(wdt_ping_timer, watchdog_ping_handler);
|
osTimerDef(wdt_ping_timer, watchdog_ping_handler);
|
||||||
static uint32_t wdt_ping_period;
|
static uint32_t wdt_ping_period;
|
||||||
|
|
||||||
static void watchdog_ping(void)
|
static void watchdog_ping(void) {
|
||||||
{
|
|
||||||
hal_wdt_ping(HAL_WDT_ID_0);
|
hal_wdt_ping(HAL_WDT_ID_0);
|
||||||
#ifndef CHIP_BEST2000
|
#ifndef CHIP_BEST2000
|
||||||
pmu_wdt_feed();
|
pmu_wdt_feed();
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_wdt_irq_handle(enum HAL_WDT_ID_T id, uint32_t status)
|
static void app_wdt_irq_handle(enum HAL_WDT_ID_T id, uint32_t status) {
|
||||||
{
|
|
||||||
analog_aud_codec_mute();
|
analog_aud_codec_mute();
|
||||||
ASSERT(0, "%s id:%d status:%d",__func__, id, status);
|
ASSERT(0, "%s id:%d status:%d", __func__, id, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pmu_wdt_irq_handle(void)
|
static void pmu_wdt_irq_handle(void) {
|
||||||
{
|
|
||||||
analog_aud_codec_mute();
|
analog_aud_codec_mute();
|
||||||
ASSERT(1, "%s", __func__);
|
ASSERT(1, "%s", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void watchdog_ping_handler(void const *unused)
|
static void watchdog_ping_handler(void const *unused) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
watchdog_ping();
|
watchdog_ping();
|
||||||
|
@ -221,8 +216,7 @@ static void watchdog_ping_handler(void const *unused)
|
||||||
osTimerStart(wdt_ping_timer_id, wdt_ping_period);
|
osTimerStart(wdt_ping_timer_id, wdt_ping_period);
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_wdt_open(int seconds)
|
int app_wdt_open(int seconds) {
|
||||||
{
|
|
||||||
uint32_t lock = int_lock();
|
uint32_t lock = int_lock();
|
||||||
|
|
||||||
hal_wdt_set_irq_callback(HAL_WDT_ID_0, app_wdt_irq_handle);
|
hal_wdt_set_irq_callback(HAL_WDT_ID_0, app_wdt_irq_handle);
|
||||||
|
@ -236,7 +230,7 @@ int app_wdt_open(int seconds)
|
||||||
int_unlock(lock);
|
int_unlock(lock);
|
||||||
wdt_ping_timer_id = osTimerCreate(osTimer(wdt_ping_timer), osTimerOnce, NULL);
|
wdt_ping_timer_id = osTimerCreate(osTimer(wdt_ping_timer), osTimerOnce, NULL);
|
||||||
if (!wdt_ping_timer_id) {
|
if (!wdt_ping_timer_id) {
|
||||||
TRACE(0,"Warning: can not create watchdog ping timer");
|
TRACE(0, "Warning: can not create watchdog ping timer");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
wdt_ping_period = seconds * 1000 / 4;
|
wdt_ping_period = seconds * 1000 / 4;
|
||||||
|
@ -245,8 +239,7 @@ int app_wdt_open(int seconds)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_wdt_reopen(int seconds)
|
int app_wdt_reopen(int seconds) {
|
||||||
{
|
|
||||||
uint32_t lock = int_lock();
|
uint32_t lock = int_lock();
|
||||||
hal_wdt_stop(HAL_WDT_ID_0);
|
hal_wdt_stop(HAL_WDT_ID_0);
|
||||||
hal_wdt_set_timeout(HAL_WDT_ID_0, seconds);
|
hal_wdt_set_timeout(HAL_WDT_ID_0, seconds);
|
||||||
|
@ -261,8 +254,7 @@ int app_wdt_reopen(int seconds)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_wdt_close(void)
|
int app_wdt_close(void) {
|
||||||
{
|
|
||||||
uint32_t lock;
|
uint32_t lock;
|
||||||
|
|
||||||
osTimerStop(wdt_ping_timer_id);
|
osTimerStop(wdt_ping_timer_id);
|
||||||
|
@ -278,4 +270,3 @@ int app_wdt_close(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,23 +1,23 @@
|
||||||
#ifdef __RAND_FROM_MIC__
|
#ifdef __RAND_FROM_MIC__
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "app_utils.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "stdlib.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
#include "app_bt_stream.h"
|
|
||||||
#include "randfrommic.h"
|
#include "randfrommic.h"
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "cmsis_gcc.h"
|
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
|
#include "app_bt_stream.h"
|
||||||
|
#include "app_utils.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
#include "cmsis_gcc.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "stdlib.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
#if BT_DRV_DEBUG
|
#if BT_DRV_DEBUG
|
||||||
#define RAND_TRACE(n, fmt, ...) TRACE(n, fmt, ##__VA_ARGS__)
|
#define RAND_TRACE(n, fmt, ...) TRACE(n, fmt, ##__VA_ARGS__)
|
||||||
#define RAND_DUMP(s,buff,len) DUMP8(s,buff,len)
|
#define RAND_DUMP(s, buff, len) DUMP8(s, buff, len)
|
||||||
#else
|
#else
|
||||||
#define RAND_TRACE(n, fmt, ...)
|
#define RAND_TRACE(n, fmt, ...)
|
||||||
#define RAND_DUMP(s,buff,len)
|
#define RAND_DUMP(s, buff, len)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void generateRand(bool on);
|
static void generateRand(bool on);
|
||||||
|
@ -30,85 +30,77 @@ static bool randInitialised = false;
|
||||||
|
|
||||||
// 4 bytes aligned
|
// 4 bytes aligned
|
||||||
#define RAND_GRAB_BITS_PER_SAMPLE 4
|
#define RAND_GRAB_BITS_PER_SAMPLE 4
|
||||||
#define RAND_GRAB_BITS_MASK_PER_SAMPLE ((1 << RAND_GRAB_BITS_PER_SAMPLE)-1)
|
#define RAND_GRAB_BITS_MASK_PER_SAMPLE ((1 << RAND_GRAB_BITS_PER_SAMPLE) - 1)
|
||||||
|
|
||||||
RAND_NUMBER_T randomBuffer =
|
RAND_NUMBER_T randomBuffer = {
|
||||||
{
|
|
||||||
25,
|
25,
|
||||||
RAND_STATUS_CLOSE,
|
RAND_STATUS_CLOSE,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Description: parse mic data according to the stream cfg(bit mode and channel number)
|
* Description: parse mic data according to the stream cfg(bit mode and channel
|
||||||
* only the lowest byte of each frame is taken
|
* number) only the lowest byte of each frame is taken ADC format: 16bit mode ->
|
||||||
* ADC format:
|
* [15:0] is valid 24bit mode -> [23:4] is valid 32bit mode -> [31:12] is valid
|
||||||
* 16bit mode -> [15:0] is valid
|
|
||||||
* 24bit mode -> [23:4] is valid
|
|
||||||
* 32bit mode -> [31:12] is valid
|
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
static int randDataParse(uint8_t *buf, uint32_t len, enum AUD_BITS_T bits,
|
static int randDataParse(uint8_t *buf, uint32_t len, enum AUD_BITS_T bits,
|
||||||
enum AUD_CHANNEL_NUM_T ch_num)
|
enum AUD_CHANNEL_NUM_T ch_num) {
|
||||||
{
|
|
||||||
uint8_t index = 0;
|
uint8_t index = 0;
|
||||||
|
|
||||||
union {
|
union {
|
||||||
uint32_t seedValue;
|
uint32_t seedValue;
|
||||||
uint8_t value[4];
|
uint8_t value[4];
|
||||||
}seedData;
|
} seedData;
|
||||||
|
|
||||||
if ((NULL == buf) ||
|
if ((NULL == buf) ||
|
||||||
((RANDOM_CAPTURE_BUFFER_SIZE/2) > len)) // ping-pong buffer
|
((RANDOM_CAPTURE_BUFFER_SIZE / 2) > len)) // ping-pong buffer
|
||||||
{
|
{
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
RAND_TRACE(1, "%s", __func__);
|
RAND_TRACE(1, "%s", __func__);
|
||||||
RAND_DUMP("%x ",buf, 16);
|
RAND_DUMP("%x ", buf, 16);
|
||||||
|
|
||||||
switch (bits)
|
switch (bits) {
|
||||||
{
|
case AUD_BITS_16: {
|
||||||
case AUD_BITS_16:
|
uint16_t *content = (uint16_t *)buf;
|
||||||
{
|
|
||||||
uint16_t* content = (uint16_t *)buf;
|
|
||||||
|
|
||||||
for (index = 0;index < 4; index++)
|
for (index = 0; index < 4; index++) {
|
||||||
{
|
seedData.value[index] =
|
||||||
seedData.value[index] = ((*content) & RAND_GRAB_BITS_MASK_PER_SAMPLE) |
|
((*content) & RAND_GRAB_BITS_MASK_PER_SAMPLE) |
|
||||||
(((*(content+ch_num)) & RAND_GRAB_BITS_MASK_PER_SAMPLE) << RAND_GRAB_BITS_PER_SAMPLE);
|
(((*(content + ch_num)) & RAND_GRAB_BITS_MASK_PER_SAMPLE)
|
||||||
content += ((8/RAND_GRAB_BITS_PER_SAMPLE)*ch_num);
|
<< RAND_GRAB_BITS_PER_SAMPLE);
|
||||||
|
content += ((8 / RAND_GRAB_BITS_PER_SAMPLE) * ch_num);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AUD_BITS_24:
|
case AUD_BITS_24: {
|
||||||
{
|
uint32_t *content = (uint32_t *)buf;
|
||||||
uint32_t* content = (uint32_t *)buf;
|
for (index = 0; index < 4; index++) {
|
||||||
for (index = 0;index < 4; index++)
|
|
||||||
{
|
|
||||||
// bit 23:4 are valid
|
// bit 23:4 are valid
|
||||||
seedData.value[index] = (((*content) >> 4) & RAND_GRAB_BITS_MASK_PER_SAMPLE) |
|
seedData.value[index] =
|
||||||
((((*(content+ch_num)) >> 4)&RAND_GRAB_BITS_MASK_PER_SAMPLE) << RAND_GRAB_BITS_PER_SAMPLE);
|
(((*content) >> 4) & RAND_GRAB_BITS_MASK_PER_SAMPLE) |
|
||||||
content += ((8/RAND_GRAB_BITS_PER_SAMPLE)*ch_num);
|
((((*(content + ch_num)) >> 4) & RAND_GRAB_BITS_MASK_PER_SAMPLE)
|
||||||
|
<< RAND_GRAB_BITS_PER_SAMPLE);
|
||||||
|
content += ((8 / RAND_GRAB_BITS_PER_SAMPLE) * ch_num);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AUD_BITS_32:
|
case AUD_BITS_32: {
|
||||||
{
|
uint32_t *content = (uint32_t *)buf;
|
||||||
uint32_t* content = (uint32_t *)buf;
|
for (index = 0; index < 4; index++) {
|
||||||
for (index = 0;index < 4; index++)
|
|
||||||
{
|
|
||||||
// bit 31:12 are valid
|
// bit 31:12 are valid
|
||||||
seedData.value[index] = (((*content) >> 12) & RAND_GRAB_BITS_MASK_PER_SAMPLE) |
|
seedData.value[index] =
|
||||||
((((*(content+ch_num)) >> 12) & RAND_GRAB_BITS_MASK_PER_SAMPLE) << RAND_GRAB_BITS_PER_SAMPLE);
|
(((*content) >> 12) & RAND_GRAB_BITS_MASK_PER_SAMPLE) |
|
||||||
content += ((8/RAND_GRAB_BITS_PER_SAMPLE)*ch_num);
|
((((*(content + ch_num)) >> 12) & RAND_GRAB_BITS_MASK_PER_SAMPLE)
|
||||||
|
<< RAND_GRAB_BITS_PER_SAMPLE);
|
||||||
|
content += ((8 / RAND_GRAB_BITS_PER_SAMPLE) * ch_num);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default: {
|
||||||
{
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
} break;
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
randSeed = seedData.seedValue;
|
randSeed = seedData.seedValue;
|
||||||
|
@ -116,21 +108,18 @@ static int randDataParse(uint8_t *buf, uint32_t len, enum AUD_BITS_T bits,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void generateRand(bool on)
|
static void generateRand(bool on) {
|
||||||
{
|
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
|
|
||||||
RAND_TRACE(2, "%s op:%d", __func__, on);
|
RAND_TRACE(2, "%s op:%d", __func__, on);
|
||||||
|
|
||||||
if (on)
|
if (on) {
|
||||||
{
|
|
||||||
randomBuffer.skipRound = 10;
|
randomBuffer.skipRound = 10;
|
||||||
|
|
||||||
randomBuffer.status = random_mic_is_on(&deviceId);
|
randomBuffer.status = random_mic_is_on(&deviceId);
|
||||||
RAND_TRACE(2, "%s random status = %d", __func__, randomBuffer.status);
|
RAND_TRACE(2, "%s random status = %d", __func__, randomBuffer.status);
|
||||||
|
|
||||||
if (RAND_STATUS_CLOSE == randomBuffer.status)
|
if (RAND_STATUS_CLOSE == randomBuffer.status) {
|
||||||
{
|
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_RANDOM, APP_SYSFREQ_208M);
|
app_sysfreq_req(APP_SYSFREQ_USER_RANDOM, APP_SYSFREQ_208M);
|
||||||
app_capture_audio_mempool_init();
|
app_capture_audio_mempool_init();
|
||||||
app_capture_audio_mempool_get_buff(&captureBuffer,
|
app_capture_audio_mempool_get_buff(&captureBuffer,
|
||||||
|
@ -149,22 +138,15 @@ static void generateRand(bool on)
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
randomBuffer.status = RAND_STATUS_OPEN;
|
randomBuffer.status = RAND_STATUS_OPEN;
|
||||||
}
|
} else if (RAND_STATUS_MIC_OPENED == randomBuffer.status) {
|
||||||
else if(RAND_STATUS_MIC_OPENED == randomBuffer.status)
|
|
||||||
{
|
|
||||||
af_stream_start(deviceId, AUD_STREAM_CAPTURE);
|
af_stream_start(deviceId, AUD_STREAM_CAPTURE);
|
||||||
}
|
}
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
// release the acquired system clock
|
// release the acquired system clock
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_RANDOM, APP_SYSFREQ_32K);
|
app_sysfreq_req(APP_SYSFREQ_USER_RANDOM, APP_SYSFREQ_32K);
|
||||||
if (RAND_STATUS_MIC_OPENED == randomBuffer.status)
|
if (RAND_STATUS_MIC_OPENED == randomBuffer.status) {
|
||||||
{
|
|
||||||
af_stream_stop(deviceId, AUD_STREAM_CAPTURE);
|
af_stream_stop(deviceId, AUD_STREAM_CAPTURE);
|
||||||
}
|
} else if (RAND_STATUS_OPEN == randomBuffer.status) {
|
||||||
else if (RAND_STATUS_OPEN == randomBuffer.status)
|
|
||||||
{
|
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
}
|
}
|
||||||
|
@ -172,46 +154,37 @@ static void generateRand(bool on)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t rand_data_handle(uint8_t *buf, uint32_t len)
|
static uint32_t rand_data_handle(uint8_t *buf, uint32_t len) {
|
||||||
{
|
if (buf == NULL) {
|
||||||
if (buf == NULL)
|
|
||||||
{
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((1 == randomBuffer.skipRound) &&
|
if ((1 == randomBuffer.skipRound) &&
|
||||||
(!randDataParse(buf, len, AUD_BITS_16, AUD_CHANNEL_NUM_1)))
|
(!randDataParse(buf, len, AUD_BITS_16, AUD_CHANNEL_NUM_1))) {
|
||||||
{
|
|
||||||
generateRand(false);
|
generateRand(false);
|
||||||
randomBuffer.skipRound = 0;
|
randomBuffer.skipRound = 0;
|
||||||
}
|
} else if (1 != randomBuffer.skipRound) {
|
||||||
else if (1 != randomBuffer.skipRound)
|
|
||||||
{
|
|
||||||
randomBuffer.skipRound--;
|
randomBuffer.skipRound--;
|
||||||
}
|
}
|
||||||
|
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void initSeed(void)
|
void initSeed(void) {
|
||||||
{
|
|
||||||
uint8_t count = 100; // avoid deed loop
|
uint8_t count = 100; // avoid deed loop
|
||||||
|
|
||||||
RAND_TRACE(2, "%s:+++ initialised = %d", __func__, randInitialised);
|
RAND_TRACE(2, "%s:+++ initialised = %d", __func__, randInitialised);
|
||||||
|
|
||||||
if (randInitialised)
|
if (randInitialised) {
|
||||||
{
|
|
||||||
generateRand(true);
|
generateRand(true);
|
||||||
|
|
||||||
while ((0 != randomBuffer.skipRound) && (0 != count))
|
while ((0 != randomBuffer.skipRound) && (0 != count)) {
|
||||||
{
|
|
||||||
osDelay(10);
|
osDelay(10);
|
||||||
count --;
|
count--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((0 == count) || (false == randInitialised))
|
if ((0 == count) || (false == randInitialised)) {
|
||||||
{
|
|
||||||
RAND_TRACE(1, "%s not ready", __func__);
|
RAND_TRACE(1, "%s not ready", __func__);
|
||||||
randSeed = (uint32_t)hal_sys_timer_get();
|
randSeed = (uint32_t)hal_sys_timer_get();
|
||||||
generateRand(false);
|
generateRand(false);
|
||||||
|
@ -221,47 +194,36 @@ void initSeed(void)
|
||||||
RAND_TRACE(2, "%s:--- count = %d", __func__, count);
|
RAND_TRACE(2, "%s:--- count = %d", __func__, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
void random_status_sync(void)
|
void random_status_sync(void) {
|
||||||
{
|
if (RAND_STATUS_OPEN == randomBuffer.status) {
|
||||||
if (RAND_STATUS_OPEN == randomBuffer.status)
|
|
||||||
{
|
|
||||||
RAND_TRACE(1, "%s random mic has already on,should be closed", __func__);
|
RAND_TRACE(1, "%s random mic has already on,should be closed", __func__);
|
||||||
generateRand(false);
|
generateRand(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void random_data_process(uint8_t *buf, uint32_t len,enum AUD_BITS_T bits,
|
void random_data_process(uint8_t *buf, uint32_t len, enum AUD_BITS_T bits,
|
||||||
enum AUD_CHANNEL_NUM_T ch_num)
|
enum AUD_CHANNEL_NUM_T ch_num) {
|
||||||
{
|
if (buf == NULL) {
|
||||||
if (buf == NULL)
|
|
||||||
{
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((RAND_STATUS_MIC_STARTED == randomBuffer.status) ||
|
if ((RAND_STATUS_MIC_STARTED == randomBuffer.status) ||
|
||||||
(RAND_STATUS_MIC_OPENED == randomBuffer.status))
|
(RAND_STATUS_MIC_OPENED == randomBuffer.status)) {
|
||||||
{
|
if (len >= RANDOM_CAPTURE_BUFFER_SIZE / 2) {
|
||||||
if (len >= RANDOM_CAPTURE_BUFFER_SIZE/2)
|
RAND_TRACE(4, "%s buf address = 0x%p, bits = %d, channel num = %d",
|
||||||
{
|
__func__, buf, bits, ch_num);
|
||||||
RAND_TRACE(4, "%s buf address = 0x%p, bits = %d, channel num = %d", __func__, buf, bits, ch_num);
|
|
||||||
RAND_DUMP("%02x ", buf, 32);
|
RAND_DUMP("%02x ", buf, 32);
|
||||||
if ((1 == randomBuffer.skipRound) &&
|
if ((1 == randomBuffer.skipRound) &&
|
||||||
(!randDataParse(buf, len, bits, ch_num)))
|
(!randDataParse(buf, len, bits, ch_num))) {
|
||||||
{
|
|
||||||
generateRand(false);
|
generateRand(false);
|
||||||
randomBuffer.skipRound = 0;
|
randomBuffer.skipRound = 0;
|
||||||
}
|
} else if (1 != randomBuffer.skipRound) {
|
||||||
else if (1 != randomBuffer.skipRound)
|
|
||||||
{
|
|
||||||
randomBuffer.skipRound--;
|
randomBuffer.skipRound--;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void randInit(void)
|
void randInit(void) { randInitialised = true; }
|
||||||
{
|
|
||||||
randInitialised = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,46 +13,44 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_factory.h"
|
||||||
|
#include "app_bt_stream.h"
|
||||||
|
#include "app_key.h"
|
||||||
|
#include "app_media_player.h"
|
||||||
|
#include "bluetooth.h"
|
||||||
|
#include "bt_drv_interface.h"
|
||||||
|
#include "bt_drv_reg_op.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "list.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_bootmode.h"
|
#include "hal_bootmode.h"
|
||||||
#include "hal_cmu.h"
|
#include "hal_cmu.h"
|
||||||
#include "hal_sleep.h"
|
#include "hal_sleep.h"
|
||||||
#include "app_key.h"
|
#include "hal_trace.h"
|
||||||
#include "app_factory.h"
|
#include "list.h"
|
||||||
#include "bt_drv_interface.h"
|
|
||||||
#include "bt_drv_reg_op.h"
|
|
||||||
#include "bluetooth.h"
|
|
||||||
#include "nvrecord.h"
|
#include "nvrecord.h"
|
||||||
#include "nvrecord_dev.h"
|
#include "nvrecord_dev.h"
|
||||||
#include "nvrecord_env.h"
|
#include "nvrecord_env.h"
|
||||||
#include "resources.h"
|
|
||||||
#include "app_bt_stream.h"
|
|
||||||
#include "app_media_player.h"
|
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
|
#include "resources.h"
|
||||||
|
|
||||||
// for init
|
// for init
|
||||||
#include "apps.h"
|
#include "app_battery.h"
|
||||||
|
#include "app_key.h"
|
||||||
|
#include "app_overlay.h"
|
||||||
|
#include "app_pwl.h"
|
||||||
#include "app_status_ind.h"
|
#include "app_status_ind.h"
|
||||||
#include "app_thread.h"
|
#include "app_thread.h"
|
||||||
#include "app_key.h"
|
|
||||||
#include "app_pwl.h"
|
|
||||||
#include "app_overlay.h"
|
|
||||||
#include "app_battery.h"
|
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "apps.h"
|
||||||
|
|
||||||
// for bt
|
// for bt
|
||||||
#include "besbt.h"
|
|
||||||
#include "app_bt.h"
|
#include "app_bt.h"
|
||||||
#include "app_factory_bt.h"
|
#include "app_factory_bt.h"
|
||||||
|
#include "besbt.h"
|
||||||
|
|
||||||
// for audio
|
// for audio
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
|
||||||
|
|
||||||
// for progress
|
// for progress
|
||||||
#include "hal_uart.h"
|
#include "hal_uart.h"
|
||||||
|
@ -71,28 +69,30 @@ typedef enum APP_FACTORYMODE_STATUS_INDICATION_T {
|
||||||
APP_FACTORYMODE_STATUS_INDICATION_INVALID,
|
APP_FACTORYMODE_STATUS_INDICATION_INVALID,
|
||||||
|
|
||||||
APP_FACTORYMODE_STATUS_INDICATION_NUM
|
APP_FACTORYMODE_STATUS_INDICATION_NUM
|
||||||
}APP_FACTORYMODE_STATUS_INDICATION_T;
|
} APP_FACTORYMODE_STATUS_INDICATION_T;
|
||||||
|
|
||||||
static void app_factorymode_timehandler(void const *param);
|
static void app_factorymode_timehandler(void const *param);
|
||||||
void app_bt_key_shutdown(APP_KEY_STATUS *status, void *param);
|
void app_bt_key_shutdown(APP_KEY_STATUS *status, void *param);
|
||||||
void app_factorymode_result_set(bool result);
|
void app_factorymode_result_set(bool result);
|
||||||
|
|
||||||
static osThreadId app_factorymode_tid= NULL;
|
static osThreadId app_factorymode_tid = NULL;
|
||||||
static struct message_t send_msg = { { PREFIX_CHAR, }, };
|
static struct message_t send_msg = {
|
||||||
|
{
|
||||||
|
PREFIX_CHAR,
|
||||||
|
},
|
||||||
|
};
|
||||||
static unsigned char send_seq = 0;
|
static unsigned char send_seq = 0;
|
||||||
|
|
||||||
osTimerId app_factory_timer = NULL;
|
osTimerId app_factory_timer = NULL;
|
||||||
osTimerDef (APP_FACTORY_TIMER, app_factorymode_timehandler);
|
osTimerDef(APP_FACTORY_TIMER, app_factorymode_timehandler);
|
||||||
|
|
||||||
int app_factorymode_languageswitch_proc(void)
|
int app_factorymode_languageswitch_proc(void) {
|
||||||
{
|
|
||||||
#ifdef MEDIA_PLAYER_SUPPORT
|
#ifdef MEDIA_PLAYER_SUPPORT
|
||||||
int lan;
|
int lan;
|
||||||
int new_lan;
|
int new_lan;
|
||||||
struct nvrecord_env_t *nvrecord_env;
|
struct nvrecord_env_t *nvrecord_env;
|
||||||
|
|
||||||
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
|
||||||
lan = app_play_audio_get_lang();
|
lan = app_play_audio_get_lang();
|
||||||
new_lan = lan;
|
new_lan = lan;
|
||||||
app_play_audio_set_lang(new_lan);
|
app_play_audio_set_lang(new_lan);
|
||||||
|
@ -101,21 +101,20 @@ int app_factorymode_languageswitch_proc(void)
|
||||||
nvrecord_env->media_language.language = new_lan;
|
nvrecord_env->media_language.language = new_lan;
|
||||||
nv_record_env_set(nvrecord_env);
|
nv_record_env_set(nvrecord_env);
|
||||||
|
|
||||||
APP_FACTORY_TRACE(2,"languages old:%d new:%d",lan ,new_lan);
|
APP_FACTORY_TRACE(2, "languages old:%d new:%d", lan, new_lan);
|
||||||
media_PlayAudio(AUD_ID_LANGUAGE_SWITCH, 0);
|
media_PlayAudio(AUD_ID_LANGUAGE_SWITCH, 0);
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_languageswitch(APP_KEY_STATUS *status, void *param)
|
void app_factorymode_languageswitch(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
app_factorymode_languageswitch_proc();
|
app_factorymode_languageswitch_proc();
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_enter(void)
|
void app_factorymode_enter(void) {
|
||||||
{
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE |
|
||||||
hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE|HAL_SW_BOOTMODE_TEST_SIGNALINGMODE);
|
HAL_SW_BOOTMODE_TEST_SIGNALINGMODE);
|
||||||
hal_cmu_sys_reboot();
|
hal_cmu_sys_reboot();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,132 +122,141 @@ extern "C" {
|
||||||
|
|
||||||
static bool isInFactoryMode = false;
|
static bool isInFactoryMode = false;
|
||||||
|
|
||||||
bool app_factorymode_get(void)
|
bool app_factorymode_get(void) { return isInFactoryMode; }
|
||||||
{
|
|
||||||
return isInFactoryMode;
|
|
||||||
}
|
|
||||||
|
|
||||||
void app_factorymode_set(bool set)
|
|
||||||
{
|
|
||||||
isInFactoryMode = set;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
void app_factorymode_set(bool set) { isInFactoryMode = set; }
|
||||||
}
|
}
|
||||||
#ifdef POWERKEY_I2C_SWITCH
|
#ifdef POWERKEY_I2C_SWITCH
|
||||||
void app_factorymode_i2c_switch(APP_KEY_STATUS *status, void *param)
|
void app_factorymode_i2c_switch(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
static int i = 0;
|
static int i = 0;
|
||||||
|
|
||||||
i++;
|
i++;
|
||||||
if (i & 1) {
|
if (i & 1) {
|
||||||
TRACE(0,"set analog i2c mode !!!");
|
TRACE(0, "set analog i2c mode !!!");
|
||||||
osDelay(100);
|
osDelay(100);
|
||||||
hal_iomux_set_analog_i2c();
|
hal_iomux_set_analog_i2c();
|
||||||
} else {
|
} else {
|
||||||
hal_iomux_set_uart0();
|
hal_iomux_set_uart0();
|
||||||
osDelay(100);
|
osDelay(100);
|
||||||
TRACE(0,"hal_iomux_set_uart0 !!!");
|
TRACE(0, "hal_iomux_set_uart0 !!!");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __IBRT_IBRT_TESTMODE__
|
#ifdef __IBRT_IBRT_TESTMODE__
|
||||||
void bt_drv_ibrt_test_key_click(APP_KEY_STATUS *status, void *param);
|
void bt_drv_ibrt_test_key_click(APP_KEY_STATUS *status, void *param);
|
||||||
void bt_drv_ibrt_test_key_click(APP_KEY_STATUS *status, void *param)
|
void bt_drv_ibrt_test_key_click(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
btdrv_connect_ibrt_device(bt_addr);
|
btdrv_connect_ibrt_device(bt_addr);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void app_factorymode_key_init(void)
|
void app_factorymode_key_init(void) {
|
||||||
{
|
|
||||||
const APP_KEY_HANDLE app_factorymode_handle_cfg[] = {
|
const APP_KEY_HANDLE app_factorymode_handle_cfg[] = {
|
||||||
#ifdef POWERKEY_I2C_SWITCH
|
#ifdef POWERKEY_I2C_SWITCH
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_RAMPAGECLICK},"bt i2c key",app_factorymode_i2c_switch, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_RAMPAGECLICK},
|
||||||
|
"bt i2c key",
|
||||||
|
app_factorymode_i2c_switch,
|
||||||
|
NULL},
|
||||||
#endif
|
#endif
|
||||||
#ifdef __POWERKEY_CTRL_ONOFF_ONLY__
|
#ifdef __POWERKEY_CTRL_ONOFF_ONLY__
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_UP},"bt function key",app_bt_key_shutdown, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_UP},
|
||||||
|
"bt function key",
|
||||||
|
app_bt_key_shutdown,
|
||||||
|
NULL},
|
||||||
#else
|
#else
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGLONGPRESS},"bt function key",app_bt_key_shutdown, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGLONGPRESS},
|
||||||
|
"bt function key",
|
||||||
|
app_bt_key_shutdown,
|
||||||
|
NULL},
|
||||||
#endif
|
#endif
|
||||||
#ifdef __IBRT_IBRT_TESTMODE__
|
#ifdef __IBRT_IBRT_TESTMODE__
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",bt_drv_ibrt_test_key_click, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_CLICK},
|
||||||
|
"bt function key",
|
||||||
|
bt_drv_ibrt_test_key_click,
|
||||||
|
NULL},
|
||||||
#else
|
#else
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_factorymode_languageswitch, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_CLICK},
|
||||||
|
"bt function key",
|
||||||
|
app_factorymode_languageswitch,
|
||||||
|
NULL},
|
||||||
#endif
|
#endif
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_DOUBLECLICK},"bt function key",app_factorymode_bt_xtalcalib, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_DOUBLECLICK},
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"bt function key",app_factorymode_bt_signalingtest, NULL},
|
"bt function key",
|
||||||
|
app_factorymode_bt_xtalcalib,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGPRESS},
|
||||||
|
"bt function key",
|
||||||
|
app_factorymode_bt_signalingtest,
|
||||||
|
NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
|
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
|
|
||||||
app_key_handle_clear();
|
app_key_handle_clear();
|
||||||
for (i=0; i<(sizeof(app_factorymode_handle_cfg)/sizeof(APP_KEY_HANDLE)); i++){
|
for (i = 0; i < (sizeof(app_factorymode_handle_cfg) / sizeof(APP_KEY_HANDLE));
|
||||||
|
i++) {
|
||||||
app_key_handle_registration(&app_factorymode_handle_cfg[i]);
|
app_key_handle_registration(&app_factorymode_handle_cfg[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_factorymode_audioloopswitch(APP_KEY_STATUS *status, void *param)
|
static void app_factorymode_audioloopswitch(APP_KEY_STATUS *status,
|
||||||
{
|
void *param) {
|
||||||
static bool onaudioloop = false;
|
static bool onaudioloop = false;
|
||||||
|
|
||||||
onaudioloop = onaudioloop?false:true;
|
onaudioloop = onaudioloop ? false : true;
|
||||||
|
|
||||||
if (onaudioloop)
|
if (onaudioloop)
|
||||||
app_audio_sendrequest(APP_FACTORYMODE_AUDIO_LOOP, (uint8_t)APP_BT_SETTING_OPEN, 0);
|
app_audio_sendrequest(APP_FACTORYMODE_AUDIO_LOOP,
|
||||||
|
(uint8_t)APP_BT_SETTING_OPEN, 0);
|
||||||
else
|
else
|
||||||
app_audio_sendrequest(APP_FACTORYMODE_AUDIO_LOOP, (uint8_t)APP_BT_SETTING_CLOSE, 0);
|
app_audio_sendrequest(APP_FACTORYMODE_AUDIO_LOOP,
|
||||||
|
(uint8_t)APP_BT_SETTING_CLOSE, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_test_key_init(void)
|
void app_factorymode_test_key_init(void) {
|
||||||
{
|
|
||||||
const APP_KEY_HANDLE app_factorymode_handle_cfg[] = {
|
const APP_KEY_HANDLE app_factorymode_handle_cfg[] = {
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_CLICK},"bt function key",app_factorymode_audioloopswitch, NULL},
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_CLICK},
|
||||||
|
"bt function key",
|
||||||
|
app_factorymode_audioloopswitch,
|
||||||
|
NULL},
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
for (i=0; i<(sizeof(app_factorymode_handle_cfg)/sizeof(APP_KEY_HANDLE)); i++){
|
for (i = 0; i < (sizeof(app_factorymode_handle_cfg) / sizeof(APP_KEY_HANDLE));
|
||||||
|
i++) {
|
||||||
app_key_handle_registration(&app_factorymode_handle_cfg[i]);
|
app_key_handle_registration(&app_factorymode_handle_cfg[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_result_clean(void)
|
void app_factorymode_result_clean(void) {
|
||||||
{
|
|
||||||
osSignalClear(app_factorymode_tid, 0x01);
|
osSignalClear(app_factorymode_tid, 0x01);
|
||||||
osSignalClear(app_factorymode_tid, 0x02);
|
osSignalClear(app_factorymode_tid, 0x02);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_result_set(bool result)
|
void app_factorymode_result_set(bool result) {
|
||||||
{
|
|
||||||
if (result)
|
if (result)
|
||||||
osSignalSet(app_factorymode_tid ,0x01);
|
osSignalSet(app_factorymode_tid, 0x01);
|
||||||
else
|
else
|
||||||
osSignalSet(app_factorymode_tid ,0x02);
|
osSignalSet(app_factorymode_tid, 0x02);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_factorymode_result_wait(void)
|
bool app_factorymode_result_wait(void) {
|
||||||
{
|
|
||||||
bool nRet;
|
bool nRet;
|
||||||
osEvent evt;
|
osEvent evt;
|
||||||
|
|
||||||
while(1)
|
while (1) {
|
||||||
{
|
// wait any signal
|
||||||
//wait any signal
|
|
||||||
evt = osSignalWait(0x0, osWaitForever);
|
evt = osSignalWait(0x0, osWaitForever);
|
||||||
|
|
||||||
//get role from signal value
|
// get role from signal value
|
||||||
if(evt.status == osEventSignal)
|
if (evt.status == osEventSignal) {
|
||||||
{
|
if (evt.value.signals & 0x01) {
|
||||||
if(evt.value.signals & 0x01)
|
|
||||||
{
|
|
||||||
nRet = true;
|
nRet = true;
|
||||||
break;
|
break;
|
||||||
}
|
} else if (evt.value.signals & 0x02) {
|
||||||
else if(evt.value.signals & 0x02)
|
|
||||||
{
|
|
||||||
nRet = false;
|
nRet = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -257,8 +265,7 @@ bool app_factorymode_result_wait(void)
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_send_progress (uint8_t progress)
|
static int app_factorymode_send_progress(uint8_t progress) {
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
|
|
||||||
msg.mod_id = APP_MODUAL_OHTER;
|
msg.mod_id = APP_MODUAL_OHTER;
|
||||||
|
@ -269,8 +276,7 @@ static int app_factorymode_send_progress (uint8_t progress)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_send_code (uint32_t progress)
|
static int app_factorymode_send_code(uint32_t progress) {
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
|
|
||||||
msg.mod_id = APP_MODUAL_OHTER;
|
msg.mod_id = APP_MODUAL_OHTER;
|
||||||
|
@ -281,8 +287,7 @@ static int app_factorymode_send_code (uint32_t progress)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_factorymode_proc(void)
|
int app_factorymode_proc(void) {
|
||||||
{
|
|
||||||
uint8_t cnt = 0;
|
uint8_t cnt = 0;
|
||||||
bool nRet;
|
bool nRet;
|
||||||
app_factorymode_tid = osThreadGetId();
|
app_factorymode_tid = osThreadGetId();
|
||||||
|
@ -290,11 +295,11 @@ int app_factorymode_proc(void)
|
||||||
app_factorymode_send_progress(60);
|
app_factorymode_send_progress(60);
|
||||||
app_factorymode_bt_init_connect();
|
app_factorymode_bt_init_connect();
|
||||||
|
|
||||||
do{
|
do {
|
||||||
app_factorymode_result_clean();
|
app_factorymode_result_clean();
|
||||||
app_factorymode_bt_create_connect();
|
app_factorymode_bt_create_connect();
|
||||||
nRet = app_factorymode_result_wait();
|
nRet = app_factorymode_result_wait();
|
||||||
}while(!nRet && ++cnt < APP_FACTORYMODE_RETRY_LIMITED);
|
} while (!nRet && ++cnt < APP_FACTORYMODE_RETRY_LIMITED);
|
||||||
|
|
||||||
if (!nRet)
|
if (!nRet)
|
||||||
goto exit;
|
goto exit;
|
||||||
|
@ -306,15 +311,15 @@ int app_factorymode_proc(void)
|
||||||
osDelay(100);
|
osDelay(100);
|
||||||
exit:
|
exit:
|
||||||
app_factorymode_result_clean();
|
app_factorymode_result_clean();
|
||||||
if (nRet){
|
if (nRet) {
|
||||||
return 0;
|
return 0;
|
||||||
}else{
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned char app_factorymode_msg_check_sum(unsigned char *buf, unsigned char len)
|
static unsigned char app_factorymode_msg_check_sum(unsigned char *buf,
|
||||||
{
|
unsigned char len) {
|
||||||
int i;
|
int i;
|
||||||
unsigned char sum = 0;
|
unsigned char sum = 0;
|
||||||
|
|
||||||
|
@ -325,8 +330,7 @@ static unsigned char app_factorymode_msg_check_sum(unsigned char *buf, unsigned
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_msg_uart_send(const unsigned char *buf, size_t len)
|
static int app_factorymode_msg_uart_send(const unsigned char *buf, size_t len) {
|
||||||
{
|
|
||||||
uint32_t sent = 0;
|
uint32_t sent = 0;
|
||||||
|
|
||||||
while (sent < len) {
|
while (sent < len) {
|
||||||
|
@ -340,8 +344,7 @@ static int app_factorymode_msg_uart_send(const unsigned char *buf, size_t len)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_msg_send_ping(void)
|
static int app_factorymode_msg_send_ping(void) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
send_msg.hdr.type = 0x88;
|
send_msg.hdr.type = 0x88;
|
||||||
|
@ -349,15 +352,16 @@ static int app_factorymode_msg_send_ping(void)
|
||||||
send_msg.hdr.len = 2;
|
send_msg.hdr.len = 2;
|
||||||
send_msg.data[0] = 0xaa;
|
send_msg.data[0] = 0xaa;
|
||||||
send_msg.data[1] = 0x55;
|
send_msg.data[1] = 0x55;
|
||||||
send_msg.data[2] = ~app_factorymode_msg_check_sum((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
send_msg.data[2] = ~app_factorymode_msg_check_sum(
|
||||||
|
(unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
||||||
|
|
||||||
ret = app_factorymode_msg_uart_send((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg));
|
ret = app_factorymode_msg_uart_send((unsigned char *)&send_msg,
|
||||||
|
MSG_TOTAL_LEN(&send_msg));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_msg_send_progress (uint8_t progress)
|
static int app_factorymode_msg_send_progress(uint8_t progress) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
send_msg.hdr.type = 0x88;
|
send_msg.hdr.type = 0x88;
|
||||||
|
@ -365,15 +369,16 @@ static int app_factorymode_msg_send_progress (uint8_t progress)
|
||||||
send_msg.hdr.len = 2;
|
send_msg.hdr.len = 2;
|
||||||
send_msg.data[0] = progress;
|
send_msg.data[0] = progress;
|
||||||
send_msg.data[1] = 100;
|
send_msg.data[1] = 100;
|
||||||
send_msg.data[2] = ~app_factorymode_msg_check_sum((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
send_msg.data[2] = ~app_factorymode_msg_check_sum(
|
||||||
|
(unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
||||||
|
|
||||||
ret = app_factorymode_msg_uart_send((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg));
|
ret = app_factorymode_msg_uart_send((unsigned char *)&send_msg,
|
||||||
|
MSG_TOTAL_LEN(&send_msg));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_msg_send_32bitcode(uint32_t code)
|
static int app_factorymode_msg_send_32bitcode(uint32_t code) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
send_msg.hdr.type = 0x88;
|
send_msg.hdr.type = 0x88;
|
||||||
|
@ -381,41 +386,38 @@ static int app_factorymode_msg_send_32bitcode(uint32_t code)
|
||||||
send_msg.hdr.len = 4;
|
send_msg.hdr.len = 4;
|
||||||
send_msg.data[0] = 0xf2;
|
send_msg.data[0] = 0xf2;
|
||||||
*(uint32_t *)&(send_msg.data[1]) = code;
|
*(uint32_t *)&(send_msg.data[1]) = code;
|
||||||
send_msg.data[4] = ~app_factorymode_msg_check_sum((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
send_msg.data[4] = ~app_factorymode_msg_check_sum(
|
||||||
|
(unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
||||||
|
|
||||||
ret = app_factorymode_msg_uart_send((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg));
|
ret = app_factorymode_msg_uart_send((unsigned char *)&send_msg,
|
||||||
|
MSG_TOTAL_LEN(&send_msg));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_process(APP_MESSAGE_BODY *msg_body)
|
static int app_factorymode_process(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
if (msg_body->message_id == 1) {
|
||||||
if (msg_body->message_id == 1){
|
|
||||||
app_factorymode_msg_send_ping();
|
app_factorymode_msg_send_ping();
|
||||||
}
|
}
|
||||||
if (msg_body->message_id == 2){
|
if (msg_body->message_id == 2) {
|
||||||
app_factorymode_msg_send_progress(msg_body->message_Param0);
|
app_factorymode_msg_send_progress(msg_body->message_Param0);
|
||||||
}
|
}
|
||||||
if (msg_body->message_id == 3){
|
if (msg_body->message_id == 3) {
|
||||||
app_factorymode_msg_send_32bitcode(msg_body->message_Param0);
|
app_factorymode_msg_send_32bitcode(msg_body->message_Param0);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_factorymode_uart_init(void)
|
static int app_factorymode_uart_init(void) {
|
||||||
{
|
|
||||||
struct HAL_UART_CFG_T uart_cfg;
|
struct HAL_UART_CFG_T uart_cfg;
|
||||||
|
|
||||||
memset(&uart_cfg, 0, sizeof(struct HAL_UART_CFG_T));
|
memset(&uart_cfg, 0, sizeof(struct HAL_UART_CFG_T));
|
||||||
uart_cfg.parity = HAL_UART_PARITY_NONE,
|
uart_cfg.parity = HAL_UART_PARITY_NONE, uart_cfg.stop = HAL_UART_STOP_BITS_1,
|
||||||
uart_cfg.stop = HAL_UART_STOP_BITS_1,
|
|
||||||
uart_cfg.data = HAL_UART_DATA_BITS_8,
|
uart_cfg.data = HAL_UART_DATA_BITS_8,
|
||||||
uart_cfg.flow = HAL_UART_FLOW_CONTROL_NONE,//HAL_UART_FLOW_CONTROL_RTSCTS,
|
uart_cfg.flow = HAL_UART_FLOW_CONTROL_NONE, // HAL_UART_FLOW_CONTROL_RTSCTS,
|
||||||
uart_cfg.tx_level = HAL_UART_FIFO_LEVEL_1_2,
|
uart_cfg.tx_level = HAL_UART_FIFO_LEVEL_1_2,
|
||||||
uart_cfg.rx_level = HAL_UART_FIFO_LEVEL_1_4,
|
uart_cfg.rx_level = HAL_UART_FIFO_LEVEL_1_4, uart_cfg.baud = 921600,
|
||||||
uart_cfg.baud = 921600,
|
uart_cfg.dma_rx = false, uart_cfg.dma_tx = false,
|
||||||
uart_cfg.dma_rx = false,
|
|
||||||
uart_cfg.dma_tx = false,
|
|
||||||
uart_cfg.dma_rx_stop_on_err = false;
|
uart_cfg.dma_rx_stop_on_err = false;
|
||||||
hal_uart_close(HAL_UART_ID_0);
|
hal_uart_close(HAL_UART_ID_0);
|
||||||
hal_uart_open(HAL_UART_ID_0, &uart_cfg);
|
hal_uart_open(HAL_UART_ID_0, &uart_cfg);
|
||||||
|
@ -423,9 +425,7 @@ static int app_factorymode_uart_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void app_factorymode_timehandler(void const *param) {
|
||||||
static void app_factorymode_timehandler(void const *param)
|
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
|
|
||||||
msg.mod_id = APP_MODUAL_OHTER;
|
msg.mod_id = APP_MODUAL_OHTER;
|
||||||
|
@ -433,8 +433,7 @@ static void app_factorymode_timehandler(void const *param)
|
||||||
app_mailbox_put(&msg);
|
app_mailbox_put(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t app_factorymode_indication_init(void)
|
static uint8_t app_factorymode_indication_init(void) {
|
||||||
{
|
|
||||||
struct APP_PWL_CFG_T cfg;
|
struct APP_PWL_CFG_T cfg;
|
||||||
|
|
||||||
memset(&cfg, 0, sizeof(struct APP_PWL_CFG_T));
|
memset(&cfg, 0, sizeof(struct APP_PWL_CFG_T));
|
||||||
|
@ -444,11 +443,11 @@ static uint8_t app_factorymode_indication_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint8_t app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_T status)
|
static uint8_t
|
||||||
{
|
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_T status) {
|
||||||
struct APP_PWL_CFG_T cfg0;
|
struct APP_PWL_CFG_T cfg0;
|
||||||
struct APP_PWL_CFG_T cfg1;
|
struct APP_PWL_CFG_T cfg1;
|
||||||
APP_FACTORY_TRACE(2,"%s %d",__func__, status);
|
APP_FACTORY_TRACE(2, "%s %d", __func__, status);
|
||||||
memset(&cfg0, 0, sizeof(struct APP_PWL_CFG_T));
|
memset(&cfg0, 0, sizeof(struct APP_PWL_CFG_T));
|
||||||
memset(&cfg1, 0, sizeof(struct APP_PWL_CFG_T));
|
memset(&cfg1, 0, sizeof(struct APP_PWL_CFG_T));
|
||||||
app_pwl_stop(APP_PWL_ID_0);
|
app_pwl_stop(APP_PWL_ID_0);
|
||||||
|
@ -504,13 +503,12 @@ static uint8_t app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATI
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_factorymode_init(uint32_t factorymode)
|
int app_factorymode_init(uint32_t factorymode) {
|
||||||
{
|
|
||||||
uint8_t cnt = 0;
|
uint8_t cnt = 0;
|
||||||
int nRet = 0;
|
int nRet = 0;
|
||||||
uint32_t capval = 0x00;
|
uint32_t capval = 0x00;
|
||||||
struct nvrecord_env_t *nvrecord_env;
|
struct nvrecord_env_t *nvrecord_env;
|
||||||
APP_FACTORY_TRACE(1,"app_factorymode_init mode:%x\n", factorymode);
|
APP_FACTORY_TRACE(1, "app_factorymode_init mode:%x\n", factorymode);
|
||||||
|
|
||||||
osThreadSetPriority(osThreadGetId(), osPriorityRealtime);
|
osThreadSetPriority(osThreadGetId(), osPriorityRealtime);
|
||||||
app_factorymode_uart_init();
|
app_factorymode_uart_init();
|
||||||
|
@ -522,12 +520,13 @@ int app_factorymode_init(uint32_t factorymode)
|
||||||
app_os_init();
|
app_os_init();
|
||||||
app_factorymode_indication_init();
|
app_factorymode_indication_init();
|
||||||
app_battery_open();
|
app_battery_open();
|
||||||
if (app_key_open(false)){
|
if (app_key_open(false)) {
|
||||||
nRet = -1;
|
nRet = -1;
|
||||||
goto exit;
|
goto exit;
|
||||||
}
|
}
|
||||||
app_set_threadhandle(APP_MODUAL_OHTER, app_factorymode_process);
|
app_set_threadhandle(APP_MODUAL_OHTER, app_factorymode_process);
|
||||||
app_factory_timer = osTimerCreate (osTimer(APP_FACTORY_TIMER), osTimerPeriodic, NULL);
|
app_factory_timer =
|
||||||
|
osTimerCreate(osTimer(APP_FACTORY_TIMER), osTimerPeriodic, NULL);
|
||||||
osTimerStart(app_factory_timer, 300);
|
osTimerStart(app_factory_timer, 300);
|
||||||
app_factorymode_send_progress(10);
|
app_factorymode_send_progress(10);
|
||||||
|
|
||||||
|
@ -546,13 +545,13 @@ int app_factorymode_init(uint32_t factorymode)
|
||||||
app_status_indication_set(APP_STATUS_INDICATION_POWERON);
|
app_status_indication_set(APP_STATUS_INDICATION_POWERON);
|
||||||
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_RUNNING);
|
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_RUNNING);
|
||||||
|
|
||||||
if (factorymode&HAL_SW_BOOTMODE_CALIB){
|
if (factorymode & HAL_SW_BOOTMODE_CALIB) {
|
||||||
btdrv_start_bt();
|
btdrv_start_bt();
|
||||||
app_factorymode_send_progress(20);
|
app_factorymode_send_progress(20);
|
||||||
|
|
||||||
do {
|
do {
|
||||||
nRet = app_factorymode_bt_xtalcalib_proc();
|
nRet = app_factorymode_bt_xtalcalib_proc();
|
||||||
}while(nRet && cnt++<APP_FACTORYMODE_RETRY_LIMITED);
|
} while (nRet && cnt++ < APP_FACTORYMODE_RETRY_LIMITED);
|
||||||
|
|
||||||
if (nRet)
|
if (nRet)
|
||||||
goto err;
|
goto err;
|
||||||
|
@ -560,7 +559,7 @@ int app_factorymode_init(uint32_t factorymode)
|
||||||
app_factorymode_send_progress(30);
|
app_factorymode_send_progress(30);
|
||||||
}
|
}
|
||||||
|
|
||||||
nvrec_dev_get_xtal_fcap((unsigned int*)&capval);
|
nvrec_dev_get_xtal_fcap((unsigned int *)&capval);
|
||||||
app_factorymode_send_code(capval);
|
app_factorymode_send_code(capval);
|
||||||
|
|
||||||
btdrv_start_bt();
|
btdrv_start_bt();
|
||||||
|
@ -574,10 +573,10 @@ int app_factorymode_init(uint32_t factorymode)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
app_factorymode_test_key_init();
|
app_factorymode_test_key_init();
|
||||||
//osTimerStop(app_factory_timer);
|
// osTimerStop(app_factory_timer);
|
||||||
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_PASS);
|
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_PASS);
|
||||||
|
|
||||||
//wait forever
|
// wait forever
|
||||||
osSignalWait(0x01, osWaitForever);
|
osSignalWait(0x01, osWaitForever);
|
||||||
goto exit;
|
goto exit;
|
||||||
|
|
||||||
|
@ -592,8 +591,7 @@ exit:
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_factorymode_calib_only(void)
|
int app_factorymode_calib_only(void) {
|
||||||
{
|
|
||||||
uint8_t cnt = 0;
|
uint8_t cnt = 0;
|
||||||
int nRet = 0;
|
int nRet = 0;
|
||||||
uint32_t capval = 0x00;
|
uint32_t capval = 0x00;
|
||||||
|
@ -611,8 +609,9 @@ int app_factorymode_calib_only(void)
|
||||||
app_factorymode_indication_init();
|
app_factorymode_indication_init();
|
||||||
|
|
||||||
app_set_threadhandle(APP_MODUAL_OHTER, app_factorymode_process);
|
app_set_threadhandle(APP_MODUAL_OHTER, app_factorymode_process);
|
||||||
app_factory_timer = osTimerCreate(osTimer(APP_FACTORY_TIMER),osTimerPeriodic,NULL);
|
app_factory_timer =
|
||||||
osTimerStart(app_factory_timer,300);
|
osTimerCreate(osTimer(APP_FACTORY_TIMER), osTimerPeriodic, NULL);
|
||||||
|
osTimerStart(app_factory_timer, 300);
|
||||||
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_RUNNING);
|
app_factorymode_status_indication(APP_FACTORYMODE_STATUS_INDICATION_RUNNING);
|
||||||
app_factorymode_send_progress(10);
|
app_factorymode_send_progress(10);
|
||||||
btdrv_start_bt();
|
btdrv_start_bt();
|
||||||
|
@ -620,11 +619,11 @@ int app_factorymode_calib_only(void)
|
||||||
app_factorymode_send_progress(20);
|
app_factorymode_send_progress(20);
|
||||||
do {
|
do {
|
||||||
nRet = app_factorymode_bt_xtalcalib_proc();
|
nRet = app_factorymode_bt_xtalcalib_proc();
|
||||||
}while(nRet && ++cnt < APP_FACTORYMODE_RETRY_LIMITED);
|
} while (nRet && ++cnt < APP_FACTORYMODE_RETRY_LIMITED);
|
||||||
if(nRet)
|
if (nRet)
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
nvrec_dev_get_xtal_fcap((unsigned int*)&capval);
|
nvrec_dev_get_xtal_fcap((unsigned int *)&capval);
|
||||||
app_factorymode_send_code(capval);
|
app_factorymode_send_code(capval);
|
||||||
|
|
||||||
app_factorymode_send_progress(50);
|
app_factorymode_send_progress(50);
|
||||||
|
@ -650,25 +649,21 @@ exit:
|
||||||
|
|
||||||
#ifdef __USB_COMM__
|
#ifdef __USB_COMM__
|
||||||
// for usb
|
// for usb
|
||||||
#include "usb_cdc.h"
|
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
#include "hwtimer_list.h"
|
#include "hwtimer_list.h"
|
||||||
|
#include "usb_cdc.h"
|
||||||
|
|
||||||
#include "hal_usb.h"
|
|
||||||
#include "app_factory_cdc_comm.h"
|
#include "app_factory_cdc_comm.h"
|
||||||
|
#include "hal_usb.h"
|
||||||
#include "sys_api_cdc_comm.h"
|
#include "sys_api_cdc_comm.h"
|
||||||
|
|
||||||
static const struct USB_SERIAL_CFG_T cdc_cfg = {
|
static const struct USB_SERIAL_CFG_T cdc_cfg = {
|
||||||
.mode = USB_SERIAL_API_NONBLOCKING,
|
.mode = USB_SERIAL_API_NONBLOCKING,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void usb_serial_recv_timeout(void *param)
|
static void usb_serial_recv_timeout(void *param) { usb_serial_cancel_recv(); }
|
||||||
{
|
|
||||||
usb_serial_cancel_recv();
|
|
||||||
}
|
|
||||||
|
|
||||||
int app_factorymode_cdc_comm(void)
|
int app_factorymode_cdc_comm(void) {
|
||||||
{
|
|
||||||
HWTIMER_ID timer;
|
HWTIMER_ID timer;
|
||||||
pmu_usb_config(PMU_USB_CONFIG_TYPE_DEVICE);
|
pmu_usb_config(PMU_USB_CONFIG_TYPE_DEVICE);
|
||||||
usb_serial_open(&cdc_cfg);
|
usb_serial_open(&cdc_cfg);
|
||||||
|
|
|
@ -15,8 +15,9 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#ifndef __APP_FACTORY_H__
|
#ifndef __APP_FACTORY_H__
|
||||||
#define __APP_FACTORY_H__
|
#define __APP_FACTORY_H__
|
||||||
|
#include <stdbool.h>
|
||||||
#define APP_FACTORY_TRACE(s,...) TRACE(s, ##__VA_ARGS__)
|
#include <stdint.h>
|
||||||
|
#define APP_FACTORY_TRACE(s, ...) TRACE(s, ##__VA_ARGS__)
|
||||||
|
|
||||||
void app_factorymode_result_set(bool result);
|
void app_factorymode_result_set(bool result);
|
||||||
|
|
||||||
|
|
|
@ -13,61 +13,59 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_bt_stream.h"
|
||||||
|
#include "app_factory.h"
|
||||||
|
#include "app_media_player.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "resources.h"
|
#include "resources.h"
|
||||||
#include "app_bt_stream.h"
|
|
||||||
#include "app_media_player.h"
|
|
||||||
#include "app_factory.h"
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
// for audio
|
// for audio
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
|
||||||
#include "app_factory_audio.h"
|
#include "app_factory_audio.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef __FACTORY_MODE_SUPPORT__
|
#ifdef __FACTORY_MODE_SUPPORT__
|
||||||
|
|
||||||
#define BT_AUDIO_FACTORMODE_BUFF_SIZE (1024*2)
|
#define BT_AUDIO_FACTORMODE_BUFF_SIZE (1024 * 2)
|
||||||
static enum APP_AUDIO_CACHE_T a2dp_cache_status = APP_AUDIO_CACHE_QTY;
|
static enum APP_AUDIO_CACHE_T a2dp_cache_status = APP_AUDIO_CACHE_QTY;
|
||||||
static int16_t *app_audioloop_play_cache = NULL;
|
static int16_t *app_audioloop_play_cache = NULL;
|
||||||
|
|
||||||
static uint32_t app_factorymode_data_come(uint8_t *buf, uint32_t len)
|
static uint32_t app_factorymode_data_come(uint8_t *buf, uint32_t len) {
|
||||||
{
|
DUMP16("%d,", (int *)buf, 30);
|
||||||
DUMP16("%d,",(int*)buf,30);
|
|
||||||
|
|
||||||
app_audio_pcmbuff_put(buf, len);
|
app_audio_pcmbuff_put(buf, len);
|
||||||
if (a2dp_cache_status == APP_AUDIO_CACHE_QTY){
|
if (a2dp_cache_status == APP_AUDIO_CACHE_QTY) {
|
||||||
a2dp_cache_status = APP_AUDIO_CACHE_OK;
|
a2dp_cache_status = APP_AUDIO_CACHE_OK;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t app_factorymode_more_data(uint8_t *buf, uint32_t len)
|
static uint32_t app_factorymode_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
if (a2dp_cache_status != APP_AUDIO_CACHE_QTY) {
|
||||||
if (a2dp_cache_status != APP_AUDIO_CACHE_QTY){
|
app_audio_pcmbuff_get((uint8_t *)app_audioloop_play_cache, len / 2);
|
||||||
app_audio_pcmbuff_get((uint8_t *)app_audioloop_play_cache, len/2);
|
app_bt_stream_copy_track_one_to_two_16bits(
|
||||||
app_bt_stream_copy_track_one_to_two_16bits((int16_t *)buf, app_audioloop_play_cache, len/2/2);
|
(int16_t *)buf, app_audioloop_play_cache, len / 2 / 2);
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_factorymode_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
int app_factorymode_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq) {
|
||||||
{
|
|
||||||
uint8_t *buff_play = NULL;
|
uint8_t *buff_play = NULL;
|
||||||
uint8_t *buff_capture = NULL;
|
uint8_t *buff_capture = NULL;
|
||||||
uint8_t *buff_loop = NULL;
|
uint8_t *buff_loop = NULL;
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
APP_FACTORY_TRACE(3,"app_factorymode_audioloop work:%d op:%d freq:%d", isRun, on, freq);
|
APP_FACTORY_TRACE(3, "app_factorymode_audioloop work:%d op:%d freq:%d", isRun,
|
||||||
|
on, freq);
|
||||||
|
|
||||||
if (isRun==on)
|
if (isRun == on)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (on){
|
if (on) {
|
||||||
if (freq < APP_SYSFREQ_52M) {
|
if (freq < APP_SYSFREQ_52M) {
|
||||||
freq = APP_SYSFREQ_52M;
|
freq = APP_SYSFREQ_52M;
|
||||||
}
|
}
|
||||||
|
@ -76,13 +74,14 @@ int app_factorymode_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
||||||
a2dp_cache_status = APP_AUDIO_CACHE_QTY;
|
a2dp_cache_status = APP_AUDIO_CACHE_QTY;
|
||||||
app_audio_mempool_init();
|
app_audio_mempool_init();
|
||||||
app_audio_mempool_get_buff(&buff_capture, BT_AUDIO_FACTORMODE_BUFF_SIZE);
|
app_audio_mempool_get_buff(&buff_capture, BT_AUDIO_FACTORMODE_BUFF_SIZE);
|
||||||
app_audio_mempool_get_buff(&buff_play, BT_AUDIO_FACTORMODE_BUFF_SIZE*2);
|
app_audio_mempool_get_buff(&buff_play, BT_AUDIO_FACTORMODE_BUFF_SIZE * 2);
|
||||||
app_audio_mempool_get_buff((uint8_t **)&app_audioloop_play_cache, BT_AUDIO_FACTORMODE_BUFF_SIZE*2/2/2);
|
app_audio_mempool_get_buff((uint8_t **)&app_audioloop_play_cache,
|
||||||
app_audio_mempool_get_buff(&buff_loop, BT_AUDIO_FACTORMODE_BUFF_SIZE<<2);
|
BT_AUDIO_FACTORMODE_BUFF_SIZE * 2 / 2 / 2);
|
||||||
app_audio_pcmbuff_init(buff_loop, BT_AUDIO_FACTORMODE_BUFF_SIZE<<2);
|
app_audio_mempool_get_buff(&buff_loop, BT_AUDIO_FACTORMODE_BUFF_SIZE << 2);
|
||||||
|
app_audio_pcmbuff_init(buff_loop, BT_AUDIO_FACTORMODE_BUFF_SIZE << 2);
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
stream_cfg.bits = AUD_BITS_16;
|
stream_cfg.bits = AUD_BITS_16;
|
||||||
//stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
// stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
||||||
|
|
||||||
#ifdef SPEECH_TX_AEC_CODEC_REF
|
#ifdef SPEECH_TX_AEC_CODEC_REF
|
||||||
stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
||||||
|
@ -94,7 +93,7 @@ int app_factorymode_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
||||||
#else
|
#else
|
||||||
stream_cfg.sample_rate = AUD_SAMPRATE_8000;
|
stream_cfg.sample_rate = AUD_SAMPRATE_8000;
|
||||||
#endif
|
#endif
|
||||||
#if FPGA==0
|
#if FPGA == 0
|
||||||
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
||||||
#else
|
#else
|
||||||
stream_cfg.device = AUD_STREAM_USE_EXT_CODEC;
|
stream_cfg.device = AUD_STREAM_USE_EXT_CODEC;
|
||||||
|
@ -112,68 +111,57 @@ int app_factorymode_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
||||||
stream_cfg.handler = app_factorymode_more_data;
|
stream_cfg.handler = app_factorymode_more_data;
|
||||||
|
|
||||||
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(buff_play);
|
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(buff_play);
|
||||||
stream_cfg.data_size = BT_AUDIO_FACTORMODE_BUFF_SIZE*2;
|
stream_cfg.data_size = BT_AUDIO_FACTORMODE_BUFF_SIZE * 2;
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
|
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
APP_FACTORY_TRACE(0,"app_factorymode_audioloop on");
|
APP_FACTORY_TRACE(0, "app_factorymode_audioloop on");
|
||||||
} else {
|
} else {
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
APP_FACTORY_TRACE(0,"app_factorymode_audioloop off");
|
APP_FACTORY_TRACE(0, "app_factorymode_audioloop off");
|
||||||
|
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
|
||||||
}
|
}
|
||||||
|
|
||||||
isRun=on;
|
isRun = on;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_factorymode_output_pcmpatten(audio_test_pcmpatten_t *pcmpatten, uint8_t *buf, uint32_t len)
|
int app_factorymode_output_pcmpatten(audio_test_pcmpatten_t *pcmpatten,
|
||||||
{
|
uint8_t *buf, uint32_t len) {
|
||||||
uint32_t remain_size = len;
|
uint32_t remain_size = len;
|
||||||
uint32_t curr_size = 0;
|
uint32_t curr_size = 0;
|
||||||
|
|
||||||
if (remain_size > pcmpatten->len)
|
if (remain_size > pcmpatten->len) {
|
||||||
{
|
do {
|
||||||
do{
|
if (pcmpatten->cuur_buf_pos) {
|
||||||
if (pcmpatten->cuur_buf_pos)
|
curr_size = pcmpatten->len - pcmpatten->cuur_buf_pos;
|
||||||
{
|
memcpy(buf, &(pcmpatten->buf[pcmpatten->cuur_buf_pos / 2]), curr_size);
|
||||||
curr_size = pcmpatten->len-pcmpatten->cuur_buf_pos;
|
|
||||||
memcpy(buf,&(pcmpatten->buf[pcmpatten->cuur_buf_pos/2]), curr_size);
|
|
||||||
remain_size -= curr_size;
|
remain_size -= curr_size;
|
||||||
pcmpatten->cuur_buf_pos = 0;
|
pcmpatten->cuur_buf_pos = 0;
|
||||||
}
|
} else if (remain_size > pcmpatten->len) {
|
||||||
else if (remain_size>pcmpatten->len)
|
memcpy(buf + curr_size, pcmpatten->buf, pcmpatten->len);
|
||||||
{
|
|
||||||
memcpy(buf+curr_size, pcmpatten->buf, pcmpatten->len);
|
|
||||||
curr_size += pcmpatten->len;
|
curr_size += pcmpatten->len;
|
||||||
remain_size -= pcmpatten->len;
|
remain_size -= pcmpatten->len;
|
||||||
}
|
} else {
|
||||||
else
|
memcpy(buf + curr_size, pcmpatten->buf, remain_size);
|
||||||
{
|
|
||||||
memcpy(buf+curr_size,pcmpatten->buf, remain_size);
|
|
||||||
pcmpatten->cuur_buf_pos = remain_size;
|
pcmpatten->cuur_buf_pos = remain_size;
|
||||||
remain_size = 0;
|
remain_size = 0;
|
||||||
}
|
}
|
||||||
}while(remain_size);
|
} while (remain_size);
|
||||||
}
|
} else {
|
||||||
else
|
if ((pcmpatten->len - pcmpatten->cuur_buf_pos) >= len) {
|
||||||
{
|
memcpy(buf, &(pcmpatten->buf[pcmpatten->cuur_buf_pos / 2]), len);
|
||||||
if ((pcmpatten->len - pcmpatten->cuur_buf_pos) >= len)
|
|
||||||
{
|
|
||||||
memcpy(buf, &(pcmpatten->buf[pcmpatten->cuur_buf_pos/2]),len);
|
|
||||||
pcmpatten->cuur_buf_pos += len;
|
pcmpatten->cuur_buf_pos += len;
|
||||||
}
|
} else {
|
||||||
else
|
curr_size = pcmpatten->len - pcmpatten->cuur_buf_pos;
|
||||||
{
|
memcpy(buf, &(pcmpatten->buf[pcmpatten->cuur_buf_pos / 2]), curr_size);
|
||||||
curr_size = pcmpatten->len-pcmpatten->cuur_buf_pos;
|
|
||||||
memcpy(buf, &(pcmpatten->buf[pcmpatten->cuur_buf_pos/2]),curr_size);
|
|
||||||
pcmpatten->cuur_buf_pos = len - curr_size;
|
pcmpatten->cuur_buf_pos = len - curr_size;
|
||||||
memcpy(buf+curr_size, pcmpatten->buf, pcmpatten->cuur_buf_pos);
|
memcpy(buf + curr_size, pcmpatten->buf, pcmpatten->cuur_buf_pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -185,111 +173,118 @@ int app_factorymode_output_pcmpatten(audio_test_pcmpatten_t *pcmpatten, uint8_t
|
||||||
#define N 64
|
#define N 64
|
||||||
#define NFFT 128
|
#define NFFT 128
|
||||||
|
|
||||||
struct mic_st_t{
|
struct mic_st_t {
|
||||||
FftTwiddle_t w[N];
|
FftTwiddle_t w[N];
|
||||||
FftTwiddle_t w128[N*2];
|
FftTwiddle_t w128[N * 2];
|
||||||
FftData_t x[N*2];
|
FftData_t x[N * 2];
|
||||||
FftData_t data_odd[N];
|
FftData_t data_odd[N];
|
||||||
FftData_t data_even[N];
|
FftData_t data_even[N];
|
||||||
FftData_t data_odd_d[N];
|
FftData_t data_odd_d[N];
|
||||||
FftData_t data_even_d[N];
|
FftData_t data_even_d[N];
|
||||||
FftData_t data[N*2];
|
FftData_t data[N * 2];
|
||||||
signed long out[N];
|
signed long out[N];
|
||||||
};
|
};
|
||||||
|
|
||||||
int app_factorymode_mic_cancellation_run(void * mic_st, signed short *inbuf, int sample)
|
int app_factorymode_mic_cancellation_run(void *mic_st, signed short *inbuf,
|
||||||
{
|
int sample) {
|
||||||
struct mic_st_t *st = (struct mic_st_t *)mic_st;
|
struct mic_st_t *st = (struct mic_st_t *)mic_st;
|
||||||
int i,k,jj,ii;
|
int i, k, jj, ii;
|
||||||
//int dataWidth = 16; // input word format is 16 bit twos complement fractional format 1.15
|
// int dataWidth = 16; // input word format is 16 bit twos complement
|
||||||
int twiddleWidth = 16; // input word format is 16 bit twos complement fractional format 2.14
|
// fractional format 1.15
|
||||||
|
int twiddleWidth =
|
||||||
|
16; // input word format is 16 bit twos complement fractional format 2.14
|
||||||
FftMode_t ifft = FFT_MODE;
|
FftMode_t ifft = FFT_MODE;
|
||||||
|
|
||||||
make_symmetric_twiddles(st->w,N,twiddleWidth);
|
make_symmetric_twiddles(st->w, N, twiddleWidth);
|
||||||
make_symmetric_twiddles(st->w128,N*2,twiddleWidth);
|
make_symmetric_twiddles(st->w128, N * 2, twiddleWidth);
|
||||||
// input data
|
// input data
|
||||||
for (i=0; i<sample; i++){
|
for (i = 0; i < sample; i++) {
|
||||||
st->x[i].re = inbuf[i];
|
st->x[i].re = inbuf[i];
|
||||||
st->x[i].im = 0;
|
st->x[i].im = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for(ii = 0; ii < 1; ii++)
|
for (ii = 0; ii < 1; ii++) {
|
||||||
{
|
|
||||||
k = 0;
|
k = 0;
|
||||||
for (jj = 0; jj < N*2; jj+=2)
|
for (jj = 0; jj < N * 2; jj += 2) {
|
||||||
{
|
|
||||||
FftData_t tmp;
|
FftData_t tmp;
|
||||||
|
|
||||||
tmp.re = st->x[jj].re;
|
tmp.re = st->x[jj].re;
|
||||||
tmp.im = st->x[jj].im;
|
tmp.im = st->x[jj].im;
|
||||||
|
|
||||||
st->data_even[k].re = tmp.re;//(int) (double(tmp.re)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
st->data_even[k].re =
|
||||||
st->data_even[k].im = tmp.im;//(int) (double(tmp.im)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
tmp.re; //(int) (double(tmp.re)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
||||||
tmp.re = st->x[jj+1].re;
|
st->data_even[k].im =
|
||||||
tmp.im = st->x[jj+1].im;
|
tmp.im; //(int) (double(tmp.im)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
||||||
st->data_odd[k].re = tmp.re;//(int) (double(tmp.re)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
tmp.re = st->x[jj + 1].re;
|
||||||
st->data_odd[k].im = tmp.im;//(int) (double(tmp.im)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
tmp.im = st->x[jj + 1].im;
|
||||||
|
st->data_odd[k].re =
|
||||||
|
tmp.re; //(int) (double(tmp.re)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
||||||
|
st->data_odd[k].im =
|
||||||
|
tmp.im; //(int) (double(tmp.im)*double(1 << FFTR4_INPUT_FORMAT_Y)) ;
|
||||||
k++;
|
k++;
|
||||||
}
|
}
|
||||||
|
|
||||||
fftr4(NFFT/2, st->data_even, st->w, FFTR4_TWIDDLE_WIDTH, FFTR4_DATA_WIDTH, ifft);
|
fftr4(NFFT / 2, st->data_even, st->w, FFTR4_TWIDDLE_WIDTH, FFTR4_DATA_WIDTH,
|
||||||
fftr4(NFFT/2, st->data_odd, st->w, FFTR4_TWIDDLE_WIDTH, FFTR4_DATA_WIDTH, ifft);
|
ifft);
|
||||||
|
fftr4(NFFT / 2, st->data_odd, st->w, FFTR4_TWIDDLE_WIDTH, FFTR4_DATA_WIDTH,
|
||||||
|
ifft);
|
||||||
|
|
||||||
for (jj = 0; jj < NFFT/2; jj++)
|
for (jj = 0; jj < NFFT / 2; jj++) {
|
||||||
{
|
|
||||||
|
|
||||||
int idx = dibit_reverse_int(jj, NFFT/2);
|
int idx = dibit_reverse_int(jj, NFFT / 2);
|
||||||
st->data_even_d[jj].re = st->data_even[idx].re;
|
st->data_even_d[jj].re = st->data_even[idx].re;
|
||||||
st->data_even_d[jj].im = st->data_even[idx].im;
|
st->data_even_d[jj].im = st->data_even[idx].im;
|
||||||
st->data_odd_d[jj].re = st->data_odd[idx].re;
|
st->data_odd_d[jj].re = st->data_odd[idx].re;
|
||||||
st->data_odd_d[jj].im = st->data_odd[idx].im;
|
st->data_odd_d[jj].im = st->data_odd[idx].im;
|
||||||
}
|
}
|
||||||
for (jj=0;jj<NFFT/2;jj++)
|
for (jj = 0; jj < NFFT / 2; jj++) {
|
||||||
{
|
long long mbr, mbi;
|
||||||
long long mbr,mbi;
|
|
||||||
FftData_t ta;
|
FftData_t ta;
|
||||||
FftData_t tmp;
|
FftData_t tmp;
|
||||||
double a;
|
double a;
|
||||||
mbr = (long long)(st->data_odd_d[jj].re) * st->w128[jj].re - (long long)(st->data_odd_d[jj].im) * st->w128[jj].im;
|
mbr = (long long)(st->data_odd_d[jj].re) * st->w128[jj].re -
|
||||||
mbi = (long long)(st->data_odd_d[jj].im) * st->w128[jj].re + (long long)(st->data_odd_d[jj].re) * st->w128[jj].im;
|
(long long)(st->data_odd_d[jj].im) * st->w128[jj].im;
|
||||||
ta.re = int(mbr>>(FFTR4_TWIDDLE_WIDTH-2));
|
mbi = (long long)(st->data_odd_d[jj].im) * st->w128[jj].re +
|
||||||
ta.im = int(mbi>>(FFTR4_TWIDDLE_WIDTH-2));
|
(long long)(st->data_odd_d[jj].re) * st->w128[jj].im;
|
||||||
st->data[jj].re = (st->data_even_d[jj].re + ta.re)/2;
|
ta.re = int(mbr >> (FFTR4_TWIDDLE_WIDTH - 2));
|
||||||
st->data[jj].im = (st->data_even_d[jj].im + ta.im)/2;
|
ta.im = int(mbi >> (FFTR4_TWIDDLE_WIDTH - 2));
|
||||||
//data[jj] = sat(data[jj],FFTR4_DATA_WIDTH);
|
st->data[jj].re = (st->data_even_d[jj].re + ta.re) / 2;
|
||||||
st->data[jj+NFFT/2].re = (st->data_even_d[jj].re - ta.re)/2;
|
st->data[jj].im = (st->data_even_d[jj].im + ta.im) / 2;
|
||||||
st->data[jj+NFFT/2].im = (st->data_even_d[jj].im - ta.im)/2;
|
// data[jj] = sat(data[jj],FFTR4_DATA_WIDTH);
|
||||||
//data[jj+NFFT/2] = sat(data[jj+NFFT/2],FFTR4_DATA_WIDTH);
|
st->data[jj + NFFT / 2].re = (st->data_even_d[jj].re - ta.re) / 2;
|
||||||
|
st->data[jj + NFFT / 2].im = (st->data_even_d[jj].im - ta.im) / 2;
|
||||||
|
// data[jj+NFFT/2] = sat(data[jj+NFFT/2],FFTR4_DATA_WIDTH);
|
||||||
|
|
||||||
a = st->data[jj].re;///double(1 << FFTR4_OUTPUT_FORMAT_Y);// * double(1 << FFTR4_SCALE);
|
a = st->data[jj].re; /// double(1 << FFTR4_OUTPUT_FORMAT_Y);// * double(1
|
||||||
|
/// << FFTR4_SCALE);
|
||||||
tmp.re = (int)a;
|
tmp.re = (int)a;
|
||||||
a = st->data[jj].im;///double(1 << FFTR4_OUTPUT_FORMAT_Y);// * double(1 << FFTR4_SCALE);
|
a = st->data[jj].im; /// double(1 << FFTR4_OUTPUT_FORMAT_Y);// * double(1
|
||||||
|
/// << FFTR4_SCALE);
|
||||||
tmp.im = (int)a;
|
tmp.im = (int)a;
|
||||||
st->x[ii*NFFT+jj].re = (int) tmp.re;
|
st->x[ii * NFFT + jj].re = (int)tmp.re;
|
||||||
st->x[ii*NFFT+jj].im = (int) tmp.im;
|
st->x[ii * NFFT + jj].im = (int)tmp.im;
|
||||||
a = st->data[jj+NFFT/2].re;///double(1 << FFTR4_OUTPUT_FORMAT_Y);// * double(1 << FFTR4_SCALE);
|
a = st->data[jj + NFFT / 2].re; /// double(1 << FFTR4_OUTPUT_FORMAT_Y);//
|
||||||
|
/// * double(1 << FFTR4_SCALE);
|
||||||
tmp.re = (int)a;
|
tmp.re = (int)a;
|
||||||
a = st->data[jj+NFFT/2].im;///double(1 << FFTR4_OUTPUT_FORMAT_Y);// * double(1 << FFTR4_SCALE);
|
a = st->data[jj + NFFT / 2].im; /// double(1 << FFTR4_OUTPUT_FORMAT_Y);//
|
||||||
|
/// * double(1 << FFTR4_SCALE);
|
||||||
tmp.im = (int)a;
|
tmp.im = (int)a;
|
||||||
st->x[ii*NFFT+jj+NFFT/2].re = (int) tmp.re;
|
st->x[ii * NFFT + jj + NFFT / 2].re = (int)tmp.re;
|
||||||
st->x[ii*NFFT+jj+NFFT/2].im = (int) tmp.im;
|
st->x[ii * NFFT + jj + NFFT / 2].im = (int)tmp.im;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i=0; i<N; i++){
|
for (i = 0; i < N; i++) {
|
||||||
st->out[i] = st->x[i].re * st->x[i].re + st->x[i].im * st->x[i].im;
|
st->out[i] = st->x[i].re * st->x[i].re + st->x[i].im * st->x[i].im;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void *app_factorymode_mic_cancellation_init(void* (* alloc_ext)(int))
|
void *app_factorymode_mic_cancellation_init(void *(*alloc_ext)(int)) {
|
||||||
{
|
|
||||||
struct mic_st_t *mic_st;
|
struct mic_st_t *mic_st;
|
||||||
mic_st = (struct mic_st_t *)alloc_ext(sizeof(struct mic_st_t));
|
mic_st = (struct mic_st_t *)alloc_ext(sizeof(struct mic_st_t));
|
||||||
return (void *)mic_st;
|
return (void *)mic_st;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -13,122 +13,114 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_sleep.h"
|
|
||||||
#include "bt_drv_interface.h"
|
|
||||||
#include "intersyshci.h"
|
|
||||||
#include "apps.h"
|
|
||||||
#include "app_factory.h"
|
|
||||||
#include "app_factory_bt.h"
|
#include "app_factory_bt.h"
|
||||||
|
#include "app_battery.h"
|
||||||
|
#include "app_factory.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "apps.h"
|
||||||
#include "bluetooth.h"
|
#include "bluetooth.h"
|
||||||
|
#include "bt_drv_interface.h"
|
||||||
|
#include "bt_drv_reg_op.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "conmgr_api.h"
|
||||||
|
#include "hal_bootmode.h"
|
||||||
|
#include "hal_chipid.h"
|
||||||
|
#include "hal_sleep.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "intersyshci.h"
|
||||||
|
#include "me_api.h"
|
||||||
#include "nvrecord.h"
|
#include "nvrecord.h"
|
||||||
#include "nvrecord_dev.h"
|
#include "nvrecord_dev.h"
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
#include "tgt_hardware.h"
|
#include "tgt_hardware.h"
|
||||||
#include "app_battery.h"
|
|
||||||
#include "bt_drv_reg_op.h"
|
|
||||||
#include "conmgr_api.h"
|
|
||||||
#include "me_api.h"
|
|
||||||
#include "hal_bootmode.h"
|
|
||||||
#include "hal_chipid.h"
|
|
||||||
|
|
||||||
|
|
||||||
#define APP_FACT_CPU_WAKE_LOCK HAL_CPU_WAKE_LOCK_USER_3
|
#define APP_FACT_CPU_WAKE_LOCK HAL_CPU_WAKE_LOCK_USER_3
|
||||||
|
|
||||||
#ifdef __FACTORY_MODE_SUPPORT__
|
#ifdef __FACTORY_MODE_SUPPORT__
|
||||||
static uint8_t inquiry_buff[] = {0x01, 0x72, 0x77, 0xb0, 0x18, 0x57, 0x60,\
|
static uint8_t inquiry_buff[] = {0x01, 0x72, 0x77, 0xb0, 0x18, 0x57, 0x60, 0x01,
|
||||||
0x01, 0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00};
|
0x00, 0x00, 0x00, 0x1f, 0x00, 0x00, 0x00};
|
||||||
|
|
||||||
|
|
||||||
static btif_cmgr_handler_t *app_factorymode_cmgrHandler;
|
static btif_cmgr_handler_t *app_factorymode_cmgrHandler;
|
||||||
|
|
||||||
|
|
||||||
static void bt_error_check_timer_handler(void const *param);
|
static void bt_error_check_timer_handler(void const *param);
|
||||||
osTimerDef(bt_error_check_timer, bt_error_check_timer_handler);
|
osTimerDef(bt_error_check_timer, bt_error_check_timer_handler);
|
||||||
static osTimerId bt_error_check_timer_id = NULL;
|
static osTimerId bt_error_check_timer_id = NULL;
|
||||||
uint8_t test_mode_type=0;
|
uint8_t test_mode_type = 0;
|
||||||
static void bt_error_check_timer_handler(void const *param)
|
static void bt_error_check_timer_handler(void const *param) {
|
||||||
{
|
// dump rssi
|
||||||
//dump rssi
|
|
||||||
bt_drv_rssi_dump_handler();
|
bt_drv_rssi_dump_handler();
|
||||||
//check BT core status
|
// check BT core status
|
||||||
if(bt_drv_error_check_handler())
|
if (bt_drv_error_check_handler()) {
|
||||||
{
|
if (test_mode_type == 1) {
|
||||||
if(test_mode_type==1)
|
hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE |
|
||||||
{
|
HAL_SW_BOOTMODE_TEST_SIGNALINGMODE);
|
||||||
hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE|HAL_SW_BOOTMODE_TEST_SIGNALINGMODE);
|
} else if (test_mode_type == 2) {
|
||||||
}
|
hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE |
|
||||||
else if(test_mode_type==2)
|
HAL_SW_BOOTMODE_TEST_NOSIGNALINGMODE);
|
||||||
{
|
|
||||||
hal_sw_bootmode_set(HAL_SW_BOOTMODE_TEST_MODE|HAL_SW_BOOTMODE_TEST_NOSIGNALINGMODE);
|
|
||||||
}
|
}
|
||||||
hal_cmu_sys_reboot();
|
hal_cmu_sys_reboot();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_factorymode_bt_inquiry_buff_update(void)
|
static void app_factorymode_bt_inquiry_buff_update(void) {
|
||||||
{
|
|
||||||
bt_bdaddr_t flsh_dongle_addr;
|
bt_bdaddr_t flsh_dongle_addr;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
|
|
||||||
ret = nvrec_dev_get_dongleaddr(&flsh_dongle_addr);
|
ret = nvrec_dev_get_dongleaddr(&flsh_dongle_addr);
|
||||||
if(0 == ret) {
|
if (0 == ret) {
|
||||||
memcpy((void *)&inquiry_buff[1],(void *)flsh_dongle_addr.address,BTIF_BD_ADDR_SIZE);
|
memcpy((void *)&inquiry_buff[1], (void *)flsh_dongle_addr.address,
|
||||||
|
BTIF_BD_ADDR_SIZE);
|
||||||
DUMP8("0x%02x ", &inquiry_buff[2], BTIF_BD_ADDR_SIZE);
|
DUMP8("0x%02x ", &inquiry_buff[2], BTIF_BD_ADDR_SIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_factorymode_CmgrCallback(btif_cmgr_handler_t *cHandler,
|
static void app_factorymode_CmgrCallback(btif_cmgr_handler_t *cHandler,
|
||||||
cmgr_event_t Event,
|
cmgr_event_t Event,
|
||||||
bt_status_t Status)
|
bt_status_t Status) {
|
||||||
{
|
APP_FACTORY_TRACE(4, "%s cHandler:%p Event:%d status:%d", __func__, cHandler,
|
||||||
APP_FACTORY_TRACE(4,"%s cHandler:%p Event:%d status:%d", __func__, cHandler, Event, Status);
|
Event, Status);
|
||||||
if (Event == BTIF_CMEVENT_DATA_LINK_CON_CNF){
|
if (Event == BTIF_CMEVENT_DATA_LINK_CON_CNF) {
|
||||||
if (Status == BT_STS_SUCCESS){
|
if (Status == BT_STS_SUCCESS) {
|
||||||
APP_FACTORY_TRACE(0,"connect ok");
|
APP_FACTORY_TRACE(0, "connect ok");
|
||||||
app_factorymode_result_set(true);
|
app_factorymode_result_set(true);
|
||||||
btif_cmgr_remove_data_link(cHandler);
|
btif_cmgr_remove_data_link(cHandler);
|
||||||
|
|
||||||
}else{
|
} else {
|
||||||
APP_FACTORY_TRACE(0,"connect failed");
|
APP_FACTORY_TRACE(0, "connect failed");
|
||||||
app_factorymode_result_set(false);
|
app_factorymode_result_set(false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Event == BTIF_CMEVENT_DATA_LINK_DIS){
|
if (Event == BTIF_CMEVENT_DATA_LINK_DIS) {
|
||||||
if (Status == BT_STS_SUCCESS){
|
if (Status == BT_STS_SUCCESS) {
|
||||||
APP_FACTORY_TRACE(0,"disconnect ok");
|
APP_FACTORY_TRACE(0, "disconnect ok");
|
||||||
}else{
|
} else {
|
||||||
APP_FACTORY_TRACE(0,"disconnect failed");
|
APP_FACTORY_TRACE(0, "disconnect failed");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_factorymode_bt_InquiryResult_add(void)
|
static void app_factorymode_bt_InquiryResult_add(void) {
|
||||||
{
|
|
||||||
U8 len = 15;
|
U8 len = 15;
|
||||||
bool rssi = false, extended = false;
|
bool rssi = false, extended = false;
|
||||||
U8* parm = (U8*)inquiry_buff;
|
U8 *parm = (U8 *)inquiry_buff;
|
||||||
|
|
||||||
/* Found one or more devices. Report to clients */
|
/* Found one or more devices. Report to clients */
|
||||||
APP_FACTORY_TRACE(4,"%s len:%d rssi:%d extended:%d", __func__, len, rssi, extended);
|
APP_FACTORY_TRACE(4, "%s len:%d rssi:%d extended:%d", __func__, len, rssi,
|
||||||
|
extended);
|
||||||
DUMP8("0x%02x ", parm, len);
|
DUMP8("0x%02x ", parm, len);
|
||||||
btif_me_inquiry_result_setup(parm, rssi, extended);
|
btif_me_inquiry_result_setup(parm, rssi, extended);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_bt_create_connect(void)
|
void app_factorymode_bt_create_connect(void) {
|
||||||
{
|
|
||||||
bt_status_t status;
|
bt_status_t status;
|
||||||
bt_bdaddr_t *bdAddr = (bt_bdaddr_t *)(inquiry_buff+1);
|
bt_bdaddr_t *bdAddr = (bt_bdaddr_t *)(inquiry_buff + 1);
|
||||||
|
|
||||||
status = btif_cmgr_create_data_link(app_factorymode_cmgrHandler, bdAddr);
|
status = btif_cmgr_create_data_link(app_factorymode_cmgrHandler, bdAddr);
|
||||||
APP_FACTORY_TRACE(2,"%s:%d", __func__, status);
|
APP_FACTORY_TRACE(2, "%s:%d", __func__, status);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_bt_init_connect(void)
|
void app_factorymode_bt_init_connect(void) {
|
||||||
{
|
|
||||||
app_factorymode_cmgrHandler = btif_cmgr_handler_create();
|
app_factorymode_cmgrHandler = btif_cmgr_handler_create();
|
||||||
|
|
||||||
btif_cmgr_register_handler(app_factorymode_cmgrHandler,
|
btif_cmgr_register_handler(app_factorymode_cmgrHandler,
|
||||||
|
@ -145,22 +137,22 @@ extern osTimerId app_bt_accessmode_timer;
|
||||||
#define XTAL_FCAP_RANGE (0xFF)
|
#define XTAL_FCAP_RANGE (0xFF)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void app_factorymode_bt_xtalrangetest(APP_KEY_STATUS *status, void *param)
|
void app_factorymode_bt_xtalrangetest(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
dev_addr_name devinfo;
|
dev_addr_name devinfo;
|
||||||
uint32_t fcap = 0;
|
uint32_t fcap = 0;
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
#ifdef __WATCHER_DOG_RESET__
|
#ifdef __WATCHER_DOG_RESET__
|
||||||
app_wdt_close();
|
app_wdt_close();
|
||||||
#endif
|
#endif
|
||||||
hal_cpu_wake_lock(APP_FACT_CPU_WAKE_LOCK);
|
hal_cpu_wake_lock(APP_FACT_CPU_WAKE_LOCK);
|
||||||
app_stop_10_second_timer(APP_PAIR_TIMER_ID);
|
app_stop_10_second_timer(APP_PAIR_TIMER_ID);
|
||||||
app_stop_10_second_timer(APP_POWEROFF_TIMER_ID);
|
app_stop_10_second_timer(APP_POWEROFF_TIMER_ID);
|
||||||
if (app_bt_accessmode_timer){
|
if (app_bt_accessmode_timer) {
|
||||||
osTimerStop(app_bt_accessmode_timer);
|
osTimerStop(app_bt_accessmode_timer);
|
||||||
}
|
}
|
||||||
if (!bt_error_check_timer_id){
|
if (!bt_error_check_timer_id) {
|
||||||
bt_error_check_timer_id = osTimerCreate(osTimer(bt_error_check_timer), osTimerPeriodic, NULL);
|
bt_error_check_timer_id =
|
||||||
|
osTimerCreate(osTimer(bt_error_check_timer), osTimerPeriodic, NULL);
|
||||||
}
|
}
|
||||||
if (bt_error_check_timer_id != NULL) {
|
if (bt_error_check_timer_id != NULL) {
|
||||||
osTimerStart(bt_error_check_timer_id, 1000);
|
osTimerStart(bt_error_check_timer_id, 1000);
|
||||||
|
@ -182,32 +174,33 @@ void app_factorymode_bt_xtalrangetest(APP_KEY_STATUS *status, void *param)
|
||||||
devinfo.ble_addr = ble_addr;
|
devinfo.ble_addr = ble_addr;
|
||||||
devinfo.localname = BT_LOCAL_NAME;
|
devinfo.localname = BT_LOCAL_NAME;
|
||||||
nvrec_dev_localname_addr_init(&devinfo);
|
nvrec_dev_localname_addr_init(&devinfo);
|
||||||
btdrv_write_localinfo((char *)devinfo.localname, strlen(devinfo.localname) + 1, devinfo.btd_addr);
|
btdrv_write_localinfo((char *)devinfo.localname,
|
||||||
|
strlen(devinfo.localname) + 1, devinfo.btd_addr);
|
||||||
|
|
||||||
btdrv_vco_test_start(78);
|
btdrv_vco_test_start(78);
|
||||||
while(1){
|
while (1) {
|
||||||
btdrv_rf_set_xtal_fcap(fcap%XTAL_FCAP_RANGE, 1);
|
btdrv_rf_set_xtal_fcap(fcap % XTAL_FCAP_RANGE, 1);
|
||||||
osDelay(300);
|
osDelay(300);
|
||||||
TRACE(2,"xtal tune:%d", fcap%XTAL_FCAP_RANGE);
|
TRACE(2, "xtal tune:%d", fcap % XTAL_FCAP_RANGE);
|
||||||
fcap++;
|
fcap++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_bt_signalingtest(APP_KEY_STATUS *status, void *param)
|
void app_factorymode_bt_signalingtest(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
dev_addr_name devinfo;
|
dev_addr_name devinfo;
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
#ifdef __WATCHER_DOG_RESET__
|
#ifdef __WATCHER_DOG_RESET__
|
||||||
app_wdt_close();
|
app_wdt_close();
|
||||||
#endif
|
#endif
|
||||||
hal_cpu_wake_lock(APP_FACT_CPU_WAKE_LOCK);
|
hal_cpu_wake_lock(APP_FACT_CPU_WAKE_LOCK);
|
||||||
app_stop_10_second_timer(APP_PAIR_TIMER_ID);
|
app_stop_10_second_timer(APP_PAIR_TIMER_ID);
|
||||||
app_stop_10_second_timer(APP_POWEROFF_TIMER_ID);
|
app_stop_10_second_timer(APP_POWEROFF_TIMER_ID);
|
||||||
if (app_bt_accessmode_timer){
|
if (app_bt_accessmode_timer) {
|
||||||
osTimerStop(app_bt_accessmode_timer);
|
osTimerStop(app_bt_accessmode_timer);
|
||||||
}
|
}
|
||||||
if (!bt_error_check_timer_id){
|
if (!bt_error_check_timer_id) {
|
||||||
bt_error_check_timer_id = osTimerCreate(osTimer(bt_error_check_timer), osTimerPeriodic, NULL);
|
bt_error_check_timer_id =
|
||||||
|
osTimerCreate(osTimer(bt_error_check_timer), osTimerPeriodic, NULL);
|
||||||
}
|
}
|
||||||
if (bt_error_check_timer_id != NULL) {
|
if (bt_error_check_timer_id != NULL) {
|
||||||
osTimerStart(bt_error_check_timer_id, 1000);
|
osTimerStart(bt_error_check_timer_id, 1000);
|
||||||
|
@ -229,14 +222,15 @@ void app_factorymode_bt_signalingtest(APP_KEY_STATUS *status, void *param)
|
||||||
devinfo.btd_addr = bt_addr;
|
devinfo.btd_addr = bt_addr;
|
||||||
devinfo.ble_addr = ble_addr;
|
devinfo.ble_addr = ble_addr;
|
||||||
devinfo.localname = BT_LOCAL_NAME;
|
devinfo.localname = BT_LOCAL_NAME;
|
||||||
devinfo.ble_name= BT_LOCAL_NAME;
|
devinfo.ble_name = BT_LOCAL_NAME;
|
||||||
nvrec_dev_localname_addr_init(&devinfo);
|
nvrec_dev_localname_addr_init(&devinfo);
|
||||||
#ifdef __IBRT_IBRT_TESTMODE__
|
#ifdef __IBRT_IBRT_TESTMODE__
|
||||||
uint8_t ibrt_address[6] = {0x11,0x22,0x33,0x44,0x55,0x66};
|
uint8_t ibrt_address[6] = {0x11, 0x22, 0x33, 0x44, 0x55, 0x66};
|
||||||
memcpy(bt_addr,ibrt_address,6);
|
memcpy(bt_addr, ibrt_address, 6);
|
||||||
memcpy(devinfo.btd_addr,ibrt_address,6);
|
memcpy(devinfo.btd_addr, ibrt_address, 6);
|
||||||
#endif
|
#endif
|
||||||
btdrv_write_localinfo((char *)devinfo.localname, strlen(devinfo.localname) + 1, devinfo.btd_addr);
|
btdrv_write_localinfo((char *)devinfo.localname,
|
||||||
|
strlen(devinfo.localname) + 1, devinfo.btd_addr);
|
||||||
bt_drv_extra_config_after_init();
|
bt_drv_extra_config_after_init();
|
||||||
btdrv_enable_dut();
|
btdrv_enable_dut();
|
||||||
#ifdef __IBRT_IBRT_TESTMODE__
|
#ifdef __IBRT_IBRT_TESTMODE__
|
||||||
|
@ -245,10 +239,9 @@ void app_factorymode_bt_signalingtest(APP_KEY_STATUS *status, void *param)
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_battery_stop(void);
|
int app_battery_stop(void);
|
||||||
void app_factorymode_bt_nosignalingtest(APP_KEY_STATUS *status, void *param)
|
void app_factorymode_bt_nosignalingtest(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
dev_addr_name devinfo;
|
dev_addr_name devinfo;
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
#ifdef __WATCHER_DOG_RESET__
|
#ifdef __WATCHER_DOG_RESET__
|
||||||
app_wdt_close();
|
app_wdt_close();
|
||||||
#endif
|
#endif
|
||||||
|
@ -257,8 +250,9 @@ void app_factorymode_bt_nosignalingtest(APP_KEY_STATUS *status, void *param)
|
||||||
app_stop_10_second_timer(APP_POWEROFF_TIMER_ID);
|
app_stop_10_second_timer(APP_POWEROFF_TIMER_ID);
|
||||||
app_status_indication_set(APP_STATUS_INDICATION_TESTMODE1);
|
app_status_indication_set(APP_STATUS_INDICATION_TESTMODE1);
|
||||||
osTimerStop(app_bt_accessmode_timer);
|
osTimerStop(app_bt_accessmode_timer);
|
||||||
if (!bt_error_check_timer_id){
|
if (!bt_error_check_timer_id) {
|
||||||
bt_error_check_timer_id = osTimerCreate(osTimer(bt_error_check_timer), osTimerPeriodic, NULL);
|
bt_error_check_timer_id =
|
||||||
|
osTimerCreate(osTimer(bt_error_check_timer), osTimerPeriodic, NULL);
|
||||||
}
|
}
|
||||||
if (bt_error_check_timer_id != NULL) {
|
if (bt_error_check_timer_id != NULL) {
|
||||||
osTimerStart(bt_error_check_timer_id, 1000);
|
osTimerStart(bt_error_check_timer_id, 1000);
|
||||||
|
@ -281,9 +275,10 @@ void app_factorymode_bt_nosignalingtest(APP_KEY_STATUS *status, void *param)
|
||||||
devinfo.btd_addr = bt_addr;
|
devinfo.btd_addr = bt_addr;
|
||||||
devinfo.ble_addr = ble_addr;
|
devinfo.ble_addr = ble_addr;
|
||||||
devinfo.localname = BT_LOCAL_NAME;
|
devinfo.localname = BT_LOCAL_NAME;
|
||||||
devinfo.ble_name= BT_LOCAL_NAME;
|
devinfo.ble_name = BT_LOCAL_NAME;
|
||||||
nvrec_dev_localname_addr_init(&devinfo);
|
nvrec_dev_localname_addr_init(&devinfo);
|
||||||
btdrv_write_localinfo((char *)devinfo.localname, strlen(devinfo.localname) + 1, devinfo.btd_addr);
|
btdrv_write_localinfo((char *)devinfo.localname,
|
||||||
|
strlen(devinfo.localname) + 1, devinfo.btd_addr);
|
||||||
#endif
|
#endif
|
||||||
bt_drv_extra_config_after_init();
|
bt_drv_extra_config_after_init();
|
||||||
btdrv_hcioff();
|
btdrv_hcioff();
|
||||||
|
@ -291,19 +286,18 @@ void app_factorymode_bt_nosignalingtest(APP_KEY_STATUS *status, void *param)
|
||||||
{
|
{
|
||||||
extern void bt_enable_tports(void);
|
extern void bt_enable_tports(void);
|
||||||
bt_enable_tports();
|
bt_enable_tports();
|
||||||
//hal_iomux_tportopen();
|
// hal_iomux_tportopen();
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
btdrv_uart_bridge_loop();
|
btdrv_uart_bridge_loop();
|
||||||
}
|
}
|
||||||
int app_factorymode_bt_xtalcalib_proc(void)
|
int app_factorymode_bt_xtalcalib_proc(void) {
|
||||||
{
|
|
||||||
uint32_t capval = 0x80;
|
uint32_t capval = 0x80;
|
||||||
int nRet;
|
int nRet;
|
||||||
|
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
hal_cpu_wake_lock(APP_FACT_CPU_WAKE_LOCK);
|
hal_cpu_wake_lock(APP_FACT_CPU_WAKE_LOCK);
|
||||||
APP_FACTORY_TRACE(1,"calib default, capval:%d", capval);
|
APP_FACTORY_TRACE(1, "calib default, capval:%d", capval);
|
||||||
btdrv_hciopen();
|
btdrv_hciopen();
|
||||||
btdrv_hci_reset();
|
btdrv_hci_reset();
|
||||||
#ifndef BT_50_FUNCTION
|
#ifndef BT_50_FUNCTION
|
||||||
|
@ -314,18 +308,16 @@ int app_factorymode_bt_xtalcalib_proc(void)
|
||||||
bt_drv_calib_open();
|
bt_drv_calib_open();
|
||||||
nRet = bt_drv_calib_result_porc(&capval);
|
nRet = bt_drv_calib_result_porc(&capval);
|
||||||
bt_drv_calib_close();
|
bt_drv_calib_close();
|
||||||
TRACE(2,"!!!!!!!!!!!!!!!!!!!!!!!!!!!calib ret:%d, capval:%d", nRet, capval);
|
TRACE(2, "!!!!!!!!!!!!!!!!!!!!!!!!!!!calib ret:%d, capval:%d", nRet, capval);
|
||||||
if (!nRet)
|
if (!nRet)
|
||||||
nvrec_dev_set_xtal_fcap((unsigned int)capval);
|
nvrec_dev_set_xtal_fcap((unsigned int)capval);
|
||||||
|
|
||||||
return nRet;
|
return nRet;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_factorymode_bt_xtalcalib(APP_KEY_STATUS *status, void *param)
|
void app_factorymode_bt_xtalcalib(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
APP_FACTORY_TRACE(1, "%s", __func__);
|
||||||
APP_FACTORY_TRACE(1,"%s",__func__);
|
|
||||||
app_factorymode_bt_xtalcalib_proc();
|
app_factorymode_bt_xtalcalib_proc();
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -1,19 +1,22 @@
|
||||||
#ifdef __USB_COMM__
|
#ifdef __USB_COMM__
|
||||||
#include "stdint.h"
|
|
||||||
#include "stdbool.h"
|
|
||||||
#include "plat_types.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "stdio.h"
|
|
||||||
#include "tool_msg.h"
|
|
||||||
#include "sys_api_cdc_comm.h"
|
|
||||||
#include "app_factory_cdc_comm.h"
|
#include "app_factory_cdc_comm.h"
|
||||||
|
#include "plat_types.h"
|
||||||
|
#include "stdbool.h"
|
||||||
|
#include "stdint.h"
|
||||||
|
#include "stdio.h"
|
||||||
|
#include "string.h"
|
||||||
|
#include "sys_api_cdc_comm.h"
|
||||||
|
#include "tool_msg.h"
|
||||||
|
|
||||||
static enum PARSE_STATE parse_state;
|
static enum PARSE_STATE parse_state;
|
||||||
static struct message_t recv_msg;
|
static struct message_t recv_msg;
|
||||||
static struct message_t send_msg = { { PREFIX_CHAR, }, };
|
static struct message_t send_msg = {
|
||||||
|
{
|
||||||
|
PREFIX_CHAR,
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
static unsigned char check_sum(unsigned char *buf, unsigned char len)
|
static unsigned char check_sum(unsigned char *buf, unsigned char len) {
|
||||||
{
|
|
||||||
int i;
|
int i;
|
||||||
unsigned char sum = 0;
|
unsigned char sum = 0;
|
||||||
|
|
||||||
|
@ -24,12 +27,11 @@ static unsigned char check_sum(unsigned char *buf, unsigned char len)
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
int send_reply(const unsigned char *payload, unsigned int len)
|
int send_reply(const unsigned char *payload, unsigned int len) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
|
|
||||||
if (len + 1 > sizeof(send_msg.data)) {
|
if (len + 1 > sizeof(send_msg.data)) {
|
||||||
TRACE(1,"Packet length too long: %u", len);
|
TRACE(1, "Packet length too long: %u", len);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -37,15 +39,15 @@ int send_reply(const unsigned char *payload, unsigned int len)
|
||||||
send_msg.hdr.seq = recv_msg.hdr.seq;
|
send_msg.hdr.seq = recv_msg.hdr.seq;
|
||||||
send_msg.hdr.len = len;
|
send_msg.hdr.len = len;
|
||||||
memcpy(&send_msg.data[0], payload, len);
|
memcpy(&send_msg.data[0], payload, len);
|
||||||
send_msg.data[len] = ~check_sum((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
send_msg.data[len] =
|
||||||
|
~check_sum((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg) - 1);
|
||||||
|
|
||||||
ret = send_data((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg));
|
ret = send_data((unsigned char *)&send_msg, MSG_TOTAL_LEN(&send_msg));
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void reset_parse_state(unsigned char **buf, size_t *len)
|
static void reset_parse_state(unsigned char **buf, size_t *len) {
|
||||||
{
|
|
||||||
parse_state = PARSE_HEADER;
|
parse_state = PARSE_HEADER;
|
||||||
memset(&recv_msg.hdr, 0, sizeof(recv_msg.hdr));
|
memset(&recv_msg.hdr, 0, sizeof(recv_msg.hdr));
|
||||||
|
|
||||||
|
@ -53,26 +55,25 @@ static void reset_parse_state(unsigned char **buf, size_t *len)
|
||||||
*len = sizeof(recv_msg.hdr);
|
*len = sizeof(recv_msg.hdr);
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum ERR_CODE check_msg_hdr(void)
|
static enum ERR_CODE check_msg_hdr(void) {
|
||||||
{
|
|
||||||
enum ERR_CODE errcode = ERR_NONE;
|
enum ERR_CODE errcode = ERR_NONE;
|
||||||
|
|
||||||
switch (recv_msg.hdr.type) {
|
switch (recv_msg.hdr.type) {
|
||||||
case TYPE_SYS:
|
case TYPE_SYS:
|
||||||
if (recv_msg.hdr.len != 1 && recv_msg.hdr.len != 5) {
|
if (recv_msg.hdr.len != 1 && recv_msg.hdr.len != 5) {
|
||||||
//TRACE(1,"SYS msg length error: %u", recv_msg.hdr.len);
|
// TRACE(1,"SYS msg length error: %u", recv_msg.hdr.len);
|
||||||
errcode = ERR_LEN;
|
errcode = ERR_LEN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_READ:
|
case TYPE_READ:
|
||||||
if (recv_msg.hdr.len != 4) {
|
if (recv_msg.hdr.len != 4) {
|
||||||
//TRACE(1,"READ msg length error: %u", recv_msg.hdr.len);
|
// TRACE(1,"READ msg length error: %u", recv_msg.hdr.len);
|
||||||
errcode = ERR_LEN;
|
errcode = ERR_LEN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TYPE_WRITE:
|
case TYPE_WRITE:
|
||||||
if (recv_msg.hdr.len <= 4 || recv_msg.hdr.len > 20) {
|
if (recv_msg.hdr.len <= 4 || recv_msg.hdr.len > 20) {
|
||||||
//TRACE(1,"WRITE msg length error: %u", recv_msg.hdr.len);
|
// TRACE(1,"WRITE msg length error: %u", recv_msg.hdr.len);
|
||||||
errcode = ERR_LEN;
|
errcode = ERR_LEN;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -87,8 +88,8 @@ static enum ERR_CODE check_msg_hdr(void)
|
||||||
return errcode;
|
return errcode;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum ERR_CODE handle_sys_cmd(enum SYS_CMD_TYPE cmd, unsigned char *param, unsigned int len)
|
static enum ERR_CODE handle_sys_cmd(enum SYS_CMD_TYPE cmd, unsigned char *param,
|
||||||
{
|
unsigned int len) {
|
||||||
unsigned char cret[5];
|
unsigned char cret[5];
|
||||||
unsigned int bootmode;
|
unsigned int bootmode;
|
||||||
|
|
||||||
|
@ -96,52 +97,52 @@ static enum ERR_CODE handle_sys_cmd(enum SYS_CMD_TYPE cmd, unsigned char *param,
|
||||||
|
|
||||||
if (cmd == SYS_CMD_SET_BOOTMODE || cmd == SYS_CMD_CLR_BOOTMODE) {
|
if (cmd == SYS_CMD_SET_BOOTMODE || cmd == SYS_CMD_CLR_BOOTMODE) {
|
||||||
if (len != 4) {
|
if (len != 4) {
|
||||||
TRACE(2,"Invalid SYS CMD len %u for cmd: 0x%x", len, cmd);
|
TRACE(2, "Invalid SYS CMD len %u for cmd: 0x%x", len, cmd);
|
||||||
return ERR_DATA_LEN;
|
return ERR_DATA_LEN;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (len != 0) {
|
if (len != 0) {
|
||||||
TRACE(2,"Invalid SYS CMD len %u for cmd: 0x%x", len, cmd);
|
TRACE(2, "Invalid SYS CMD len %u for cmd: 0x%x", len, cmd);
|
||||||
return ERR_DATA_LEN;
|
return ERR_DATA_LEN;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (cmd) {
|
switch (cmd) {
|
||||||
case SYS_CMD_REBOOT: {
|
case SYS_CMD_REBOOT: {
|
||||||
TRACE(0,"--- Reboot---");
|
TRACE(0, "--- Reboot---");
|
||||||
send_reply(cret, 1);
|
send_reply(cret, 1);
|
||||||
system_reboot();
|
system_reboot();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SYS_CMD_SHUTDOWN: {
|
case SYS_CMD_SHUTDOWN: {
|
||||||
TRACE(0,"--- Shutdown ---");
|
TRACE(0, "--- Shutdown ---");
|
||||||
send_reply(cret, 1);
|
send_reply(cret, 1);
|
||||||
system_shutdown();
|
system_shutdown();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SYS_CMD_SET_BOOTMODE: {
|
case SYS_CMD_SET_BOOTMODE: {
|
||||||
TRACE(0,"--- Set bootmode ---");
|
TRACE(0, "--- Set bootmode ---");
|
||||||
memcpy(&bootmode, param, 4);
|
memcpy(&bootmode, param, 4);
|
||||||
system_set_bootmode(bootmode);
|
system_set_bootmode(bootmode);
|
||||||
send_reply(cret, 1);
|
send_reply(cret, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SYS_CMD_CLR_BOOTMODE: {
|
case SYS_CMD_CLR_BOOTMODE: {
|
||||||
TRACE(0,"--- Clear bootmode ---");
|
TRACE(0, "--- Clear bootmode ---");
|
||||||
memcpy(&bootmode, param, 4);
|
memcpy(&bootmode, param, 4);
|
||||||
system_clear_bootmode(bootmode);
|
system_clear_bootmode(bootmode);
|
||||||
send_reply(cret, 1);
|
send_reply(cret, 1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case SYS_CMD_GET_BOOTMODE: {
|
case SYS_CMD_GET_BOOTMODE: {
|
||||||
TRACE(0,"--- Get bootmode ---");
|
TRACE(0, "--- Get bootmode ---");
|
||||||
bootmode = system_get_bootmode();
|
bootmode = system_get_bootmode();
|
||||||
memcpy(&cret[1], &bootmode, 4);
|
memcpy(&cret[1], &bootmode, 4);
|
||||||
send_reply(cret, 5);
|
send_reply(cret, 5);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default: {
|
default: {
|
||||||
TRACE(1,"Invalid command: 0x%x", recv_msg.data[0]);
|
TRACE(1, "Invalid command: 0x%x", recv_msg.data[0]);
|
||||||
return ERR_SYS_CMD;
|
return ERR_SYS_CMD;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -149,8 +150,7 @@ static enum ERR_CODE handle_sys_cmd(enum SYS_CMD_TYPE cmd, unsigned char *param,
|
||||||
return ERR_NONE;
|
return ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static enum ERR_CODE handle_data(unsigned char **buf, size_t *len, int *extra)
|
static enum ERR_CODE handle_data(unsigned char **buf, size_t *len, int *extra) {
|
||||||
{
|
|
||||||
enum ERR_CODE errcode = ERR_NONE;
|
enum ERR_CODE errcode = ERR_NONE;
|
||||||
#if 0
|
#if 0
|
||||||
uint32_t rlen = 0;
|
uint32_t rlen = 0;
|
||||||
|
@ -159,21 +159,22 @@ static enum ERR_CODE handle_data(unsigned char **buf, size_t *len, int *extra)
|
||||||
|
|
||||||
// Checksum
|
// Checksum
|
||||||
if (check_sum((unsigned char *)&recv_msg, MSG_TOTAL_LEN(&recv_msg)) != 0xFF) {
|
if (check_sum((unsigned char *)&recv_msg, MSG_TOTAL_LEN(&recv_msg)) != 0xFF) {
|
||||||
TRACE(0,"Checksum error");
|
TRACE(0, "Checksum error");
|
||||||
return ERR_CHECKSUM;
|
return ERR_CHECKSUM;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (recv_msg.hdr.type) {
|
switch (recv_msg.hdr.type) {
|
||||||
case TYPE_SYS: {
|
case TYPE_SYS: {
|
||||||
TRACE_TIME(0,"------ SYS CMD ------");
|
TRACE_TIME(0, "------ SYS CMD ------");
|
||||||
errcode = handle_sys_cmd((enum SYS_CMD_TYPE)recv_msg.data[0], &recv_msg.data[1], recv_msg.hdr.len - 1);
|
errcode = handle_sys_cmd((enum SYS_CMD_TYPE)recv_msg.data[0],
|
||||||
|
&recv_msg.data[1], recv_msg.hdr.len - 1);
|
||||||
if (errcode != ERR_NONE) {
|
if (errcode != ERR_NONE) {
|
||||||
return errcode;
|
return errcode;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TYPE_READ: {
|
case TYPE_READ: {
|
||||||
TRACE_TIME(0,"------ READ CMD ------");
|
TRACE_TIME(0, "------ READ CMD ------");
|
||||||
#if 0
|
#if 0
|
||||||
uint32_t addr = (recv_msg.data[0] << 16) | (recv_msg.data[1] << 8) | recv_msg.data[2];
|
uint32_t addr = (recv_msg.data[0] << 16) | (recv_msg.data[1] << 8) | recv_msg.data[2];
|
||||||
uint8_t data[4] = {0};
|
uint8_t data[4] = {0};
|
||||||
|
@ -187,7 +188,7 @@ static enum ERR_CODE handle_data(unsigned char **buf, size_t *len, int *extra)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TYPE_WRITE: {
|
case TYPE_WRITE: {
|
||||||
TRACE_TIME(0,"------ WRITE CMD ------");
|
TRACE_TIME(0, "------ WRITE CMD ------");
|
||||||
#if 0
|
#if 0
|
||||||
uint32_t addr = (recv_msg.data[0] << 16) | (recv_msg.data[1] << 8) | recv_msg.data[2];
|
uint32_t addr = (recv_msg.data[0] << 16) | (recv_msg.data[1] << 8) | recv_msg.data[2];
|
||||||
uint32_t wdata = (recv_msg.data[3] << 24) | (recv_msg.data[4] << 16) | (recv_msg.data[5] << 8) | recv_msg.data[6];
|
uint32_t wdata = (recv_msg.data[3] << 24) | (recv_msg.data[4] << 16) | (recv_msg.data[5] << 8) | recv_msg.data[6];
|
||||||
|
@ -208,8 +209,7 @@ static enum ERR_CODE handle_data(unsigned char **buf, size_t *len, int *extra)
|
||||||
return ERR_NONE;
|
return ERR_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int parse_packet(unsigned char **buf, size_t *len)
|
static int parse_packet(unsigned char **buf, size_t *len) {
|
||||||
{
|
|
||||||
enum ERR_CODE errcode;
|
enum ERR_CODE errcode;
|
||||||
int rlen = *len;
|
int rlen = *len;
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
|
@ -250,7 +250,7 @@ static int parse_packet(unsigned char **buf, size_t *len)
|
||||||
reset_parse_state(buf, len);
|
reset_parse_state(buf, len);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
TRACE(1,"Invalid parse_state: %d", parse_state);
|
TRACE(1, "Invalid parse_state: %d", parse_state);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,8 +264,7 @@ _err:
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
void comm_loop(void)
|
void comm_loop(void) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
unsigned char *buf = NULL;
|
unsigned char *buf = NULL;
|
||||||
size_t len = 0;
|
size_t len = 0;
|
||||||
|
@ -286,18 +285,18 @@ _sync:
|
||||||
|
|
||||||
ret = recv_data_ex(buf, buf_len, len, &rlen);
|
ret = recv_data_ex(buf, buf_len, len, &rlen);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
TRACE(1,"Receiving data failed: %d", ret);
|
TRACE(1, "Receiving data failed: %d", ret);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (len != rlen) {
|
if (len != rlen) {
|
||||||
TRACE(2,"Receiving part of the data: expect=%u real=%u", len, rlen);
|
TRACE(2, "Receiving part of the data: expect=%u real=%u", len, rlen);
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = parse_packet(&buf, &len);
|
ret = parse_packet(&buf, &len);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
TRACE(0,"Parsing packet failed");
|
TRACE(0, "Parsing packet failed");
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -305,7 +304,7 @@ _sync:
|
||||||
_err:
|
_err:
|
||||||
ret = handle_error();
|
ret = handle_error();
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
TRACE(0,"retry ...");
|
TRACE(0, "retry ...");
|
||||||
goto _sync;
|
goto _sync;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,7 +11,8 @@
|
||||||
#define TIMEOUT_INFINITE ((uint32_t)-1)
|
#define TIMEOUT_INFINITE ((uint32_t)-1)
|
||||||
|
|
||||||
const unsigned int default_recv_timeout_short = MS_TO_TICKS(500);
|
const unsigned int default_recv_timeout_short = MS_TO_TICKS(500);
|
||||||
const unsigned int default_recv_timeout_idle = TIMEOUT_INFINITE; //MS_TO_TICKS(10 * 60 * 1000);
|
const unsigned int default_recv_timeout_idle =
|
||||||
|
TIMEOUT_INFINITE; // MS_TO_TICKS(10 * 60 * 1000);
|
||||||
const unsigned int default_recv_timeout_4k_data = MS_TO_TICKS(500);
|
const unsigned int default_recv_timeout_4k_data = MS_TO_TICKS(500);
|
||||||
const unsigned int default_send_timeout = MS_TO_TICKS(500);
|
const unsigned int default_send_timeout = MS_TO_TICKS(500);
|
||||||
|
|
||||||
|
@ -29,8 +30,7 @@ static const struct USB_SERIAL_CFG_T cdc_cfg = {
|
||||||
.mode = USB_SERIAL_API_NONBLOCKING,
|
.mode = USB_SERIAL_API_NONBLOCKING,
|
||||||
};
|
};
|
||||||
|
|
||||||
void reset_transport(void)
|
void reset_transport(void) {
|
||||||
{
|
|
||||||
cancel_xfer = false;
|
cancel_xfer = false;
|
||||||
|
|
||||||
if (xfer_timer) {
|
if (xfer_timer) {
|
||||||
|
@ -45,23 +45,13 @@ void reset_transport(void)
|
||||||
set_send_timeout(default_send_timeout);
|
set_send_timeout(default_send_timeout);
|
||||||
}
|
}
|
||||||
|
|
||||||
void set_recv_timeout(unsigned int timeout)
|
void set_recv_timeout(unsigned int timeout) { recv_timeout = timeout; }
|
||||||
{
|
|
||||||
recv_timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_send_timeout(unsigned int timeout)
|
void set_send_timeout(unsigned int timeout) { send_timeout = timeout; }
|
||||||
{
|
|
||||||
send_timeout = timeout;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_send_timeout(void *param)
|
static void usb_send_timeout(void *param) { usb_serial_cancel_send(); }
|
||||||
{
|
|
||||||
usb_serial_cancel_send();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_send_timer_start(void)
|
static void usb_send_timer_start(void) {
|
||||||
{
|
|
||||||
if (send_timeout == TIMEOUT_INFINITE) {
|
if (send_timeout == TIMEOUT_INFINITE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -71,15 +61,13 @@ static void usb_send_timer_start(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_send_timer_stop(void)
|
static void usb_send_timer_stop(void) {
|
||||||
{
|
|
||||||
if (xfer_timer) {
|
if (xfer_timer) {
|
||||||
hwtimer_stop(xfer_timer);
|
hwtimer_stop(xfer_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_send_data(const unsigned char *buf, size_t len)
|
static int usb_send_data(const unsigned char *buf, size_t len) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
usb_send_timer_start();
|
usb_send_timer_start();
|
||||||
|
@ -88,21 +76,16 @@ static int usb_send_data(const unsigned char *buf, size_t len)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int send_data(const unsigned char *buf, size_t len)
|
int send_data(const unsigned char *buf, size_t len) {
|
||||||
{
|
|
||||||
if (cancel_xfer) {
|
if (cancel_xfer) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return usb_send_data(buf, len);
|
return usb_send_data(buf, len);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_recv_timeout(void *param)
|
static void usb_recv_timeout(void *param) { usb_serial_cancel_recv(); }
|
||||||
{
|
|
||||||
usb_serial_cancel_recv();
|
|
||||||
}
|
|
||||||
|
|
||||||
static void usb_recv_timer_start(void)
|
static void usb_recv_timer_start(void) {
|
||||||
{
|
|
||||||
if (recv_timeout == TIMEOUT_INFINITE) {
|
if (recv_timeout == TIMEOUT_INFINITE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -112,15 +95,13 @@ static void usb_recv_timer_start(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_recv_timer_stop(void)
|
static void usb_recv_timer_stop(void) {
|
||||||
{
|
|
||||||
if (xfer_timer) {
|
if (xfer_timer) {
|
||||||
hwtimer_stop(xfer_timer);
|
hwtimer_stop(xfer_timer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_recv_data(unsigned char *buf, size_t len, size_t *rlen)
|
static int usb_recv_data(unsigned char *buf, size_t len, size_t *rlen) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
usb_recv_timer_start();
|
usb_recv_timer_start();
|
||||||
|
@ -132,30 +113,27 @@ static int usb_recv_data(unsigned char *buf, size_t len, size_t *rlen)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int recv_data_ex(unsigned char *buf, size_t len, size_t expect, size_t *rlen)
|
int recv_data_ex(unsigned char *buf, size_t len, size_t expect, size_t *rlen) {
|
||||||
{
|
|
||||||
if (cancel_xfer) {
|
if (cancel_xfer) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return usb_recv_data(buf, expect, rlen);
|
return usb_recv_data(buf, expect, rlen);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_handle_error(void)
|
static int usb_handle_error(void) {
|
||||||
{
|
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
TRACE(0,"****** Send break ******");
|
TRACE(0, "****** Send break ******");
|
||||||
|
|
||||||
// Send break signal, to tell the peer to reset the connection
|
// Send break signal, to tell the peer to reset the connection
|
||||||
ret = usb_serial_send_break();
|
ret = usb_serial_send_break();
|
||||||
if (ret) {
|
if (ret) {
|
||||||
TRACE(1,"Sending break failed: %d", ret);
|
TRACE(1, "Sending break failed: %d", ret);
|
||||||
}
|
}
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int handle_error(void)
|
int handle_error(void) {
|
||||||
{
|
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
uint32_t err_time;
|
uint32_t err_time;
|
||||||
|
|
||||||
|
@ -182,24 +160,16 @@ int handle_error(void)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int usb_cancel_input(void)
|
static int usb_cancel_input(void) { return usb_serial_flush_recv_buffer(); }
|
||||||
{
|
|
||||||
return usb_serial_flush_recv_buffer();
|
|
||||||
}
|
|
||||||
|
|
||||||
int cancel_input(void)
|
int cancel_input(void) { return usb_cancel_input(); }
|
||||||
{
|
|
||||||
return usb_cancel_input();
|
|
||||||
}
|
|
||||||
|
|
||||||
void system_reboot(void)
|
void system_reboot(void) {
|
||||||
{
|
|
||||||
hal_sys_timer_delay(MS_TO_TICKS(10));
|
hal_sys_timer_delay(MS_TO_TICKS(10));
|
||||||
hal_cmu_sys_reboot();
|
hal_cmu_sys_reboot();
|
||||||
}
|
}
|
||||||
|
|
||||||
void system_shutdown(void)
|
void system_shutdown(void) {
|
||||||
{
|
|
||||||
#if 0
|
#if 0
|
||||||
if (dld_transport == TRANSPORT_USB) {
|
if (dld_transport == TRANSPORT_USB) {
|
||||||
// Avoid PC usb serial driver hanging
|
// Avoid PC usb serial driver hanging
|
||||||
|
@ -210,20 +180,15 @@ void system_shutdown(void)
|
||||||
pmu_shutdown();
|
pmu_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
void system_set_bootmode(unsigned int bootmode)
|
void system_set_bootmode(unsigned int bootmode) {
|
||||||
{
|
|
||||||
bootmode &= ~(HAL_SW_BOOTMODE_READ_ENABLED | HAL_SW_BOOTMODE_WRITE_ENABLED);
|
bootmode &= ~(HAL_SW_BOOTMODE_READ_ENABLED | HAL_SW_BOOTMODE_WRITE_ENABLED);
|
||||||
hal_sw_bootmode_set(bootmode);
|
hal_sw_bootmode_set(bootmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void system_clear_bootmode(unsigned int bootmode)
|
void system_clear_bootmode(unsigned int bootmode) {
|
||||||
{
|
|
||||||
bootmode &= ~(HAL_SW_BOOTMODE_READ_ENABLED | HAL_SW_BOOTMODE_WRITE_ENABLED);
|
bootmode &= ~(HAL_SW_BOOTMODE_READ_ENABLED | HAL_SW_BOOTMODE_WRITE_ENABLED);
|
||||||
hal_sw_bootmode_clear(bootmode);
|
hal_sw_bootmode_clear(bootmode);
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned int system_get_bootmode(void)
|
unsigned int system_get_bootmode(void) { return hal_sw_bootmode_get(); }
|
||||||
{
|
|
||||||
return hal_sw_bootmode_get();
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -13,37 +13,34 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_key.h"
|
||||||
|
#include "app_thread.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
#include "list.h"
|
#include "list.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
#include "app_thread.h"
|
|
||||||
#include "app_key.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
|
|
||||||
#define APP_KEY_TRACE(s,...) //TRACE(s, ##__VA_ARGS__)
|
#define APP_KEY_TRACE(s, ...) // TRACE(s, ##__VA_ARGS__)
|
||||||
|
|
||||||
#define KEY_EVENT_CNT_LIMIT (3)
|
#define KEY_EVENT_CNT_LIMIT (3)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
list_t *key_list;
|
list_t *key_list;
|
||||||
}APP_KEY_CONFIG;
|
} APP_KEY_CONFIG;
|
||||||
|
|
||||||
APP_KEY_CONFIG app_key_conifg = {
|
APP_KEY_CONFIG app_key_conifg = {.key_list = NULL};
|
||||||
.key_list = NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
osPoolDef (app_key_handle_mempool, 20, APP_KEY_HANDLE);
|
osPoolDef(app_key_handle_mempool, 20, APP_KEY_HANDLE);
|
||||||
osPoolId app_key_handle_mempool = NULL;
|
osPoolId app_key_handle_mempool = NULL;
|
||||||
static uint8_t key_event_cnt = 0;
|
static uint8_t key_event_cnt = 0;
|
||||||
|
|
||||||
static int key_event_process(uint32_t key_code, uint8_t key_event)
|
static int key_event_process(uint32_t key_code, uint8_t key_event) {
|
||||||
{
|
|
||||||
uint32_t app_keyevt;
|
uint32_t app_keyevt;
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
|
|
||||||
if (key_event_cnt>KEY_EVENT_CNT_LIMIT){
|
if (key_event_cnt > KEY_EVENT_CNT_LIMIT) {
|
||||||
return 0;
|
return 0;
|
||||||
}else{
|
} else {
|
||||||
key_event_cnt++;
|
key_event_cnt++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,82 +53,79 @@ static int key_event_process(uint32_t key_code, uint8_t key_event)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_key_simulate_key_event(uint32_t key_code, uint8_t key_event)
|
void app_key_simulate_key_event(uint32_t key_code, uint8_t key_event) {
|
||||||
{
|
|
||||||
key_event_process(key_code, key_event);
|
key_event_process(key_code, key_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void app_key_handle_free(void *key_handle)
|
static void app_key_handle_free(void *key_handle) {
|
||||||
{
|
osPoolFree(app_key_handle_mempool, key_handle);
|
||||||
osPoolFree (app_key_handle_mempool, key_handle);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static APP_KEY_HANDLE *app_key_handle_find(const APP_KEY_STATUS *key_status)
|
static APP_KEY_HANDLE *app_key_handle_find(const APP_KEY_STATUS *key_status) {
|
||||||
{
|
|
||||||
APP_KEY_HANDLE *key_handle = NULL;
|
APP_KEY_HANDLE *key_handle = NULL;
|
||||||
list_node_t *node = NULL;
|
list_node_t *node = NULL;
|
||||||
|
|
||||||
for (node = list_begin(app_key_conifg.key_list); node != list_end(app_key_conifg.key_list); node = list_next(node)) {
|
for (node = list_begin(app_key_conifg.key_list);
|
||||||
|
node != list_end(app_key_conifg.key_list); node = list_next(node)) {
|
||||||
key_handle = (APP_KEY_HANDLE *)list_node(node);
|
key_handle = (APP_KEY_HANDLE *)list_node(node);
|
||||||
if ((key_handle->key_status.code == key_status->code)&&(key_handle->key_status.event == key_status->event))
|
if ((key_handle->key_status.code == key_status->code) &&
|
||||||
|
(key_handle->key_status.event == key_status->event))
|
||||||
return key_handle;
|
return key_handle;
|
||||||
}
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_key_handle_process(APP_MESSAGE_BODY *msg_body)
|
static int app_key_handle_process(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
APP_KEY_STATUS key_status;
|
APP_KEY_STATUS key_status;
|
||||||
APP_KEY_HANDLE *key_handle = NULL;
|
APP_KEY_HANDLE *key_handle = NULL;
|
||||||
|
|
||||||
APP_KEY_GET_CODE(msg_body->message_id, key_status.code);
|
APP_KEY_GET_CODE(msg_body->message_id, key_status.code);
|
||||||
APP_KEY_GET_EVENT(msg_body->message_id, key_status.event);
|
APP_KEY_GET_EVENT(msg_body->message_id, key_status.event);
|
||||||
|
|
||||||
APP_KEY_TRACE(3,"%s code:%d event:%d",__func__,key_status.code, key_status.event);
|
APP_KEY_TRACE(3, "%s code:%d event:%d", __func__, key_status.code,
|
||||||
|
key_status.event);
|
||||||
|
|
||||||
key_event_cnt--;
|
key_event_cnt--;
|
||||||
|
|
||||||
key_handle = app_key_handle_find(&key_status);
|
key_handle = app_key_handle_find(&key_status);
|
||||||
|
|
||||||
if (key_handle != NULL && key_handle->function!= NULL)
|
if (key_handle != NULL && key_handle->function != NULL)
|
||||||
((APP_KEY_HANDLE_CB_T)key_handle->function)(&key_status,key_handle->param);
|
((APP_KEY_HANDLE_CB_T)key_handle->function)(&key_status, key_handle->param);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_key_handle_registration(const APP_KEY_HANDLE *key_handle)
|
int app_key_handle_registration(const APP_KEY_HANDLE *key_handle) {
|
||||||
{
|
|
||||||
APP_KEY_HANDLE *dest_key_handle = NULL;
|
APP_KEY_HANDLE *dest_key_handle = NULL;
|
||||||
APP_KEY_TRACE(1,"%s",__func__);
|
APP_KEY_TRACE(1, "%s", __func__);
|
||||||
dest_key_handle = app_key_handle_find(&(key_handle->key_status));
|
dest_key_handle = app_key_handle_find(&(key_handle->key_status));
|
||||||
|
|
||||||
APP_KEY_TRACE(2,"%s dest handle:0x%x",__func__,dest_key_handle);
|
APP_KEY_TRACE(2, "%s dest handle:0x%x", __func__, dest_key_handle);
|
||||||
if (dest_key_handle == NULL){
|
if (dest_key_handle == NULL) {
|
||||||
dest_key_handle = (APP_KEY_HANDLE *)osPoolCAlloc (app_key_handle_mempool);
|
dest_key_handle = (APP_KEY_HANDLE *)osPoolCAlloc(app_key_handle_mempool);
|
||||||
APP_KEY_TRACE(2,"%s malloc:0x%x",__func__,dest_key_handle);
|
APP_KEY_TRACE(2, "%s malloc:0x%x", __func__, dest_key_handle);
|
||||||
list_append(app_key_conifg.key_list, dest_key_handle);
|
list_append(app_key_conifg.key_list, dest_key_handle);
|
||||||
}
|
}
|
||||||
if (dest_key_handle == NULL)
|
if (dest_key_handle == NULL)
|
||||||
return -1;
|
return -1;
|
||||||
APP_KEY_TRACE(5,"%s set handle:0x%x code:%d event:%d function:%x",__func__,dest_key_handle, key_handle->key_status.code, key_handle->key_status.event, key_handle->function);
|
APP_KEY_TRACE(5, "%s set handle:0x%x code:%d event:%d function:%x", __func__,
|
||||||
|
dest_key_handle, key_handle->key_status.code,
|
||||||
|
key_handle->key_status.event, key_handle->function);
|
||||||
dest_key_handle->key_status.code = key_handle->key_status.code;
|
dest_key_handle->key_status.code = key_handle->key_status.code;
|
||||||
dest_key_handle->key_status.event = key_handle->key_status.event;
|
dest_key_handle->key_status.event = key_handle->key_status.event;
|
||||||
dest_key_handle->string = key_handle->string;
|
dest_key_handle->string = key_handle->string;
|
||||||
dest_key_handle->function = key_handle->function;
|
dest_key_handle->function = key_handle->function;
|
||||||
dest_key_handle->param = key_handle->param;;
|
dest_key_handle->param = key_handle->param;
|
||||||
|
;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_key_handle_clear(void)
|
void app_key_handle_clear(void) { list_clear(app_key_conifg.key_list); }
|
||||||
{
|
|
||||||
list_clear(app_key_conifg.key_list);
|
|
||||||
}
|
|
||||||
|
|
||||||
int app_key_open(int checkPwrKey)
|
int app_key_open(int checkPwrKey) {
|
||||||
{
|
APP_KEY_TRACE(2, "%s %x", __func__, app_key_conifg.key_list);
|
||||||
APP_KEY_TRACE(2,"%s %x",__func__, app_key_conifg.key_list);
|
|
||||||
|
|
||||||
if (app_key_conifg.key_list == NULL)
|
if (app_key_conifg.key_list == NULL)
|
||||||
app_key_conifg.key_list = list_new(app_key_handle_free, NULL, NULL);
|
app_key_conifg.key_list = list_new(app_key_handle_free, NULL, NULL);
|
||||||
|
@ -144,8 +138,7 @@ int app_key_open(int checkPwrKey)
|
||||||
return hal_key_open(checkPwrKey, key_event_process);
|
return hal_key_open(checkPwrKey, key_event_process);
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_key_close(void)
|
int app_key_close(void) {
|
||||||
{
|
|
||||||
hal_key_close();
|
hal_key_close();
|
||||||
if (app_key_conifg.key_list != NULL)
|
if (app_key_conifg.key_list != NULL)
|
||||||
list_free(app_key_conifg.key_list);
|
list_free(app_key_conifg.key_list);
|
||||||
|
@ -153,15 +146,12 @@ int app_key_close(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
uint32_t app_key_read_status(uint32_t code)
|
uint32_t app_key_read_status(uint32_t code) {
|
||||||
{
|
|
||||||
return (uint32_t)hal_key_read_status((enum HAL_KEY_CODE_T)code);
|
return (uint32_t)hal_key_read_status((enum HAL_KEY_CODE_T)code);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_AUTO_TEST_)
|
#if defined(_AUTO_TEST_)
|
||||||
int simul_key_event_process(uint32_t key_code, uint8_t key_event)
|
int simul_key_event_process(uint32_t key_code, uint8_t key_event) {
|
||||||
{
|
|
||||||
return key_event_process(key_code, key_event);
|
return key_event_process(key_code, key_event);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -13,14 +13,19 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "hal_key.h"
|
||||||
|
|
||||||
#ifndef __APP_KEY_H__
|
#ifndef __APP_KEY_H__
|
||||||
#define __APP_KEY_H__
|
#define __APP_KEY_H__
|
||||||
|
|
||||||
#include "hal_key.h"
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
#define APP_KEY_SET_MESSAGE(appevt, code, evt) (appevt = (((uint32_t)code&0xffffff)<<8)|(evt&0xff))
|
#define APP_KEY_SET_MESSAGE(appevt, code, evt) \
|
||||||
#define APP_KEY_GET_CODE(appevt, code) (code = (appevt>>8)&0xffffff)
|
(appevt = (((uint32_t)code & 0xffffff) << 8) | (evt & 0xff))
|
||||||
#define APP_KEY_GET_EVENT(appevt, evt) (evt = appevt&0xff)
|
#define APP_KEY_GET_CODE(appevt, code) (code = (appevt >> 8) & 0xffffff)
|
||||||
|
#define APP_KEY_GET_EVENT(appevt, evt) (evt = appevt & 0xff)
|
||||||
|
|
||||||
#define APP_KEY_CODE_GOOGLE APP_KEY_CODE_FN15
|
#define APP_KEY_CODE_GOOGLE APP_KEY_CODE_FN15
|
||||||
#define APP_KEY_CODE_VOICEPATH APP_KEY_CODE_FN15
|
#define APP_KEY_CODE_VOICEPATH APP_KEY_CODE_FN15
|
||||||
|
@ -80,13 +85,13 @@ enum APP_KEY_EVENT_T {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
uint32_t code;
|
uint32_t code;
|
||||||
uint8_t event;
|
uint8_t event;
|
||||||
}APP_KEY_STATUS;
|
} APP_KEY_STATUS;
|
||||||
|
|
||||||
typedef void (*APP_KEY_HANDLE_CB_T)(APP_KEY_STATUS*, void *param);
|
typedef void (*APP_KEY_HANDLE_CB_T)(APP_KEY_STATUS *, void *param);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
APP_KEY_STATUS key_status;
|
APP_KEY_STATUS key_status;
|
||||||
const char* string;
|
const char *string;
|
||||||
APP_KEY_HANDLE_CB_T function;
|
APP_KEY_HANDLE_CB_T function;
|
||||||
void *param;
|
void *param;
|
||||||
} APP_KEY_HANDLE;
|
} APP_KEY_HANDLE;
|
||||||
|
@ -106,4 +111,8 @@ void app_key_simulate_key_event(uint32_t key_code, uint8_t key_event);
|
||||||
#if defined(_AUTO_TEST_)
|
#if defined(_AUTO_TEST_)
|
||||||
int simul_key_event_process(uint32_t key_code, uint8_t key_event);
|
int simul_key_event_process(uint32_t key_code, uint8_t key_event);
|
||||||
#endif
|
#endif
|
||||||
#endif//__FMDEC_H__
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
#endif //__FMDEC_H__
|
||||||
|
|
1989
apps/main/apps.cpp
1989
apps/main/apps.cpp
File diff suppressed because it is too large
Load Diff
|
@ -13,21 +13,21 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "stdio.h"
|
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
#include "stdio.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
#include "hal_iomux.h"
|
|
||||||
#include "app_key.h"
|
#include "app_key.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_iomux.h"
|
||||||
#include "hal_sleep.h"
|
#include "hal_sleep.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "audiobuffer.h"
|
|
||||||
#include "app_thread.h"
|
#include "app_thread.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
#include "bt_drv_interface.h"
|
#include "audiobuffer.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
#include "besbt.h"
|
#include "besbt.h"
|
||||||
|
#include "bt_drv_interface.h"
|
||||||
|
|
||||||
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
||||||
#include "anc_usb_app.h"
|
#include "anc_usb_app.h"
|
||||||
|
@ -43,26 +43,23 @@ extern void app_anc_usb_init(void);
|
||||||
|
|
||||||
#define REG(a) *(volatile uint32_t *)(a)
|
#define REG(a) *(volatile uint32_t *)(a)
|
||||||
|
|
||||||
void bt_signaling_test(APP_KEY_STATUS *status, void *param)
|
void bt_signaling_test(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
|
||||||
|
|
||||||
hal_cpu_wake_lock(APP_TESTER_CPU_WAKE_LOCK);
|
hal_cpu_wake_lock(APP_TESTER_CPU_WAKE_LOCK);
|
||||||
btdrv_testmode_start();
|
btdrv_testmode_start();
|
||||||
btdrv_enable_dut();
|
btdrv_enable_dut();
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_stack_test(APP_KEY_STATUS *status, void *param)
|
void bt_stack_test(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
|
||||||
|
|
||||||
btdrv_start_bt();
|
btdrv_start_bt();
|
||||||
BesbtInit();
|
BesbtInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_ble_test(APP_KEY_STATUS *status, void *param)
|
void bt_ble_test(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
|
||||||
|
|
||||||
hal_cpu_wake_lock(APP_TESTER_CPU_WAKE_LOCK);
|
hal_cpu_wake_lock(APP_TESTER_CPU_WAKE_LOCK);
|
||||||
btdrv_testmode_start();
|
btdrv_testmode_start();
|
||||||
|
@ -72,60 +69,50 @@ void bt_ble_test(APP_KEY_STATUS *status, void *param)
|
||||||
btdrv_uart_bridge_loop();
|
btdrv_uart_bridge_loop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_test_104m(APP_KEY_STATUS *status, void *param)
|
void bt_test_104m(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
|
||||||
|
|
||||||
hal_analogif_reg_write(0x35,0x0);
|
hal_analogif_reg_write(0x35, 0x0);
|
||||||
hal_analogif_reg_write(0x36,0x8000);
|
hal_analogif_reg_write(0x36, 0x8000);
|
||||||
hal_analogif_reg_write(0x37,0x1000);
|
hal_analogif_reg_write(0x37, 0x1000);
|
||||||
hal_analogif_reg_write(0x31,0xfd31);
|
hal_analogif_reg_write(0x31, 0xfd31);
|
||||||
REG(0xd0350248) = 0X80C00000;
|
REG(0xd0350248) = 0X80C00000;
|
||||||
hal_analogif_reg_write(0xC,0x3790);
|
hal_analogif_reg_write(0xC, 0x3790);
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_change_to_iic(APP_KEY_STATUS *status, void *param)
|
void bt_change_to_iic(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
|
||||||
|
|
||||||
hal_iomux_set_analog_i2c();
|
hal_iomux_set_analog_i2c();
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_change_to_uart0(APP_KEY_STATUS *status, void *param)
|
void bt_change_to_uart0(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
|
||||||
|
|
||||||
hal_iomux_set_uart0();
|
hal_iomux_set_uart0();
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_switch_i2c_uart(APP_KEY_STATUS *status, void *param)
|
void app_switch_i2c_uart(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
static uint32_t flag = 1;
|
static uint32_t flag = 1;
|
||||||
|
|
||||||
TRACE(2,"[%s] flag = %d",__func__, flag);
|
TRACE(2, "[%s] flag = %d", __func__, flag);
|
||||||
if(flag)
|
if (flag) {
|
||||||
{
|
|
||||||
bt_change_to_iic(NULL, NULL);
|
bt_change_to_iic(NULL, NULL);
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
bt_change_to_uart0(NULL, NULL);
|
bt_change_to_uart0(NULL, NULL);
|
||||||
}
|
}
|
||||||
flag = !flag;
|
flag = !flag;
|
||||||
}
|
}
|
||||||
|
|
||||||
void test_power_off(APP_KEY_STATUS *status, void *param)
|
void test_power_off(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(0, "app_power_off\n");
|
||||||
TRACE(0,"app_power_off\n");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
extern APP_KEY_STATUS bt_key;
|
extern APP_KEY_STATUS bt_key;
|
||||||
|
|
||||||
void test_bt_key(APP_KEY_STATUS *status, void *param)
|
void test_bt_key(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
TRACE(3, "%s %d,%d", __func__, status->code, status->event);
|
||||||
TRACE(3,"%s %d,%d",__func__, status->code, status->event);
|
if (bt_key.code == 0xff) {
|
||||||
if(bt_key.code == 0xff)
|
|
||||||
{
|
|
||||||
bt_key.code = status->code;
|
bt_key.code = status->code;
|
||||||
bt_key.event = status->event;
|
bt_key.event = status->event;
|
||||||
OS_NotifyEvm();
|
OS_NotifyEvm();
|
||||||
|
@ -136,172 +123,206 @@ void test_bt_key(APP_KEY_STATUS *status, void *param)
|
||||||
#include "app_sdmmc.h"
|
#include "app_sdmmc.h"
|
||||||
|
|
||||||
#define SD_BUF_SIZE (10)
|
#define SD_BUF_SIZE (10)
|
||||||
uint8_t sd_buf[SD_BUF_SIZE]={0,1,2,3,4,5,6,7,8,9};
|
uint8_t sd_buf[SD_BUF_SIZE] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
|
||||||
|
|
||||||
void test_sd_card()
|
void test_sd_card() {
|
||||||
{
|
|
||||||
sd_open();
|
sd_open();
|
||||||
|
|
||||||
dump_data2sd(APP_SDMMC_DUMP_OPEN, NULL , 0);
|
dump_data2sd(APP_SDMMC_DUMP_OPEN, NULL, 0);
|
||||||
dump_data2sd(APP_SDMMC_DUMP_WRITE,sd_buf, SD_BUF_SIZE);
|
dump_data2sd(APP_SDMMC_DUMP_WRITE, sd_buf, SD_BUF_SIZE);
|
||||||
dump_data2sd(APP_SDMMC_DUMP_CLOSE, NULL, 0);
|
dump_data2sd(APP_SDMMC_DUMP_CLOSE, NULL, 0);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef APP_TEST_AUDIO
|
#ifdef APP_TEST_AUDIO
|
||||||
extern void adc_looptester(bool on, enum AUD_IO_PATH_T input_path, enum AUD_SAMPRATE_T sample_rate);
|
extern void adc_looptester(bool on, enum AUD_IO_PATH_T input_path,
|
||||||
void test_codec_loop(APP_KEY_STATUS *status, void *param)
|
enum AUD_SAMPRATE_T sample_rate);
|
||||||
{
|
void test_codec_loop(APP_KEY_STATUS *status, void *param) {
|
||||||
audio_buffer_init();
|
audio_buffer_init();
|
||||||
adc_looptester(true, AUD_INPUT_PATH_MAINMIC, AUD_SAMPRATE_8000);
|
adc_looptester(true, AUD_INPUT_PATH_MAINMIC, AUD_SAMPRATE_8000);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ANC_APP
|
#ifdef ANC_APP
|
||||||
void test_anc(APP_KEY_STATUS *status, void *param)
|
void test_anc(APP_KEY_STATUS *status, void *param) { anc_usb_app((bool)param); }
|
||||||
{
|
|
||||||
anc_usb_app((bool)param);
|
|
||||||
}
|
|
||||||
|
|
||||||
void test_usb_audio(APP_KEY_STATUS *status, void *param)
|
void test_usb_audio(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
usb_audio_app((bool)param);
|
usb_audio_app((bool)param);
|
||||||
//dualadc_audio_app((bool)param);
|
// dualadc_audio_app((bool)param);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void bt_change_to_jlink(APP_KEY_STATUS *status, void *param)
|
void bt_change_to_jlink(APP_KEY_STATUS *status, void *param) {
|
||||||
{
|
|
||||||
hal_iomux_set_jtag();
|
hal_iomux_set_jtag();
|
||||||
|
|
||||||
hal_cmu_jtag_clock_enable();
|
hal_cmu_jtag_clock_enable();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void bt_enable_tports(void)
|
void bt_enable_tports(void) {
|
||||||
{
|
|
||||||
hal_iomux_set_bt_tport();
|
hal_iomux_set_bt_tport();
|
||||||
bt_drv_bt_tport_type_config();
|
bt_drv_bt_tport_type_config();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef APP_TEST_AUDIO
|
#ifdef APP_TEST_AUDIO
|
||||||
extern void da_tester(uint8_t on);
|
extern void da_tester(uint8_t on);
|
||||||
void bt_test_dsp_process(APP_KEY_STATUS *status, void *param)
|
void bt_test_dsp_process(APP_KEY_STATUS *status, void *param) { da_tester(1); }
|
||||||
{
|
|
||||||
da_tester(1);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
#define MENU_TITLE_MAX_SIZE (50)
|
#define MENU_TITLE_MAX_SIZE (50)
|
||||||
APP_KEY_HANDLE app_testcase[] = {
|
APP_KEY_HANDLE app_testcase[] = {
|
||||||
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
#if defined(APP_TEST_AUDIO) && defined(ANC_APP)
|
||||||
{{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"USB AUDIO TEST OFF",test_usb_audio, (void *)0},
|
{{APP_KEY_CODE_FN2, APP_KEY_EVENT_UP},
|
||||||
{{APP_KEY_CODE_FN5,APP_KEY_EVENT_UP},"USB AUDIO TEST ON",test_usb_audio, (void *)1},
|
"USB AUDIO TEST OFF",
|
||||||
{{APP_KEY_CODE_FN3,APP_KEY_EVENT_UP},"ANC TEST OFF",test_anc, (void *)0},
|
test_usb_audio,
|
||||||
{{APP_KEY_CODE_FN6,APP_KEY_EVENT_UP},"ANC TEST ON",test_anc, (void *)1},
|
(void *)0},
|
||||||
|
{{APP_KEY_CODE_FN5, APP_KEY_EVENT_UP},
|
||||||
|
"USB AUDIO TEST ON",
|
||||||
|
test_usb_audio,
|
||||||
|
(void *)1},
|
||||||
|
{{APP_KEY_CODE_FN3, APP_KEY_EVENT_UP}, "ANC TEST OFF", test_anc, (void *)0},
|
||||||
|
{{APP_KEY_CODE_FN6, APP_KEY_EVENT_UP}, "ANC TEST ON", test_anc, (void *)1},
|
||||||
#else
|
#else
|
||||||
#ifdef APP_TEST_AUDIO
|
#ifdef APP_TEST_AUDIO
|
||||||
{{APP_KEY_CODE_FN1,APP_KEY_EVENT_LONGPRESS},"LONGPRESS: test_codec_loop",test_codec_loop, NULL},
|
{{APP_KEY_CODE_FN1, APP_KEY_EVENT_LONGPRESS},
|
||||||
|
"LONGPRESS: test_codec_loop",
|
||||||
|
test_codec_loop,
|
||||||
|
NULL},
|
||||||
#endif
|
#endif
|
||||||
{{APP_KEY_CODE_FN1,APP_KEY_EVENT_UP},"bt_signaling_test",bt_signaling_test, NULL},
|
{{APP_KEY_CODE_FN1, APP_KEY_EVENT_UP},
|
||||||
{{APP_KEY_CODE_FN2,APP_KEY_EVENT_UP},"bt gogogogo" ,bt_stack_test, NULL},
|
"bt_signaling_test",
|
||||||
{{APP_KEY_CODE_FN3,APP_KEY_EVENT_UP},"bt change to 104m",bt_test_104m, NULL},
|
bt_signaling_test,
|
||||||
{{APP_KEY_CODE_FN4,APP_KEY_EVENT_UP},"ble test mode" ,bt_ble_test, NULL},
|
NULL},
|
||||||
|
{{APP_KEY_CODE_FN2, APP_KEY_EVENT_UP}, "bt gogogogo", bt_stack_test, NULL},
|
||||||
|
{{APP_KEY_CODE_FN3, APP_KEY_EVENT_UP},
|
||||||
|
"bt change to 104m",
|
||||||
|
bt_test_104m,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_FN4, APP_KEY_EVENT_UP}, "ble test mode", bt_ble_test, NULL},
|
||||||
#ifdef APP_TEST_AUDIO
|
#ifdef APP_TEST_AUDIO
|
||||||
{{APP_KEY_CODE_FN5,APP_KEY_EVENT_UP},"dsp eq test" ,bt_test_dsp_process, NULL},
|
{{APP_KEY_CODE_FN5, APP_KEY_EVENT_UP},
|
||||||
|
"dsp eq test",
|
||||||
|
bt_test_dsp_process,
|
||||||
|
NULL},
|
||||||
#endif
|
#endif
|
||||||
{{APP_KEY_CODE_FN5,APP_KEY_EVENT_LONGPRESS},"LONGPRESS: bt volume up key" ,test_bt_key, NULL},
|
{{APP_KEY_CODE_FN5, APP_KEY_EVENT_LONGPRESS},
|
||||||
|
"LONGPRESS: bt volume up key",
|
||||||
|
test_bt_key,
|
||||||
|
NULL},
|
||||||
|
|
||||||
{{APP_KEY_CODE_FN6,APP_KEY_EVENT_UP},"bt volume down key" ,test_bt_key, NULL},
|
{{APP_KEY_CODE_FN6, APP_KEY_EVENT_UP},
|
||||||
{{APP_KEY_CODE_FN6,APP_KEY_EVENT_LONGPRESS},"LONGPRESS: bt volume down key" ,test_bt_key, NULL},
|
"bt volume down key",
|
||||||
|
test_bt_key,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_FN6, APP_KEY_EVENT_LONGPRESS},
|
||||||
|
"LONGPRESS: bt volume down key",
|
||||||
|
test_bt_key,
|
||||||
|
NULL},
|
||||||
|
|
||||||
{{APP_KEY_CODE_FN7,APP_KEY_EVENT_CLICK},"bt function key" ,test_bt_key, NULL},
|
{{APP_KEY_CODE_FN7, APP_KEY_EVENT_CLICK},
|
||||||
{{APP_KEY_CODE_FN7,APP_KEY_EVENT_DOUBLECLICK},"DOUBLECLICK: bt function key" ,test_bt_key, NULL},
|
"bt function key",
|
||||||
{{APP_KEY_CODE_FN7,APP_KEY_EVENT_LONGPRESS},"LONGPRESS: bt function key" ,test_bt_key, NULL},
|
test_bt_key,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_FN7, APP_KEY_EVENT_DOUBLECLICK},
|
||||||
|
"DOUBLECLICK: bt function key",
|
||||||
|
test_bt_key,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_FN7, APP_KEY_EVENT_LONGPRESS},
|
||||||
|
"LONGPRESS: bt function key",
|
||||||
|
test_bt_key,
|
||||||
|
NULL},
|
||||||
|
|
||||||
{{APP_KEY_CODE_FN8,APP_KEY_EVENT_UP},"open jlink" ,bt_change_to_jlink, NULL},
|
{{APP_KEY_CODE_FN8, APP_KEY_EVENT_UP},
|
||||||
{{APP_KEY_CODE_FN9,APP_KEY_EVENT_UP},"iic_map2_P3_0" ,bt_change_to_iic, NULL},
|
"open jlink",
|
||||||
{{APP_KEY_CODE_PWR,APP_KEY_EVENT_LONGPRESS},"LONGPRESS: power off" ,test_power_off, NULL},
|
bt_change_to_jlink,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_FN9, APP_KEY_EVENT_UP},
|
||||||
|
"iic_map2_P3_0",
|
||||||
|
bt_change_to_iic,
|
||||||
|
NULL},
|
||||||
|
{{APP_KEY_CODE_PWR, APP_KEY_EVENT_LONGPRESS},
|
||||||
|
"LONGPRESS: power off",
|
||||||
|
test_power_off,
|
||||||
|
NULL},
|
||||||
#endif // !(APP_TEST_AUDIO && ANC_APP)
|
#endif // !(APP_TEST_AUDIO && ANC_APP)
|
||||||
{{0xff, APP_KEY_EVENT_NONE}, NULL, (uint32_t)NULL, 0},
|
{{0xff, APP_KEY_EVENT_NONE}, NULL, (uint32_t)NULL, 0},
|
||||||
};
|
};
|
||||||
|
|
||||||
int app_testcase_disp_menu(APP_KEY_HANDLE* testcase, bool printall)
|
int app_testcase_disp_menu(APP_KEY_HANDLE *testcase, bool printall) {
|
||||||
{
|
char buf[MENU_TITLE_MAX_SIZE + 1];
|
||||||
char buf[MENU_TITLE_MAX_SIZE+1];
|
if (strlen(testcase->string) > (MENU_TITLE_MAX_SIZE - 15)) {
|
||||||
if (strlen(testcase->string)>(MENU_TITLE_MAX_SIZE-15)){
|
TRACE(0, "string too long, please check again\n");
|
||||||
TRACE(0,"string too long, please check again\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (printall){
|
if (printall) {
|
||||||
memset(buf, '-', sizeof(buf)-3);
|
memset(buf, '-', sizeof(buf) - 3);
|
||||||
buf[0] = '|';
|
buf[0] = '|';
|
||||||
buf[MENU_TITLE_MAX_SIZE-3] = '|';
|
buf[MENU_TITLE_MAX_SIZE - 3] = '|';
|
||||||
buf[MENU_TITLE_MAX_SIZE-2] = '\r';
|
buf[MENU_TITLE_MAX_SIZE - 2] = '\r';
|
||||||
buf[MENU_TITLE_MAX_SIZE-1] = '\n';
|
buf[MENU_TITLE_MAX_SIZE - 1] = '\n';
|
||||||
buf[MENU_TITLE_MAX_SIZE] = '\0';
|
buf[MENU_TITLE_MAX_SIZE] = '\0';
|
||||||
TRACE(1,"%s", buf);
|
TRACE(1, "%s", buf);
|
||||||
osDelay(1);
|
osDelay(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
do{
|
do {
|
||||||
snprintf(buf, sizeof(buf), "| (0x%X)%s", testcase->key_status.code, testcase->string);
|
snprintf(buf, sizeof(buf), "| (0x%X)%s", testcase->key_status.code,
|
||||||
memset(buf+strlen(buf), ' ', sizeof(buf)-strlen(buf)-3);
|
testcase->string);
|
||||||
buf[MENU_TITLE_MAX_SIZE-3] = '|';
|
memset(buf + strlen(buf), ' ', sizeof(buf) - strlen(buf) - 3);
|
||||||
buf[MENU_TITLE_MAX_SIZE-2] = '\r';
|
buf[MENU_TITLE_MAX_SIZE - 3] = '|';
|
||||||
buf[MENU_TITLE_MAX_SIZE-1] = '\n';
|
buf[MENU_TITLE_MAX_SIZE - 2] = '\r';
|
||||||
|
buf[MENU_TITLE_MAX_SIZE - 1] = '\n';
|
||||||
buf[MENU_TITLE_MAX_SIZE] = '\0';
|
buf[MENU_TITLE_MAX_SIZE] = '\0';
|
||||||
TRACE(1,"%s", buf);
|
TRACE(1, "%s", buf);
|
||||||
testcase++;
|
testcase++;
|
||||||
}while(testcase->key_status.code != 0xff && printall);
|
} while (testcase->key_status.code != 0xff && printall);
|
||||||
|
|
||||||
if (printall){
|
if (printall) {
|
||||||
memset(buf, '-', sizeof(buf)-3);
|
memset(buf, '-', sizeof(buf) - 3);
|
||||||
buf[0] = '|';
|
buf[0] = '|';
|
||||||
buf[MENU_TITLE_MAX_SIZE-3] = '|';
|
buf[MENU_TITLE_MAX_SIZE - 3] = '|';
|
||||||
buf[MENU_TITLE_MAX_SIZE-2] = '\r';
|
buf[MENU_TITLE_MAX_SIZE - 2] = '\r';
|
||||||
buf[MENU_TITLE_MAX_SIZE-1] = '\n';
|
buf[MENU_TITLE_MAX_SIZE - 1] = '\n';
|
||||||
buf[MENU_TITLE_MAX_SIZE] = '\0';
|
buf[MENU_TITLE_MAX_SIZE] = '\0';
|
||||||
TRACE(1,"%s", buf);
|
TRACE(1, "%s", buf);
|
||||||
osDelay(1);
|
osDelay(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_testcase_key_response(APP_MESSAGE_BODY *msg_body)
|
int app_testcase_key_response(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
APP_KEY_STATUS key_status;
|
APP_KEY_STATUS key_status;
|
||||||
|
|
||||||
APP_KEY_GET_CODE(msg_body->message_id, key_status.code);
|
APP_KEY_GET_CODE(msg_body->message_id, key_status.code);
|
||||||
APP_KEY_GET_EVENT(msg_body->message_id, key_status.event);
|
APP_KEY_GET_EVENT(msg_body->message_id, key_status.event);
|
||||||
|
|
||||||
if ((key_status.code)>(sizeof(app_testcase)/sizeof(APP_KEY_HANDLE)))
|
if ((key_status.code) > (sizeof(app_testcase) / sizeof(APP_KEY_HANDLE)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
for (i=0; i<(sizeof(app_testcase)/sizeof(APP_KEY_HANDLE)); i++){
|
for (i = 0; i < (sizeof(app_testcase) / sizeof(APP_KEY_HANDLE)); i++) {
|
||||||
if (app_testcase[i].key_status.code == key_status.code && (app_testcase[i].key_status.event == key_status.event))
|
if (app_testcase[i].key_status.code == key_status.code &&
|
||||||
|
(app_testcase[i].key_status.event == key_status.event))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (i>=(sizeof(app_testcase)/sizeof(APP_KEY_HANDLE)))
|
if (i >= (sizeof(app_testcase) / sizeof(APP_KEY_HANDLE)))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
if (app_testcase[i].function != (uint32_t)NULL){
|
if (app_testcase[i].function != (uint32_t)NULL) {
|
||||||
if (app_testcase[i].string != (uint32_t)NULL)
|
if (app_testcase[i].string != (uint32_t)NULL)
|
||||||
app_testcase_disp_menu(&app_testcase[i],0);
|
app_testcase_disp_menu(&app_testcase[i], 0);
|
||||||
((APP_KEY_HANDLE_CB_T)app_testcase[i].function)(&key_status,app_testcase[i].param);
|
((APP_KEY_HANDLE_CB_T)app_testcase[i].function)(&key_status,
|
||||||
|
app_testcase[i].param);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_test_init(void)
|
void app_test_init(void) {
|
||||||
{
|
|
||||||
uint8_t i = 0;
|
uint8_t i = 0;
|
||||||
TRACE(1,"%s",__func__);
|
TRACE(1, "%s", __func__);
|
||||||
for (i=0; i<(sizeof(app_testcase)/sizeof(APP_KEY_HANDLE)); i++){
|
for (i = 0; i < (sizeof(app_testcase) / sizeof(APP_KEY_HANDLE)); i++) {
|
||||||
app_key_handle_registration(&app_testcase[i]);
|
app_key_handle_registration(&app_testcase[i]);
|
||||||
}
|
}
|
||||||
app_testcase_disp_menu(app_testcase, 1);
|
app_testcase_disp_menu(app_testcase, 1);
|
||||||
|
|
|
@ -14,46 +14,45 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
//#include "mbed.h"
|
//#include "mbed.h"
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "tgt_hardware.h"
|
|
||||||
#include "hal_uart.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "lockcqueue.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_cmu.h"
|
|
||||||
#include "hal_chipid.h"
|
|
||||||
#include "analog.h"
|
#include "analog.h"
|
||||||
|
#include "app_audio.h"
|
||||||
#include "app_bt_stream.h"
|
#include "app_bt_stream.h"
|
||||||
#include "app_overlay.h"
|
#include "app_overlay.h"
|
||||||
#include "app_audio.h"
|
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "apps.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "hal_chipid.h"
|
||||||
|
#include "hal_cmu.h"
|
||||||
|
#include "hal_codec.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "hal_uart.h"
|
||||||
|
#include "lockcqueue.h"
|
||||||
#include "nvrecord.h"
|
#include "nvrecord.h"
|
||||||
#include "nvrecord_env.h"
|
#include "nvrecord_env.h"
|
||||||
#include "hal_codec.h"
|
#include "tgt_hardware.h"
|
||||||
#include "apps.h"
|
|
||||||
|
|
||||||
#include "app_ring_merge.h"
|
#include "app_ring_merge.h"
|
||||||
|
|
||||||
#include "bt_drv.h"
|
|
||||||
#include "bt_xtal_sync.h"
|
|
||||||
#include "besbt.h"
|
|
||||||
#include "app_bt_func.h"
|
#include "app_bt_func.h"
|
||||||
#include "app_mic.h"
|
#include "app_mic.h"
|
||||||
|
#include "besbt.h"
|
||||||
|
#include "bt_drv.h"
|
||||||
|
#include "bt_xtal_sync.h"
|
||||||
|
|
||||||
|
|
||||||
#include "app_thread.h"
|
|
||||||
#include "cqueue.h"
|
|
||||||
#include "btapp.h"
|
|
||||||
#include "app_bt_media_manager.h"
|
#include "app_bt_media_manager.h"
|
||||||
#include "string.h"
|
|
||||||
#include "hal_location.h"
|
|
||||||
#include "hal_codec.h"
|
|
||||||
#include "hal_sleep.h"
|
|
||||||
#include "app_hfp.h"
|
#include "app_hfp.h"
|
||||||
|
#include "app_thread.h"
|
||||||
|
#include "btapp.h"
|
||||||
|
#include "cqueue.h"
|
||||||
|
#include "hal_codec.h"
|
||||||
|
#include "hal_location.h"
|
||||||
|
#include "hal_sleep.h"
|
||||||
|
#include "string.h"
|
||||||
|
|
||||||
extern bool app_hfp_siri_is_active(void);
|
extern bool app_hfp_siri_is_active(void);
|
||||||
extern int a2dp_volume_2_level_convert(uint8_t vol);
|
extern int a2dp_volume_2_level_convert(uint8_t vol);
|
||||||
|
@ -63,55 +62,41 @@ typedef enum {
|
||||||
MIC_EVENT_START,
|
MIC_EVENT_START,
|
||||||
MIC_EVENT_STOP,
|
MIC_EVENT_STOP,
|
||||||
MIC_EVENT_CHECK,
|
MIC_EVENT_CHECK,
|
||||||
}MIC_EVENT_TYPE;
|
} MIC_EVENT_TYPE;
|
||||||
|
|
||||||
static MIC_APP_TYPE current_mictype = MIC_APP_NONE;
|
static MIC_APP_TYPE current_mictype = MIC_APP_NONE;
|
||||||
static struct AF_STREAM_CONFIG_T mic_config[MIC_APP_MAX];
|
static struct AF_STREAM_CONFIG_T mic_config[MIC_APP_MAX];
|
||||||
osMutexId app_mic_mutex_id = NULL;
|
osMutexId app_mic_mutex_id = NULL;
|
||||||
osMutexDef(app_mic_mutex);
|
osMutexDef(app_mic_mutex);
|
||||||
|
|
||||||
|
|
||||||
// flag of is first mic date, if true ,will delete to avoid POP voice
|
// flag of is first mic date, if true ,will delete to avoid POP voice
|
||||||
bool first_mic_in = false;
|
bool first_mic_in = false;
|
||||||
|
|
||||||
static int internal_mic_start(MIC_APP_TYPE new_mictype)
|
static int internal_mic_start(MIC_APP_TYPE new_mictype) {
|
||||||
{
|
TRACE(1, "MIC_EVENT_START,current_mictype=%d", current_mictype);
|
||||||
TRACE(1,"MIC_EVENT_START,current_mictype=%d",current_mictype);
|
|
||||||
assert(new_mictype != MIC_APP_NONE);
|
assert(new_mictype != MIC_APP_NONE);
|
||||||
if (current_mictype != MIC_APP_NONE) {
|
if (current_mictype != MIC_APP_NONE) {
|
||||||
TRACE(0,"MIC START ERROR################");
|
TRACE(0, "MIC START ERROR################");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (new_mictype == MIC_APP_SOC_CALL)
|
if (new_mictype == MIC_APP_SOC_CALL) {
|
||||||
{
|
if (btapp_hfp_get_call_state() || app_hfp_siri_is_active()) {
|
||||||
if (btapp_hfp_get_call_state() || app_hfp_siri_is_active())
|
TRACE(2, "[%s] tws_mic_start_telephone_call: %d", __func__,
|
||||||
{
|
mic_config[new_mictype].sample_rate);
|
||||||
TRACE(2,"[%s] tws_mic_start_telephone_call: %d", __func__, mic_config[new_mictype].sample_rate);
|
if (mic_config[new_mictype].data_ptr != NULL) {
|
||||||
if (mic_config[new_mictype].data_ptr != NULL)
|
} else {
|
||||||
{
|
TRACE(1, "[%s] Warning sco play not started", __func__);
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
TRACE(1,"[%s] Warning sco play not started",__func__);
|
|
||||||
}
|
}
|
||||||
current_mictype = MIC_APP_SOC_CALL;
|
current_mictype = MIC_APP_SOC_CALL;
|
||||||
}
|
}
|
||||||
}
|
} else if (new_mictype == MIC_APP_SPEECH_RECO) {
|
||||||
else if (new_mictype == MIC_APP_SPEECH_RECO)
|
} else if (new_mictype == MIC_APP_CSPOTTER) {
|
||||||
{
|
|
||||||
}
|
|
||||||
else if (new_mictype == MIC_APP_CSPOTTER)
|
|
||||||
{
|
|
||||||
first_mic_in = true;
|
first_mic_in = true;
|
||||||
current_mictype = MIC_APP_CSPOTTER;
|
current_mictype = MIC_APP_CSPOTTER;
|
||||||
}
|
} else if (new_mictype == MIC_APP_MICRECORD) {
|
||||||
else if (new_mictype == MIC_APP_MICRECORD)
|
|
||||||
{
|
|
||||||
current_mictype = MIC_APP_MICRECORD;
|
current_mictype = MIC_APP_MICRECORD;
|
||||||
}
|
} else if (new_mictype == MIC_APP_OTHER) {
|
||||||
else if (new_mictype == MIC_APP_OTHER)
|
TRACE(0, "~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
||||||
{
|
|
||||||
TRACE(0,"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &mic_config[new_mictype]);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &mic_config[new_mictype]);
|
||||||
|
@ -119,12 +104,11 @@ static int internal_mic_start(MIC_APP_TYPE new_mictype)
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int internal_mic_stop(MIC_APP_TYPE new_mictype)
|
static int internal_mic_stop(MIC_APP_TYPE new_mictype) {
|
||||||
{
|
TRACE(1, "MIC_EVENT_STOP,current_mictype=%d", current_mictype);
|
||||||
TRACE(1,"MIC_EVENT_STOP,current_mictype=%d",current_mictype);
|
// assert(currentMicStauts == currentStatus);
|
||||||
//assert(currentMicStauts == currentStatus);
|
|
||||||
if (new_mictype != current_mictype) {
|
if (new_mictype != current_mictype) {
|
||||||
TRACE(0,"MIC STOP ERROR ################");
|
TRACE(0, "MIC STOP ERROR ################");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
|
@ -135,78 +119,70 @@ static int internal_mic_stop(MIC_APP_TYPE new_mictype)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int app_mic_process(APP_MESSAGE_BODY *msg_body)
|
static int app_mic_process(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
MIC_EVENT_TYPE mic_event = (MIC_EVENT_TYPE)msg_body->message_id;
|
MIC_EVENT_TYPE mic_event = (MIC_EVENT_TYPE)msg_body->message_id;
|
||||||
MIC_APP_TYPE new_mictype = (MIC_APP_TYPE)msg_body->message_ptr;
|
MIC_APP_TYPE new_mictype = (MIC_APP_TYPE)msg_body->message_ptr;
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
TRACE(4,"%s mic_event:%d new_mictype:%d current_mictype:%d",__func__,mic_event, new_mictype, current_mictype);
|
TRACE(4, "%s mic_event:%d new_mictype:%d current_mictype:%d", __func__,
|
||||||
|
mic_event, new_mictype, current_mictype);
|
||||||
|
|
||||||
osMutexWait(app_mic_mutex_id, osWaitForever);
|
osMutexWait(app_mic_mutex_id, osWaitForever);
|
||||||
if (mic_event == MIC_EVENT_START)
|
if (mic_event == MIC_EVENT_START)
|
||||||
ret = internal_mic_start(new_mictype);
|
ret = internal_mic_start(new_mictype);
|
||||||
else if (mic_event == MIC_EVENT_STOP)
|
else if (mic_event == MIC_EVENT_STOP)
|
||||||
ret = internal_mic_stop(new_mictype);
|
ret = internal_mic_stop(new_mictype);
|
||||||
else if (mic_event == MIC_EVENT_CHECK)
|
else if (mic_event == MIC_EVENT_CHECK) {
|
||||||
{
|
TRACE(1, "MIC_EVENT_CHECK,current_mictype=%d", current_mictype);
|
||||||
TRACE(1,"MIC_EVENT_CHECK,current_mictype=%d",current_mictype);
|
if (current_mictype != new_mictype) {
|
||||||
if (current_mictype != new_mictype)
|
|
||||||
{
|
|
||||||
if (current_mictype != MIC_APP_NONE)
|
if (current_mictype != MIC_APP_NONE)
|
||||||
internal_mic_stop(current_mictype);
|
internal_mic_stop(current_mictype);
|
||||||
if (new_mictype != MIC_APP_CSPOTTER)
|
if (new_mictype != MIC_APP_CSPOTTER)
|
||||||
internal_mic_start(new_mictype);
|
internal_mic_start(new_mictype);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
}
|
}
|
||||||
}
|
} else
|
||||||
else
|
|
||||||
assert(0);
|
assert(0);
|
||||||
osMutexRelease(app_mic_mutex_id);
|
osMutexRelease(app_mic_mutex_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_mic_init()
|
void app_mic_init() {
|
||||||
{
|
|
||||||
app_mic_mutex_id = osMutexCreate((osMutex(app_mic_mutex)));
|
app_mic_mutex_id = osMutexCreate((osMutex(app_mic_mutex)));
|
||||||
app_set_threadhandle(APP_MODUAL_MIC, app_mic_process);
|
app_set_threadhandle(APP_MODUAL_MIC, app_mic_process);
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_mic_register(MIC_APP_TYPE mic_type, struct AF_STREAM_CONFIG_T *newStream)
|
int app_mic_register(MIC_APP_TYPE mic_type,
|
||||||
{
|
struct AF_STREAM_CONFIG_T *newStream) {
|
||||||
TRACE(2,"app_mic_registration mic_type:%d,newStream=%p\n",mic_type,newStream);
|
TRACE(2, "app_mic_registration mic_type:%d,newStream=%p\n", mic_type,
|
||||||
if (mic_type > MIC_APP_NONE && mic_type < MIC_APP_MAX)
|
newStream);
|
||||||
{
|
if (mic_type > MIC_APP_NONE && mic_type < MIC_APP_MAX) {
|
||||||
osMutexWait(app_mic_mutex_id, osWaitForever);
|
osMutexWait(app_mic_mutex_id, osWaitForever);
|
||||||
if (memcmp(&mic_config[mic_type],newStream,sizeof(struct AF_STREAM_CONFIG_T)) != 0)
|
if (memcmp(&mic_config[mic_type], newStream,
|
||||||
{
|
sizeof(struct AF_STREAM_CONFIG_T)) != 0) {
|
||||||
TRACE(0,"app_mic_registration Warning mic stream config changed!!!");
|
TRACE(0, "app_mic_registration Warning mic stream config changed!!!");
|
||||||
}
|
}
|
||||||
memcpy(&mic_config[mic_type],newStream,sizeof(struct AF_STREAM_CONFIG_T));
|
memcpy(&mic_config[mic_type], newStream, sizeof(struct AF_STREAM_CONFIG_T));
|
||||||
osMutexRelease(app_mic_mutex_id);
|
osMutexRelease(app_mic_mutex_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_mic_deregister(MIC_APP_TYPE mic_type)
|
int app_mic_deregister(MIC_APP_TYPE mic_type) {
|
||||||
{
|
TRACE(1, "app_mic_deregister mic_type:%d\n", mic_type);
|
||||||
TRACE(1,"app_mic_deregister mic_type:%d\n",mic_type);
|
if (mic_type > MIC_APP_NONE && mic_type < MIC_APP_MAX) {
|
||||||
if (mic_type > MIC_APP_NONE && mic_type < MIC_APP_MAX)
|
|
||||||
{
|
|
||||||
osMutexWait(app_mic_mutex_id, osWaitForever);
|
osMutexWait(app_mic_mutex_id, osWaitForever);
|
||||||
memset(&mic_config[mic_type],0,sizeof(struct AF_STREAM_CONFIG_T));
|
memset(&mic_config[mic_type], 0, sizeof(struct AF_STREAM_CONFIG_T));
|
||||||
osMutexRelease(app_mic_mutex_id);
|
osMutexRelease(app_mic_mutex_id);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_mic_is_registed(MIC_APP_TYPE mic_type)
|
bool app_mic_is_registed(MIC_APP_TYPE mic_type) {
|
||||||
{
|
TRACE(1, "app_mic_is_registed mic_type:%d\n", mic_type);
|
||||||
TRACE(1,"app_mic_is_registed mic_type:%d\n",mic_type);
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (mic_type > MIC_APP_NONE && mic_type < MIC_APP_MAX)
|
if (mic_type > MIC_APP_NONE && mic_type < MIC_APP_MAX) {
|
||||||
{
|
|
||||||
osMutexWait(app_mic_mutex_id, osWaitForever);
|
osMutexWait(app_mic_mutex_id, osWaitForever);
|
||||||
ret = mic_config[mic_type].data_ptr != NULL;
|
ret = mic_config[mic_type].data_ptr != NULL;
|
||||||
osMutexRelease(app_mic_mutex_id);
|
osMutexRelease(app_mic_mutex_id);
|
||||||
|
@ -214,8 +190,7 @@ bool app_mic_is_registed(MIC_APP_TYPE mic_type)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_mic_start(MIC_APP_TYPE mic_type)
|
bool app_mic_start(MIC_APP_TYPE mic_type) {
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
msg.mod_id = APP_MODUAL_MIC;
|
msg.mod_id = APP_MODUAL_MIC;
|
||||||
msg.msg_body.message_id = MIC_EVENT_START;
|
msg.msg_body.message_id = MIC_EVENT_START;
|
||||||
|
@ -224,8 +199,7 @@ bool app_mic_start(MIC_APP_TYPE mic_type)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool app_mic_stop(MIC_APP_TYPE mic_type)
|
bool app_mic_stop(MIC_APP_TYPE mic_type) {
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
msg.mod_id = APP_MODUAL_MIC;
|
msg.mod_id = APP_MODUAL_MIC;
|
||||||
msg.msg_body.message_id = MIC_EVENT_STOP;
|
msg.msg_body.message_id = MIC_EVENT_STOP;
|
||||||
|
@ -234,8 +208,7 @@ bool app_mic_stop(MIC_APP_TYPE mic_type)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_mic_check(MIC_APP_TYPE mic_type)
|
void app_mic_check(MIC_APP_TYPE mic_type) {
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
msg.mod_id = APP_MODUAL_MIC;
|
msg.mod_id = APP_MODUAL_MIC;
|
||||||
msg.msg_body.message_id = MIC_EVENT_CHECK;
|
msg.msg_body.message_id = MIC_EVENT_CHECK;
|
||||||
|
@ -243,12 +216,10 @@ void app_mic_check(MIC_APP_TYPE mic_type)
|
||||||
app_mailbox_put(&msg);
|
app_mailbox_put(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
MIC_APP_TYPE app_mic_status(void)
|
MIC_APP_TYPE app_mic_status(void) {
|
||||||
{
|
|
||||||
MIC_APP_TYPE ret;
|
MIC_APP_TYPE ret;
|
||||||
osMutexWait(app_mic_mutex_id, osWaitForever);
|
osMutexWait(app_mic_mutex_id, osWaitForever);
|
||||||
ret= current_mictype;
|
ret = current_mictype;
|
||||||
osMutexRelease(app_mic_mutex_id);
|
osMutexRelease(app_mic_mutex_id);
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,18 +13,18 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_bt_stream.h"
|
||||||
|
#include "app_media_player.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "resources.h"
|
#include "resources.h"
|
||||||
#include "app_bt_stream.h"
|
|
||||||
#include "app_media_player.h"
|
|
||||||
//#include "app_factory.h"
|
//#include "app_factory.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
// for audio
|
// for audio
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "app_audio.h"
|
#include "app_audio.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
#include "hal_timer.h"
|
#include "hal_timer.h"
|
||||||
|
|
||||||
#include "app_mic_alg.h"
|
#include "app_mic_alg.h"
|
||||||
|
@ -42,7 +42,6 @@
|
||||||
|
|
||||||
#include "apps.h"
|
#include "apps.h"
|
||||||
|
|
||||||
|
|
||||||
#ifdef WEBRTC_AGC
|
#ifdef WEBRTC_AGC
|
||||||
#include "agc_main.h"
|
#include "agc_main.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -51,17 +50,14 @@
|
||||||
#define WEBRTC_NSX_BUFF_SIZE (14000)
|
#define WEBRTC_NSX_BUFF_SIZE (14000)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef WL_VAD
|
#ifdef WL_VAD
|
||||||
#include "vad_user.h"
|
#include "vad_user.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef WL_DEBUG_MODE
|
#ifdef WL_DEBUG_MODE
|
||||||
#include "nvrecord_env.h"
|
#include "nvrecord_env.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifdef REMOTE_UART
|
#ifdef REMOTE_UART
|
||||||
#include "app_remoter_uart.h"
|
#include "app_remoter_uart.h"
|
||||||
#endif
|
#endif
|
||||||
|
@ -75,77 +71,69 @@
|
||||||
#include "app_i2c_sensor.h"
|
#include "app_i2c_sensor.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static inline float clampf(float v, float min, float max){
|
static inline float clampf(float v, float min, float max) {
|
||||||
return v < min ? min : (v > max ? max : v);
|
return v < min ? min : (v > max ? max : v);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef WL_NSX_5MS
|
#ifdef WL_NSX_5MS
|
||||||
#define BT_AUDIO_FACTORMODE_BUFF_SIZE (160*2)
|
#define BT_AUDIO_FACTORMODE_BUFF_SIZE (160 * 2)
|
||||||
#else
|
#else
|
||||||
#define BT_AUDIO_FACTORMODE_BUFF_SIZE (6*320*16)
|
#define BT_AUDIO_FACTORMODE_BUFF_SIZE (6 * 320 * 16)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define NSX_FRAME_SIZE 160
|
#define NSX_FRAME_SIZE 160
|
||||||
|
|
||||||
|
|
||||||
static enum APP_AUDIO_CACHE_T a2dp_cache_status = APP_AUDIO_CACHE_QTY;
|
static enum APP_AUDIO_CACHE_T a2dp_cache_status = APP_AUDIO_CACHE_QTY;
|
||||||
|
|
||||||
|
|
||||||
#if defined(WL_AEC)
|
#if defined(WL_AEC)
|
||||||
static short POSSIBLY_UNUSED aec_out[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
static short POSSIBLY_UNUSED aec_out[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
static short POSSIBLY_UNUSED far_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
static short POSSIBLY_UNUSED far_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
static short POSSIBLY_UNUSED out_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
|
static short POSSIBLY_UNUSED tmp_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
|
|
||||||
static short POSSIBLY_UNUSED out_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
// static short revert_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
||||||
static short POSSIBLY_UNUSED tmp_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
// static short audio_uart_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
||||||
|
|
||||||
//static short revert_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
|
||||||
//static short audio_uart_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
|
||||||
|
|
||||||
|
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
||||||
|
|
||||||
static short POSSIBLY_UNUSED one_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
static short POSSIBLY_UNUSED one_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
static short POSSIBLY_UNUSED two_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
static short POSSIBLY_UNUSED two_buff[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
|
|
||||||
static short POSSIBLY_UNUSED left_out[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
static short POSSIBLY_UNUSED left_out[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
static short POSSIBLY_UNUSED right_out[BT_AUDIO_FACTORMODE_BUFF_SIZE>>2];
|
static short POSSIBLY_UNUSED right_out[BT_AUDIO_FACTORMODE_BUFF_SIZE >> 2];
|
||||||
|
|
||||||
static void POSSIBLY_UNUSED aaudio_div_stero_to_rmono(int16_t *dst_buf, int16_t *src_buf, uint32_t src_len)
|
static void POSSIBLY_UNUSED aaudio_div_stero_to_rmono(int16_t *dst_buf,
|
||||||
{
|
int16_t *src_buf,
|
||||||
|
uint32_t src_len) {
|
||||||
// Copy from tail so that it works even if dst_buf == src_buf
|
// Copy from tail so that it works even if dst_buf == src_buf
|
||||||
for (uint32_t i = 0; i < src_len>>1; i++)
|
for (uint32_t i = 0; i < src_len >> 1; i++) {
|
||||||
{
|
dst_buf[i] = src_buf[i * 2 + 1];
|
||||||
dst_buf[i] = src_buf[i*2 + 1];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
static void POSSIBLY_UNUSED aaudio_div_stero_to_lmono(int16_t *dst_buf, int16_t *src_buf, uint32_t src_len)
|
static void POSSIBLY_UNUSED aaudio_div_stero_to_lmono(int16_t *dst_buf,
|
||||||
{
|
int16_t *src_buf,
|
||||||
|
uint32_t src_len) {
|
||||||
// Copy from tail so that it works even if dst_buf == src_buf
|
// Copy from tail so that it works even if dst_buf == src_buf
|
||||||
for (uint32_t i = 0; i < src_len>>1; i++)
|
for (uint32_t i = 0; i < src_len >> 1; i++) {
|
||||||
{
|
dst_buf[i] = src_buf[i * 2 + 0];
|
||||||
dst_buf[i] = src_buf[i*2 + 0];
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void POSSIBLY_UNUSED audio_mono2stereo_16bits(int16_t *dst_buf,
|
||||||
static void POSSIBLY_UNUSED audio_mono2stereo_16bits(int16_t *dst_buf, int16_t *left_buf, int16_t *right_buf, uint32_t src_len)
|
int16_t *left_buf,
|
||||||
{
|
int16_t *right_buf,
|
||||||
|
uint32_t src_len) {
|
||||||
uint32_t i = 0;
|
uint32_t i = 0;
|
||||||
for (i = 0; i < src_len; ++i) {
|
for (i = 0; i < src_len; ++i) {
|
||||||
dst_buf[i*2 + 0] = left_buf[i];
|
dst_buf[i * 2 + 0] = left_buf[i];
|
||||||
dst_buf[i*2 + 1] = right_buf[i];
|
dst_buf[i * 2 + 1] = right_buf[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
||||||
|
|
||||||
|
|
||||||
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 4
|
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 4
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -155,102 +143,90 @@ extern uint32_t transfer_factor;
|
||||||
extern uint32_t diff_energy;
|
extern uint32_t diff_energy;
|
||||||
extern uint32_t level_shift;
|
extern uint32_t level_shift;
|
||||||
|
|
||||||
static inline double convert_multiple_to_db(uint32_t multiple)
|
static inline double convert_multiple_to_db(uint32_t multiple) {
|
||||||
{
|
return 20 * log10(multiple);
|
||||||
return 20*log10(multiple);
|
|
||||||
}
|
}
|
||||||
#define DUMP_FRAME_LEN 0x3C0
|
#define DUMP_FRAME_LEN 0x3C0
|
||||||
static short POSSIBLY_UNUSED revert_buff[2+1*DUMP_FRAME_LEN];
|
static short POSSIBLY_UNUSED revert_buff[2 + 1 * DUMP_FRAME_LEN];
|
||||||
int32_t tx_pcmbuf32[960];
|
int32_t tx_pcmbuf32[960];
|
||||||
|
|
||||||
|
|
||||||
extern int app_reset(void);
|
extern int app_reset(void);
|
||||||
|
|
||||||
extern void app_bt_volumeup();
|
extern void app_bt_volumeup();
|
||||||
extern void app_bt_volumedown();
|
extern void app_bt_volumedown();
|
||||||
|
|
||||||
void vol_state_process(uint32_t db_val)
|
void vol_state_process(uint32_t db_val) {
|
||||||
{
|
TRACE(2, "db value is:%d volume_is:%d ", db_val,
|
||||||
TRACE(2,"db value is:%d volume_is:%d ",db_val,app_bt_stream_local_volume_get());
|
app_bt_stream_local_volume_get());
|
||||||
|
|
||||||
if((db_val < 52) && (app_bt_stream_local_volume_get() > 10))
|
if ((db_val < 52) && (app_bt_stream_local_volume_get() > 10)) {
|
||||||
{
|
|
||||||
app_bt_volumedown();
|
app_bt_volumedown();
|
||||||
}
|
} else if ((db_val > 60) && (app_bt_stream_local_volume_get() < 13)) {
|
||||||
else if((db_val > 60) && (app_bt_stream_local_volume_get() < 13))
|
app_bt_volumeup();
|
||||||
{
|
} else if ((db_val > 72) && (app_bt_stream_local_volume_get() < 15)) {
|
||||||
app_bt_volumeup();
|
app_bt_volumeup();
|
||||||
}
|
}
|
||||||
else if((db_val > 72) && (app_bt_stream_local_volume_get() < 15))
|
|
||||||
{
|
|
||||||
app_bt_volumeup();
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t app_mic_alg_data_come(uint8_t *buf, uint32_t len)
|
static uint32_t app_mic_alg_data_come(uint8_t *buf, uint32_t len) {
|
||||||
{
|
uint32_t pcm_len = len >> 1;
|
||||||
uint32_t pcm_len = len>>1;
|
|
||||||
|
|
||||||
short POSSIBLY_UNUSED *tx_pcmbuf16 = (short*)buf;
|
short POSSIBLY_UNUSED *tx_pcmbuf16 = (short *)buf;
|
||||||
|
|
||||||
//DUMP16("%d, ",tx_pcmbuf16,30);
|
// DUMP16("%d, ",tx_pcmbuf16,30);
|
||||||
// memcpy(tmp_buff,pcm_buff,len);
|
// memcpy(tmp_buff,pcm_buff,len);
|
||||||
|
|
||||||
int32_t stime = 0;
|
int32_t stime = 0;
|
||||||
static int32_t nsx_cnt = 0;
|
static int32_t nsx_cnt = 0;
|
||||||
static int32_t dump_cnt = 0;
|
static int32_t dump_cnt = 0;
|
||||||
|
|
||||||
|
|
||||||
nsx_cnt++;
|
nsx_cnt++;
|
||||||
dump_cnt++;
|
dump_cnt++;
|
||||||
|
|
||||||
DUMP16("%d,",tx_pcmbuf16,30);
|
DUMP16("%d,", tx_pcmbuf16, 30);
|
||||||
if(false == (nsx_cnt & 0x3F))
|
if (false == (nsx_cnt & 0x3F)) {
|
||||||
{
|
|
||||||
stime = hal_sys_timer_get();
|
stime = hal_sys_timer_get();
|
||||||
//TRACE("aecm echo time: lens:%d g_time_cnt:%d ",len, g_time_cnt);
|
// TRACE("aecm echo time: lens:%d g_time_cnt:%d ",len, g_time_cnt);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef WL_DET
|
#ifdef WL_DET
|
||||||
if(nsx_cnt > 100)
|
if (nsx_cnt > 100) {
|
||||||
{
|
static double last_sum = 0, last_avg = 0;
|
||||||
static double last_sum = 0,last_avg = 0;
|
|
||||||
|
|
||||||
uint32_t sum_ss = 0;
|
uint32_t sum_ss = 0;
|
||||||
//short db_val = 0;
|
// short db_val = 0;
|
||||||
double db_sum = 0;
|
double db_sum = 0;
|
||||||
for (uint32_t i_cnt = 0; i_cnt < pcm_len; i_cnt++)
|
for (uint32_t i_cnt = 0; i_cnt < pcm_len; i_cnt++) {
|
||||||
{
|
|
||||||
sum_ss += ABS(tx_pcmbuf16[i_cnt]);
|
sum_ss += ABS(tx_pcmbuf16[i_cnt]);
|
||||||
}
|
}
|
||||||
|
|
||||||
sum_ss = 1*sum_ss/pcm_len;
|
sum_ss = 1 * sum_ss / pcm_len;
|
||||||
|
|
||||||
db_sum = convert_multiple_to_db(sum_ss);
|
db_sum = convert_multiple_to_db(sum_ss);
|
||||||
//db_val = (short)(100*db_sum);
|
// db_val = (short)(100*db_sum);
|
||||||
last_sum += db_sum;
|
last_sum += db_sum;
|
||||||
last_avg = last_sum/nsx_cnt;
|
last_avg = last_sum / nsx_cnt;
|
||||||
|
|
||||||
db_sum = db_sum*(double)0.02 + last_avg*(double)0.98;
|
db_sum = db_sum * (double)0.02 + last_avg * (double)0.98;
|
||||||
|
|
||||||
//TRACE(2,"db value is:%d sum_ss:%d ",(uint32_t)db_sum,sum_ss);
|
// TRACE(2,"db value is:%d sum_ss:%d ",(uint32_t)db_sum,sum_ss);
|
||||||
//TRACE(2,"db value is:%d ",(uint32_t)db_sum);
|
// TRACE(2,"db value is:%d ",(uint32_t)db_sum);
|
||||||
vol_state_process((uint32_t)db_sum);
|
vol_state_process((uint32_t)db_sum);
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
if (false == (nsx_cnt & 0x3F)) {
|
||||||
if(false == (nsx_cnt & 0x3F))
|
// TRACE("drc 48 mic_alg 16k nsx 3 agc 15 closed speed time:%d ms and
|
||||||
{
|
// pcm_lens:%d freq:%d ", TICKS_TO_MS(hal_sys_timer_get() - stime),
|
||||||
//TRACE("drc 48 mic_alg 16k nsx 3 agc 15 closed speed time:%d ms and pcm_lens:%d freq:%d ", TICKS_TO_MS(hal_sys_timer_get() - stime), pcm_len,hal_sysfreq_get());
|
// pcm_len,hal_sysfreq_get()); TRACE("notch 500 mic_alg 16k nsx 3 agc 15
|
||||||
//TRACE("notch 500 mic_alg 16k nsx 3 agc 15 closed speed time:%d ms and pcm_lens:%d freq:%d ", TICKS_TO_MS(hal_sys_timer_get() - stime), pcm_len,hal_sysfreq_get());
|
// closed speed time:%d ms and pcm_lens:%d freq:%d ",
|
||||||
TRACE(2,"denoise det speed time:%d ms and pcm_lens:%d freq:%d ", TICKS_TO_MS(hal_sys_timer_get() - stime), pcm_len,hal_sysfreq_get());
|
// TICKS_TO_MS(hal_sys_timer_get() - stime), pcm_len,hal_sysfreq_get());
|
||||||
|
TRACE(2, "denoise det speed time:%d ms and pcm_lens:%d freq:%d ",
|
||||||
|
TICKS_TO_MS(hal_sys_timer_get() - stime), pcm_len, hal_sysfreq_get());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (a2dp_cache_status == APP_AUDIO_CACHE_QTY) {
|
||||||
if (a2dp_cache_status == APP_AUDIO_CACHE_QTY){
|
|
||||||
a2dp_cache_status = APP_AUDIO_CACHE_OK;
|
a2dp_cache_status = APP_AUDIO_CACHE_OK;
|
||||||
}
|
}
|
||||||
return len;
|
return len;
|
||||||
|
@ -262,13 +238,14 @@ static uint32_t app_mic_alg_data_come(uint8_t *buf, uint32_t len)
|
||||||
// #if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
// #if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
||||||
// #ifdef WL_AEC
|
// #ifdef WL_AEC
|
||||||
// app_audio_pcmbuff_get((uint8_t *)app_audioloop_play_cache, len/2);
|
// app_audio_pcmbuff_get((uint8_t *)app_audioloop_play_cache, len/2);
|
||||||
// app_bt_stream_copy_track_one_to_two_16bits((int16_t *)buf, app_audioloop_play_cache, len/2/2);
|
// app_bt_stream_copy_track_one_to_two_16bits((int16_t *)buf,
|
||||||
// #else
|
// app_audioloop_play_cache, len/2/2); #else
|
||||||
// app_audio_pcmbuff_get((uint8_t *)buf, len);
|
// app_audio_pcmbuff_get((uint8_t *)buf, len);
|
||||||
// #endif
|
// #endif
|
||||||
// #else
|
// #else
|
||||||
// app_audio_pcmbuff_get((uint8_t *)app_audioloop_play_cache, len/2);
|
// app_audio_pcmbuff_get((uint8_t *)app_audioloop_play_cache, len/2);
|
||||||
// app_bt_stream_copy_track_one_to_two_16bits((int16_t *)buf, app_audioloop_play_cache, len/2/2);
|
// app_bt_stream_copy_track_one_to_two_16bits((int16_t *)buf,
|
||||||
|
// app_audioloop_play_cache, len/2/2);
|
||||||
// #endif
|
// #endif
|
||||||
// }
|
// }
|
||||||
// return len;
|
// return len;
|
||||||
|
@ -276,18 +253,16 @@ static uint32_t app_mic_alg_data_come(uint8_t *buf, uint32_t len)
|
||||||
|
|
||||||
static uint8_t buff_capture[BT_AUDIO_FACTORMODE_BUFF_SIZE];
|
static uint8_t buff_capture[BT_AUDIO_FACTORMODE_BUFF_SIZE];
|
||||||
|
|
||||||
int app_mic_alg_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
int app_mic_alg_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq) {
|
||||||
{
|
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
|
|
||||||
TRACE(2,"app_mic_alg work:%d op:%d freq:%d", isRun, on, freq);
|
TRACE(2, "app_mic_alg work:%d op:%d freq:%d", isRun, on, freq);
|
||||||
|
|
||||||
if (isRun==on)
|
if (isRun == on)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (on){
|
if (on) {
|
||||||
|
|
||||||
|
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, freq);
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, freq);
|
||||||
|
|
||||||
|
@ -295,14 +270,12 @@ int app_mic_alg_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
||||||
|
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
|
|
||||||
|
|
||||||
stream_cfg.bits = AUD_BITS_16;
|
stream_cfg.bits = AUD_BITS_16;
|
||||||
|
|
||||||
stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
stream_cfg.channel_num = AUD_CHANNEL_NUM_1;
|
||||||
|
|
||||||
stream_cfg.sample_rate = AUD_SAMPRATE_48000;
|
stream_cfg.sample_rate = AUD_SAMPRATE_48000;
|
||||||
|
|
||||||
|
|
||||||
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
stream_cfg.device = AUD_STREAM_USE_INT_CODEC;
|
||||||
|
|
||||||
stream_cfg.vol = CODEC_SADC_VOL;
|
stream_cfg.vol = CODEC_SADC_VOL;
|
||||||
|
@ -311,7 +284,8 @@ int app_mic_alg_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
||||||
stream_cfg.handler = app_mic_alg_data_come;
|
stream_cfg.handler = app_mic_alg_data_come;
|
||||||
|
|
||||||
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(buff_capture);
|
stream_cfg.data_ptr = BT_AUDIO_CACHE_2_UNCACHE(buff_capture);
|
||||||
stream_cfg.data_size = BT_AUDIO_FACTORMODE_BUFF_SIZE*stream_cfg.channel_num;
|
stream_cfg.data_size =
|
||||||
|
BT_AUDIO_FACTORMODE_BUFF_SIZE * stream_cfg.channel_num;
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
||||||
|
|
||||||
// stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
// stream_cfg.channel_num = AUD_CHANNEL_NUM_2;
|
||||||
|
@ -322,22 +296,20 @@ int app_mic_alg_audioloop(bool on, enum APP_SYSFREQ_FREQ_T freq)
|
||||||
// stream_cfg.data_size = BT_AUDIO_FACTORMODE_BUFF_SIZE*2;
|
// stream_cfg.data_size = BT_AUDIO_FACTORMODE_BUFF_SIZE*2;
|
||||||
// af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
// af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
|
|
||||||
//af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
// af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
TRACE(2,"app_mic_uart ss loopback on");
|
TRACE(2, "app_mic_uart ss loopback on");
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
//af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
// af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
//af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
// af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
TRACE(2,"app_mic_16k loopback off");
|
TRACE(2, "app_mic_16k loopback off");
|
||||||
|
|
||||||
//app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
|
// app_sysfreq_req(APP_SYSFREQ_USER_APP_0, APP_SYSFREQ_32K);
|
||||||
}
|
}
|
||||||
|
|
||||||
isRun=on;
|
isRun = on;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,24 +13,24 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_pwl.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "tgt_hardware.h"
|
|
||||||
#include "hal_gpio.h"
|
#include "hal_gpio.h"
|
||||||
#include "hal_iomux.h"
|
#include "hal_iomux.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
#include "app_pwl.h"
|
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
#include "tgt_hardware.h"
|
||||||
|
|
||||||
#define APP_PWL_TRACE(s,...)
|
#define APP_PWL_TRACE(s, ...)
|
||||||
//TRACE(s, ##__VA_ARGS__)
|
// TRACE(s, ##__VA_ARGS__)
|
||||||
|
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
static void app_pwl_timehandler(void const *param);
|
static void app_pwl_timehandler(void const *param);
|
||||||
|
|
||||||
osTimerDef (APP_PWL_TIMER0, app_pwl_timehandler); // define timers
|
osTimerDef(APP_PWL_TIMER0, app_pwl_timehandler); // define timers
|
||||||
#if (CFG_HW_PLW_NUM == 2)
|
#if (CFG_HW_PLW_NUM == 2)
|
||||||
osTimerDef (APP_PWL_TIMER1, app_pwl_timehandler);
|
osTimerDef(APP_PWL_TIMER1, app_pwl_timehandler);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
struct APP_PWL_T {
|
struct APP_PWL_T {
|
||||||
|
@ -42,97 +42,107 @@ struct APP_PWL_T {
|
||||||
|
|
||||||
static struct APP_PWL_T app_pwl[APP_PWL_ID_QTY];
|
static struct APP_PWL_T app_pwl[APP_PWL_ID_QTY];
|
||||||
|
|
||||||
static void app_pwl_timehandler(void const *param)
|
static void app_pwl_timehandler(void const *param) {
|
||||||
{
|
|
||||||
struct APP_PWL_T *pwl = (struct APP_PWL_T *)param;
|
struct APP_PWL_T *pwl = (struct APP_PWL_T *)param;
|
||||||
struct APP_PWL_CFG_T *cfg = &(pwl->config);
|
struct APP_PWL_CFG_T *cfg = &(pwl->config);
|
||||||
APP_PWL_TRACE(2,"%s %x",__func__, param);
|
APP_PWL_TRACE(2, "%s %x", __func__, param);
|
||||||
|
|
||||||
osTimerStop(pwl->timer);
|
osTimerStop(pwl->timer);
|
||||||
|
|
||||||
pwl->partidx++;
|
pwl->partidx++;
|
||||||
if (cfg->periodic){
|
if (cfg->periodic) {
|
||||||
if (pwl->partidx >= cfg->parttotal){
|
if (pwl->partidx >= cfg->parttotal) {
|
||||||
pwl->partidx = 0;
|
pwl->partidx = 0;
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
if (pwl->partidx >= cfg->parttotal){
|
if (pwl->partidx >= cfg->parttotal) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
APP_PWL_TRACE(3,"idx:%d pin:%d lvl:%d", pwl->partidx, cfg_hw_pinmux_pwl[pwl->id].pin, cfg->part[pwl->partidx].level);
|
APP_PWL_TRACE(3, "idx:%d pin:%d lvl:%d", pwl->partidx,
|
||||||
if(!cfg->part[pwl->partidx].level){
|
cfg_hw_pinmux_pwl[pwl->id].pin, cfg->part[pwl->partidx].level);
|
||||||
|
if (!cfg->part[pwl->partidx].level) {
|
||||||
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
||||||
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0 : PMU_VIORISE_REQ_USER_PWL1, true);
|
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0
|
||||||
|
: PMU_VIORISE_REQ_USER_PWL1,
|
||||||
|
true);
|
||||||
#endif
|
#endif
|
||||||
hal_gpio_pin_set((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
hal_gpio_pin_set((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
||||||
}else{
|
} else {
|
||||||
hal_gpio_pin_clr((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
hal_gpio_pin_clr((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
||||||
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
||||||
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0 : PMU_VIORISE_REQ_USER_PWL1, false);
|
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0
|
||||||
|
: PMU_VIORISE_REQ_USER_PWL1,
|
||||||
|
false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
osTimerStart(pwl->timer, cfg->part[pwl->partidx].time);
|
osTimerStart(pwl->timer, cfg->part[pwl->partidx].time);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int app_pwl_open(void)
|
int app_pwl_open(void) {
|
||||||
{
|
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
APP_PWL_TRACE(1,"%s",__func__);
|
APP_PWL_TRACE(1, "%s", __func__);
|
||||||
for (i=0;i<APP_PWL_ID_QTY;i++){
|
for (i = 0; i < APP_PWL_ID_QTY; i++) {
|
||||||
app_pwl[i].id = APP_PWL_ID_QTY;
|
app_pwl[i].id = APP_PWL_ID_QTY;
|
||||||
memset(&(app_pwl[i].config), 0, sizeof(struct APP_PWL_CFG_T));
|
memset(&(app_pwl[i].config), 0, sizeof(struct APP_PWL_CFG_T));
|
||||||
hal_iomux_init((struct HAL_IOMUX_PIN_FUNCTION_MAP *)&cfg_hw_pinmux_pwl[i], 1);
|
hal_iomux_init((struct HAL_IOMUX_PIN_FUNCTION_MAP *)&cfg_hw_pinmux_pwl[i],
|
||||||
hal_gpio_pin_set_dir((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[i].pin, HAL_GPIO_DIR_OUT, 1);
|
1);
|
||||||
|
hal_gpio_pin_set_dir((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[i].pin,
|
||||||
|
HAL_GPIO_DIR_OUT, 1);
|
||||||
}
|
}
|
||||||
app_pwl[APP_PWL_ID_0].timer = osTimerCreate (osTimer(APP_PWL_TIMER0), osTimerOnce, &app_pwl[APP_PWL_ID_0]);
|
app_pwl[APP_PWL_ID_0].timer = osTimerCreate(
|
||||||
|
osTimer(APP_PWL_TIMER0), osTimerOnce, &app_pwl[APP_PWL_ID_0]);
|
||||||
#if (CFG_HW_PLW_NUM == 2)
|
#if (CFG_HW_PLW_NUM == 2)
|
||||||
app_pwl[APP_PWL_ID_1].timer = osTimerCreate (osTimer(APP_PWL_TIMER1), osTimerOnce, &app_pwl[APP_PWL_ID_1]);
|
app_pwl[APP_PWL_ID_1].timer = osTimerCreate(
|
||||||
|
osTimer(APP_PWL_TIMER1), osTimerOnce, &app_pwl[APP_PWL_ID_1]);
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_pwl_start(enum APP_PWL_ID_T id)
|
int app_pwl_start(enum APP_PWL_ID_T id) {
|
||||||
{
|
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
struct APP_PWL_T *pwl = NULL;
|
struct APP_PWL_T *pwl = NULL;
|
||||||
struct APP_PWL_CFG_T *cfg = NULL;
|
struct APP_PWL_CFG_T *cfg = NULL;
|
||||||
|
|
||||||
|
|
||||||
if (id >= APP_PWL_ID_QTY) {
|
if (id >= APP_PWL_ID_QTY) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
APP_PWL_TRACE(2,"%s %d",__func__, id);
|
APP_PWL_TRACE(2, "%s %d", __func__, id);
|
||||||
|
|
||||||
pwl = &app_pwl[id];
|
pwl = &app_pwl[id];
|
||||||
cfg = &(pwl->config);
|
cfg = &(pwl->config);
|
||||||
|
|
||||||
if (pwl->id == APP_PWL_ID_QTY){
|
if (pwl->id == APP_PWL_ID_QTY) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pwl->partidx = 0;
|
pwl->partidx = 0;
|
||||||
if (pwl->partidx >= cfg->parttotal){
|
if (pwl->partidx >= cfg->parttotal) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
osTimerStop(pwl->timer);
|
osTimerStop(pwl->timer);
|
||||||
|
|
||||||
APP_PWL_TRACE(3,"idx:%d pin:%d lvl:%d", pwl->partidx, cfg_hw_pinmux_pwl[pwl->id].pin, cfg->part[pwl->partidx].level);
|
APP_PWL_TRACE(3, "idx:%d pin:%d lvl:%d", pwl->partidx,
|
||||||
if(!cfg->part[pwl->partidx].level){
|
cfg_hw_pinmux_pwl[pwl->id].pin, cfg->part[pwl->partidx].level);
|
||||||
|
if (!cfg->part[pwl->partidx].level) {
|
||||||
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
||||||
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0 : PMU_VIORISE_REQ_USER_PWL1, false);
|
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0
|
||||||
|
: PMU_VIORISE_REQ_USER_PWL1,
|
||||||
|
false);
|
||||||
#endif
|
#endif
|
||||||
hal_gpio_pin_set((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
hal_gpio_pin_set((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
||||||
}else{
|
} else {
|
||||||
hal_gpio_pin_clr((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
hal_gpio_pin_clr((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[pwl->id].pin);
|
||||||
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
#if defined(__PMU_VIO_DYNAMIC_CTRL_MODE__)
|
||||||
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0 : PMU_VIORISE_REQ_USER_PWL1, false);
|
pmu_viorise_req(pwl->id == APP_PWL_ID_0 ? PMU_VIORISE_REQ_USER_PWL0
|
||||||
|
: PMU_VIORISE_REQ_USER_PWL1,
|
||||||
|
false);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
osTimerStart(pwl->timer, cfg->part[pwl->partidx].time);
|
osTimerStart(pwl->timer, cfg->part[pwl->partidx].time);
|
||||||
|
@ -140,15 +150,15 @@ int app_pwl_start(enum APP_PWL_ID_T id)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_pwl_setup(enum APP_PWL_ID_T id, struct APP_PWL_CFG_T *cfg)
|
int app_pwl_setup(enum APP_PWL_ID_T id, struct APP_PWL_CFG_T *cfg) {
|
||||||
{
|
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
if (cfg == NULL || id >= APP_PWL_ID_QTY) {
|
if (cfg == NULL || id >= APP_PWL_ID_QTY) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
APP_PWL_TRACE(2,"%s %d",__func__, id);
|
APP_PWL_TRACE(2, "%s %d", __func__, id);
|
||||||
|
|
||||||
hal_gpio_pin_set_dir((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[id].pin, HAL_GPIO_DIR_OUT, cfg->startlevel?0:1);
|
hal_gpio_pin_set_dir((enum HAL_GPIO_PIN_T)cfg_hw_pinmux_pwl[id].pin,
|
||||||
|
HAL_GPIO_DIR_OUT, cfg->startlevel ? 0 : 1);
|
||||||
app_pwl[id].id = id;
|
app_pwl[id].id = id;
|
||||||
memcpy(&(app_pwl[id].config), cfg, sizeof(struct APP_PWL_CFG_T));
|
memcpy(&(app_pwl[id].config), cfg, sizeof(struct APP_PWL_CFG_T));
|
||||||
|
|
||||||
|
@ -157,8 +167,7 @@ int app_pwl_setup(enum APP_PWL_ID_T id, struct APP_PWL_CFG_T *cfg)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_pwl_stop(enum APP_PWL_ID_T id)
|
int app_pwl_stop(enum APP_PWL_ID_T id) {
|
||||||
{
|
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
if (id >= APP_PWL_ID_QTY) {
|
if (id >= APP_PWL_ID_QTY) {
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -170,16 +179,13 @@ int app_pwl_stop(enum APP_PWL_ID_T id)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_pwl_close(void)
|
int app_pwl_close(void) {
|
||||||
{
|
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
uint8_t i;
|
uint8_t i;
|
||||||
for (i=0;i<APP_PWL_ID_QTY;i++){
|
for (i = 0; i < APP_PWL_ID_QTY; i++) {
|
||||||
if (app_pwl[i].id != APP_PWL_ID_QTY)
|
if (app_pwl[i].id != APP_PWL_ID_QTY)
|
||||||
app_pwl_stop((enum APP_PWL_ID_T)i);
|
app_pwl_stop((enum APP_PWL_ID_T)i);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -19,43 +19,40 @@
|
||||||
|
|
||||||
//#include "hal_sdmmc.h"
|
//#include "hal_sdmmc.h"
|
||||||
#include "SDFileSystem.h"
|
#include "SDFileSystem.h"
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "audiobuffer.h"
|
|
||||||
#include "app_sdmmc.h"
|
#include "app_sdmmc.h"
|
||||||
|
#include "audiobuffer.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
|
||||||
#define APP_TEST_PLAYBACK_BUFF_SIZE (120 * 20)
|
#define APP_TEST_PLAYBACK_BUFF_SIZE (120 * 20)
|
||||||
#define APP_TEST_CAPTURE_BUFF_SIZE (120 * 20)
|
#define APP_TEST_CAPTURE_BUFF_SIZE (120 * 20)
|
||||||
extern uint8_t app_test_playback_buff[APP_TEST_PLAYBACK_BUFF_SIZE] __attribute__ ((aligned(4)));
|
extern uint8_t app_test_playback_buff[APP_TEST_PLAYBACK_BUFF_SIZE]
|
||||||
extern uint8_t app_test_capture_buff[APP_TEST_CAPTURE_BUFF_SIZE] __attribute__ ((aligned(4)));
|
__attribute__((aligned(4)));
|
||||||
|
extern uint8_t app_test_capture_buff[APP_TEST_CAPTURE_BUFF_SIZE]
|
||||||
|
__attribute__((aligned(4)));
|
||||||
SDFileSystem sdfs("sd");
|
SDFileSystem sdfs("sd");
|
||||||
|
|
||||||
int sd_open()
|
int sd_open() {
|
||||||
{
|
|
||||||
DIR *d = opendir("/sd");
|
DIR *d = opendir("/sd");
|
||||||
if (!d)
|
if (!d) {
|
||||||
{
|
TRACE(0, "sd file system borked\n");
|
||||||
TRACE(0,"sd file system borked\n");
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
TRACE(0,"---------root---------\n");
|
TRACE(0, "---------root---------\n");
|
||||||
struct dirent *p;
|
struct dirent *p;
|
||||||
while ((p = readdir(d)))
|
while ((p = readdir(d))) {
|
||||||
{
|
int len = sizeof(dirent);
|
||||||
int len = sizeof( dirent);
|
TRACE(2, "%s %d\n", p->d_name, len);
|
||||||
TRACE(2,"%s %d\n", p->d_name, len);
|
|
||||||
}
|
}
|
||||||
closedir(d);
|
closedir(d);
|
||||||
TRACE(0,"--------root end-------\n");
|
TRACE(0, "--------root end-------\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
extern uint32_t play_wav_file(char *file_path);
|
extern uint32_t play_wav_file(char *file_path);
|
||||||
extern uint32_t stop_wav_file(void);
|
extern uint32_t stop_wav_file(void);
|
||||||
extern uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len);
|
extern uint32_t wav_file_audio_more_data(uint8_t *buf, uint32_t len);
|
||||||
|
|
||||||
void test_wave_play(bool on)
|
void test_wave_play(bool on) {
|
||||||
{
|
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
uint32_t reallen;
|
uint32_t reallen;
|
||||||
uint32_t totalreadsize;
|
uint32_t totalreadsize;
|
||||||
|
@ -65,15 +62,14 @@ void test_wave_play(bool on)
|
||||||
|
|
||||||
static bool isRun = false;
|
static bool isRun = false;
|
||||||
|
|
||||||
if (isRun==on)
|
if (isRun == on)
|
||||||
return;
|
return;
|
||||||
else
|
else
|
||||||
isRun=on;
|
isRun = on;
|
||||||
|
|
||||||
|
TRACE(2, "%s %d\n", __func__, on);
|
||||||
TRACE(2,"%s %d\n", __func__, on);
|
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
if (on){
|
if (on) {
|
||||||
play_wav_file(wave);
|
play_wav_file(wave);
|
||||||
|
|
||||||
stream_cfg.bits = AUD_BITS_16;
|
stream_cfg.bits = AUD_BITS_16;
|
||||||
|
@ -90,7 +86,7 @@ void test_wave_play(bool on)
|
||||||
|
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK, &stream_cfg);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
}else{
|
} else {
|
||||||
stop_wav_file();
|
stop_wav_file();
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_PLAYBACK);
|
||||||
|
@ -99,36 +95,32 @@ void test_wave_play(bool on)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
FIL pcm_fil;
|
FIL pcm_fil;
|
||||||
FRESULT pcm_res;
|
FRESULT pcm_res;
|
||||||
UINT pcm_num;
|
UINT pcm_num;
|
||||||
uint32_t pcm_save_more_data(uint8_t *buf, uint32_t len)
|
uint32_t pcm_save_more_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
// TRACE(2,"%s\n len:%d", __func__, len);
|
||||||
// TRACE(2,"%s\n len:%d", __func__, len);
|
|
||||||
|
|
||||||
audio_buffer_set_stereo2mono_16bits(buf, len, 1);
|
audio_buffer_set_stereo2mono_16bits(buf, len, 1);
|
||||||
pcm_res = f_write(&pcm_fil,(uint8_t *)buf,len>>1,&pcm_num);
|
pcm_res = f_write(&pcm_fil, (uint8_t *)buf, len >> 1, &pcm_num);
|
||||||
if(pcm_res != FR_OK)
|
if (pcm_res != FR_OK) {
|
||||||
{
|
TRACE(2, "[%s]:error-->res = %d", __func__, pcm_res);
|
||||||
TRACE(2,"[%s]:error-->res = %d", __func__, pcm_res);
|
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ad_tester(bool run)
|
void ad_tester(bool run) {
|
||||||
{
|
|
||||||
char filename[] = "/sd/audio_dump.bin";
|
char filename[] = "/sd/audio_dump.bin";
|
||||||
|
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
|
|
||||||
TRACE(2,"%s %d\n", __func__, run);
|
TRACE(2, "%s %d\n", __func__, run);
|
||||||
|
|
||||||
if (run){
|
if (run) {
|
||||||
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
memset(&stream_cfg, 0, sizeof(stream_cfg));
|
||||||
pcm_res = f_open(&pcm_fil,"test2.bin",FA_CREATE_ALWAYS | FA_WRITE);
|
pcm_res = f_open(&pcm_fil, "test2.bin", FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
if (pcm_res) {
|
if (pcm_res) {
|
||||||
TRACE(2,"[%s]:Cannot creat test2.bin...%d",__func__, pcm_res);
|
TRACE(2, "[%s]:Cannot creat test2.bin...%d", __func__, pcm_res);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -146,7 +138,7 @@ void ad_tester(bool run)
|
||||||
|
|
||||||
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
af_stream_open(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE, &stream_cfg);
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
}else{
|
} else {
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
osDelay(1000);
|
osDelay(1000);
|
||||||
|
@ -156,45 +148,39 @@ void ad_tester(bool run)
|
||||||
}
|
}
|
||||||
|
|
||||||
// if dump data into sd, buffer length should make sd card speed enough
|
// if dump data into sd, buffer length should make sd card speed enough
|
||||||
// Bench32.exe can test sd card speed in PC, then make sure bufer length, buffer length < 16k(sd driver)
|
// Bench32.exe can test sd card speed in PC, then make sure bufer length, buffer
|
||||||
void dump_data2sd(enum APP_SDMMC_DUMP_T opt, uint8_t *buf, uint32_t len)
|
// length < 16k(sd driver)
|
||||||
{
|
void dump_data2sd(enum APP_SDMMC_DUMP_T opt, uint8_t *buf, uint32_t len) {
|
||||||
static FIL sd_fil;
|
static FIL sd_fil;
|
||||||
FRESULT res;
|
FRESULT res;
|
||||||
|
|
||||||
|
ASSERT(opt < APP_SDMMC_DUMP_NUM, "[%s] opt(%d) >= APP_SDMMC_DUMP_NUM",
|
||||||
|
__func__, opt);
|
||||||
|
|
||||||
ASSERT(opt < APP_SDMMC_DUMP_NUM, "[%s] opt(%d) >= APP_SDMMC_DUMP_NUM", __func__, opt);
|
if (opt == APP_SDMMC_DUMP_OPEN) {
|
||||||
|
// res = f_open(&sd_fil,"dump.bin",FA_CREATE_ALWAYS | FA_WRITE);
|
||||||
|
res = f_open(&sd_fil, "test.txt", FA_READ);
|
||||||
|
|
||||||
if(opt == APP_SDMMC_DUMP_OPEN)
|
// ASSERT(pcm_res == FR_OK,"[%s]:Cannot creat dump.bin, res =
|
||||||
{
|
// %d",__func__, pcm_res);
|
||||||
// res = f_open(&sd_fil,"dump.bin",FA_CREATE_ALWAYS | FA_WRITE);
|
|
||||||
res = f_open(&sd_fil,"test.txt",FA_READ);
|
|
||||||
|
|
||||||
// ASSERT(pcm_res == FR_OK,"[%s]:Cannot creat dump.bin, res = %d",__func__, pcm_res);
|
|
||||||
}
|
}
|
||||||
if(opt == APP_SDMMC_DUMP_READ)
|
if (opt == APP_SDMMC_DUMP_READ) {
|
||||||
{
|
|
||||||
res = f_read(&sd_fil, buf, len, &pcm_num);
|
res = f_read(&sd_fil, buf, len, &pcm_num);
|
||||||
|
|
||||||
// ASSERT(pcm_res == FR_OK,"[%s]:Cannot creat dump.bin, res = %d",__func__, pcm_res);
|
// ASSERT(pcm_res == FR_OK,"[%s]:Cannot creat dump.bin, res =
|
||||||
}
|
// %d",__func__, pcm_res);
|
||||||
else if(opt == APP_SDMMC_DUMP_WRITE)
|
} else if (opt == APP_SDMMC_DUMP_WRITE) {
|
||||||
{
|
|
||||||
res = f_write(&sd_fil, buf, len, &pcm_num);
|
res = f_write(&sd_fil, buf, len, &pcm_num);
|
||||||
|
|
||||||
// ASSERT(pcm_res == FR_OK,"[%s]:Write dump.bin failed, res = %d", __func__, pcm_res);
|
// ASSERT(pcm_res == FR_OK,"[%s]:Write dump.bin failed, res = %d",
|
||||||
}
|
// __func__, pcm_res);
|
||||||
else if(opt == APP_SDMMC_DUMP_CLOSE)
|
} else if (opt == APP_SDMMC_DUMP_CLOSE) {
|
||||||
{
|
|
||||||
res = f_close(&sd_fil);
|
res = f_close(&sd_fil);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(res == FR_OK)
|
if (res == FR_OK) {
|
||||||
{
|
TRACE(3, "[%s] SUCESS: opt = %d, res = %d", __func__, opt, res);
|
||||||
TRACE(3,"[%s] SUCESS: opt = %d, res = %d",__func__, opt, res);
|
} else {
|
||||||
}
|
TRACE(3, "[%s] ERROR: opt = %d, res = %d", __func__, opt, res);
|
||||||
else
|
|
||||||
{
|
|
||||||
TRACE(3,"[%s] ERROR: opt = %d, res = %d",__func__, opt, res);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,30 +13,30 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "plat_addr_map.h"
|
#include "analog.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
#include "cmsis.h"
|
||||||
#include "hal_cmu.h"
|
#include "hal_cmu.h"
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_iomux.h"
|
|
||||||
#include "hal_dma.h"
|
#include "hal_dma.h"
|
||||||
#include "hal_key.h"
|
|
||||||
#include "hal_gpadc.h"
|
#include "hal_gpadc.h"
|
||||||
|
#include "hal_iomux.h"
|
||||||
|
#include "hal_key.h"
|
||||||
#include "hal_sleep.h"
|
#include "hal_sleep.h"
|
||||||
#include "hal_sysfreq.h"
|
#include "hal_sysfreq.h"
|
||||||
#include "cmsis.h"
|
#include "hal_timer.h"
|
||||||
#include "pmu.h"
|
#include "hal_trace.h"
|
||||||
#include "analog.h"
|
|
||||||
#include "string.h"
|
|
||||||
#include "hwtimer_list.h"
|
#include "hwtimer_list.h"
|
||||||
#include "audioflinger.h"
|
#include "plat_addr_map.h"
|
||||||
|
#include "pmu.h"
|
||||||
|
#include "string.h"
|
||||||
#if defined(ANC_APP)
|
#if defined(ANC_APP)
|
||||||
#include "anc_usb_app.h"
|
#include "anc_usb_app.h"
|
||||||
#endif
|
#endif
|
||||||
#include "usb_audio_app.h"
|
|
||||||
#include "dualadc_audio_app.h"
|
|
||||||
#include "usb_audio_frm_defs.h"
|
|
||||||
#include "tgt_hardware.h"
|
|
||||||
#include "audio_process.h"
|
#include "audio_process.h"
|
||||||
|
#include "dualadc_audio_app.h"
|
||||||
|
#include "tgt_hardware.h"
|
||||||
|
#include "usb_audio_app.h"
|
||||||
|
#include "usb_audio_frm_defs.h"
|
||||||
|
|
||||||
#ifdef RTOS
|
#ifdef RTOS
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
|
@ -54,15 +54,20 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (CODEC_BUFF_FRAME_NUM >= USB_BUFF_FRAME_NUM)
|
#if (CODEC_BUFF_FRAME_NUM >= USB_BUFF_FRAME_NUM)
|
||||||
#error "Codec buffer frame num should be less than usb buffer frame num (on the requirement of conflict ctrl)"
|
#error \
|
||||||
|
"Codec buffer frame num should be less than usb buffer frame num (on the requirement of conflict ctrl)"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef USB_AUDIO_DYN_CFG
|
#ifdef USB_AUDIO_DYN_CFG
|
||||||
#define USB_AUDIO_PLAYBACK_BUFF_SIZE NON_EXP_ALIGN(MAX_FRAME_SIZE_PLAYBACK * CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN)
|
#define USB_AUDIO_PLAYBACK_BUFF_SIZE \
|
||||||
#define USB_AUDIO_CAPTURE_BUFF_SIZE NON_EXP_ALIGN(MAX_FRAME_SIZE_CAPTURE * CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN)
|
NON_EXP_ALIGN(MAX_FRAME_SIZE_PLAYBACK *CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN)
|
||||||
|
#define USB_AUDIO_CAPTURE_BUFF_SIZE \
|
||||||
|
NON_EXP_ALIGN(MAX_FRAME_SIZE_CAPTURE *CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN)
|
||||||
|
|
||||||
#define USB_AUDIO_RECV_BUFF_SIZE NON_EXP_ALIGN(MAX_FRAME_SIZE_RECV * USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN)
|
#define USB_AUDIO_RECV_BUFF_SIZE \
|
||||||
#define USB_AUDIO_SEND_BUFF_SIZE NON_EXP_ALIGN(MAX_FRAME_SIZE_SEND * USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN)
|
NON_EXP_ALIGN(MAX_FRAME_SIZE_RECV *USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN)
|
||||||
|
#define USB_AUDIO_SEND_BUFF_SIZE \
|
||||||
|
NON_EXP_ALIGN(MAX_FRAME_SIZE_SEND *USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN)
|
||||||
|
|
||||||
#if defined(CHIP_BEST1000)
|
#if defined(CHIP_BEST1000)
|
||||||
// FIR EQ is working on 16-bit
|
// FIR EQ is working on 16-bit
|
||||||
|
@ -71,50 +76,67 @@
|
||||||
#elif defined(CHIP_BEST2000)
|
#elif defined(CHIP_BEST2000)
|
||||||
// FIR EQ is working on 32-bit
|
// FIR EQ is working on 32-bit
|
||||||
// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t)
|
// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t)
|
||||||
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE*2)
|
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 2)
|
||||||
#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P)
|
#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P)
|
||||||
// FIR EQ is working on 32-bit
|
// FIR EQ is working on 32-bit
|
||||||
// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t)
|
// FIR_EQ_buffer_size = max_playback_symbol_number_in_buffer * sizeof(int32_t)
|
||||||
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE*2)
|
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * 2)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#else
|
#else
|
||||||
#define USB_AUDIO_PLAYBACK_BUFF_SIZE NON_EXP_ALIGN(FRAME_SIZE_PLAYBACK * CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN)
|
#define USB_AUDIO_PLAYBACK_BUFF_SIZE \
|
||||||
#define USB_AUDIO_CAPTURE_BUFF_SIZE NON_EXP_ALIGN(FRAME_SIZE_CAPTURE * CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN)
|
NON_EXP_ALIGN(FRAME_SIZE_PLAYBACK *CODEC_BUFF_FRAME_NUM, DAC_BUFF_ALIGN)
|
||||||
|
#define USB_AUDIO_CAPTURE_BUFF_SIZE \
|
||||||
|
NON_EXP_ALIGN(FRAME_SIZE_CAPTURE *CODEC_BUFF_FRAME_NUM, ADC_BUFF_ALIGN)
|
||||||
|
|
||||||
#define USB_AUDIO_RECV_BUFF_SIZE NON_EXP_ALIGN(FRAME_SIZE_RECV * USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN)
|
#define USB_AUDIO_RECV_BUFF_SIZE \
|
||||||
#define USB_AUDIO_SEND_BUFF_SIZE NON_EXP_ALIGN(FRAME_SIZE_SEND * USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN)
|
NON_EXP_ALIGN(FRAME_SIZE_RECV *USB_BUFF_FRAME_NUM, RECV_BUFF_ALIGN)
|
||||||
|
#define USB_AUDIO_SEND_BUFF_SIZE \
|
||||||
|
NON_EXP_ALIGN(FRAME_SIZE_SEND *USB_BUFF_FRAME_NUM, SEND_BUFF_ALIGN)
|
||||||
|
|
||||||
#if defined(CHIP_BEST1000)
|
#if defined(CHIP_BEST1000)
|
||||||
// FIR EQ is working on 16-bit
|
// FIR EQ is working on 16-bit
|
||||||
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int16_t) / SAMPLE_SIZE_PLAYBACK)
|
#define USB_AUDIO_FIR_EQ_BUFF_SIZE \
|
||||||
|
(USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int16_t) / SAMPLE_SIZE_PLAYBACK)
|
||||||
#elif defined(CHIP_BEST2000)
|
#elif defined(CHIP_BEST2000)
|
||||||
// FIR EQ is working on 16-bit
|
// FIR EQ is working on 16-bit
|
||||||
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK)
|
#define USB_AUDIO_FIR_EQ_BUFF_SIZE \
|
||||||
|
(USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK)
|
||||||
#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P)
|
#elif defined(CHIP_BEST2300) || defined(CHIP_BEST2300P)
|
||||||
// FIR EQ is working on 16-bit
|
// FIR EQ is working on 16-bit
|
||||||
#define USB_AUDIO_FIR_EQ_BUFF_SIZE (USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK)
|
#define USB_AUDIO_FIR_EQ_BUFF_SIZE \
|
||||||
|
(USB_AUDIO_PLAYBACK_BUFF_SIZE * sizeof(int32_t) / SAMPLE_SIZE_PLAYBACK)
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if (defined(CHIP_BEST1000) && (defined(ANC_APP) || defined(_DUAL_AUX_MIC_))) && (CHAN_NUM_CAPTURE == CHAN_NUM_SEND)
|
#if (defined(CHIP_BEST1000) && \
|
||||||
// Resample input buffer size should be (half_of_max_sample_num * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE).
|
(defined(ANC_APP) || defined(_DUAL_AUX_MIC_))) && \
|
||||||
// half_of_max_sample_num = 48000 / 1000 * CODEC_BUFF_FRAME_NUM / 2 * 48 / 44
|
(CHAN_NUM_CAPTURE == CHAN_NUM_SEND)
|
||||||
#define RESAMPLE_INPUT_BUFF_SIZE ALIGN(48000 / 1000 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE * CODEC_BUFF_FRAME_NUM / 2 * 48 / 44, 4)
|
// Resample input buffer size should be (half_of_max_sample_num *
|
||||||
|
// SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE). half_of_max_sample_num = 48000 /
|
||||||
|
// 1000 * CODEC_BUFF_FRAME_NUM / 2 * 48 / 44
|
||||||
|
#define RESAMPLE_INPUT_BUFF_SIZE \
|
||||||
|
ALIGN(48000 / 1000 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE * \
|
||||||
|
CODEC_BUFF_FRAME_NUM / 2 * 48 / 44, \
|
||||||
|
4)
|
||||||
#else
|
#else
|
||||||
#define RESAMPLE_INPUT_BUFF_SIZE 0
|
#define RESAMPLE_INPUT_BUFF_SIZE 0
|
||||||
#endif
|
#endif
|
||||||
// Resample history buffer size should be
|
// Resample history buffer size should be
|
||||||
// sizeof(struct RESAMPLE_CTRL_T) + ((SAMPLE_NUM + phase_coef_num) * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE)
|
// sizeof(struct RESAMPLE_CTRL_T) + ((SAMPLE_NUM + phase_coef_num) *
|
||||||
#define RESAMPLE_HISTORY_BUFF_SIZE (50 + (256 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE))
|
// SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE)
|
||||||
#define USB_AUDIO_RESAMPLE_BUFF_SIZE (RESAMPLE_INPUT_BUFF_SIZE + RESAMPLE_HISTORY_BUFF_SIZE)
|
#define RESAMPLE_HISTORY_BUFF_SIZE \
|
||||||
|
(50 + (256 * SAMPLE_SIZE_CAPTURE * CHAN_NUM_CAPTURE))
|
||||||
|
#define USB_AUDIO_RESAMPLE_BUFF_SIZE \
|
||||||
|
(RESAMPLE_INPUT_BUFF_SIZE + RESAMPLE_HISTORY_BUFF_SIZE)
|
||||||
|
|
||||||
#define ALIGNED4 ALIGNED(4)
|
#define ALIGNED4 ALIGNED(4)
|
||||||
|
|
||||||
#if defined(USB_AUDIO_APP) || defined(DUALADC_AUDIO_TEST)
|
#if defined(USB_AUDIO_APP) || defined(DUALADC_AUDIO_TEST)
|
||||||
|
|
||||||
#ifdef AUDIO_ANC_FB_MC
|
#ifdef AUDIO_ANC_FB_MC
|
||||||
static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE * 9];//max 48->384 or 44.1->44.1*8;
|
static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE *
|
||||||
|
9]; // max 48->384 or 44.1->44.1*8;
|
||||||
#else
|
#else
|
||||||
static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE];
|
static uint8_t ALIGNED4 playback_buff[USB_AUDIO_PLAYBACK_BUFF_SIZE];
|
||||||
#endif
|
#endif
|
||||||
|
@ -125,7 +147,8 @@ static uint8_t ALIGNED4 capture_buff[USB_AUDIO_CAPTURE_BUFF_SIZE];
|
||||||
|
|
||||||
#ifdef USB_AUDIO_APP
|
#ifdef USB_AUDIO_APP
|
||||||
#if defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__)
|
#if defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__)
|
||||||
static uint8_t ALIGNED4 eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE+USB_AUDIO_IIR_EQ_BUFF_SIZE];
|
static uint8_t ALIGNED4
|
||||||
|
eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE + USB_AUDIO_IIR_EQ_BUFF_SIZE];
|
||||||
#elif defined(__HW_FIR_EQ_PROCESS__) && !defined(__HW_IIR_EQ_PROCESS__)
|
#elif defined(__HW_FIR_EQ_PROCESS__) && !defined(__HW_IIR_EQ_PROCESS__)
|
||||||
static uint8_t ALIGNED4 eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE];
|
static uint8_t ALIGNED4 eq_buff[USB_AUDIO_FIR_EQ_BUFF_SIZE];
|
||||||
#elif !defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__)
|
#elif !defined(__HW_FIR_EQ_PROCESS__) && defined(__HW_IIR_EQ_PROCESS__)
|
||||||
|
@ -146,16 +169,16 @@ static uint8_t ALIGNED4 send_buff[USB_AUDIO_SEND_BUFF_SIZE];
|
||||||
|
|
||||||
#ifdef CFG_HW_KEY_LED_PIN
|
#ifdef CFG_HW_KEY_LED_PIN
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_key_led[1] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP pinmux_key_led[1] = {
|
||||||
{CFG_HW_KEY_LED_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
{CFG_HW_KEY_LED_PIN, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef CFG_MIC_KEY
|
#ifdef CFG_MIC_KEY
|
||||||
extern void mic_key_open (void);
|
extern void mic_key_open(void);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void uart_i2c_switch(void)
|
static void uart_i2c_switch(void) {
|
||||||
{
|
|
||||||
static int flag = 0;
|
static int flag = 0;
|
||||||
|
|
||||||
flag ^= 1;
|
flag ^= 1;
|
||||||
|
@ -167,9 +190,9 @@ static void uart_i2c_switch(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int POSSIBLY_UNUSED key_event_process(uint32_t key_code, uint8_t key_event)
|
static int POSSIBLY_UNUSED key_event_process(uint32_t key_code,
|
||||||
{
|
uint8_t key_event) {
|
||||||
TRACE(3,"%s: code=0x%X, event=%u", __FUNCTION__, key_code, key_event);
|
TRACE(3, "%s: code=0x%X, event=%u", __FUNCTION__, key_code, key_event);
|
||||||
|
|
||||||
#ifdef CFG_HW_KEY_LED_PIN
|
#ifdef CFG_HW_KEY_LED_PIN
|
||||||
if (key_event == HAL_KEY_EVENT_DOWN) {
|
if (key_event == HAL_KEY_EVENT_DOWN) {
|
||||||
|
@ -200,9 +223,8 @@ static int POSSIBLY_UNUSED key_event_process(uint32_t key_code, uint8_t key_even
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void anc_usb_open(void)
|
void anc_usb_open(void) {
|
||||||
{
|
TRACE(1, "%s", __FUNCTION__);
|
||||||
TRACE(1,"%s", __FUNCTION__);
|
|
||||||
|
|
||||||
#ifdef __AUDIO_RESAMPLE__
|
#ifdef __AUDIO_RESAMPLE__
|
||||||
hal_cmu_audio_resample_enable();
|
hal_cmu_audio_resample_enable();
|
||||||
|
@ -234,7 +256,8 @@ void anc_usb_open(void)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef ANC_APP
|
#ifdef ANC_APP
|
||||||
anc_usb_app_init(AUD_INPUT_PATH_MAINMIC, SAMPLE_RATE_PLAYBACK, SAMPLE_RATE_CAPTURE);
|
anc_usb_app_init(AUD_INPUT_PATH_MAINMIC, SAMPLE_RATE_PLAYBACK,
|
||||||
|
SAMPLE_RATE_CAPTURE);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef DUALADC_AUDIO_TEST
|
#ifdef DUALADC_AUDIO_TEST
|
||||||
|
@ -276,14 +299,10 @@ void anc_usb_open(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void anc_usb_close(void)
|
void anc_usb_close(void) { usb_audio_app(0); }
|
||||||
{
|
|
||||||
usb_audio_app(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef CFG_HW_GPADCKEY
|
#ifdef CFG_HW_GPADCKEY
|
||||||
void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt)
|
void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt) {
|
||||||
{
|
|
||||||
static uint16_t stable_cnt = 0;
|
static uint16_t stable_cnt = 0;
|
||||||
static uint16_t click_cnt = 0;
|
static uint16_t click_cnt = 0;
|
||||||
static uint32_t click_time;
|
static uint32_t click_time;
|
||||||
|
@ -295,10 +314,12 @@ void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt)
|
||||||
|
|
||||||
if (volt < 100) {
|
if (volt < 100) {
|
||||||
stable_cnt++;
|
stable_cnt++;
|
||||||
//TRACE(5,"adc_key down: volt=%u stable=%u click_cnt=%u click_time=%u time=%u", volt, stable_cnt, click_cnt, click_time, time);
|
// TRACE(5,"adc_key down: volt=%u stable=%u click_cnt=%u click_time=%u
|
||||||
|
// time=%u", volt, stable_cnt, click_cnt, click_time, time);
|
||||||
} else {
|
} else {
|
||||||
if (stable_cnt > 1) {
|
if (stable_cnt > 1) {
|
||||||
//TRACE(5,"adc_key up: volt=%u stable=%u click_cnt=%u click_time=%u time=%u", volt, stable_cnt, click_cnt, click_time, time);
|
// TRACE(5,"adc_key up: volt=%u stable=%u click_cnt=%u click_time=%u
|
||||||
|
// time=%u", volt, stable_cnt, click_cnt, click_time, time);
|
||||||
if (click_cnt == 0 || (time - click_time) < MS_TO_TICKS(500)) {
|
if (click_cnt == 0 || (time - click_time) < MS_TO_TICKS(500)) {
|
||||||
click_time = time;
|
click_time = time;
|
||||||
click_cnt++;
|
click_cnt++;
|
||||||
|
@ -316,7 +337,8 @@ void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (send_event) {
|
if (send_event) {
|
||||||
//TRACE(5,"adc_key click: volt=%u stable=%u click_cnt=%u click_time=%u time=%u", volt, stable_cnt, click_cnt, click_time, time);
|
// TRACE(5,"adc_key click: volt=%u stable=%u click_cnt=%u click_time=%u
|
||||||
|
// time=%u", volt, stable_cnt, click_cnt, click_time, time);
|
||||||
if (click_cnt == 1) {
|
if (click_cnt == 1) {
|
||||||
event = HAL_KEY_EVENT_CLICK;
|
event = HAL_KEY_EVENT_CLICK;
|
||||||
} else if (click_cnt == 2) {
|
} else if (click_cnt == 2) {
|
||||||
|
@ -333,15 +355,9 @@ void gpadc_key_handler(uint16_t irq_val, HAL_GPADC_MV_T volt)
|
||||||
|
|
||||||
// GDB can set a breakpoint on the main function only if it is
|
// GDB can set a breakpoint on the main function only if it is
|
||||||
// declared as below, when linking with STD libraries.
|
// declared as below, when linking with STD libraries.
|
||||||
int btusbaudio_entry(void)
|
int btusbaudio_entry(void) {
|
||||||
{
|
|
||||||
anc_usb_open();
|
anc_usb_open();
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void btusbaudio_exit(void)
|
void btusbaudio_exit(void) { anc_usb_close(); }
|
||||||
{
|
|
||||||
anc_usb_close();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -13,9 +13,6 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
#include "app_thread.h"
|
||||||
#include "cmsis_os.h"
|
#include "cmsis_os.h"
|
||||||
#include "hal_trace.h"
|
#include "hal_trace.h"
|
||||||
#include "app_thread.h"
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,20 +1,22 @@
|
||||||
#include <stdio.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "tgt_hardware.h"
|
|
||||||
#include "audioflinger.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "app_thread.h"
|
|
||||||
#include "voice_detector.h"
|
|
||||||
#include "app_voice_detector.h"
|
#include "app_voice_detector.h"
|
||||||
|
#include "app_thread.h"
|
||||||
|
#include "audioflinger.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "tgt_hardware.h"
|
||||||
|
#include "voice_detector.h"
|
||||||
|
#include <assert.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
#define APP_VD_DEBUG
|
#define APP_VD_DEBUG
|
||||||
|
|
||||||
#ifdef APP_VD_DEBUG
|
#ifdef APP_VD_DEBUG
|
||||||
#define APP_VD_LOG(str, ...) LOG_DEBUG(LOG_MOD(AUD), str, ##__VA_ARGS__)
|
#define APP_VD_LOG(str, ...) LOG_DEBUG(LOG_MOD(AUD), str, ##__VA_ARGS__)
|
||||||
#else
|
#else
|
||||||
#define APP_VD_LOG(...) do{}while(0)
|
#define APP_VD_LOG(...) \
|
||||||
|
do { \
|
||||||
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
#define APP_VD_ERR(str, ...) LOG_ERROR(LOG_MOD(AUD), str, ##__VA_ARGS__)
|
#define APP_VD_ERR(str, ...) LOG_ERROR(LOG_MOD(AUD), str, ##__VA_ARGS__)
|
||||||
|
|
||||||
|
@ -22,10 +24,8 @@ osMutexId vd_mutex_id = NULL;
|
||||||
osMutexDef(vd_mutex);
|
osMutexDef(vd_mutex);
|
||||||
|
|
||||||
static int cmd_arr_evt_vad_start[] = {
|
static int cmd_arr_evt_vad_start[] = {
|
||||||
VOICE_DET_CMD_AUD_CAP_STOP,
|
VOICE_DET_CMD_AUD_CAP_STOP, VOICE_DET_CMD_AUD_CAP_CLOSE,
|
||||||
VOICE_DET_CMD_AUD_CAP_CLOSE,
|
VOICE_DET_CMD_VAD_OPEN, VOICE_DET_CMD_VAD_START,
|
||||||
VOICE_DET_CMD_VAD_OPEN,
|
|
||||||
VOICE_DET_CMD_VAD_START,
|
|
||||||
VOICE_DET_CMD_SYS_CLK_32K,
|
VOICE_DET_CMD_SYS_CLK_32K,
|
||||||
};
|
};
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -44,10 +44,8 @@ static int cmd_arr_evt_cap_start[] = {
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
static int cmd_arr_evt_close[] = {
|
static int cmd_arr_evt_close[] = {
|
||||||
VOICE_DET_CMD_AUD_CAP_STOP,
|
VOICE_DET_CMD_AUD_CAP_STOP, VOICE_DET_CMD_AUD_CAP_CLOSE,
|
||||||
VOICE_DET_CMD_AUD_CAP_CLOSE,
|
VOICE_DET_CMD_VAD_STOP, VOICE_DET_CMD_VAD_CLOSE,
|
||||||
VOICE_DET_CMD_VAD_STOP,
|
|
||||||
VOICE_DET_CMD_VAD_CLOSE,
|
|
||||||
VOICE_DET_CMD_EXIT,
|
VOICE_DET_CMD_EXIT,
|
||||||
};
|
};
|
||||||
#if 1
|
#if 1
|
||||||
|
@ -63,16 +61,15 @@ static int cmd_arr_evt_vad_close[] = {
|
||||||
VOICE_DET_CMD_EXIT,
|
VOICE_DET_CMD_EXIT,
|
||||||
};
|
};
|
||||||
|
|
||||||
static int app_voice_detector_process(APP_MESSAGE_BODY *msg_body)
|
static int app_voice_detector_process(APP_MESSAGE_BODY *msg_body) {
|
||||||
{
|
|
||||||
enum voice_detector_id id = (enum voice_detector_id)msg_body->message_id;
|
enum voice_detector_id id = (enum voice_detector_id)msg_body->message_id;
|
||||||
enum voice_detector_evt evt = (enum voice_detector_evt)msg_body->message_ptr;
|
enum voice_detector_evt evt = (enum voice_detector_evt)msg_body->message_ptr;
|
||||||
int ret = 0, num, *cmds;
|
int ret = 0, num, *cmds;
|
||||||
|
|
||||||
voice_detector_enhance_perform(id);// set sys clock to 104M or 208M
|
voice_detector_enhance_perform(id); // set sys clock to 104M or 208M
|
||||||
|
|
||||||
osMutexWait(vd_mutex_id, osWaitForever);
|
osMutexWait(vd_mutex_id, osWaitForever);
|
||||||
switch(evt) {
|
switch (evt) {
|
||||||
case VOICE_DET_EVT_VAD_START:
|
case VOICE_DET_EVT_VAD_START:
|
||||||
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_CLOSE) {
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_CLOSE) {
|
||||||
cmds = &cmd_arr_evt_vad_start[0];
|
cmds = &cmd_arr_evt_vad_start[0];
|
||||||
|
@ -115,8 +112,7 @@ static int app_voice_detector_process(APP_MESSAGE_BODY *msg_body)
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_send_msg(uint32_t id, uint32_t evt)
|
static void voice_detector_send_msg(uint32_t id, uint32_t evt) {
|
||||||
{
|
|
||||||
APP_MESSAGE_BLOCK msg;
|
APP_MESSAGE_BLOCK msg;
|
||||||
|
|
||||||
msg.mod_id = APP_MODUAL_VOICE_DETECTOR;
|
msg.mod_id = APP_MODUAL_VOICE_DETECTOR;
|
||||||
|
@ -126,8 +122,7 @@ static void voice_detector_send_msg(uint32_t id, uint32_t evt)
|
||||||
app_mailbox_put(&msg);
|
app_mailbox_put(&msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_wakeup_system(int state, void *param)
|
static void voice_detector_wakeup_system(int state, void *param) {
|
||||||
{
|
|
||||||
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
||||||
|
|
||||||
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_START) {
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_START) {
|
||||||
|
@ -138,8 +133,7 @@ static void voice_detector_wakeup_system(int state, void *param)
|
||||||
// APP_VD_LOG("cpu freq=%d", hal_sys_timer_calc_cpu_freq(5,0));
|
// APP_VD_LOG("cpu freq=%d", hal_sys_timer_calc_cpu_freq(5,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_not_detector_wakeup_system(int state, void *param)
|
static void voice_not_detector_wakeup_system(int state, void *param) {
|
||||||
{
|
|
||||||
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
||||||
|
|
||||||
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_START) {
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_START) {
|
||||||
|
@ -150,18 +144,17 @@ static void voice_not_detector_wakeup_system(int state, void *param)
|
||||||
// APP_VD_LOG("cpu freq=%d", hal_sys_timer_calc_cpu_freq(5,0));
|
// APP_VD_LOG("cpu freq=%d", hal_sys_timer_calc_cpu_freq(5,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_voice_detector_init(void)
|
void app_voice_detector_init(void) {
|
||||||
{
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
|
||||||
if(vd_mutex_id == NULL){
|
if (vd_mutex_id == NULL) {
|
||||||
vd_mutex_id = osMutexCreate((osMutex(vd_mutex)));
|
vd_mutex_id = osMutexCreate((osMutex(vd_mutex)));
|
||||||
app_set_threadhandle(APP_MODUAL_VOICE_DETECTOR, app_voice_detector_process);
|
app_set_threadhandle(APP_MODUAL_VOICE_DETECTOR, app_voice_detector_process);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_voice_detector_open(enum voice_detector_id id, enum AUD_VAD_TYPE_T vad_type)
|
int app_voice_detector_open(enum voice_detector_id id,
|
||||||
{
|
enum AUD_VAD_TYPE_T vad_type) {
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
@ -183,8 +176,7 @@ int app_voice_detector_open(enum voice_detector_id id, enum AUD_VAD_TYPE_T vad_t
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_voice_detector_setup_vad(enum voice_detector_id id,
|
int app_voice_detector_setup_vad(enum voice_detector_id id,
|
||||||
struct AUD_VAD_CONFIG_T *conf)
|
struct AUD_VAD_CONFIG_T *conf) {
|
||||||
{
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
@ -201,8 +193,7 @@ int app_voice_detector_setup_vad(enum voice_detector_id id,
|
||||||
|
|
||||||
int app_voice_detector_setup_stream(enum voice_detector_id id,
|
int app_voice_detector_setup_stream(enum voice_detector_id id,
|
||||||
enum AUD_STREAM_T stream_id,
|
enum AUD_STREAM_T stream_id,
|
||||||
struct AF_STREAM_CONFIG_T *stream)
|
struct AF_STREAM_CONFIG_T *stream) {
|
||||||
{
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
@ -219,9 +210,7 @@ int app_voice_detector_setup_stream(enum voice_detector_id id,
|
||||||
|
|
||||||
int app_voice_detector_setup_callback(enum voice_detector_id id,
|
int app_voice_detector_setup_callback(enum voice_detector_id id,
|
||||||
enum voice_detector_cb_id func_id,
|
enum voice_detector_cb_id func_id,
|
||||||
voice_detector_cb_t func,
|
voice_detector_cb_t func, void *param) {
|
||||||
void *param)
|
|
||||||
{
|
|
||||||
int r;
|
int r;
|
||||||
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
@ -237,31 +226,26 @@ int app_voice_detector_setup_callback(enum voice_detector_id id,
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_voice_detector_send_event(enum voice_detector_id id,
|
int app_voice_detector_send_event(enum voice_detector_id id,
|
||||||
enum voice_detector_evt evt)
|
enum voice_detector_evt evt) {
|
||||||
{
|
|
||||||
APP_VD_LOG("%s, id=%d, evt=%d", __func__, id, evt);
|
APP_VD_LOG("%s, id=%d, evt=%d", __func__, id, evt);
|
||||||
|
|
||||||
voice_detector_send_msg(id, evt);
|
voice_detector_send_msg(id, evt);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_voice_detector_close(enum voice_detector_id id)
|
void app_voice_detector_close(enum voice_detector_id id) {
|
||||||
{
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
|
||||||
voice_detector_send_msg(id, VOICE_DET_EVT_CLOSE);
|
voice_detector_send_msg(id, VOICE_DET_EVT_CLOSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_voice_detector_capture_start(enum voice_detector_id id)
|
void app_voice_detector_capture_start(enum voice_detector_id id) {
|
||||||
{
|
|
||||||
APP_VD_LOG("%s", __func__);
|
APP_VD_LOG("%s", __func__);
|
||||||
|
|
||||||
voice_detector_send_msg(id, VOICE_DET_EVT_AUD_CAP_START);
|
voice_detector_send_msg(id, VOICE_DET_EVT_AUD_CAP_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
void app_voice_detector_get_vad_data_info(enum voice_detector_id id,
|
void app_voice_detector_get_vad_data_info(
|
||||||
struct CODEC_VAD_BUF_INFO_T* vad_buf_info)
|
enum voice_detector_id id, struct CODEC_VAD_BUF_INFO_T *vad_buf_info) {
|
||||||
{
|
|
||||||
voice_detector_get_vad_data_info(id, vad_buf_info);
|
voice_detector_get_vad_data_info(id, vad_buf_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,16 +1,16 @@
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "hal_cmu.h"
|
|
||||||
#include "hal_aud.h"
|
|
||||||
#include "hal_timer.h"
|
|
||||||
#include "hal_sleep.h"
|
|
||||||
#include "analog.h"
|
#include "analog.h"
|
||||||
#include "audioflinger.h"
|
#include "audioflinger.h"
|
||||||
|
#include "hal_aud.h"
|
||||||
|
#include "hal_cmu.h"
|
||||||
|
#include "hal_sleep.h"
|
||||||
|
#include "hal_timer.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
//#include "app_audio.h"
|
//#include "app_audio.h"
|
||||||
#include "app_utils.h"
|
#include "app_utils.h"
|
||||||
#include "voice_detector.h"
|
|
||||||
#include <string.h>
|
|
||||||
#include "audio_dump.h"
|
#include "audio_dump.h"
|
||||||
#include "speech_ssat.h"
|
#include "speech_ssat.h"
|
||||||
|
#include "voice_detector.h"
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
#include "pmu.h"
|
#include "pmu.h"
|
||||||
#ifdef __CYBERON
|
#ifdef __CYBERON
|
||||||
|
@ -27,13 +27,17 @@
|
||||||
#ifdef VD_DEBUG
|
#ifdef VD_DEBUG
|
||||||
#define VD_LOG TRACE
|
#define VD_LOG TRACE
|
||||||
#else
|
#else
|
||||||
#define VD_LOG(...) do{}while(0)
|
#define VD_LOG(...) \
|
||||||
|
do { \
|
||||||
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef VD_TEST
|
#ifdef VD_TEST
|
||||||
#define VD_TRACE TRACE
|
#define VD_TRACE TRACE
|
||||||
#else
|
#else
|
||||||
#define VD_TRACE(...) do{}while(0)
|
#define VD_TRACE(...) \
|
||||||
|
do { \
|
||||||
|
} while (0)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CMD_QUEUE_DATA_SIZE 15
|
#define CMD_QUEUE_DATA_SIZE 15
|
||||||
|
@ -66,7 +70,7 @@ uint32_t vad_buf_len = 0;
|
||||||
short vad_buf[VAD_BUFFER_LEN] = {0};
|
short vad_buf[VAD_BUFFER_LEN] = {0};
|
||||||
|
|
||||||
#ifdef __CYBERON
|
#ifdef __CYBERON
|
||||||
static uint32_t POSSIBLY_UNUSED cyb_buf[20*1024];
|
static uint32_t POSSIBLY_UNUSED cyb_buf[20 * 1024];
|
||||||
static uint32_t POSSIBLY_UNUSED cyb_buf_used = 0;
|
static uint32_t POSSIBLY_UNUSED cyb_buf_used = 0;
|
||||||
|
|
||||||
extern unsigned char __g_cybase_start[];
|
extern unsigned char __g_cybase_start[];
|
||||||
|
@ -82,8 +86,7 @@ static void voice_detector_exec_callback(struct voice_detector_dev *pdev,
|
||||||
|
|
||||||
#define to_voice_dev(id) (&voice_det_devs[(id)])
|
#define to_voice_dev(id) (&voice_det_devs[(id)])
|
||||||
|
|
||||||
static int cmd_queue_enqueue(struct command_queue *q, int c)
|
static int cmd_queue_enqueue(struct command_queue *q, int c) {
|
||||||
{
|
|
||||||
if (q->idx >= CMD_QUEUE_DATA_SIZE) {
|
if (q->idx >= CMD_QUEUE_DATA_SIZE) {
|
||||||
VD_LOG(2, "%s, overflow cmd=%d", __func__, c);
|
VD_LOG(2, "%s, overflow cmd=%d", __func__, c);
|
||||||
return -2;
|
return -2;
|
||||||
|
@ -92,16 +95,15 @@ static int cmd_queue_enqueue(struct command_queue *q, int c)
|
||||||
q->idx = 0;
|
q->idx = 0;
|
||||||
}
|
}
|
||||||
q->data[q->idx++] = c;
|
q->data[q->idx++] = c;
|
||||||
// VD_LOG(2, "%s, cmd=%d", __func__, c);
|
// VD_LOG(2, "%s, cmd=%d", __func__, c);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmd_queue_dequeue(struct command_queue *q)
|
static int cmd_queue_dequeue(struct command_queue *q) {
|
||||||
{
|
|
||||||
int cmd;
|
int cmd;
|
||||||
|
|
||||||
if (q->idx < 0) {
|
if (q->idx < 0) {
|
||||||
// VD_LOG(1, "%s, empty", __func__);
|
// VD_LOG(1, "%s, empty", __func__);
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
if (q->out < 0) {
|
if (q->out < 0) {
|
||||||
|
@ -112,25 +114,23 @@ static int cmd_queue_dequeue(struct command_queue *q)
|
||||||
q->out = -1;
|
q->out = -1;
|
||||||
q->idx = -1;
|
q->idx = -1;
|
||||||
}
|
}
|
||||||
// VD_LOG(2, "%s, cmd=%d", __func__, cmd);
|
// VD_LOG(2, "%s, cmd=%d", __func__, cmd);
|
||||||
return cmd;
|
return cmd;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int cmd_queue_is_empty(struct command_queue *q)
|
static int cmd_queue_is_empty(struct command_queue *q) {
|
||||||
{
|
|
||||||
return (q->idx < 0) ? 1 : 0;
|
return (q->idx < 0) ? 1 : 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_init_cmd_queue(struct command_queue *q)
|
static void voice_detector_init_cmd_queue(struct command_queue *q) {
|
||||||
{
|
|
||||||
if (q) {
|
if (q) {
|
||||||
q->idx = -1;
|
q->idx = -1;
|
||||||
q->out = -1;
|
q->out = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_init_vad(struct AUD_VAD_CONFIG_T *c, int id, enum AUD_VAD_TYPE_T vad_type)
|
static void voice_detector_init_vad(struct AUD_VAD_CONFIG_T *c, int id,
|
||||||
{
|
enum AUD_VAD_TYPE_T vad_type) {
|
||||||
if (c) {
|
if (c) {
|
||||||
c->type = vad_type;
|
c->type = vad_type;
|
||||||
#ifdef VAD_USE_8K_SAMPLE_RATE
|
#ifdef VAD_USE_8K_SAMPLE_RATE
|
||||||
|
@ -164,8 +164,8 @@ static void voice_detector_init_vad(struct AUD_VAD_CONFIG_T *c, int id, enum AUD
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_open(enum voice_detector_id id, enum AUD_VAD_TYPE_T vad_type)
|
int voice_detector_open(enum voice_detector_id id,
|
||||||
{
|
enum AUD_VAD_TYPE_T vad_type) {
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
if (id >= VOICE_DETECTOR_QTY) {
|
if (id >= VOICE_DETECTOR_QTY) {
|
||||||
|
@ -196,8 +196,7 @@ int voice_detector_open(enum voice_detector_id id, enum AUD_VAD_TYPE_T vad_type)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void voice_detector_close(enum voice_detector_id id)
|
void voice_detector_close(enum voice_detector_id id) {
|
||||||
{
|
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
if (id >= VOICE_DETECTOR_QTY) {
|
if (id >= VOICE_DETECTOR_QTY) {
|
||||||
|
@ -215,8 +214,7 @@ void voice_detector_close(enum voice_detector_id id)
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_setup_vad(enum voice_detector_id id,
|
int voice_detector_setup_vad(enum voice_detector_id id,
|
||||||
struct AUD_VAD_CONFIG_T *conf)
|
struct AUD_VAD_CONFIG_T *conf) {
|
||||||
{
|
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
if (id >= VOICE_DETECTOR_QTY) {
|
if (id >= VOICE_DETECTOR_QTY) {
|
||||||
|
@ -239,8 +237,8 @@ int voice_detector_setup_vad(enum voice_detector_id id,
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_setup_stream(enum voice_detector_id id,
|
int voice_detector_setup_stream(enum voice_detector_id id,
|
||||||
enum AUD_STREAM_T stream_id, struct AF_STREAM_CONFIG_T *stream)
|
enum AUD_STREAM_T stream_id,
|
||||||
{
|
struct AF_STREAM_CONFIG_T *stream) {
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
if (id >= VOICE_DETECTOR_QTY) {
|
if (id >= VOICE_DETECTOR_QTY) {
|
||||||
|
@ -263,8 +261,8 @@ int voice_detector_setup_stream(enum voice_detector_id id,
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_setup_callback(enum voice_detector_id id,
|
int voice_detector_setup_callback(enum voice_detector_id id,
|
||||||
enum voice_detector_cb_id func_id, voice_detector_cb_t func, void *param)
|
enum voice_detector_cb_id func_id,
|
||||||
{
|
voice_detector_cb_t func, void *param) {
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
if (id >= VOICE_DETECTOR_QTY) {
|
if (id >= VOICE_DETECTOR_QTY) {
|
||||||
|
@ -287,8 +285,8 @@ int voice_detector_setup_callback(enum voice_detector_id id,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_send_cmd(enum voice_detector_id id, enum voice_detector_cmd cmd)
|
int voice_detector_send_cmd(enum voice_detector_id id,
|
||||||
{
|
enum voice_detector_cmd cmd) {
|
||||||
int r;
|
int r;
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
|
@ -302,8 +300,8 @@ int voice_detector_send_cmd(enum voice_detector_id id, enum voice_detector_cmd c
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_send_cmd_array(enum voice_detector_id id, int *cmd_array, int num)
|
int voice_detector_send_cmd_array(enum voice_detector_id id, int *cmd_array,
|
||||||
{
|
int num) {
|
||||||
int r, i;
|
int r, i;
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
|
@ -313,7 +311,7 @@ int voice_detector_send_cmd_array(enum voice_detector_id id, int *cmd_array, int
|
||||||
}
|
}
|
||||||
pdev = to_voice_dev(id);
|
pdev = to_voice_dev(id);
|
||||||
|
|
||||||
for(i = 0; i < num; i++) {
|
for (i = 0; i < num; i++) {
|
||||||
r = cmd_queue_enqueue(&pdev->cmd_queue, cmd_array[i]);
|
r = cmd_queue_enqueue(&pdev->cmd_queue, cmd_array[i]);
|
||||||
if (r)
|
if (r)
|
||||||
return r;
|
return r;
|
||||||
|
@ -321,8 +319,8 @@ int voice_detector_send_cmd_array(enum voice_detector_id id, int *cmd_array, int
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
enum voice_detector_state voice_detector_query_status(enum voice_detector_id id)
|
enum voice_detector_state
|
||||||
{
|
voice_detector_query_status(enum voice_detector_id id) {
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
if (id >= VOICE_DETECTOR_QTY) {
|
if (id >= VOICE_DETECTOR_QTY) {
|
||||||
|
@ -334,8 +332,7 @@ enum voice_detector_state voice_detector_query_status(enum voice_detector_id id)
|
||||||
return pdev->state;
|
return pdev->state;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_vad_callback(int found)
|
static void voice_detector_vad_callback(int found) {
|
||||||
{
|
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
||||||
|
|
||||||
|
@ -343,8 +340,8 @@ static void voice_detector_vad_callback(int found)
|
||||||
|
|
||||||
pdev->wakeup_cnt++;
|
pdev->wakeup_cnt++;
|
||||||
|
|
||||||
VD_LOG(3, "%s, voice detector[%d], wakeup_cnt=%d",
|
VD_LOG(3, "%s, voice detector[%d], wakeup_cnt=%d", __func__, id,
|
||||||
__func__, id, pdev->wakeup_cnt);
|
pdev->wakeup_cnt);
|
||||||
|
|
||||||
if (pdev->wakeup_cnt == 1) {
|
if (pdev->wakeup_cnt == 1) {
|
||||||
/*
|
/*
|
||||||
|
@ -352,12 +349,12 @@ static void voice_detector_vad_callback(int found)
|
||||||
* after CPU is waked up from sleeping.
|
* after CPU is waked up from sleeping.
|
||||||
* The VAD already can gernerates interrupts at this monment or later.
|
* The VAD already can gernerates interrupts at this monment or later.
|
||||||
*/
|
*/
|
||||||
voice_detector_exec_callback(pdev, found ? VOICE_DET_FIND_APP : VOICE_DET_NOT_FIND_APP);
|
voice_detector_exec_callback(pdev, found ? VOICE_DET_FIND_APP
|
||||||
|
: VOICE_DET_NOT_FIND_APP);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_vad_open(struct voice_detector_dev *pdev)
|
static int voice_detector_vad_open(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
struct AUD_VAD_CONFIG_T *c = &pdev->conf;
|
struct AUD_VAD_CONFIG_T *c = &pdev->conf;
|
||||||
|
|
||||||
if (pdev->dfl) {
|
if (pdev->dfl) {
|
||||||
|
@ -370,8 +367,7 @@ static int voice_detector_vad_open(struct voice_detector_dev *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_vad_start(struct voice_detector_dev *pdev)
|
static int voice_detector_vad_start(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
/* wakeup_cnt is cleared while VAD starts */
|
/* wakeup_cnt is cleared while VAD starts */
|
||||||
pdev->wakeup_cnt = 0;
|
pdev->wakeup_cnt = 0;
|
||||||
af_vad_start();
|
af_vad_start();
|
||||||
|
@ -381,8 +377,7 @@ static int voice_detector_vad_start(struct voice_detector_dev *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_vad_stop(struct voice_detector_dev *pdev)
|
static int voice_detector_vad_stop(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
af_vad_stop();
|
af_vad_stop();
|
||||||
|
|
||||||
#ifdef I2C_VAD
|
#ifdef I2C_VAD
|
||||||
|
@ -390,11 +385,12 @@ static int voice_detector_vad_stop(struct voice_detector_dev *pdev)
|
||||||
#else
|
#else
|
||||||
/* get vad buf info after stopping it */
|
/* get vad buf info after stopping it */
|
||||||
af_vad_get_data_info(&(pdev->vad_buf_info));
|
af_vad_get_data_info(&(pdev->vad_buf_info));
|
||||||
TRACE(4,"vad_buf base_addr:0x%x, buf_size:0x%x, data_count:%d, addr_count:%d",
|
TRACE(4,
|
||||||
|
"vad_buf base_addr:0x%x, buf_size:0x%x, data_count:%d, addr_count:%d",
|
||||||
pdev->vad_buf_info.base_addr, pdev->vad_buf_info.buf_size,
|
pdev->vad_buf_info.base_addr, pdev->vad_buf_info.buf_size,
|
||||||
pdev->vad_buf_info.data_count, pdev->vad_buf_info.addr_count);
|
pdev->vad_buf_info.data_count, pdev->vad_buf_info.addr_count);
|
||||||
#if defined(CHIP_BEST2300)
|
#if defined(CHIP_BEST2300)
|
||||||
vad_buf_len = pdev->vad_buf_info.data_count/2;
|
vad_buf_len = pdev->vad_buf_info.data_count / 2;
|
||||||
#else
|
#else
|
||||||
vad_buf_len = pdev->vad_buf_info.data_count;
|
vad_buf_len = pdev->vad_buf_info.data_count;
|
||||||
#endif
|
#endif
|
||||||
|
@ -402,9 +398,8 @@ static int voice_detector_vad_stop(struct voice_detector_dev *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void voice_detector_get_vad_data_info(enum voice_detector_id id,
|
void voice_detector_get_vad_data_info(
|
||||||
struct CODEC_VAD_BUF_INFO_T* vad_buf_info)
|
enum voice_detector_id id, struct CODEC_VAD_BUF_INFO_T *vad_buf_info) {
|
||||||
{
|
|
||||||
|
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
|
||||||
|
@ -414,11 +409,9 @@ void voice_detector_get_vad_data_info(enum voice_detector_id id,
|
||||||
vad_buf_info->buf_size = pdev->vad_buf_info.buf_size;
|
vad_buf_info->buf_size = pdev->vad_buf_info.buf_size;
|
||||||
vad_buf_info->data_count = pdev->vad_buf_info.data_count;
|
vad_buf_info->data_count = pdev->vad_buf_info.data_count;
|
||||||
vad_buf_info->addr_count = pdev->vad_buf_info.addr_count;
|
vad_buf_info->addr_count = pdev->vad_buf_info.addr_count;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_vad_close(struct voice_detector_dev *pdev)
|
static int voice_detector_vad_close(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
#ifdef I2C_VAD
|
#ifdef I2C_VAD
|
||||||
vad_sensor_close();
|
vad_sensor_close();
|
||||||
#endif
|
#endif
|
||||||
|
@ -426,8 +419,7 @@ static int voice_detector_vad_close(struct voice_detector_dev *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_aud_cap_open(struct voice_detector_dev *pdev)
|
static int voice_detector_aud_cap_open(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
struct AF_STREAM_CONFIG_T *conf = &pdev->cap_conf;
|
struct AF_STREAM_CONFIG_T *conf = &pdev->cap_conf;
|
||||||
|
|
||||||
if ((!conf->handler) || (!conf->data_ptr)) {
|
if ((!conf->handler) || (!conf->data_ptr)) {
|
||||||
|
@ -438,44 +430,41 @@ static int voice_detector_aud_cap_open(struct voice_detector_dev *pdev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_aud_cap_start(struct voice_detector_dev *pdev)
|
static int voice_detector_aud_cap_start(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_start(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_aud_cap_stop(struct voice_detector_dev *pdev)
|
static int voice_detector_aud_cap_stop(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_stop(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_aud_cap_close(struct voice_detector_dev *pdev)
|
static int voice_detector_aud_cap_close(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
af_stream_close(AUD_STREAM_ID_0, AUD_STREAM_CAPTURE);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_sys_clk(struct voice_detector_dev *pdev)
|
static int voice_detector_sys_clk(struct voice_detector_dev *pdev) {
|
||||||
{
|
|
||||||
#ifdef VD_TEST
|
#ifdef VD_TEST
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_APP_0, (enum APP_SYSFREQ_FREQ_T)(pdev->sys_clk));
|
app_sysfreq_req(APP_SYSFREQ_USER_APP_0,
|
||||||
|
(enum APP_SYSFREQ_FREQ_T)(pdev->sys_clk));
|
||||||
#else
|
#else
|
||||||
app_sysfreq_req(APP_SYSFREQ_USER_AI_VOICE, (enum APP_SYSFREQ_FREQ_T)(pdev->sys_clk));
|
app_sysfreq_req(APP_SYSFREQ_USER_AI_VOICE,
|
||||||
|
(enum APP_SYSFREQ_FREQ_T)(pdev->sys_clk));
|
||||||
#endif
|
#endif
|
||||||
// VD_TRACE(2,"%s, cpu freq=%d", __func__, hal_sys_timer_calc_cpu_freq(5,0));
|
// VD_TRACE(2,"%s, cpu freq=%d", __func__,
|
||||||
|
// hal_sys_timer_calc_cpu_freq(5,0));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_exit(struct voice_detector_dev *pdev)
|
static int voice_detector_exit(struct voice_detector_dev *pdev) {
|
||||||
{
|
// TODO: exit process
|
||||||
//TODO: exit process
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int voice_detector_idle(struct voice_detector_dev *pdev)
|
static int voice_detector_idle(struct voice_detector_dev *pdev) {
|
||||||
{
|
// TODO: idle process
|
||||||
//TODO: idle process
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -489,26 +478,26 @@ static struct cmd_vector cmd_vectors[] = {
|
||||||
{"idle", VOICE_DET_CMD_IDLE, voice_detector_idle},
|
{"idle", VOICE_DET_CMD_IDLE, voice_detector_idle},
|
||||||
{"exit", VOICE_DET_CMD_EXIT, voice_detector_exit},
|
{"exit", VOICE_DET_CMD_EXIT, voice_detector_exit},
|
||||||
{"vad open", VOICE_DET_CMD_VAD_OPEN, voice_detector_vad_open},
|
{"vad open", VOICE_DET_CMD_VAD_OPEN, voice_detector_vad_open},
|
||||||
{"vad start",VOICE_DET_CMD_VAD_START, voice_detector_vad_start},
|
{"vad start", VOICE_DET_CMD_VAD_START, voice_detector_vad_start},
|
||||||
{"vad stop", VOICE_DET_CMD_VAD_STOP, voice_detector_vad_stop},
|
{"vad stop", VOICE_DET_CMD_VAD_STOP, voice_detector_vad_stop},
|
||||||
{"vad close",VOICE_DET_CMD_VAD_CLOSE, voice_detector_vad_close},
|
{"vad close", VOICE_DET_CMD_VAD_CLOSE, voice_detector_vad_close},
|
||||||
{"cap start",VOICE_DET_CMD_AUD_CAP_START, voice_detector_aud_cap_start},
|
{"cap start", VOICE_DET_CMD_AUD_CAP_START, voice_detector_aud_cap_start},
|
||||||
{"cap stop", VOICE_DET_CMD_AUD_CAP_STOP, voice_detector_aud_cap_stop},
|
{"cap stop", VOICE_DET_CMD_AUD_CAP_STOP, voice_detector_aud_cap_stop},
|
||||||
{"cap open", VOICE_DET_CMD_AUD_CAP_OPEN, voice_detector_aud_cap_open},
|
{"cap open", VOICE_DET_CMD_AUD_CAP_OPEN, voice_detector_aud_cap_open},
|
||||||
{"cap close",VOICE_DET_CMD_AUD_CAP_CLOSE, voice_detector_aud_cap_close},
|
{"cap close", VOICE_DET_CMD_AUD_CAP_CLOSE, voice_detector_aud_cap_close},
|
||||||
{"clk32k", VOICE_DET_CMD_SYS_CLK_32K, voice_detector_sys_clk},
|
{"clk32k", VOICE_DET_CMD_SYS_CLK_32K, voice_detector_sys_clk},
|
||||||
{"clk26m", VOICE_DET_CMD_SYS_CLK_26M, voice_detector_sys_clk},
|
{"clk26m", VOICE_DET_CMD_SYS_CLK_26M, voice_detector_sys_clk},
|
||||||
{"clk52m", VOICE_DET_CMD_SYS_CLK_52M, voice_detector_sys_clk},
|
{"clk52m", VOICE_DET_CMD_SYS_CLK_52M, voice_detector_sys_clk},
|
||||||
{"clk104m", VOICE_DET_CMD_SYS_CLK_104M, voice_detector_sys_clk},
|
{"clk104m", VOICE_DET_CMD_SYS_CLK_104M, voice_detector_sys_clk},
|
||||||
};
|
};
|
||||||
|
|
||||||
static int voice_detector_process_cmd(struct voice_detector_dev *pdev, int cmd)
|
static int voice_detector_process_cmd(struct voice_detector_dev *pdev,
|
||||||
{
|
int cmd) {
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
VD_LOG(3, "%s, cmd[%d]: %s", __func__, cmd, cmd_vectors[(int)cmd].name);
|
VD_LOG(3, "%s, cmd[%d]: %s", __func__, cmd, cmd_vectors[(int)cmd].name);
|
||||||
|
|
||||||
switch(cmd) {
|
switch (cmd) {
|
||||||
case VOICE_DET_CMD_SYS_CLK_32K:
|
case VOICE_DET_CMD_SYS_CLK_32K:
|
||||||
pdev->sys_clk = APP_SYSFREQ_32K;
|
pdev->sys_clk = APP_SYSFREQ_32K;
|
||||||
break;
|
break;
|
||||||
|
@ -528,12 +517,12 @@ static int voice_detector_process_cmd(struct voice_detector_dev *pdev, int cmd)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_set_status(struct voice_detector_dev *pdev, enum voice_detector_state s)
|
static void voice_detector_set_status(struct voice_detector_dev *pdev,
|
||||||
{
|
enum voice_detector_state s) {
|
||||||
if ((s == VOICE_DET_STATE_SYS_CLK_104M)
|
if ((s == VOICE_DET_STATE_SYS_CLK_104M) ||
|
||||||
|| (s == VOICE_DET_STATE_SYS_CLK_52M)
|
(s == VOICE_DET_STATE_SYS_CLK_52M) ||
|
||||||
|| (s == VOICE_DET_STATE_SYS_CLK_26M)
|
(s == VOICE_DET_STATE_SYS_CLK_26M) ||
|
||||||
|| (s == VOICE_DET_STATE_SYS_CLK_32K)) {
|
(s == VOICE_DET_STATE_SYS_CLK_32K)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
pdev->state = s;
|
pdev->state = s;
|
||||||
|
@ -541,8 +530,7 @@ static void voice_detector_set_status(struct voice_detector_dev *pdev, enum voic
|
||||||
}
|
}
|
||||||
|
|
||||||
static void voice_detector_exec_callback(struct voice_detector_dev *pdev,
|
static void voice_detector_exec_callback(struct voice_detector_dev *pdev,
|
||||||
enum voice_detector_cb_id id)
|
enum voice_detector_cb_id id) {
|
||||||
{
|
|
||||||
voice_detector_cb_t func;
|
voice_detector_cb_t func;
|
||||||
|
|
||||||
func = pdev->callback[id];
|
func = pdev->callback[id];
|
||||||
|
@ -553,8 +541,7 @@ static void voice_detector_exec_callback(struct voice_detector_dev *pdev,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_enhance_perform(enum voice_detector_id id)
|
int voice_detector_enhance_perform(enum voice_detector_id id) {
|
||||||
{
|
|
||||||
struct voice_detector_dev *pdev = to_voice_dev(id);
|
struct voice_detector_dev *pdev = to_voice_dev(id);
|
||||||
|
|
||||||
pdev->sys_clk = APP_SYSFREQ_26M;
|
pdev->sys_clk = APP_SYSFREQ_26M;
|
||||||
|
@ -563,8 +550,7 @@ int voice_detector_enhance_perform(enum voice_detector_id id)
|
||||||
(enum APP_SYSFREQ_FREQ_T)(pdev->sys_clk));
|
(enum APP_SYSFREQ_FREQ_T)(pdev->sys_clk));
|
||||||
}
|
}
|
||||||
|
|
||||||
int voice_detector_run(enum voice_detector_id id, int continous)
|
int voice_detector_run(enum voice_detector_id id, int continous) {
|
||||||
{
|
|
||||||
int exit = 0;
|
int exit = 0;
|
||||||
int exit_code = 0;
|
int exit_code = 0;
|
||||||
struct voice_detector_dev *pdev;
|
struct voice_detector_dev *pdev;
|
||||||
|
@ -597,7 +583,7 @@ int voice_detector_run(enum voice_detector_id id, int continous)
|
||||||
VD_LOG(3, "%s, process cmd %d error, %d", __func__, cmd, err);
|
VD_LOG(3, "%s, process cmd %d error, %d", __func__, cmd, err);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
switch(continous) {
|
switch (continous) {
|
||||||
case VOICE_DET_MODE_ONESHOT:
|
case VOICE_DET_MODE_ONESHOT:
|
||||||
// not continous, run only once
|
// not continous, run only once
|
||||||
exit_code = err;
|
exit_code = err;
|
||||||
|
@ -613,7 +599,7 @@ int voice_detector_run(enum voice_detector_id id, int continous)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case VOICE_DET_MODE_LOOP:
|
case VOICE_DET_MODE_LOOP:
|
||||||
//continous run forever, exit until receive VOICE_DET_CMD_EXIT
|
// continous run forever, exit until receive VOICE_DET_CMD_EXIT
|
||||||
if (cmd == VOICE_DET_CMD_EXIT) {
|
if (cmd == VOICE_DET_CMD_EXIT) {
|
||||||
exit = 1;
|
exit = 1;
|
||||||
exit_code = err;
|
exit_code = err;
|
||||||
|
@ -636,30 +622,23 @@ int voice_detector_run(enum voice_detector_id id, int continous)
|
||||||
|
|
||||||
#include "app_voice_detector.h"
|
#include "app_voice_detector.h"
|
||||||
|
|
||||||
#define AUDIO_CAP_BUFF_SIZE (160*2*2*2)
|
#define AUDIO_CAP_BUFF_SIZE (160 * 2 * 2 * 2)
|
||||||
|
|
||||||
static uint32_t buff_capture[AUDIO_CAP_BUFF_SIZE/4];
|
static uint32_t buff_capture[AUDIO_CAP_BUFF_SIZE / 4];
|
||||||
static uint32_t voice_det_evt = 0;
|
static uint32_t voice_det_evt = 0;
|
||||||
static uint8_t vad_data_buf[8 * 1024];
|
static uint8_t vad_data_buf[8 * 1024];
|
||||||
|
|
||||||
static void voice_detector_send_evt(uint32_t evt)
|
static void voice_detector_send_evt(uint32_t evt) { voice_det_evt = evt; }
|
||||||
{
|
|
||||||
voice_det_evt = evt;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void print_vad_raw_data(uint8_t *buf, uint32_t len)
|
static void print_vad_raw_data(uint8_t *buf, uint32_t len) {
|
||||||
{
|
VD_TRACE(3, "%s, buf=%x, len=%d", __func__, (uint32_t)buf, len);
|
||||||
VD_TRACE(3,"%s, buf=%x, len=%d", __func__, (uint32_t)buf, len);
|
// TODO: print data
|
||||||
//TODO: print data
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static int State_M_1 = 0;
|
static int State_M_1 = 0;
|
||||||
void dc_filter_f(short *in, int len, float left_gain, float right_gain)
|
void dc_filter_f(short *in, int len, float left_gain, float right_gain) {
|
||||||
{
|
|
||||||
int tmp1;
|
int tmp1;
|
||||||
for (int i = 0; i<len; i+=1)
|
for (int i = 0; i < len; i += 1) {
|
||||||
{
|
|
||||||
State_M_1 = (15 * State_M_1 + in[i]) >> 4;
|
State_M_1 = (15 * State_M_1 + in[i]) >> 4;
|
||||||
tmp1 = in[i];
|
tmp1 = in[i];
|
||||||
tmp1 -= State_M_1;
|
tmp1 -= State_M_1;
|
||||||
|
@ -667,9 +646,7 @@ void dc_filter_f(short *in, int len, float left_gain, float right_gain)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static uint32_t mic_data_come(uint8_t *buf, uint32_t len) {
|
||||||
static uint32_t mic_data_come(uint8_t *buf, uint32_t len)
|
|
||||||
{
|
|
||||||
static int come_cnt = 0;
|
static int come_cnt = 0;
|
||||||
short *p16data = (short *)buf;
|
short *p16data = (short *)buf;
|
||||||
uint32_t sample_len = len / 2;
|
uint32_t sample_len = len / 2;
|
||||||
|
@ -679,7 +656,7 @@ static uint32_t mic_data_come(uint8_t *buf, uint32_t len)
|
||||||
|
|
||||||
audio_dump_clear_up();
|
audio_dump_clear_up();
|
||||||
audio_dump_add_channel_data(0, p16data, sample_len);
|
audio_dump_add_channel_data(0, p16data, sample_len);
|
||||||
//audio_dump_add_channel_data(1, temp_buf, sample_len);
|
// audio_dump_add_channel_data(1, temp_buf, sample_len);
|
||||||
audio_dump_run();
|
audio_dump_run();
|
||||||
|
|
||||||
#ifdef __CYBERON
|
#ifdef __CYBERON
|
||||||
|
@ -689,69 +666,69 @@ static uint32_t mic_data_come(uint8_t *buf, uint32_t len)
|
||||||
int id, score;
|
int id, score;
|
||||||
|
|
||||||
id = CSpotter_GetResult(h_CSpotter);
|
id = CSpotter_GetResult(h_CSpotter);
|
||||||
TRACE(1,"##### CSpotterGetResult return ID : %d\n", id);
|
TRACE(1, "##### CSpotterGetResult return ID : %d\n", id);
|
||||||
|
|
||||||
score = CSpotter_GetResultScore(h_CSpotter);
|
score = CSpotter_GetResultScore(h_CSpotter);
|
||||||
TRACE(1,"CSpotter_GetResultScore return Score: %d", score);
|
TRACE(1, "CSpotter_GetResultScore return Score: %d", score);
|
||||||
|
|
||||||
CSpotter_Reset(h_CSpotter);
|
CSpotter_Reset(h_CSpotter);
|
||||||
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if(come_cnt % 100 == 0) {
|
if (come_cnt % 100 == 0) {
|
||||||
TRACE(1,"retcode: %d", retcode);
|
TRACE(1, "retcode: %d", retcode);
|
||||||
}
|
}
|
||||||
come_cnt++;
|
come_cnt++;
|
||||||
//if ((come_cnt % 200) == 0) {
|
// if ((come_cnt % 200) == 0) {
|
||||||
// VD_TRACE(3,"%s, buf=%x, len=%d", __func__, (uint32_t)buf, len);
|
// VD_TRACE(3,"%s, buf=%x, len=%d", __func__, (uint32_t)buf, len);
|
||||||
// }
|
// }
|
||||||
if ((come_cnt % 300) == 0) {
|
if ((come_cnt % 300) == 0) {
|
||||||
come_cnt = 0;
|
come_cnt = 0;
|
||||||
voice_detector_send_evt(VOICE_DET_EVT_VAD_START);
|
voice_detector_send_evt(VOICE_DET_EVT_VAD_START);
|
||||||
VD_TRACE(1,"%s, close audio stream ...", __func__);
|
VD_TRACE(1, "%s, close audio stream ...", __func__);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef __CYBERON
|
#ifdef __CYBERON
|
||||||
static int CSpotter_Init_bes()
|
static int CSpotter_Init_bes() {
|
||||||
{
|
|
||||||
#define TIMES (1000)
|
#define TIMES (1000)
|
||||||
int err;
|
int err;
|
||||||
int state_size, mem_size;
|
int state_size, mem_size;
|
||||||
uint8_t *state_buffer, *mem_pool;
|
uint8_t *state_buffer, *mem_pool;
|
||||||
uint8_t *p_combuf = (uint8_t *)cyb_buf;
|
uint8_t *p_combuf = (uint8_t *)cyb_buf;
|
||||||
|
|
||||||
TRACE(1,"%s",__func__);
|
TRACE(1, "%s", __func__);
|
||||||
|
|
||||||
state_size = CSpotter_GetStateSize((BYTE*)COMMAND_MODEL_DATA);
|
state_size = CSpotter_GetStateSize((BYTE *)COMMAND_MODEL_DATA);
|
||||||
TRACE(2,"%s, state_size=%d",__func__, state_size);
|
TRACE(2, "%s, state_size=%d", __func__, state_size);
|
||||||
|
|
||||||
state_buffer = p_combuf+ cyb_buf_used;
|
state_buffer = p_combuf + cyb_buf_used;
|
||||||
cyb_buf_used += state_size;
|
cyb_buf_used += state_size;
|
||||||
if (!state_buffer) {
|
if (!state_buffer) {
|
||||||
TRACE(0,"alloc state buff failed");
|
TRACE(0, "alloc state buff failed");
|
||||||
err = -1;
|
err = -1;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
mem_size = CSpotter_GetMemoryUsage_Sep((BYTE*)BASE_MODEL_DATA, (BYTE*)COMMAND_MODEL_DATA, TIMES);
|
mem_size = CSpotter_GetMemoryUsage_Sep((BYTE *)BASE_MODEL_DATA,
|
||||||
TRACE(1,"mem_size=%d",mem_size);
|
(BYTE *)COMMAND_MODEL_DATA, TIMES);
|
||||||
|
TRACE(1, "mem_size=%d", mem_size);
|
||||||
|
|
||||||
mem_pool = p_combuf+ cyb_buf_used;
|
mem_pool = p_combuf + cyb_buf_used;
|
||||||
cyb_buf_used += mem_size;
|
cyb_buf_used += mem_size;
|
||||||
if (!mem_pool) {
|
if (!mem_pool) {
|
||||||
TRACE(0,"alloc mem pool failed");
|
TRACE(0, "alloc mem pool failed");
|
||||||
err = -2;
|
err = -2;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
|
||||||
h_CSpotter = CSpotter_Init_Sep((BYTE*)BASE_MODEL_DATA, (BYTE*)COMMAND_MODEL_DATA,
|
h_CSpotter = CSpotter_Init_Sep((BYTE *)BASE_MODEL_DATA,
|
||||||
TIMES, mem_pool, mem_size, state_buffer, state_size, &err);
|
(BYTE *)COMMAND_MODEL_DATA, TIMES, mem_pool,
|
||||||
|
mem_size, state_buffer, state_size, &err);
|
||||||
if (!h_CSpotter) {
|
if (!h_CSpotter) {
|
||||||
TRACE(1,"CSpotter Init fail! err : %d\n", err);
|
TRACE(1, "CSpotter Init fail! err : %d\n", err);
|
||||||
err = -3;
|
err = -3;
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
@ -763,51 +740,48 @@ fail:
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static void cmd_wait_handler(int state, void *param)
|
static void cmd_wait_handler(int state, void *param) {
|
||||||
{
|
|
||||||
voice_detector_send_evt(VOICE_DET_EVT_IDLE);
|
voice_detector_send_evt(VOICE_DET_EVT_IDLE);
|
||||||
|
|
||||||
VD_TRACE(2,"%s, state=%d", __func__, state);
|
VD_TRACE(2, "%s, state=%d", __func__, state);
|
||||||
// hal_sys_timer_delay(MS_TO_TICKS(100));
|
// hal_sys_timer_delay(MS_TO_TICKS(100));
|
||||||
// while(1);
|
// while(1);
|
||||||
|
|
||||||
// hal_sleep_enter_sleep();
|
// hal_sleep_enter_sleep();
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cmd_done_handler(int state, void *param)
|
static void cmd_done_handler(int state, void *param) {
|
||||||
{
|
VD_TRACE(2, "%s, state=%d", __func__, state);
|
||||||
VD_TRACE(2,"%s, state=%d", __func__, state);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_det_find_wakeup_handler(int state, void *param)
|
static void cpu_det_find_wakeup_handler(int state, void *param) {
|
||||||
{
|
|
||||||
static uint32_t cpu_wakeup_cnt = 0;
|
static uint32_t cpu_wakeup_cnt = 0;
|
||||||
|
|
||||||
cpu_wakeup_cnt++;
|
cpu_wakeup_cnt++;
|
||||||
VD_TRACE(3,"%s, state=%d, cnt=%d", __func__, state, cpu_wakeup_cnt);
|
VD_TRACE(3, "%s, state=%d, cnt=%d", __func__, state, cpu_wakeup_cnt);
|
||||||
//VD_TRACE(2,"%s, calc sys freq=%d", __func__, hal_sys_timer_calc_cpu_freq(5,0));
|
// VD_TRACE(2,"%s, calc sys freq=%d", __func__,
|
||||||
|
// hal_sys_timer_calc_cpu_freq(5,0));
|
||||||
|
|
||||||
voice_detector_send_evt(VOICE_DET_EVT_AUD_CAP_START);
|
voice_detector_send_evt(VOICE_DET_EVT_AUD_CAP_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void cpu_det_notfind_wakeup_handler(int state, void *param)
|
static void cpu_det_notfind_wakeup_handler(int state, void *param) {
|
||||||
{
|
|
||||||
|
|
||||||
VD_TRACE(2,"%s, state=%d", __func__, state);
|
VD_TRACE(2, "%s, state=%d", __func__, state);
|
||||||
//VD_TRACE(2,"%s, calc sys freq=%d", __func__, hal_sys_timer_calc_cpu_freq(5,0));
|
// VD_TRACE(2,"%s, calc sys freq=%d", __func__,
|
||||||
|
// hal_sys_timer_calc_cpu_freq(5,0));
|
||||||
|
|
||||||
voice_detector_send_evt(VOICE_DET_EVT_VAD_START);
|
voice_detector_send_evt(VOICE_DET_EVT_VAD_START);
|
||||||
}
|
}
|
||||||
|
|
||||||
void voice_detector_test(void)
|
void voice_detector_test(void) {
|
||||||
{
|
|
||||||
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
enum voice_detector_id id = VOICE_DETECTOR_ID_0;
|
||||||
int r, run;
|
int r, run;
|
||||||
struct AF_STREAM_CONFIG_T stream_cfg;
|
struct AF_STREAM_CONFIG_T stream_cfg;
|
||||||
enum HAL_SLEEP_STATUS_T sleep;
|
enum HAL_SLEEP_STATUS_T sleep;
|
||||||
uint32_t len;
|
uint32_t len;
|
||||||
|
|
||||||
VD_TRACE(1,"%s, start", __func__);
|
VD_TRACE(1, "%s, start", __func__);
|
||||||
|
|
||||||
af_open();
|
af_open();
|
||||||
|
|
||||||
|
@ -831,17 +805,22 @@ void voice_detector_test(void)
|
||||||
|
|
||||||
r = voice_detector_open(id);
|
r = voice_detector_open(id);
|
||||||
if (r) {
|
if (r) {
|
||||||
VD_TRACE(2,"%s, error %d", __func__, r);
|
VD_TRACE(2, "%s, error %d", __func__, r);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
voice_detector_setup_stream(id, AUD_STREAM_CAPTURE, &stream_cfg);
|
voice_detector_setup_stream(id, AUD_STREAM_CAPTURE, &stream_cfg);
|
||||||
voice_detector_setup_callback(id, VOICE_DET_CB_RUN_WAIT, cmd_wait_handler, NULL);
|
voice_detector_setup_callback(id, VOICE_DET_CB_RUN_WAIT, cmd_wait_handler,
|
||||||
voice_detector_setup_callback(id, VOICE_DET_CB_RUN_DONE, cmd_done_handler, NULL);
|
NULL);
|
||||||
voice_detector_setup_callback(id, VOICE_DET_FIND_APP, cpu_det_find_wakeup_handler, NULL);
|
voice_detector_setup_callback(id, VOICE_DET_CB_RUN_DONE, cmd_done_handler,
|
||||||
voice_detector_setup_callback(id, VOICE_DET_NOT_FIND_APP, cpu_det_notfind_wakeup_handler, NULL);
|
NULL);
|
||||||
|
voice_detector_setup_callback(id, VOICE_DET_FIND_APP,
|
||||||
|
cpu_det_find_wakeup_handler, NULL);
|
||||||
|
voice_detector_setup_callback(id, VOICE_DET_NOT_FIND_APP,
|
||||||
|
cpu_det_notfind_wakeup_handler, NULL);
|
||||||
|
|
||||||
VD_TRACE(2,"%s, calc sys freq=%d", __func__, hal_sys_timer_calc_cpu_freq(5,0));
|
VD_TRACE(2, "%s, calc sys freq=%d", __func__,
|
||||||
|
hal_sys_timer_calc_cpu_freq(5, 0));
|
||||||
|
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_OPEN);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_OPEN);
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_CLOSE);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_CLOSE);
|
||||||
|
@ -850,13 +829,13 @@ void voice_detector_test(void)
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
if (voice_det_evt != VOICE_DET_EVT_IDLE) {
|
if (voice_det_evt != VOICE_DET_EVT_IDLE) {
|
||||||
switch(voice_det_evt) {
|
switch (voice_det_evt) {
|
||||||
case VOICE_DET_EVT_VAD_START:
|
case VOICE_DET_EVT_VAD_START:
|
||||||
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_CLOSE) {
|
if (voice_detector_query_status(id) == VOICE_DET_STATE_VAD_CLOSE) {
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_STOP);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_STOP);
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_CLOSE);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_CLOSE);
|
||||||
}
|
}
|
||||||
//TODO: save current system clock
|
// TODO: save current system clock
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_OPEN);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_OPEN);
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_START);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_START);
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_SYS_CLK_32K);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_SYS_CLK_32K);
|
||||||
|
@ -868,8 +847,8 @@ void voice_detector_test(void)
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_START);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_START);
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_STOP);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_STOP);
|
||||||
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_CLOSE);
|
voice_detector_send_cmd(id, VOICE_DET_CMD_VAD_CLOSE);
|
||||||
//voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_OPEN);
|
// voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_OPEN);
|
||||||
//voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_START);
|
// voice_detector_send_cmd(id, VOICE_DET_CMD_AUD_CAP_START);
|
||||||
run = 1;
|
run = 1;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -888,14 +867,14 @@ void voice_detector_test(void)
|
||||||
af_thread(NULL);
|
af_thread(NULL);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// while(1);
|
// while(1);
|
||||||
sleep = hal_sleep_enter_sleep();
|
sleep = hal_sleep_enter_sleep();
|
||||||
if (sleep == HAL_SLEEP_STATUS_DEEP) {
|
if (sleep == HAL_SLEEP_STATUS_DEEP) {
|
||||||
VD_TRACE(0,"wake up from deep sleep");
|
VD_TRACE(0, "wake up from deep sleep");
|
||||||
}
|
}
|
||||||
|
|
||||||
len = voice_detector_recv_vad_data(VOICE_DETECTOR_ID_0,
|
len = voice_detector_recv_vad_data(VOICE_DETECTOR_ID_0, vad_data_buf,
|
||||||
vad_data_buf, sizeof(vad_data_buf));
|
sizeof(vad_data_buf));
|
||||||
if (len) {
|
if (len) {
|
||||||
print_vad_raw_data(vad_data_buf, len);
|
print_vad_raw_data(vad_data_buf, len);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,18 +13,18 @@
|
||||||
* trademark and other intellectual property rights.
|
* trademark and other intellectual property rights.
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "cmsis_os.h"
|
|
||||||
#include "stdbool.h"
|
|
||||||
#include "hal_trace.h"
|
|
||||||
#include "app_pwl.h"
|
|
||||||
#include "app_status_ind.h"
|
#include "app_status_ind.h"
|
||||||
|
#include "app_pwl.h"
|
||||||
|
#include "cmsis_os.h"
|
||||||
|
#include "hal_trace.h"
|
||||||
|
#include "stdbool.h"
|
||||||
#include "string.h"
|
#include "string.h"
|
||||||
|
|
||||||
static APP_STATUS_INDICATION_T app_status = APP_STATUS_INDICATION_NUM;
|
static APP_STATUS_INDICATION_T app_status = APP_STATUS_INDICATION_NUM;
|
||||||
static APP_STATUS_INDICATION_T app_status_ind_filter = APP_STATUS_INDICATION_NUM;
|
static APP_STATUS_INDICATION_T app_status_ind_filter =
|
||||||
|
APP_STATUS_INDICATION_NUM;
|
||||||
|
|
||||||
const char *app_status_indication_str[] =
|
const char *app_status_indication_str[] = {
|
||||||
{
|
|
||||||
"[POWERON]",
|
"[POWERON]",
|
||||||
"[INITIAL]",
|
"[INITIAL]",
|
||||||
"[PAGESCAN]",
|
"[PAGESCAN]",
|
||||||
|
@ -64,36 +64,26 @@ const char *app_status_indication_str[] =
|
||||||
"[TILE_FIND]",
|
"[TILE_FIND]",
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const char *status2str(uint16_t status) {
|
||||||
const char *status2str(uint16_t status)
|
|
||||||
{
|
|
||||||
const char *str = NULL;
|
const char *str = NULL;
|
||||||
|
|
||||||
if (status >= 0 && status < APP_STATUS_INDICATION_NUM)
|
if (status >= 0 && status < APP_STATUS_INDICATION_NUM) {
|
||||||
{
|
|
||||||
str = app_status_indication_str[status];
|
str = app_status_indication_str[status];
|
||||||
}
|
} else {
|
||||||
else
|
|
||||||
{
|
|
||||||
str = "[UNKNOWN]";
|
str = "[UNKNOWN]";
|
||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
return str;
|
||||||
}
|
}
|
||||||
|
|
||||||
int app_status_indication_filter_set(APP_STATUS_INDICATION_T status)
|
int app_status_indication_filter_set(APP_STATUS_INDICATION_T status) {
|
||||||
{
|
|
||||||
app_status_ind_filter = status;
|
app_status_ind_filter = status;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
APP_STATUS_INDICATION_T app_status_indication_get(void)
|
APP_STATUS_INDICATION_T app_status_indication_get(void) { return app_status; }
|
||||||
{
|
|
||||||
return app_status;
|
|
||||||
}
|
|
||||||
|
|
||||||
int app_status_indication_set(APP_STATUS_INDICATION_T status)
|
int app_status_indication_set(APP_STATUS_INDICATION_T status) {
|
||||||
{
|
|
||||||
struct APP_PWL_CFG_T cfg0;
|
struct APP_PWL_CFG_T cfg0;
|
||||||
struct APP_PWL_CFG_T cfg1;
|
struct APP_PWL_CFG_T cfg1;
|
||||||
|
|
||||||
|
@ -103,7 +93,7 @@ int app_status_indication_set(APP_STATUS_INDICATION_T status)
|
||||||
if (app_status_ind_filter == status)
|
if (app_status_ind_filter == status)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
TRACE(2,"%s %d",__func__, status);
|
TRACE(2, "%s %d", __func__, status);
|
||||||
|
|
||||||
app_status = status;
|
app_status = status;
|
||||||
memset(&cfg0, 0, sizeof(struct APP_PWL_CFG_T));
|
memset(&cfg0, 0, sizeof(struct APP_PWL_CFG_T));
|
||||||
|
|
|
@ -15,21 +15,18 @@
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "tgt_hardware.h"
|
#include "tgt_hardware.h"
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {};
|
||||||
};
|
|
||||||
|
|
||||||
//adckey define
|
// adckey define
|
||||||
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
||||||
HAL_KEY_CODE_FN9,HAL_KEY_CODE_FN8,HAL_KEY_CODE_FN7,
|
HAL_KEY_CODE_FN9, HAL_KEY_CODE_FN8, HAL_KEY_CODE_FN7,
|
||||||
HAL_KEY_CODE_FN6,HAL_KEY_CODE_FN5,HAL_KEY_CODE_FN4,
|
HAL_KEY_CODE_FN6, HAL_KEY_CODE_FN5, HAL_KEY_CODE_FN4,
|
||||||
HAL_KEY_CODE_FN3,HAL_KEY_CODE_FN2,HAL_KEY_CODE_FN1
|
HAL_KEY_CODE_FN3, HAL_KEY_CODE_FN2, HAL_KEY_CODE_FN1};
|
||||||
};
|
|
||||||
|
|
||||||
//gpiokey define
|
// gpiokey define
|
||||||
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {};
|
||||||
};
|
|
||||||
|
|
||||||
//bt config
|
// bt config
|
||||||
const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
||||||
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
||||||
|
|
||||||
|
@ -37,63 +34,69 @@ uint8_t ble_addr[6] = {
|
||||||
#ifdef BLE_DEV_ADDR
|
#ifdef BLE_DEV_ADDR
|
||||||
BLE_DEV_ADDR
|
BLE_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0xBE,0x99,0x34,0x45,0x56,0x67
|
0xBE, 0x99, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
uint8_t bt_addr[6] = {
|
uint8_t bt_addr[6] = {
|
||||||
#ifdef BT_DEV_ADDR
|
#ifdef BT_DEV_ADDR
|
||||||
BT_DEV_ADDR
|
BT_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0x1e,0x57,0x34,0x45,0x56,0x67
|
0x1e, 0x57, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//audio config
|
// audio config
|
||||||
//freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K], [12.5K:15K], [15K:17.5K], [17.5K:20K]}
|
// freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K],
|
||||||
//gain range -12~+12
|
// [12.5K:15K], [15K:17.5K], [17.5K:20K]} gain range -12~+12
|
||||||
const int8_t cfg_hw_aud_eq_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {0, 0, 0, 0, 0, 0, 0, 0};
|
const int8_t cfg_hw_aud_eq_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
||||||
|
|
||||||
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
||||||
{TX_PA_GAIN,0x03,-11},
|
{TX_PA_GAIN, 0x03, -11}, {TX_PA_GAIN, 0x03, -99},
|
||||||
{TX_PA_GAIN,0x03,-99},
|
{TX_PA_GAIN, 0x03, -45}, {TX_PA_GAIN, 0x03, -42},
|
||||||
{TX_PA_GAIN,0x03,-45},
|
{TX_PA_GAIN, 0x03, -39}, {TX_PA_GAIN, 0x03, -36},
|
||||||
{TX_PA_GAIN,0x03,-42},
|
{TX_PA_GAIN, 0x03, -33}, {TX_PA_GAIN, 0x03, -30},
|
||||||
{TX_PA_GAIN,0x03,-39},
|
{TX_PA_GAIN, 0x03, -27}, {TX_PA_GAIN, 0x03, -24},
|
||||||
{TX_PA_GAIN,0x03,-36},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -18},
|
||||||
{TX_PA_GAIN,0x03,-33},
|
{TX_PA_GAIN, 0x03, -15}, {TX_PA_GAIN, 0x03, -12},
|
||||||
{TX_PA_GAIN,0x03,-30},
|
{TX_PA_GAIN, 0x03, -9}, {TX_PA_GAIN, 0x03, -6},
|
||||||
{TX_PA_GAIN,0x03,-27},
|
{TX_PA_GAIN, 0x03, -3}, {TX_PA_GAIN, 0x03, 0}, // 0dBm
|
||||||
{TX_PA_GAIN,0x03,-24},
|
|
||||||
{TX_PA_GAIN,0x03,-21},
|
|
||||||
{TX_PA_GAIN,0x03,-18},
|
|
||||||
{TX_PA_GAIN,0x03,-15},
|
|
||||||
{TX_PA_GAIN,0x03,-12},
|
|
||||||
{TX_PA_GAIN,0x03, -9},
|
|
||||||
{TX_PA_GAIN,0x03, -6},
|
|
||||||
{TX_PA_GAIN,0x03, -3},
|
|
||||||
{TX_PA_GAIN,0x03, 0}, //0dBm
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
(AUD_CHANNEL_MAP_CH0 | AUD_VMIC_MAP_VMIC1)
|
||||||
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV \
|
||||||
const struct AUD_IO_PATH_CFG_T cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV, },
|
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV \
|
||||||
{ AUD_INPUT_PATH_LINEIN, CFG_HW_AUD_INPUT_PATH_LINEIN_DEV, },
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
||||||
{ AUD_INPUT_PATH_VADMIC, CFG_HW_AUD_INPUT_PATH_VADMIC_DEV, },
|
const struct AUD_IO_PATH_CFG_T
|
||||||
|
cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
||||||
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AUD_INPUT_PATH_LINEIN,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_LINEIN_DEV,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
AUD_INPUT_PATH_VADMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_VADMIC_DEV,
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg = {
|
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg =
|
||||||
|
{HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
|
@ -14,235 +14,256 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "tgt_hardware.h"
|
#include "tgt_hardware.h"
|
||||||
#include "iir_process.h"
|
|
||||||
#include "fir_process.h"
|
|
||||||
#include "drc.h"
|
#include "drc.h"
|
||||||
|
#include "fir_process.h"
|
||||||
|
#include "iir_process.h"
|
||||||
#include "limiter.h"
|
#include "limiter.h"
|
||||||
#include "spectrum_fix.h"
|
#include "spectrum_fix.h"
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
|
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __APP_USE_LED_INDICATE_IBRT_STATUS__
|
#ifdef __APP_USE_LED_INDICATE_IBRT_STATUS__
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_ibrt_indication_pinmux_pwl[3] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_ibrt_indication_pinmux_pwl[3] = {
|
||||||
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
|
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __KNOWLES
|
#ifdef __KNOWLES
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_pinmux_uart[2] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_pinmux_uart[2] = {
|
||||||
{HAL_IOMUX_PIN_P2_2, HAL_IOMUX_FUNC_UART2_RX, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
{HAL_IOMUX_PIN_P2_2, HAL_IOMUX_FUNC_UART2_RX, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_P2_3, HAL_IOMUX_FUNC_UART2_TX, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
|
{HAL_IOMUX_PIN_P2_3, HAL_IOMUX_FUNC_UART2_TX, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//adckey define
|
// adckey define
|
||||||
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
||||||
#if (CFG_HW_ADCKEY_NUMBER > 0)
|
#if (CFG_HW_ADCKEY_NUMBER > 0)
|
||||||
HAL_KEY_CODE_FN9,HAL_KEY_CODE_FN8,HAL_KEY_CODE_FN7,
|
HAL_KEY_CODE_FN9, HAL_KEY_CODE_FN8, HAL_KEY_CODE_FN7,
|
||||||
HAL_KEY_CODE_FN6,HAL_KEY_CODE_FN5,HAL_KEY_CODE_FN4,
|
HAL_KEY_CODE_FN6, HAL_KEY_CODE_FN5, HAL_KEY_CODE_FN4,
|
||||||
HAL_KEY_CODE_FN3,HAL_KEY_CODE_FN2,HAL_KEY_CODE_FN1,
|
HAL_KEY_CODE_FN3, HAL_KEY_CODE_FN2, HAL_KEY_CODE_FN1,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//gpiokey define
|
// gpiokey define
|
||||||
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
|
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
|
||||||
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
|
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
|
||||||
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
||||||
/*
|
/*
|
||||||
#if (CFG_HW_GPIOKEY_NUM > 0)
|
#if (CFG_HW_GPIOKEY_NUM > 0)
|
||||||
#ifdef BES_AUDIO_DEV_Main_Board_9v0
|
#ifdef BES_AUDIO_DEV_Main_Board_9v0
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN4,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
//{HAL_KEY_CODE_FN5,{HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
// {HAL_KEY_CODE_FN6,{HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
#else
|
{HAL_KEY_CODE_FN4,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
#ifndef TPORTS_KEY_COEXIST
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
//{HAL_KEY_CODE_FN5,{HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
// {HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
// {HAL_KEY_CODE_FN6,{HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #else #ifndef
|
||||||
#else
|
TPORTS_KEY_COEXIST {HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3,
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_PULLUP_ENABLE}}, {HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P1_0,
|
||||||
#endif
|
HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
#endif
|
HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
#ifdef IS_MULTI_AI_ENABLED
|
// {HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
//{HAL_KEY_CODE_FN13,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
//{HAL_KEY_CODE_FN14,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
#endif
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #else
|
||||||
#endif
|
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
*/
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #endif #endif
|
||||||
|
#ifdef IS_MULTI_AI_ENABLED
|
||||||
|
//{HAL_KEY_CODE_FN13,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
|
//{HAL_KEY_CODE_FN14,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #endif #endif
|
||||||
|
*/
|
||||||
|
{HAL_KEY_CODE_FN1,
|
||||||
|
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
};
|
};
|
||||||
|
|
||||||
//bt config
|
// bt config
|
||||||
//const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
// const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
||||||
const char *BT_LOCAL_NAME = "PineBuds Pro";
|
const char *BT_LOCAL_NAME = "PineBuds Pro";
|
||||||
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
||||||
uint8_t ble_addr[6] = {
|
uint8_t ble_addr[6] = {
|
||||||
#ifdef BLE_DEV_ADDR
|
#ifdef BLE_DEV_ADDR
|
||||||
BLE_DEV_ADDR
|
BLE_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0xBE,0x99,0x34,0x45,0x56,0x67
|
0xBE, 0x99, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
uint8_t bt_addr[6] = {
|
uint8_t bt_addr[6] = {
|
||||||
#ifdef BT_DEV_ADDR
|
#ifdef BT_DEV_ADDR
|
||||||
BT_DEV_ADDR
|
BT_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0x1e,0x57,0x34,0x45,0x56,0x67
|
0x1e, 0x57, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//audio config
|
// audio config
|
||||||
//freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K], [12.5K:15K], [15K:17.5K], [17.5K:20K]}
|
// freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K],
|
||||||
//gain range -12~+12
|
// [12.5K:15K], [15K:17.5K], [17.5K:20K]} gain range -12~+12
|
||||||
const int8_t cfg_aud_eq_sbc_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {0, 0, 0, 0, 0, 0, 0, 0};
|
const int8_t cfg_aud_eq_sbc_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
||||||
|
|
||||||
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
||||||
{TX_PA_GAIN,0x03,-21},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -99},
|
||||||
{TX_PA_GAIN,0x03,-99},
|
{TX_PA_GAIN, 0x03, -45}, {TX_PA_GAIN, 0x03, -42},
|
||||||
{TX_PA_GAIN,0x03,-45},
|
{TX_PA_GAIN, 0x03, -39}, {TX_PA_GAIN, 0x03, -36},
|
||||||
{TX_PA_GAIN,0x03,-42},
|
{TX_PA_GAIN, 0x03, -33}, {TX_PA_GAIN, 0x03, -30},
|
||||||
{TX_PA_GAIN,0x03,-39},
|
{TX_PA_GAIN, 0x03, -27}, {TX_PA_GAIN, 0x03, -24},
|
||||||
{TX_PA_GAIN,0x03,-36},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -18},
|
||||||
{TX_PA_GAIN,0x03,-33},
|
{TX_PA_GAIN, 0x03, -15}, {TX_PA_GAIN, 0x03, -12},
|
||||||
{TX_PA_GAIN,0x03,-30},
|
{TX_PA_GAIN, 0x03, -9}, {TX_PA_GAIN, 0x03, -6},
|
||||||
{TX_PA_GAIN,0x03,-27},
|
{TX_PA_GAIN, 0x03, -3}, {TX_PA_GAIN, 0x03, 0}, // 0dBm
|
||||||
{TX_PA_GAIN,0x03,-24},
|
|
||||||
{TX_PA_GAIN,0x03,-21},
|
|
||||||
{TX_PA_GAIN,0x03,-18},
|
|
||||||
{TX_PA_GAIN,0x03,-15},
|
|
||||||
{TX_PA_GAIN,0x03,-12},
|
|
||||||
{TX_PA_GAIN,0x03, -9},
|
|
||||||
{TX_PA_GAIN,0x03, -6},
|
|
||||||
{TX_PA_GAIN,0x03, -3},
|
|
||||||
{TX_PA_GAIN,0x03, 0}, //0dBm
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC2|AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC2 | \
|
||||||
|
AUD_VMIC_MAP_VMIC3)
|
||||||
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1 | AUD_CHANNEL_MAP_CH4 | \
|
||||||
|
AUD_VMIC_MAP_VMIC1)
|
||||||
#else
|
#else
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
||||||
#ifdef VOICE_DETECTOR_EN
|
#ifdef VOICE_DETECTOR_EN
|
||||||
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
||||||
#else
|
#else
|
||||||
#define CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const struct AUD_IO_PATH_CFG_T cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
const struct AUD_IO_PATH_CFG_T
|
||||||
|
cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
||||||
#if defined(SPEECH_TX_AEC_CODEC_REF)
|
#if defined(SPEECH_TX_AEC_CODEC_REF)
|
||||||
// NOTE: If enable Ch5 and CH6, need to add channel_num when setup audioflinger stream
|
// NOTE: If enable Ch5 and CH6, need to add channel_num when setup
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV | AUD_CHANNEL_MAP_CH4, },
|
// audioflinger stream
|
||||||
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV | AUD_CHANNEL_MAP_CH4,
|
||||||
|
},
|
||||||
#else
|
#else
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
{ AUD_INPUT_PATH_LINEIN, CFG_HW_AUD_INPUT_PATH_LINEIN_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_LINEIN,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_LINEIN_DEV,
|
||||||
|
},
|
||||||
#ifdef VOICE_DETECTOR_EN
|
#ifdef VOICE_DETECTOR_EN
|
||||||
{ AUD_INPUT_PATH_VADMIC, CFG_HW_AUD_INPUT_PATH_VADMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_VADMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_VADMIC_DEV,
|
||||||
|
},
|
||||||
#else
|
#else
|
||||||
{ AUD_INPUT_PATH_ASRMIC, CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_ASRMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
||||||
HAL_IOMUX_PIN_P1_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P1_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg = {
|
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg =
|
||||||
|
{HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_INT ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_INT ={
|
||||||
HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SDA ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SDA = {
|
||||||
HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SCL ={
|
|
||||||
HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SCL = {
|
||||||
|
HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const IIR_CFG_T audio_eq_sw_iir_cfg = {
|
const IIR_CFG_T audio_eq_sw_iir_cfg = {
|
||||||
.gain0 = 0,
|
.gain0 = 0,
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 5,
|
.num = 5,
|
||||||
.param = {
|
.param = {{IIR_TYPE_PEAK, .0, 200, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 200, 2},
|
|
||||||
{IIR_TYPE_PEAK, .0, 600, 2},
|
{IIR_TYPE_PEAK, .0, 600, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 2000.0, 2},
|
{IIR_TYPE_PEAK, .0, 2000.0, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 6000.0, 2},
|
{IIR_TYPE_PEAK, .0, 6000.0, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 12000.0, 2}
|
{IIR_TYPE_PEAK, .0, 12000.0, 2}}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const audio_eq_sw_iir_cfg_list[EQ_SW_IIR_LIST_NUM]={
|
const IIR_CFG_T *const audio_eq_sw_iir_cfg_list[EQ_SW_IIR_LIST_NUM] = {
|
||||||
&audio_eq_sw_iir_cfg,
|
&audio_eq_sw_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_44p1k = {
|
const FIR_CFG_T audio_eq_hw_fir_cfg_44p1k = {.gain = 0.0f,
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_48k = {
|
const FIR_CFG_T audio_eq_hw_fir_cfg_48k = {.gain = 0.0f,
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const FIR_CFG_T audio_eq_hw_fir_cfg_96k = {.gain = 0.0f,
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_96k = {
|
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const FIR_CFG_T * const audio_eq_hw_fir_cfg_list[EQ_HW_FIR_LIST_NUM]={
|
const FIR_CFG_T *const audio_eq_hw_fir_cfg_list[EQ_HW_FIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_fir_cfg_44p1k,
|
&audio_eq_hw_fir_cfg_44p1k,
|
||||||
&audio_eq_hw_fir_cfg_48k,
|
&audio_eq_hw_fir_cfg_48k,
|
||||||
&audio_eq_hw_fir_cfg_96k,
|
&audio_eq_hw_fir_cfg_96k,
|
||||||
};
|
};
|
||||||
|
|
||||||
//hardware dac iir eq
|
// hardware dac iir eq
|
||||||
const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {
|
const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {.gain0 = 0,
|
||||||
.gain0 = 0,
|
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 8,
|
.num = 8,
|
||||||
.param = {
|
.param = {
|
||||||
|
@ -254,32 +275,29 @@ const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_dac_iir_cfg_list[EQ_HW_DAC_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_dac_iir_cfg_list[EQ_HW_DAC_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_dac_iir_cfg,
|
&audio_eq_hw_dac_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
//hardware dac iir eq
|
// hardware dac iir eq
|
||||||
const IIR_CFG_T audio_eq_hw_adc_iir_adc_cfg = {
|
const IIR_CFG_T audio_eq_hw_adc_iir_adc_cfg = {
|
||||||
.gain0 = 0,
|
.gain0 = 0,
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 1,
|
.num = 1,
|
||||||
.param = {
|
.param = {
|
||||||
{IIR_TYPE_PEAK, 0.0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0.0, 1000.0, 0.7},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_adc_iir_cfg_list[EQ_HW_ADC_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_adc_iir_cfg_list[EQ_HW_ADC_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_adc_iir_adc_cfg,
|
&audio_eq_hw_adc_iir_adc_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// hardware iir eq
|
||||||
|
const IIR_CFG_T audio_eq_hw_iir_cfg = {.gain0 = 0,
|
||||||
//hardware iir eq
|
|
||||||
const IIR_CFG_T audio_eq_hw_iir_cfg = {
|
|
||||||
.gain0 = 0,
|
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 8,
|
.num = 8,
|
||||||
.param = {
|
.param = {
|
||||||
|
@ -292,23 +310,21 @@ const IIR_CFG_T audio_eq_hw_iir_cfg = {
|
||||||
{IIR_TYPE_PEAK, -10.1, 7000.0, 7},
|
{IIR_TYPE_PEAK, -10.1, 7000.0, 7},
|
||||||
{IIR_TYPE_PEAK, -10.1, 9000.0, 7},
|
{IIR_TYPE_PEAK, -10.1, 9000.0, 7},
|
||||||
|
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_iir_cfg_list[EQ_HW_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_iir_cfg_list[EQ_HW_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_iir_cfg,
|
&audio_eq_hw_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DrcConfig audio_drc_cfg = {
|
const DrcConfig audio_drc_cfg = {.knee = 3,
|
||||||
.knee = 3,
|
|
||||||
.filter_type = {14, -1},
|
.filter_type = {14, -1},
|
||||||
.band_num = 2,
|
.band_num = 2,
|
||||||
.look_ahead_time = 10,
|
.look_ahead_time = 10,
|
||||||
.band_settings = {
|
.band_settings = {
|
||||||
{-20, 0, 2, 3, 3000, 1},
|
{-20, 0, 2, 3, 3000, 1},
|
||||||
{-20, 0, 2, 3, 3000, 1},
|
{-20, 0, 2, 3, 3000, 1},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const LimiterConfig audio_drc2_cfg = {
|
const LimiterConfig audio_drc2_cfg = {
|
||||||
.knee = 2,
|
.knee = 2,
|
||||||
|
@ -324,4 +340,3 @@ const SpectrumFixConfig audio_spectrum_cfg = {
|
||||||
.freq_num = 9,
|
.freq_num = 9,
|
||||||
.freq_list = {200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800},
|
.freq_list = {200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -14,184 +14,220 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "tgt_hardware.h"
|
#include "tgt_hardware.h"
|
||||||
#include "iir_process.h"
|
|
||||||
#include "fir_process.h"
|
|
||||||
#include "drc.h"
|
#include "drc.h"
|
||||||
|
#include "fir_process.h"
|
||||||
|
#include "iir_process.h"
|
||||||
#include "limiter.h"
|
#include "limiter.h"
|
||||||
#include "spectrum_fix.h"
|
#include "spectrum_fix.h"
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
|
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __APP_USE_LED_INDICATE_IBRT_STATUS__
|
#ifdef __APP_USE_LED_INDICATE_IBRT_STATUS__
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_ibrt_indication_pinmux_pwl[3] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_ibrt_indication_pinmux_pwl[3] = {
|
||||||
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
|
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __KNOWLES
|
#ifdef __KNOWLES
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_pinmux_uart[2] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_pinmux_uart[2] = {
|
||||||
{HAL_IOMUX_PIN_P2_2, HAL_IOMUX_FUNC_UART2_RX, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
{HAL_IOMUX_PIN_P2_2, HAL_IOMUX_FUNC_UART2_RX, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_P2_3, HAL_IOMUX_FUNC_UART2_TX, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
|
{HAL_IOMUX_PIN_P2_3, HAL_IOMUX_FUNC_UART2_TX, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//adckey define
|
// adckey define
|
||||||
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
||||||
#if (CFG_HW_ADCKEY_NUMBER > 0)
|
#if (CFG_HW_ADCKEY_NUMBER > 0)
|
||||||
HAL_KEY_CODE_FN9,HAL_KEY_CODE_FN8,HAL_KEY_CODE_FN7,
|
HAL_KEY_CODE_FN9, HAL_KEY_CODE_FN8, HAL_KEY_CODE_FN7,
|
||||||
HAL_KEY_CODE_FN6,HAL_KEY_CODE_FN5,HAL_KEY_CODE_FN4,
|
HAL_KEY_CODE_FN6, HAL_KEY_CODE_FN5, HAL_KEY_CODE_FN4,
|
||||||
HAL_KEY_CODE_FN3,HAL_KEY_CODE_FN2,HAL_KEY_CODE_FN1,
|
HAL_KEY_CODE_FN3, HAL_KEY_CODE_FN2, HAL_KEY_CODE_FN1,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//gpiokey define
|
// gpiokey define
|
||||||
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
|
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
|
||||||
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
|
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
|
||||||
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
||||||
/*
|
/*
|
||||||
#if (CFG_HW_GPIOKEY_NUM > 0)
|
#if (CFG_HW_GPIOKEY_NUM > 0)
|
||||||
#ifdef BES_AUDIO_DEV_Main_Board_9v0
|
#ifdef BES_AUDIO_DEV_Main_Board_9v0
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN4,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
//{HAL_KEY_CODE_FN5,{HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
// {HAL_KEY_CODE_FN6,{HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
#else
|
{HAL_KEY_CODE_FN4,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
#ifndef TPORTS_KEY_COEXIST
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
//{HAL_KEY_CODE_FN5,{HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
// {HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
// {HAL_KEY_CODE_FN6,{HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #else #ifndef
|
||||||
#else
|
TPORTS_KEY_COEXIST {HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3,
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_PULLUP_ENABLE}}, {HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P1_0,
|
||||||
#endif
|
HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
#endif
|
HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
#ifdef IS_MULTI_AI_ENABLED
|
// {HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
//{HAL_KEY_CODE_FN13,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
//{HAL_KEY_CODE_FN14,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
#endif
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #else
|
||||||
#endif
|
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
*/
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #endif #endif
|
||||||
|
#ifdef IS_MULTI_AI_ENABLED
|
||||||
|
//{HAL_KEY_CODE_FN13,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
|
//{HAL_KEY_CODE_FN14,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #endif #endif
|
||||||
|
*/
|
||||||
|
{HAL_KEY_CODE_FN1,
|
||||||
|
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
};
|
};
|
||||||
|
|
||||||
//bt config
|
// bt config
|
||||||
const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
||||||
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
||||||
uint8_t ble_addr[6] = {
|
uint8_t ble_addr[6] = {
|
||||||
#ifdef BLE_DEV_ADDR
|
#ifdef BLE_DEV_ADDR
|
||||||
BLE_DEV_ADDR
|
BLE_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0xBE,0x99,0x34,0x45,0x56,0x67
|
0xBE, 0x99, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
uint8_t bt_addr[6] = {
|
uint8_t bt_addr[6] = {
|
||||||
#ifdef BT_DEV_ADDR
|
#ifdef BT_DEV_ADDR
|
||||||
BT_DEV_ADDR
|
BT_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0x1e,0x57,0x34,0x45,0x56,0x67
|
0x1e, 0x57, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//audio config
|
// audio config
|
||||||
//freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K], [12.5K:15K], [15K:17.5K], [17.5K:20K]}
|
// freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K],
|
||||||
//gain range -12~+12
|
// [12.5K:15K], [15K:17.5K], [17.5K:20K]} gain range -12~+12
|
||||||
const int8_t cfg_aud_eq_sbc_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {0, 0, 0, 0, 0, 0, 0, 0};
|
const int8_t cfg_aud_eq_sbc_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
||||||
|
|
||||||
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
||||||
{TX_PA_GAIN,0x03,-21},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -99},
|
||||||
{TX_PA_GAIN,0x03,-99},
|
{TX_PA_GAIN, 0x03, -45}, {TX_PA_GAIN, 0x03, -42},
|
||||||
{TX_PA_GAIN,0x03,-45},
|
{TX_PA_GAIN, 0x03, -39}, {TX_PA_GAIN, 0x03, -36},
|
||||||
{TX_PA_GAIN,0x03,-42},
|
{TX_PA_GAIN, 0x03, -33}, {TX_PA_GAIN, 0x03, -30},
|
||||||
{TX_PA_GAIN,0x03,-39},
|
{TX_PA_GAIN, 0x03, -27}, {TX_PA_GAIN, 0x03, -24},
|
||||||
{TX_PA_GAIN,0x03,-36},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -18},
|
||||||
{TX_PA_GAIN,0x03,-33},
|
{TX_PA_GAIN, 0x03, -15}, {TX_PA_GAIN, 0x03, -12},
|
||||||
{TX_PA_GAIN,0x03,-30},
|
{TX_PA_GAIN, 0x03, -9}, {TX_PA_GAIN, 0x03, -6},
|
||||||
{TX_PA_GAIN,0x03,-27},
|
{TX_PA_GAIN, 0x03, -3}, {TX_PA_GAIN, 0x03, 0}, // 0dBm
|
||||||
{TX_PA_GAIN,0x03,-24},
|
|
||||||
{TX_PA_GAIN,0x03,-21},
|
|
||||||
{TX_PA_GAIN,0x03,-18},
|
|
||||||
{TX_PA_GAIN,0x03,-15},
|
|
||||||
{TX_PA_GAIN,0x03,-12},
|
|
||||||
{TX_PA_GAIN,0x03, -9},
|
|
||||||
{TX_PA_GAIN,0x03, -6},
|
|
||||||
{TX_PA_GAIN,0x03, -3},
|
|
||||||
{TX_PA_GAIN,0x03, 0}, //0dBm
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC2|AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC2 | \
|
||||||
|
AUD_VMIC_MAP_VMIC3)
|
||||||
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1 | AUD_CHANNEL_MAP_CH4 | \
|
||||||
|
AUD_VMIC_MAP_VMIC1)
|
||||||
#else
|
#else
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
||||||
#ifdef VOICE_DETECTOR_EN
|
#ifdef VOICE_DETECTOR_EN
|
||||||
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
||||||
#else
|
#else
|
||||||
#define CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_VMIC_MAP_VMIC1)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const struct AUD_IO_PATH_CFG_T cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
const struct AUD_IO_PATH_CFG_T
|
||||||
|
cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
||||||
#if defined(SPEECH_TX_AEC_CODEC_REF)
|
#if defined(SPEECH_TX_AEC_CODEC_REF)
|
||||||
// NOTE: If enable Ch5 and CH6, need to add channel_num when setup audioflinger stream
|
// NOTE: If enable Ch5 and CH6, need to add channel_num when setup
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV | AUD_CHANNEL_MAP_CH4, },
|
// audioflinger stream
|
||||||
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV | AUD_CHANNEL_MAP_CH4,
|
||||||
|
},
|
||||||
#else
|
#else
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
{ AUD_INPUT_PATH_LINEIN, CFG_HW_AUD_INPUT_PATH_LINEIN_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_LINEIN,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_LINEIN_DEV,
|
||||||
|
},
|
||||||
#ifdef VOICE_DETECTOR_EN
|
#ifdef VOICE_DETECTOR_EN
|
||||||
{ AUD_INPUT_PATH_VADMIC, CFG_HW_AUD_INPUT_PATH_VADMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_VADMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_VADMIC_DEV,
|
||||||
|
},
|
||||||
#else
|
#else
|
||||||
{ AUD_INPUT_PATH_ASRMIC, CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_ASRMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg =
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
{HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_tws_channel_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_tws_channel_cfg = {
|
||||||
HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE//HAL_IOMUX_PIN_P1_5 500:HAL_IOMUX_PIN_P2_5
|
HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE // HAL_IOMUX_PIN_P1_5
|
||||||
|
// 500:HAL_IOMUX_PIN_P2_5
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_INT ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_INT ={
|
||||||
HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SDA ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SDA = {
|
||||||
HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SCL ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SCL = {
|
||||||
HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
bool tgt_tws_get_channel_is_right(void)
|
bool tgt_tws_get_channel_is_right(void) {
|
||||||
{
|
|
||||||
#ifdef __FIXED_TWS_EAR_SIDE__
|
#ifdef __FIXED_TWS_EAR_SIDE__
|
||||||
return TWS_EAR_SIDE_ROLE;
|
return TWS_EAR_SIDE_ROLE;
|
||||||
#else
|
#else
|
||||||
|
@ -203,56 +239,42 @@ const IIR_CFG_T audio_eq_sw_iir_cfg = {
|
||||||
.gain0 = 0,
|
.gain0 = 0,
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 5,
|
.num = 5,
|
||||||
.param = {
|
.param = {{IIR_TYPE_PEAK, .0, 200, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 200, 2},
|
|
||||||
{IIR_TYPE_PEAK, .0, 600, 2},
|
{IIR_TYPE_PEAK, .0, 600, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 2000.0, 2},
|
{IIR_TYPE_PEAK, .0, 2000.0, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 6000.0, 2},
|
{IIR_TYPE_PEAK, .0, 6000.0, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 12000.0, 2}
|
{IIR_TYPE_PEAK, .0, 12000.0, 2}}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const audio_eq_sw_iir_cfg_list[EQ_SW_IIR_LIST_NUM]={
|
const IIR_CFG_T *const audio_eq_sw_iir_cfg_list[EQ_SW_IIR_LIST_NUM] = {
|
||||||
&audio_eq_sw_iir_cfg,
|
&audio_eq_sw_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_44p1k = {
|
const FIR_CFG_T audio_eq_hw_fir_cfg_44p1k = {.gain = 0.0f,
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_48k = {
|
const FIR_CFG_T audio_eq_hw_fir_cfg_48k = {.gain = 0.0f,
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const FIR_CFG_T audio_eq_hw_fir_cfg_96k = {.gain = 0.0f,
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_96k = {
|
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const FIR_CFG_T * const audio_eq_hw_fir_cfg_list[EQ_HW_FIR_LIST_NUM]={
|
const FIR_CFG_T *const audio_eq_hw_fir_cfg_list[EQ_HW_FIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_fir_cfg_44p1k,
|
&audio_eq_hw_fir_cfg_44p1k,
|
||||||
&audio_eq_hw_fir_cfg_48k,
|
&audio_eq_hw_fir_cfg_48k,
|
||||||
&audio_eq_hw_fir_cfg_96k,
|
&audio_eq_hw_fir_cfg_96k,
|
||||||
};
|
};
|
||||||
|
|
||||||
//hardware dac iir eq
|
// hardware dac iir eq
|
||||||
const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {
|
const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {.gain0 = 0,
|
||||||
.gain0 = 0,
|
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 8,
|
.num = 8,
|
||||||
.param = {
|
.param = {
|
||||||
|
@ -264,32 +286,29 @@ const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_dac_iir_cfg_list[EQ_HW_DAC_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_dac_iir_cfg_list[EQ_HW_DAC_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_dac_iir_cfg,
|
&audio_eq_hw_dac_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
//hardware dac iir eq
|
// hardware dac iir eq
|
||||||
const IIR_CFG_T audio_eq_hw_adc_iir_adc_cfg = {
|
const IIR_CFG_T audio_eq_hw_adc_iir_adc_cfg = {
|
||||||
.gain0 = 0,
|
.gain0 = 0,
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 1,
|
.num = 1,
|
||||||
.param = {
|
.param = {
|
||||||
{IIR_TYPE_PEAK, 0.0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0.0, 1000.0, 0.7},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_adc_iir_cfg_list[EQ_HW_ADC_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_adc_iir_cfg_list[EQ_HW_ADC_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_adc_iir_adc_cfg,
|
&audio_eq_hw_adc_iir_adc_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// hardware iir eq
|
||||||
|
const IIR_CFG_T audio_eq_hw_iir_cfg = {.gain0 = 0,
|
||||||
//hardware iir eq
|
|
||||||
const IIR_CFG_T audio_eq_hw_iir_cfg = {
|
|
||||||
.gain0 = 0,
|
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 8,
|
.num = 8,
|
||||||
.param = {
|
.param = {
|
||||||
|
@ -302,23 +321,21 @@ const IIR_CFG_T audio_eq_hw_iir_cfg = {
|
||||||
{IIR_TYPE_PEAK, -10.1, 7000.0, 7},
|
{IIR_TYPE_PEAK, -10.1, 7000.0, 7},
|
||||||
{IIR_TYPE_PEAK, -10.1, 9000.0, 7},
|
{IIR_TYPE_PEAK, -10.1, 9000.0, 7},
|
||||||
|
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_iir_cfg_list[EQ_HW_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_iir_cfg_list[EQ_HW_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_iir_cfg,
|
&audio_eq_hw_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DrcConfig audio_drc_cfg = {
|
const DrcConfig audio_drc_cfg = {.knee = 3,
|
||||||
.knee = 3,
|
|
||||||
.filter_type = {14, -1},
|
.filter_type = {14, -1},
|
||||||
.band_num = 2,
|
.band_num = 2,
|
||||||
.look_ahead_time = 10,
|
.look_ahead_time = 10,
|
||||||
.band_settings = {
|
.band_settings = {
|
||||||
{-20, 0, 2, 3, 3000, 1},
|
{-20, 0, 2, 3, 3000, 1},
|
||||||
{-20, 0, 2, 3, 3000, 1},
|
{-20, 0, 2, 3, 3000, 1},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const LimiterConfig audio_drc2_cfg = {
|
const LimiterConfig audio_drc2_cfg = {
|
||||||
.knee = 2,
|
.knee = 2,
|
||||||
|
@ -334,4 +351,3 @@ const SpectrumFixConfig audio_spectrum_cfg = {
|
||||||
.freq_num = 9,
|
.freq_num = 9,
|
||||||
.freq_list = {200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800},
|
.freq_list = {200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -14,186 +14,224 @@
|
||||||
*
|
*
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
#include "tgt_hardware.h"
|
#include "tgt_hardware.h"
|
||||||
#include "iir_process.h"
|
|
||||||
#include "fir_process.h"
|
|
||||||
#include "drc.h"
|
#include "drc.h"
|
||||||
|
#include "fir_process.h"
|
||||||
|
#include "iir_process.h"
|
||||||
#include "limiter.h"
|
#include "limiter.h"
|
||||||
#include "spectrum_fix.h"
|
#include "spectrum_fix.h"
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_pinmux_pwl[CFG_HW_PLW_NUM] = {
|
||||||
#if (CFG_HW_PLW_NUM > 0)
|
#if (CFG_HW_PLW_NUM > 0)
|
||||||
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
|
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef __APP_USE_LED_INDICATE_IBRT_STATUS__
|
#ifdef __APP_USE_LED_INDICATE_IBRT_STATUS__
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_ibrt_indication_pinmux_pwl[3] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_ibrt_indication_pinmux_pwl[3] = {
|
||||||
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT, HAL_IOMUX_PIN_PULLUP_ENABLE},
|
{HAL_IOMUX_PIN_LED1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
|
{HAL_IOMUX_PIN_LED2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VBAT,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __KNOWLES
|
#ifdef __KNOWLES
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_pinmux_uart[2] = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_pinmux_uart[2] = {
|
||||||
{HAL_IOMUX_PIN_P2_2, HAL_IOMUX_FUNC_UART2_RX, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
{HAL_IOMUX_PIN_P2_2, HAL_IOMUX_FUNC_UART2_RX, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_IOMUX_PIN_P2_3, HAL_IOMUX_FUNC_UART2_TX, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL},
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
|
{HAL_IOMUX_PIN_P2_3, HAL_IOMUX_FUNC_UART2_TX, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_NOPULL},
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
//adckey define
|
// adckey define
|
||||||
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
const uint16_t CFG_HW_ADCKEY_MAP_TABLE[CFG_HW_ADCKEY_NUMBER] = {
|
||||||
#if (CFG_HW_ADCKEY_NUMBER > 0)
|
#if (CFG_HW_ADCKEY_NUMBER > 0)
|
||||||
HAL_KEY_CODE_FN9,HAL_KEY_CODE_FN8,HAL_KEY_CODE_FN7,
|
HAL_KEY_CODE_FN9, HAL_KEY_CODE_FN8, HAL_KEY_CODE_FN7,
|
||||||
HAL_KEY_CODE_FN6,HAL_KEY_CODE_FN5,HAL_KEY_CODE_FN4,
|
HAL_KEY_CODE_FN6, HAL_KEY_CODE_FN5, HAL_KEY_CODE_FN4,
|
||||||
HAL_KEY_CODE_FN3,HAL_KEY_CODE_FN2,HAL_KEY_CODE_FN1,
|
HAL_KEY_CODE_FN3, HAL_KEY_CODE_FN2, HAL_KEY_CODE_FN1,
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//gpiokey define
|
// gpiokey define
|
||||||
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
|
#define CFG_HW_GPIOKEY_DOWN_LEVEL (0)
|
||||||
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
|
#define CFG_HW_GPIOKEY_UP_LEVEL (1)
|
||||||
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
const struct HAL_KEY_GPIOKEY_CFG_T cfg_hw_gpio_key_cfg[CFG_HW_GPIOKEY_NUM] = {
|
||||||
/*
|
/*
|
||||||
#if (CFG_HW_GPIOKEY_NUM > 0)
|
#if (CFG_HW_GPIOKEY_NUM > 0)
|
||||||
#ifdef BES_AUDIO_DEV_Main_Board_9v0
|
#ifdef BES_AUDIO_DEV_Main_Board_9v0
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P0_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P0_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN4,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
//{HAL_KEY_CODE_FN5,{HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P0_1, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
// {HAL_KEY_CODE_FN6,{HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
#else
|
{HAL_KEY_CODE_FN4,{HAL_IOMUX_PIN_P0_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
#ifndef TPORTS_KEY_COEXIST
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
//{HAL_KEY_CODE_FN5,{HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
// {HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
// {HAL_KEY_CODE_FN6,{HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #else #ifndef
|
||||||
#else
|
TPORTS_KEY_COEXIST {HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3,
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_PULLUP_ENABLE}}, {HAL_KEY_CODE_FN2,{HAL_IOMUX_PIN_P1_0,
|
||||||
#endif
|
HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
#endif
|
HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
#ifdef IS_MULTI_AI_ENABLED
|
// {HAL_KEY_CODE_FN3,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
//{HAL_KEY_CODE_FN13,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
//{HAL_KEY_CODE_FN14,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
#endif
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #else
|
||||||
#endif
|
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
*/
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
{HAL_KEY_CODE_FN1,{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
{HAL_KEY_CODE_FN15,{HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #endif #endif
|
||||||
|
#ifdef IS_MULTI_AI_ENABLED
|
||||||
|
//{HAL_KEY_CODE_FN13,{HAL_IOMUX_PIN_P1_3, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
|
//{HAL_KEY_CODE_FN14,{HAL_IOMUX_PIN_P1_2, HAL_IOMUX_FUNC_AS_GPIO,
|
||||||
|
HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE}}, #endif #endif
|
||||||
|
*/
|
||||||
|
{HAL_KEY_CODE_FN1,
|
||||||
|
{HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE}},
|
||||||
};
|
};
|
||||||
|
|
||||||
//bt config
|
// bt config
|
||||||
const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
const char *BT_LOCAL_NAME = TO_STRING(BT_DEV_NAME) "\0";
|
||||||
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
const char *BLE_DEFAULT_NAME = "BES_BLE";
|
||||||
uint8_t ble_addr[6] = {
|
uint8_t ble_addr[6] = {
|
||||||
#ifdef BLE_DEV_ADDR
|
#ifdef BLE_DEV_ADDR
|
||||||
BLE_DEV_ADDR
|
BLE_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0xBE,0x99,0x34,0x45,0x56,0x67
|
0xBE, 0x99, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
uint8_t bt_addr[6] = {
|
uint8_t bt_addr[6] = {
|
||||||
#ifdef BT_DEV_ADDR
|
#ifdef BT_DEV_ADDR
|
||||||
BT_DEV_ADDR
|
BT_DEV_ADDR
|
||||||
#else
|
#else
|
||||||
0x1e,0x57,0x34,0x45,0x56,0x67
|
0x1e, 0x57, 0x34, 0x45,
|
||||||
|
0x56, 0x67
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
//audio config
|
// audio config
|
||||||
//freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K], [12.5K:15K], [15K:17.5K], [17.5K:20K]}
|
// freq bands range {[0k:2.5K], [2.5k:5K], [5k:7.5K], [7.5K:10K], [10K:12.5K],
|
||||||
//gain range -12~+12
|
// [12.5K:15K], [15K:17.5K], [17.5K:20K]} gain range -12~+12
|
||||||
const int8_t cfg_aud_eq_sbc_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {0, 0, 0, 0, 0, 0, 0, 0};
|
const int8_t cfg_aud_eq_sbc_band_settings[CFG_HW_AUD_EQ_NUM_BANDS] = {
|
||||||
|
0, 0, 0, 0, 0, 0, 0, 0};
|
||||||
|
|
||||||
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
#define TX_PA_GAIN CODEC_TX_PA_GAIN_DEFAULT
|
||||||
|
|
||||||
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
const struct CODEC_DAC_VOL_T codec_dac_vol[TGT_VOLUME_LEVEL_QTY] = {
|
||||||
{TX_PA_GAIN,0x03,-21},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -99},
|
||||||
{TX_PA_GAIN,0x03,-99},
|
{TX_PA_GAIN, 0x03, -45}, {TX_PA_GAIN, 0x03, -42},
|
||||||
{TX_PA_GAIN,0x03,-45},
|
{TX_PA_GAIN, 0x03, -39}, {TX_PA_GAIN, 0x03, -36},
|
||||||
{TX_PA_GAIN,0x03,-42},
|
{TX_PA_GAIN, 0x03, -33}, {TX_PA_GAIN, 0x03, -30},
|
||||||
{TX_PA_GAIN,0x03,-39},
|
{TX_PA_GAIN, 0x03, -27}, {TX_PA_GAIN, 0x03, -24},
|
||||||
{TX_PA_GAIN,0x03,-36},
|
{TX_PA_GAIN, 0x03, -21}, {TX_PA_GAIN, 0x03, -18},
|
||||||
{TX_PA_GAIN,0x03,-33},
|
{TX_PA_GAIN, 0x03, -15}, {TX_PA_GAIN, 0x03, -12},
|
||||||
{TX_PA_GAIN,0x03,-30},
|
{TX_PA_GAIN, 0x03, -9}, {TX_PA_GAIN, 0x03, -6},
|
||||||
{TX_PA_GAIN,0x03,-27},
|
{TX_PA_GAIN, 0x03, -3}, {TX_PA_GAIN, 0x03, 0}, // 0dBm
|
||||||
{TX_PA_GAIN,0x03,-24},
|
|
||||||
{TX_PA_GAIN,0x03,-21},
|
|
||||||
{TX_PA_GAIN,0x03,-18},
|
|
||||||
{TX_PA_GAIN,0x03,-15},
|
|
||||||
{TX_PA_GAIN,0x03,-12},
|
|
||||||
{TX_PA_GAIN,0x03, -9},
|
|
||||||
{TX_PA_GAIN,0x03, -6},
|
|
||||||
{TX_PA_GAIN,0x03, -3},
|
|
||||||
{TX_PA_GAIN,0x03, 0}, //0dBm
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
#if SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 2
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC2|AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC2 | \
|
||||||
|
AUD_VMIC_MAP_VMIC3)
|
||||||
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
#elif SPEECH_CODEC_CAPTURE_CHANNEL_NUM == 3
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1 | AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1 | AUD_CHANNEL_MAP_CH4 | \
|
||||||
|
AUD_VMIC_MAP_VMIC1)
|
||||||
#else
|
#else
|
||||||
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV (AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
#define CFG_HW_AUD_INPUT_PATH_LINEIN_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH0 | AUD_CHANNEL_MAP_CH1)
|
||||||
#ifdef VOICE_DETECTOR_EN
|
#ifdef VOICE_DETECTOR_EN
|
||||||
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
#define CFG_HW_AUD_INPUT_PATH_VADMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC1)
|
||||||
#else
|
#else
|
||||||
#define CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV (AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
#define CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV \
|
||||||
|
(AUD_CHANNEL_MAP_CH4 | AUD_VMIC_MAP_VMIC3)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
const struct AUD_IO_PATH_CFG_T cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
const struct AUD_IO_PATH_CFG_T
|
||||||
|
cfg_audio_input_path_cfg[CFG_HW_AUD_INPUT_PATH_NUM] = {
|
||||||
#if defined(SPEECH_TX_AEC_CODEC_REF)
|
#if defined(SPEECH_TX_AEC_CODEC_REF)
|
||||||
// NOTE: If enable Ch5 and CH6, need to add channel_num when setup audioflinger stream
|
// NOTE: If enable Ch5 and CH6, need to add channel_num when setup
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV | AUD_CHANNEL_MAP_CH4, },
|
// audioflinger stream
|
||||||
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV | AUD_CHANNEL_MAP_CH4,
|
||||||
|
},
|
||||||
#else
|
#else
|
||||||
{ AUD_INPUT_PATH_MAINMIC, CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_MAINMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_MAINMIC_DEV,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
{ AUD_INPUT_PATH_LINEIN, CFG_HW_AUD_INPUT_PATH_LINEIN_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_LINEIN,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_LINEIN_DEV,
|
||||||
|
},
|
||||||
#ifdef VOICE_DETECTOR_EN
|
#ifdef VOICE_DETECTOR_EN
|
||||||
{ AUD_INPUT_PATH_VADMIC, CFG_HW_AUD_INPUT_PATH_VADMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_VADMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_VADMIC_DEV,
|
||||||
|
},
|
||||||
#else
|
#else
|
||||||
{ AUD_INPUT_PATH_ASRMIC, CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV, },
|
{
|
||||||
|
AUD_INPUT_PATH_ASRMIC,
|
||||||
|
CFG_HW_AUD_INPUT_PATH_ASRMIC_DEV,
|
||||||
|
},
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP MuteOutPwl ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP MuteOutPwl = {
|
||||||
HAL_IOMUX_PIN_P1_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_NOPULL
|
HAL_IOMUX_PIN_P1_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_NOPULL};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_enable_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_detecter_cfg = {
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP app_battery_ext_charger_indicator_cfg =
|
||||||
HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
{HAL_IOMUX_PIN_NUM, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_tws_channel_cfg = {
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP cfg_hw_tws_channel_cfg = {
|
||||||
HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE//HAL_IOMUX_PIN_P1_5 500:HAL_IOMUX_PIN_P2_5
|
HAL_IOMUX_PIN_P1_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE // HAL_IOMUX_PIN_P1_5
|
||||||
|
// 500:HAL_IOMUX_PIN_P2_5
|
||||||
};
|
};
|
||||||
/*
|
/*
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_INT ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_INT ={
|
||||||
HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P1_5, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
|
HAL_IOMUX_PIN_PULLUP_ENABLE
|
||||||
};
|
};
|
||||||
*/
|
*/
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SDA ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SDA = {
|
||||||
HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P2_1, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
|
|
||||||
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SCL ={
|
const struct HAL_IOMUX_PIN_FUNCTION_MAP TOUCH_I2C_SCL = {
|
||||||
HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO, HAL_IOMUX_PIN_PULLUP_ENABLE
|
HAL_IOMUX_PIN_P2_0, HAL_IOMUX_FUNC_AS_GPIO, HAL_IOMUX_PIN_VOLTAGE_VIO,
|
||||||
};
|
HAL_IOMUX_PIN_PULLUP_ENABLE};
|
||||||
bool tgt_tws_get_channel_is_right(void)
|
bool tgt_tws_get_channel_is_right(void) {
|
||||||
{
|
|
||||||
#ifdef __FIXED_TWS_EAR_SIDE__
|
#ifdef __FIXED_TWS_EAR_SIDE__
|
||||||
return TWS_EAR_SIDE_ROLE;
|
return TWS_EAR_SIDE_ROLE;
|
||||||
#else
|
#else
|
||||||
|
@ -205,56 +243,42 @@ const IIR_CFG_T audio_eq_sw_iir_cfg = {
|
||||||
.gain0 = 0,
|
.gain0 = 0,
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 5,
|
.num = 5,
|
||||||
.param = {
|
.param = {{IIR_TYPE_PEAK, .0, 200, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 200, 2},
|
|
||||||
{IIR_TYPE_PEAK, .0, 600, 2},
|
{IIR_TYPE_PEAK, .0, 600, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 2000.0, 2},
|
{IIR_TYPE_PEAK, .0, 2000.0, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 6000.0, 2},
|
{IIR_TYPE_PEAK, .0, 6000.0, 2},
|
||||||
{IIR_TYPE_PEAK, .0, 12000.0, 2}
|
{IIR_TYPE_PEAK, .0, 12000.0, 2}}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const audio_eq_sw_iir_cfg_list[EQ_SW_IIR_LIST_NUM]={
|
const IIR_CFG_T *const audio_eq_sw_iir_cfg_list[EQ_SW_IIR_LIST_NUM] = {
|
||||||
&audio_eq_sw_iir_cfg,
|
&audio_eq_sw_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_44p1k = {
|
const FIR_CFG_T audio_eq_hw_fir_cfg_44p1k = {.gain = 0.0f,
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_48k = {
|
const FIR_CFG_T audio_eq_hw_fir_cfg_48k = {.gain = 0.0f,
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
|
const FIR_CFG_T audio_eq_hw_fir_cfg_96k = {.gain = 0.0f,
|
||||||
const FIR_CFG_T audio_eq_hw_fir_cfg_96k = {
|
|
||||||
.gain = 0.0f,
|
|
||||||
.len = 384,
|
.len = 384,
|
||||||
.coef =
|
.coef = {
|
||||||
{
|
(1 << 23) - 1,
|
||||||
(1<<23)-1,
|
}};
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const FIR_CFG_T * const audio_eq_hw_fir_cfg_list[EQ_HW_FIR_LIST_NUM]={
|
const FIR_CFG_T *const audio_eq_hw_fir_cfg_list[EQ_HW_FIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_fir_cfg_44p1k,
|
&audio_eq_hw_fir_cfg_44p1k,
|
||||||
&audio_eq_hw_fir_cfg_48k,
|
&audio_eq_hw_fir_cfg_48k,
|
||||||
&audio_eq_hw_fir_cfg_96k,
|
&audio_eq_hw_fir_cfg_96k,
|
||||||
};
|
};
|
||||||
|
|
||||||
//hardware dac iir eq
|
// hardware dac iir eq
|
||||||
const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {
|
const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {.gain0 = 0,
|
||||||
.gain0 = 0,
|
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 8,
|
.num = 8,
|
||||||
.param = {
|
.param = {
|
||||||
|
@ -266,32 +290,29 @@ const IIR_CFG_T audio_eq_hw_dac_iir_cfg = {
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0, 1000.0, 0.7},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_dac_iir_cfg_list[EQ_HW_DAC_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_dac_iir_cfg_list[EQ_HW_DAC_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_dac_iir_cfg,
|
&audio_eq_hw_dac_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
//hardware dac iir eq
|
// hardware dac iir eq
|
||||||
const IIR_CFG_T audio_eq_hw_adc_iir_adc_cfg = {
|
const IIR_CFG_T audio_eq_hw_adc_iir_adc_cfg = {
|
||||||
.gain0 = 0,
|
.gain0 = 0,
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 1,
|
.num = 1,
|
||||||
.param = {
|
.param = {
|
||||||
{IIR_TYPE_PEAK, 0.0, 1000.0, 0.7},
|
{IIR_TYPE_PEAK, 0.0, 1000.0, 0.7},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_adc_iir_cfg_list[EQ_HW_ADC_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_adc_iir_cfg_list[EQ_HW_ADC_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_adc_iir_adc_cfg,
|
&audio_eq_hw_adc_iir_adc_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// hardware iir eq
|
||||||
|
const IIR_CFG_T audio_eq_hw_iir_cfg = {.gain0 = 0,
|
||||||
//hardware iir eq
|
|
||||||
const IIR_CFG_T audio_eq_hw_iir_cfg = {
|
|
||||||
.gain0 = 0,
|
|
||||||
.gain1 = 0,
|
.gain1 = 0,
|
||||||
.num = 8,
|
.num = 8,
|
||||||
.param = {
|
.param = {
|
||||||
|
@ -304,23 +325,21 @@ const IIR_CFG_T audio_eq_hw_iir_cfg = {
|
||||||
{IIR_TYPE_PEAK, -10.1, 7000.0, 7},
|
{IIR_TYPE_PEAK, -10.1, 7000.0, 7},
|
||||||
{IIR_TYPE_PEAK, -10.1, 9000.0, 7},
|
{IIR_TYPE_PEAK, -10.1, 9000.0, 7},
|
||||||
|
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const IIR_CFG_T * const POSSIBLY_UNUSED audio_eq_hw_iir_cfg_list[EQ_HW_IIR_LIST_NUM]={
|
const IIR_CFG_T *const POSSIBLY_UNUSED
|
||||||
|
audio_eq_hw_iir_cfg_list[EQ_HW_IIR_LIST_NUM] = {
|
||||||
&audio_eq_hw_iir_cfg,
|
&audio_eq_hw_iir_cfg,
|
||||||
};
|
};
|
||||||
|
|
||||||
const DrcConfig audio_drc_cfg = {
|
const DrcConfig audio_drc_cfg = {.knee = 3,
|
||||||
.knee = 3,
|
|
||||||
.filter_type = {14, -1},
|
.filter_type = {14, -1},
|
||||||
.band_num = 2,
|
.band_num = 2,
|
||||||
.look_ahead_time = 10,
|
.look_ahead_time = 10,
|
||||||
.band_settings = {
|
.band_settings = {
|
||||||
{-20, 0, 2, 3, 3000, 1},
|
{-20, 0, 2, 3, 3000, 1},
|
||||||
{-20, 0, 2, 3, 3000, 1},
|
{-20, 0, 2, 3, 3000, 1},
|
||||||
}
|
}};
|
||||||
};
|
|
||||||
|
|
||||||
const LimiterConfig audio_drc2_cfg = {
|
const LimiterConfig audio_drc2_cfg = {
|
||||||
.knee = 2,
|
.knee = 2,
|
||||||
|
@ -336,4 +355,3 @@ const SpectrumFixConfig audio_spectrum_cfg = {
|
||||||
.freq_num = 9,
|
.freq_num = 9,
|
||||||
.freq_list = {200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800},
|
.freq_list = {200, 400, 600, 800, 1000, 1200, 1400, 1600, 1800},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -60,20 +60,15 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_abs_f32(
|
void arm_abs_f32(const float32_t *pSrc, float32_t *pDst, uint32_t blockSize) {
|
||||||
const float32_t * pSrc,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute and store result in destination buffer. */
|
/* Calculate absolute and store result in destination buffer. */
|
||||||
|
@ -99,8 +94,7 @@ void arm_abs_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute and store result in destination buffer. */
|
/* Calculate absolute and store result in destination buffer. */
|
||||||
|
@ -109,7 +103,6 @@ void arm_abs_f32(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,53 +46,50 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
The Q15 value -1 (0x8000) will be saturated to the maximum allowable positive value 0x7FFF.
|
The Q15 value -1 (0x8000) will be saturated to the maximum
|
||||||
|
allowable positive value 0x7FFF.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_abs_q15(
|
void arm_abs_q15(const q15_t *pSrc, q15_t *pDst, uint32_t blockSize) {
|
||||||
const q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q15_t in; /* Temporary input variable */
|
q15_t in; /* Temporary input variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7fff) and store result in destination buffer. */
|
/* Calculate absolute of input (if -1 then saturated to 0x7fff) and store
|
||||||
|
* result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q15_t)0x8000) ? 0x7fff : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q15_t)0x8000) ? 0x7fff : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q15_t)0x8000) ? 0x7fff : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q15_t)0x8000) ? 0x7fff : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -109,22 +106,21 @@ void arm_abs_q15(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7fff) and store result in destination buffer. */
|
/* Calculate absolute of input (if -1 then saturated to 0x7fff) and store
|
||||||
|
* result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
*pDst++ = (in > 0) ? in : (q15_t)__QSUB16(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q15_t) 0x8000) ? 0x7fff : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q15_t)0x8000) ? 0x7fff : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,50 +46,47 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
The Q31 value -1 (0x80000000) will be saturated to the maximum allowable positive value 0x7FFFFFFF.
|
The Q31 value -1 (0x80000000) will be saturated to the
|
||||||
|
maximum allowable positive value 0x7FFFFFFF.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_abs_q31(
|
void arm_abs_q31(const q31_t *pSrc, q31_t *pDst, uint32_t blockSize) {
|
||||||
const q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q31_t in; /* Temporary variable */
|
q31_t in; /* Temporary variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and store result in destination buffer. */
|
/* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and
|
||||||
|
* store result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
||||||
|
@ -109,13 +106,13 @@ void arm_abs_q31(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and store result in destination buffer. */
|
/* Calculate absolute of input (if -1 then saturated to 0x7fffffff) and
|
||||||
|
* store result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q31_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
*pDst++ = (in > 0) ? in : ((in == INT32_MIN) ? INT32_MAX : -in);
|
||||||
|
@ -124,7 +121,6 @@ void arm_abs_q31(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -48,53 +48,50 @@
|
||||||
Input and output buffers should be aligned by 32-bit
|
Input and output buffers should be aligned by 32-bit
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
The Q7 value -1 (0x80) will be saturated to the maximum allowable positive value 0x7F.
|
The Q7 value -1 (0x80) will be saturated to the maximum
|
||||||
|
allowable positive value 0x7F.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_abs_q7(
|
void arm_abs_q7(const q7_t *pSrc, q7_t *pDst, uint32_t blockSize) {
|
||||||
const q7_t * pSrc,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q7_t in; /* Temporary input variable */
|
q7_t in; /* Temporary input variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7f) and store result in destination buffer. */
|
/* Calculate absolute of input (if -1 then saturated to 0x7f) and store
|
||||||
|
* result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q7_t)0x80) ? (q7_t)0x7f : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q7_t)0x80) ? (q7_t)0x7f : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q7_t)0x80) ? (q7_t)0x7f : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q7_t)0x80) ? (q7_t)0x7f : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -111,22 +108,21 @@ void arm_abs_q7(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = |A| */
|
/* C = |A| */
|
||||||
|
|
||||||
/* Calculate absolute of input (if -1 then saturated to 0x7f) and store result in destination buffer. */
|
/* Calculate absolute of input (if -1 then saturated to 0x7f) and store
|
||||||
|
* result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (in > 0) ? in : (q7_t) __QSUB(0, in);
|
*pDst++ = (in > 0) ? in : (q7_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in > 0) ? in : ((in == (q7_t) 0x80) ? (q7_t) 0x7f : -in);
|
*pDst++ = (in > 0) ? in : ((in == (q7_t)0x80) ? (q7_t)0x7f : -in);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -58,21 +58,16 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_add_f32(
|
void arm_add_f32(const float32_t *pSrcA, const float32_t *pSrcB,
|
||||||
const float32_t * pSrcA,
|
float32_t *pDst, uint32_t blockSize) {
|
||||||
const float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
/* Add and store result in destination buffer. */
|
/* Add and store result in destination buffer. */
|
||||||
|
@ -95,8 +90,7 @@ void arm_add_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
/* Add and store result in destination buffer. */
|
/* Add and store result in destination buffer. */
|
||||||
|
@ -105,7 +99,6 @@ void arm_add_f32(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,20 +47,17 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
|
Results outside of the allowable Q15 range [0x8000 0x7FFF]
|
||||||
|
are saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_add_q15(
|
void arm_add_q15(const q15_t *pSrcA, const q15_t *pSrcB, q15_t *pDst,
|
||||||
const q15_t * pSrcA,
|
uint32_t blockSize) {
|
||||||
const q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t inA1, inA2;
|
q31_t inA1, inA2;
|
||||||
q31_t inB1, inB2;
|
q31_t inB1, inB2;
|
||||||
#endif
|
#endif
|
||||||
|
@ -68,26 +65,25 @@ void arm_add_q15(
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* read 2 times 2 samples at a time from sourceA */
|
/* read 2 times 2 samples at a time from sourceA */
|
||||||
inA1 = read_q15x2_ia ((q15_t **) &pSrcA);
|
inA1 = read_q15x2_ia((q15_t **)&pSrcA);
|
||||||
inA2 = read_q15x2_ia ((q15_t **) &pSrcA);
|
inA2 = read_q15x2_ia((q15_t **)&pSrcA);
|
||||||
/* read 2 times 2 samples at a time from sourceB */
|
/* read 2 times 2 samples at a time from sourceB */
|
||||||
inB1 = read_q15x2_ia ((q15_t **) &pSrcB);
|
inB1 = read_q15x2_ia((q15_t **)&pSrcB);
|
||||||
inB2 = read_q15x2_ia ((q15_t **) &pSrcB);
|
inB2 = read_q15x2_ia((q15_t **)&pSrcB);
|
||||||
|
|
||||||
/* Add and store 2 times 2 samples at a time */
|
/* Add and store 2 times 2 samples at a time */
|
||||||
write_q15x2_ia (&pDst, __QADD16(inA1, inB1));
|
write_q15x2_ia(&pDst, __QADD16(inA1, inB1));
|
||||||
write_q15x2_ia (&pDst, __QADD16(inA2, inB2));
|
write_q15x2_ia(&pDst, __QADD16(inA2, inB2));
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrcA++ + *pSrcB++), 16);
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrcA++ + *pSrcB++), 16);
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrcA++ + *pSrcB++), 16);
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrcA++ + *pSrcB++), 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -104,21 +100,19 @@ void arm_add_q15(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
/* Add and store result in destination buffer. */
|
/* Add and store result in destination buffer. */
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (q15_t) __QADD16(*pSrcA++, *pSrcB++);
|
*pDst++ = (q15_t)__QADD16(*pSrcA++, *pSrcB++);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrcA++ + *pSrcB++), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrcA++ + *pSrcB++), 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,24 +47,20 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
|
Results outside of the allowable Q31 range [0x80000000
|
||||||
|
0x7FFFFFFF] are saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_add_q31(
|
void arm_add_q31(const q31_t *pSrcA, const q31_t *pSrcB, q31_t *pDst,
|
||||||
const q31_t * pSrcA,
|
uint32_t blockSize) {
|
||||||
const q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
/* Add and store result in destination buffer. */
|
/* Add and store result in destination buffer. */
|
||||||
|
@ -90,8 +86,7 @@ void arm_add_q31(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
/* Add and store result in destination buffer. */
|
/* Add and store result in destination buffer. */
|
||||||
|
@ -100,7 +95,6 @@ void arm_add_q31(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,34 +47,31 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
|
Results outside of the allowable Q7 range [0x80 0x7F] are
|
||||||
|
saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_add_q7(
|
void arm_add_q7(const q7_t *pSrcA, const q7_t *pSrcB, q7_t *pDst,
|
||||||
const q7_t * pSrcA,
|
uint32_t blockSize) {
|
||||||
const q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Add and store result in destination buffer (4 samples at a time). */
|
/* Add and store result in destination buffer (4 samples at a time). */
|
||||||
write_q7x4_ia (&pDst, __QADD8 (read_q7x4_ia ((q7_t **) &pSrcA), read_q7x4_ia ((q7_t **) &pSrcB)));
|
write_q7x4_ia(&pDst, __QADD8(read_q7x4_ia((q7_t **)&pSrcA),
|
||||||
|
read_q7x4_ia((q7_t **)&pSrcB)));
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8);
|
*pDst++ = (q7_t)__SSAT((q15_t)*pSrcA++ + *pSrcB++, 8);
|
||||||
*pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8);
|
*pDst++ = (q7_t)__SSAT((q15_t)*pSrcA++ + *pSrcB++, 8);
|
||||||
*pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8);
|
*pDst++ = (q7_t)__SSAT((q15_t)*pSrcA++ + *pSrcB++, 8);
|
||||||
*pDst++ = (q7_t) __SSAT ((q15_t) *pSrcA++ + *pSrcB++, 8);
|
*pDst++ = (q7_t)__SSAT((q15_t)*pSrcA++ + *pSrcB++, 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -91,17 +88,15 @@ void arm_add_q7(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + B */
|
/* C = A + B */
|
||||||
|
|
||||||
/* Add and store result in destination buffer. */
|
/* Add and store result in destination buffer. */
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) *pSrcA++ + *pSrcB++, 8);
|
*pDst++ = (q7_t)__SSAT((q15_t)*pSrcA++ + *pSrcB++, 8);
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -39,7 +39,8 @@
|
||||||
The vectors are multiplied element-by-element and then summed.
|
The vectors are multiplied element-by-element and then summed.
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... + pSrcA[blockSize-1]*pSrcB[blockSize-1]
|
sum = pSrcA[0]*pSrcB[0] + pSrcA[1]*pSrcB[1] + ... +
|
||||||
|
pSrcA[blockSize-1]*pSrcB[blockSize-1]
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
There are separate functions for floating-point, Q7, Q15, and Q31 data types.
|
||||||
|
@ -59,23 +60,19 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_dot_prod_f32(
|
void arm_dot_prod_f32(const float32_t *pSrcA, const float32_t *pSrcB,
|
||||||
const float32_t * pSrcA,
|
uint32_t blockSize, float32_t *result) {
|
||||||
const float32_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
float32_t * result)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
float32_t sum = 0.0f; /* Temporary return variable */
|
float32_t sum = 0.0f; /* Temporary return variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
sum += (*pSrcA++) * (*pSrcB++);
|
||||||
|
@ -100,9 +97,9 @@ void arm_dot_prod_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
sum += (*pSrcA++) * (*pSrcB++);
|
sum += (*pSrcA++) * (*pSrcB++);
|
||||||
|
|
|
@ -46,40 +46,38 @@
|
||||||
@return none
|
@return none
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The intermediate multiplications are in 1.15 x 1.15 = 2.30 format and these
|
The intermediate multiplications are in 1.15 x 1.15 = 2.30
|
||||||
results are added to a 64-bit accumulator in 34.30 format.
|
format and these results are added to a 64-bit accumulator in 34.30 format.
|
||||||
Nonsaturating additions are used and given that there are 33 guard bits in the accumulator
|
Nonsaturating additions are used and given that there are 33
|
||||||
there is no risk of overflow.
|
guard bits in the accumulator there is no risk of overflow. The return result
|
||||||
The return result is in 34.30 format.
|
is in 34.30 format.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_dot_prod_q15(
|
void arm_dot_prod_q15(const q15_t *pSrcA, const q15_t *pSrcB,
|
||||||
const q15_t * pSrcA,
|
uint32_t blockSize, q63_t *result) {
|
||||||
const q15_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q63_t * result)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q63_t sum = 0; /* Temporary return variable */
|
q63_t sum = 0; /* Temporary return variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
sum = __SMLALD(read_q15x2_ia ((q15_t **) &pSrcA), read_q15x2_ia ((q15_t **) &pSrcB), sum);
|
sum = __SMLALD(read_q15x2_ia((q15_t **)&pSrcA),
|
||||||
sum = __SMLALD(read_q15x2_ia ((q15_t **) &pSrcA), read_q15x2_ia ((q15_t **) &pSrcB), sum);
|
read_q15x2_ia((q15_t **)&pSrcB), sum);
|
||||||
|
sum = __SMLALD(read_q15x2_ia((q15_t **)&pSrcA),
|
||||||
|
read_q15x2_ia((q15_t **)&pSrcB), sum);
|
||||||
#else
|
#else
|
||||||
sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++);
|
sum += (q63_t)((q31_t)*pSrcA++ * *pSrcB++);
|
||||||
sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++);
|
sum += (q63_t)((q31_t)*pSrcA++ * *pSrcB++);
|
||||||
sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++);
|
sum += (q63_t)((q31_t)*pSrcA++ * *pSrcB++);
|
||||||
sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++);
|
sum += (q63_t)((q31_t)*pSrcA++ * *pSrcB++);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -96,16 +94,16 @@ void arm_dot_prod_q15(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
//#if defined (ARM_MATH_DSP)
|
//#if defined (ARM_MATH_DSP)
|
||||||
// sum = __SMLALD(*pSrcA++, *pSrcB++, sum);
|
// sum = __SMLALD(*pSrcA++, *pSrcB++, sum);
|
||||||
//#else
|
//#else
|
||||||
sum += (q63_t)((q31_t) *pSrcA++ * *pSrcB++);
|
sum += (q63_t)((q31_t)*pSrcA++ * *pSrcB++);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
|
|
|
@ -46,40 +46,36 @@
|
||||||
@return none
|
@return none
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The intermediate multiplications are in 1.31 x 1.31 = 2.62 format and these
|
The intermediate multiplications are in 1.31 x 1.31 = 2.62
|
||||||
are truncated to 2.48 format by discarding the lower 14 bits.
|
format and these are truncated to 2.48 format by discarding the lower 14 bits.
|
||||||
The 2.48 result is then added without saturation to a 64-bit accumulator in 16.48 format.
|
The 2.48 result is then added without saturation to a 64-bit
|
||||||
There are 15 guard bits in the accumulator and there is no risk of overflow as long as
|
accumulator in 16.48 format. There are 15 guard bits in the accumulator and
|
||||||
the length of the vectors is less than 2^16 elements.
|
there is no risk of overflow as long as the length of the vectors is less than
|
||||||
The return result is in 16.48 format.
|
2^16 elements. The return result is in 16.48 format.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_dot_prod_q31(
|
void arm_dot_prod_q31(const q31_t *pSrcA, const q31_t *pSrcB,
|
||||||
const q31_t * pSrcA,
|
uint32_t blockSize, q63_t *result) {
|
||||||
const q31_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q63_t * result)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q63_t sum = 0; /* Temporary return variable */
|
q63_t sum = 0; /* Temporary return variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U;
|
sum += ((q63_t)*pSrcA++ * *pSrcB++) >> 14U;
|
||||||
|
|
||||||
sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U;
|
sum += ((q63_t)*pSrcA++ * *pSrcB++) >> 14U;
|
||||||
|
|
||||||
sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U;
|
sum += ((q63_t)*pSrcA++ * *pSrcB++) >> 14U;
|
||||||
|
|
||||||
sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U;
|
sum += ((q63_t)*pSrcA++ * *pSrcB++) >> 14U;
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
|
@ -95,12 +91,12 @@ void arm_dot_prod_q31(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
sum += ((q63_t) *pSrcA++ * *pSrcB++) >> 14U;
|
sum += ((q63_t)*pSrcA++ * *pSrcB++) >> 14U;
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
|
|
|
@ -46,25 +46,21 @@
|
||||||
@return none
|
@return none
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The intermediate multiplications are in 1.7 x 1.7 = 2.14 format and these
|
The intermediate multiplications are in 1.7 x 1.7 = 2.14
|
||||||
results are added to an accumulator in 18.14 format.
|
format and these results are added to an accumulator in 18.14 format.
|
||||||
Nonsaturating additions are used and there is no danger of wrap around as long as
|
Nonsaturating additions are used and there is no danger of
|
||||||
the vectors are less than 2^18 elements long.
|
wrap around as long as the vectors are less than 2^18 elements long. The
|
||||||
The return result is in 18.14 format.
|
return result is in 18.14 format.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_dot_prod_q7(
|
void arm_dot_prod_q7(const q7_t *pSrcA, const q7_t *pSrcB, uint32_t blockSize,
|
||||||
const q7_t * pSrcA,
|
q31_t *result) {
|
||||||
const q7_t * pSrcB,
|
|
||||||
uint32_t blockSize,
|
|
||||||
q31_t * result)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q31_t sum = 0; /* Temporary return variable */
|
q31_t sum = 0; /* Temporary return variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t input1, input2; /* Temporary variables */
|
q31_t input1, input2; /* Temporary variables */
|
||||||
q31_t inA1, inA2, inB1, inB2; /* Temporary variables */
|
q31_t inA1, inA2, inB1, inB2; /* Temporary variables */
|
||||||
#endif
|
#endif
|
||||||
|
@ -72,15 +68,15 @@ void arm_dot_prod_q7(
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* read 4 samples at a time from sourceA */
|
/* read 4 samples at a time from sourceA */
|
||||||
input1 = read_q7x4_ia ((q7_t **) &pSrcA);
|
input1 = read_q7x4_ia((q7_t **)&pSrcA);
|
||||||
/* read 4 samples at a time from sourceB */
|
/* read 4 samples at a time from sourceB */
|
||||||
input2 = read_q7x4_ia ((q7_t **) &pSrcB);
|
input2 = read_q7x4_ia((q7_t **)&pSrcB);
|
||||||
|
|
||||||
/* extract two q7_t samples to q15_t samples */
|
/* extract two q7_t samples to q15_t samples */
|
||||||
inA1 = __SXTB16(__ROR(input1, 8));
|
inA1 = __SXTB16(__ROR(input1, 8));
|
||||||
|
@ -95,10 +91,10 @@ void arm_dot_prod_q7(
|
||||||
sum = __SMLAD(inA1, inB1, sum);
|
sum = __SMLAD(inA1, inB1, sum);
|
||||||
sum = __SMLAD(inA2, inB2, sum);
|
sum = __SMLAD(inA2, inB2, sum);
|
||||||
#else
|
#else
|
||||||
sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++);
|
sum += (q31_t)((q15_t)*pSrcA++ * *pSrcB++);
|
||||||
sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++);
|
sum += (q31_t)((q15_t)*pSrcA++ * *pSrcB++);
|
||||||
sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++);
|
sum += (q31_t)((q15_t)*pSrcA++ * *pSrcB++);
|
||||||
sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++);
|
sum += (q31_t)((q15_t)*pSrcA++ * *pSrcB++);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -115,16 +111,16 @@ void arm_dot_prod_q7(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]*
|
||||||
/* C = A[0]* B[0] + A[1]* B[1] + A[2]* B[2] + .....+ A[blockSize-1]* B[blockSize-1] */
|
* B[blockSize-1] */
|
||||||
|
|
||||||
/* Calculate dot product and store result in a temporary buffer. */
|
/* Calculate dot product and store result in a temporary buffer. */
|
||||||
//#if defined (ARM_MATH_DSP)
|
//#if defined (ARM_MATH_DSP)
|
||||||
// sum = __SMLAD(*pSrcA++, *pSrcB++, sum);
|
// sum = __SMLAD(*pSrcA++, *pSrcB++, sum);
|
||||||
//#else
|
//#else
|
||||||
sum += (q31_t) ((q15_t) *pSrcA++ * *pSrcB++);
|
sum += (q31_t)((q15_t)*pSrcA++ * *pSrcB++);
|
||||||
//#endif
|
//#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
|
|
|
@ -58,21 +58,16 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_mult_f32(
|
void arm_mult_f32(const float32_t *pSrcA, const float32_t *pSrcB,
|
||||||
const float32_t * pSrcA,
|
float32_t *pDst, uint32_t blockSize) {
|
||||||
const float32_t * pSrcB,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
/* Multiply inputs and store result in destination buffer. */
|
/* Multiply inputs and store result in destination buffer. */
|
||||||
|
@ -98,8 +93,7 @@ void arm_mult_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
/* Multiply input and store result in destination buffer. */
|
/* Multiply input and store result in destination buffer. */
|
||||||
|
@ -108,7 +102,6 @@ void arm_mult_f32(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,20 +47,17 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
|
Results outside of the allowable Q15 range [0x8000 0x7FFF]
|
||||||
|
are saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_mult_q15(
|
void arm_mult_q15(const q15_t *pSrcA, const q15_t *pSrcB, q15_t *pDst,
|
||||||
const q15_t * pSrcA,
|
uint32_t blockSize) {
|
||||||
const q15_t * pSrcB,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t inA1, inA2, inB1, inB2; /* Temporary input variables */
|
q31_t inA1, inA2, inB1, inB2; /* Temporary input variables */
|
||||||
q15_t out1, out2, out3, out4; /* Temporary output variables */
|
q15_t out1, out2, out3, out4; /* Temporary output variables */
|
||||||
q31_t mul1, mul2, mul3, mul4; /* Temporary variables */
|
q31_t mul1, mul2, mul3, mul4; /* Temporary variables */
|
||||||
|
@ -69,46 +66,45 @@ void arm_mult_q15(
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* read 2 samples at a time from sourceA */
|
/* read 2 samples at a time from sourceA */
|
||||||
inA1 = read_q15x2_ia ((q15_t **) &pSrcA);
|
inA1 = read_q15x2_ia((q15_t **)&pSrcA);
|
||||||
/* read 2 samples at a time from sourceB */
|
/* read 2 samples at a time from sourceB */
|
||||||
inB1 = read_q15x2_ia ((q15_t **) &pSrcB);
|
inB1 = read_q15x2_ia((q15_t **)&pSrcB);
|
||||||
/* read 2 samples at a time from sourceA */
|
/* read 2 samples at a time from sourceA */
|
||||||
inA2 = read_q15x2_ia ((q15_t **) &pSrcA);
|
inA2 = read_q15x2_ia((q15_t **)&pSrcA);
|
||||||
/* read 2 samples at a time from sourceB */
|
/* read 2 samples at a time from sourceB */
|
||||||
inB2 = read_q15x2_ia ((q15_t **) &pSrcB);
|
inB2 = read_q15x2_ia((q15_t **)&pSrcB);
|
||||||
|
|
||||||
/* multiply mul = sourceA * sourceB */
|
/* multiply mul = sourceA * sourceB */
|
||||||
mul1 = (q31_t) ((q15_t) (inA1 >> 16) * (q15_t) (inB1 >> 16));
|
mul1 = (q31_t)((q15_t)(inA1 >> 16) * (q15_t)(inB1 >> 16));
|
||||||
mul2 = (q31_t) ((q15_t) (inA1 ) * (q15_t) (inB1 ));
|
mul2 = (q31_t)((q15_t)(inA1) * (q15_t)(inB1));
|
||||||
mul3 = (q31_t) ((q15_t) (inA2 >> 16) * (q15_t) (inB2 >> 16));
|
mul3 = (q31_t)((q15_t)(inA2 >> 16) * (q15_t)(inB2 >> 16));
|
||||||
mul4 = (q31_t) ((q15_t) (inA2 ) * (q15_t) (inB2 ));
|
mul4 = (q31_t)((q15_t)(inA2) * (q15_t)(inB2));
|
||||||
|
|
||||||
/* saturate result to 16 bit */
|
/* saturate result to 16 bit */
|
||||||
out1 = (q15_t) __SSAT(mul1 >> 15, 16);
|
out1 = (q15_t)__SSAT(mul1 >> 15, 16);
|
||||||
out2 = (q15_t) __SSAT(mul2 >> 15, 16);
|
out2 = (q15_t)__SSAT(mul2 >> 15, 16);
|
||||||
out3 = (q15_t) __SSAT(mul3 >> 15, 16);
|
out3 = (q15_t)__SSAT(mul3 >> 15, 16);
|
||||||
out4 = (q15_t) __SSAT(mul4 >> 15, 16);
|
out4 = (q15_t)__SSAT(mul4 >> 15, 16);
|
||||||
|
|
||||||
/* store result to destination */
|
/* store result to destination */
|
||||||
#ifndef ARM_MATH_BIG_ENDIAN
|
#ifndef ARM_MATH_BIG_ENDIAN
|
||||||
write_q15x2_ia (&pDst, __PKHBT(out2, out1, 16));
|
write_q15x2_ia(&pDst, __PKHBT(out2, out1, 16));
|
||||||
write_q15x2_ia (&pDst, __PKHBT(out4, out3, 16));
|
write_q15x2_ia(&pDst, __PKHBT(out4, out3, 16));
|
||||||
#else
|
#else
|
||||||
write_q15x2_ia (&pDst, __PKHBT(out1, out2, 16));
|
write_q15x2_ia(&pDst, __PKHBT(out1, out2, 16));
|
||||||
write_q15x2_ia (&pDst, __PKHBT(out3, out4, 16));
|
write_q15x2_ia(&pDst, __PKHBT(out3, out4, 16));
|
||||||
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
#endif /* #ifndef ARM_MATH_BIG_ENDIAN */
|
||||||
|
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
*pDst++ = (q15_t)__SSAT((((q31_t)(*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
*pDst++ = (q15_t)__SSAT((((q31_t)(*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
*pDst++ = (q15_t)__SSAT((((q31_t)(*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
*pDst++ = (q15_t)__SSAT((((q31_t)(*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -125,17 +121,15 @@ void arm_mult_q15(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
/* Multiply inputs and store result in destination buffer. */
|
/* Multiply inputs and store result in destination buffer. */
|
||||||
*pDst++ = (q15_t) __SSAT((((q31_t) (*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
*pDst++ = (q15_t)__SSAT((((q31_t)(*pSrcA++) * (*pSrcB++)) >> 15), 16);
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,41 +47,37 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q31 range[0x80000000 0x7FFFFFFF] are saturated.
|
Results outside of the allowable Q31 range[0x80000000
|
||||||
|
0x7FFFFFFF] are saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_mult_q31(
|
void arm_mult_q31(const q31_t *pSrcA, const q31_t *pSrcB, q31_t *pDst,
|
||||||
const q31_t * pSrcA,
|
uint32_t blockSize) {
|
||||||
const q31_t * pSrcB,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q31_t out; /* Temporary output variable */
|
q31_t out; /* Temporary output variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
/* Multiply inputs and store result in destination buffer. */
|
/* Multiply inputs and store result in destination buffer. */
|
||||||
out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32;
|
out = ((q63_t)*pSrcA++ * *pSrcB++) >> 32;
|
||||||
out = __SSAT(out, 31);
|
out = __SSAT(out, 31);
|
||||||
*pDst++ = out << 1U;
|
*pDst++ = out << 1U;
|
||||||
|
|
||||||
out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32;
|
out = ((q63_t)*pSrcA++ * *pSrcB++) >> 32;
|
||||||
out = __SSAT(out, 31);
|
out = __SSAT(out, 31);
|
||||||
*pDst++ = out << 1U;
|
*pDst++ = out << 1U;
|
||||||
|
|
||||||
out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32;
|
out = ((q63_t)*pSrcA++ * *pSrcB++) >> 32;
|
||||||
out = __SSAT(out, 31);
|
out = __SSAT(out, 31);
|
||||||
*pDst++ = out << 1U;
|
*pDst++ = out << 1U;
|
||||||
|
|
||||||
out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32;
|
out = ((q63_t)*pSrcA++ * *pSrcB++) >> 32;
|
||||||
out = __SSAT(out, 31);
|
out = __SSAT(out, 31);
|
||||||
*pDst++ = out << 1U;
|
*pDst++ = out << 1U;
|
||||||
|
|
||||||
|
@ -99,19 +95,17 @@ void arm_mult_q31(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
/* Multiply inputs and store result in destination buffer. */
|
/* Multiply inputs and store result in destination buffer. */
|
||||||
out = ((q63_t) *pSrcA++ * *pSrcB++) >> 32;
|
out = ((q63_t)*pSrcA++ * *pSrcB++) >> 32;
|
||||||
out = __SSAT(out, 31);
|
out = __SSAT(out, 31);
|
||||||
*pDst++ = out << 1U;
|
*pDst++ = out << 1U;
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,44 +47,40 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
|
Results outside of the allowable Q7 range [0x80 0x7F] are
|
||||||
|
saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_mult_q7(
|
void arm_mult_q7(const q7_t *pSrcA, const q7_t *pSrcB, q7_t *pDst,
|
||||||
const q7_t * pSrcA,
|
uint32_t blockSize) {
|
||||||
const q7_t * pSrcB,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q7_t out1, out2, out3, out4; /* Temporary output variables */
|
q7_t out1, out2, out3, out4; /* Temporary output variables */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Multiply inputs and store results in temporary variables */
|
/* Multiply inputs and store results in temporary variables */
|
||||||
out1 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
out1 = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
out2 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
out2 = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
out3 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
out3 = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
out4 = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
out4 = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
|
|
||||||
/* Pack and store result in destination buffer (in single write) */
|
/* Pack and store result in destination buffer (in single write) */
|
||||||
write_q7x4_ia (&pDst, __PACKq7(out1, out2, out3, out4));
|
write_q7x4_ia(&pDst, __PACKq7(out1, out2, out3, out4));
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
*pDst++ = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
*pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
*pDst++ = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
*pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
*pDst++ = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
*pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
*pDst++ = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -101,17 +97,15 @@ void arm_mult_q7(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * B */
|
/* C = A * B */
|
||||||
|
|
||||||
/* Multiply input and store result in destination buffer. */
|
/* Multiply input and store result in destination buffer. */
|
||||||
*pDst++ = (q7_t) __SSAT((((q15_t) (*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
*pDst++ = (q7_t)__SSAT((((q15_t)(*pSrcA++) * (*pSrcB++)) >> 7), 8);
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -59,20 +59,16 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_negate_f32(
|
void arm_negate_f32(const float32_t *pSrc, float32_t *pDst,
|
||||||
const float32_t * pSrc,
|
uint32_t blockSize) {
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
/* Negate and store result in destination buffer. */
|
/* Negate and store result in destination buffer. */
|
||||||
|
@ -98,8 +94,7 @@ void arm_negate_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
/* Negate and store result in destination buffer. */
|
/* Negate and store result in destination buffer. */
|
||||||
|
@ -108,7 +103,6 @@ void arm_negate_f32(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -48,49 +48,45 @@
|
||||||
Input and output buffers should be aligned by 32-bit
|
Input and output buffers should be aligned by 32-bit
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
The Q15 value -1 (0x8000) is saturated to the maximum allowable positive value 0x7FFF.
|
The Q15 value -1 (0x8000) is saturated to the maximum
|
||||||
|
allowable positive value 0x7FFF.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_negate_q15(
|
void arm_negate_q15(const q15_t *pSrc, q15_t *pDst, uint32_t blockSize) {
|
||||||
const q15_t * pSrc,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q15_t in; /* Temporary input variable */
|
q15_t in; /* Temporary input variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t in1; /* Temporary input variables */
|
q31_t in1; /* Temporary input variables */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Negate and store result in destination buffer (2 samples at a time). */
|
/* Negate and store result in destination buffer (2 samples at a time). */
|
||||||
in1 = read_q15x2_ia ((q15_t **) &pSrc);
|
in1 = read_q15x2_ia((q15_t **)&pSrc);
|
||||||
write_q15x2_ia (&pDst, __QSUB16(0, in1));
|
write_q15x2_ia(&pDst, __QSUB16(0, in1));
|
||||||
|
|
||||||
in1 = read_q15x2_ia ((q15_t **) &pSrc);
|
in1 = read_q15x2_ia((q15_t **)&pSrc);
|
||||||
write_q15x2_ia (&pDst, __QSUB16(0, in1));
|
write_q15x2_ia(&pDst, __QSUB16(0, in1));
|
||||||
#else
|
#else
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in;
|
*pDst++ = (in == (q15_t)0x8000) ? (q15_t)0x7fff : -in;
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in;
|
*pDst++ = (in == (q15_t)0x8000) ? (q15_t)0x7fff : -in;
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in;
|
*pDst++ = (in == (q15_t)0x8000) ? (q15_t)0x7fff : -in;
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in;
|
*pDst++ = (in == (q15_t)0x8000) ? (q15_t)0x7fff : -in;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -107,18 +103,16 @@ void arm_negate_q15(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
/* Negate and store result in destination buffer. */
|
/* Negate and store result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q15_t) 0x8000) ? (q15_t) 0x7fff : -in;
|
*pDst++ = (in == (q15_t)0x8000) ? (q15_t)0x7fff : -in;
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,50 +46,46 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
The Q31 value -1 (0x80000000) is saturated to the maximum allowable positive value 0x7FFFFFFF.
|
The Q31 value -1 (0x80000000) is saturated to the maximum
|
||||||
|
allowable positive value 0x7FFFFFFF.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_negate_q31(
|
void arm_negate_q31(const q31_t *pSrc, q31_t *pDst, uint32_t blockSize) {
|
||||||
const q31_t * pSrc,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q31_t in; /* Temporary input variable */
|
q31_t in; /* Temporary input variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
/* Negate and store result in destination buffer. */
|
/* Negate and store result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QSUB(0, in);
|
*pDst++ = __QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QSUB(0, in);
|
*pDst++ = __QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QSUB(0, in);
|
*pDst++ = __QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QSUB(0, in);
|
*pDst++ = __QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
||||||
|
@ -109,13 +105,12 @@ void arm_negate_q31(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
/* Negate and store result in destination buffer. */
|
/* Negate and store result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QSUB(0, in);
|
*pDst++ = __QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
*pDst++ = (in == INT32_MIN) ? INT32_MAX : -in;
|
||||||
|
@ -124,7 +119,6 @@ void arm_negate_q31(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -46,46 +46,42 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
The Q7 value -1 (0x80) is saturated to the maximum allowable positive value 0x7F.
|
The Q7 value -1 (0x80) is saturated to the maximum allowable
|
||||||
|
positive value 0x7F.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_negate_q7(
|
void arm_negate_q7(const q7_t *pSrc, q7_t *pDst, uint32_t blockSize) {
|
||||||
const q7_t * pSrc,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
q7_t in; /* Temporary input variable */
|
q7_t in; /* Temporary input variable */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t in1; /* Temporary input variable */
|
q31_t in1; /* Temporary input variable */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Negate and store result in destination buffer (4 samples at a time). */
|
/* Negate and store result in destination buffer (4 samples at a time). */
|
||||||
in1 = read_q7x4_ia ((q7_t **) &pSrc);
|
in1 = read_q7x4_ia((q7_t **)&pSrc);
|
||||||
write_q7x4_ia (&pDst, __QSUB8(0, in1));
|
write_q7x4_ia(&pDst, __QSUB8(0, in1));
|
||||||
#else
|
#else
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in;
|
*pDst++ = (in == (q7_t)0x80) ? (q7_t)0x7f : -in;
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in;
|
*pDst++ = (in == (q7_t)0x80) ? (q7_t)0x7f : -in;
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in;
|
*pDst++ = (in == (q7_t)0x80) ? (q7_t)0x7f : -in;
|
||||||
|
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
*pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in;
|
*pDst++ = (in == (q7_t)0x80) ? (q7_t)0x7f : -in;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -102,23 +98,21 @@ void arm_negate_q7(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = -A */
|
/* C = -A */
|
||||||
|
|
||||||
/* Negate and store result in destination buffer. */
|
/* Negate and store result in destination buffer. */
|
||||||
in = *pSrc++;
|
in = *pSrc++;
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (q7_t) __QSUB(0, in);
|
*pDst++ = (q7_t)__QSUB(0, in);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (in == (q7_t) 0x80) ? (q7_t) 0x7f : -in;
|
*pDst++ = (in == (q7_t)0x80) ? (q7_t)0x7f : -in;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -60,21 +60,16 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_offset_f32(
|
void arm_offset_f32(const float32_t *pSrc, float32_t offset, float32_t *pDst,
|
||||||
const float32_t * pSrc,
|
uint32_t blockSize) {
|
||||||
float32_t offset,
|
|
||||||
float32_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
/* Add offset and store result in destination buffer. */
|
/* Add offset and store result in destination buffer. */
|
||||||
|
@ -100,8 +95,7 @@ void arm_offset_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
/* Add offset and store result in destination buffer. */
|
/* Add offset and store result in destination buffer. */
|
||||||
|
@ -110,7 +104,6 @@ void arm_offset_f32(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,20 +47,17 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q15 range [0x8000 0x7FFF] are saturated.
|
Results outside of the allowable Q15 range [0x8000 0x7FFF]
|
||||||
|
are saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_offset_q15(
|
void arm_offset_q15(const q15_t *pSrc, q15_t offset, q15_t *pDst,
|
||||||
const q15_t * pSrc,
|
uint32_t blockSize) {
|
||||||
q15_t offset,
|
|
||||||
q15_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t offset_packed; /* Offset packed to 32 bit */
|
q31_t offset_packed; /* Offset packed to 32 bit */
|
||||||
|
|
||||||
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
||||||
|
@ -70,19 +67,21 @@ void arm_offset_q15(
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Add offset and store result in destination buffer (2 samples at a time). */
|
/* Add offset and store result in destination buffer (2 samples at a time).
|
||||||
write_q15x2_ia (&pDst, __QADD16(read_q15x2_ia ((q15_t **) &pSrc), offset_packed));
|
*/
|
||||||
write_q15x2_ia (&pDst, __QADD16(read_q15x2_ia ((q15_t **) &pSrc), offset_packed));
|
write_q15x2_ia(&pDst,
|
||||||
|
__QADD16(read_q15x2_ia((q15_t **)&pSrc), offset_packed));
|
||||||
|
write_q15x2_ia(&pDst,
|
||||||
|
__QADD16(read_q15x2_ia((q15_t **)&pSrc), offset_packed));
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrc++ + offset), 16);
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrc++ + offset), 16);
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrc++ + offset), 16);
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrc++ + offset), 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -99,21 +98,19 @@ void arm_offset_q15(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
/* Add offset and store result in destination buffer. */
|
/* Add offset and store result in destination buffer. */
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = (q15_t) __QADD16(*pSrc++, offset);
|
*pDst++ = (q15_t)__QADD16(*pSrc++, offset);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q15_t) __SSAT(((q31_t) *pSrc++ + offset), 16);
|
*pDst++ = (q15_t)__SSAT(((q31_t)*pSrc++ + offset), 16);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,49 +47,45 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q31 range [0x80000000 0x7FFFFFFF] are saturated.
|
Results outside of the allowable Q31 range [0x80000000
|
||||||
|
0x7FFFFFFF] are saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_offset_q31(
|
void arm_offset_q31(const q31_t *pSrc, q31_t offset, q31_t *pDst,
|
||||||
const q31_t * pSrc,
|
uint32_t blockSize) {
|
||||||
q31_t offset,
|
|
||||||
q31_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
/* Add offset and store result in destination buffer. */
|
/* Add offset and store result in destination buffer. */
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
*pDst++ = __QADD(*pSrc++, offset);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
*pDst++ = (q31_t)clip_q63_to_q31((q63_t)*pSrc++ + offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
*pDst++ = __QADD(*pSrc++, offset);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
*pDst++ = (q31_t)clip_q63_to_q31((q63_t)*pSrc++ + offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
*pDst++ = __QADD(*pSrc++, offset);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
*pDst++ = (q31_t)clip_q63_to_q31((q63_t)*pSrc++ + offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
*pDst++ = __QADD(*pSrc++, offset);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
*pDst++ = (q31_t)clip_q63_to_q31((q63_t)*pSrc++ + offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -106,21 +102,19 @@ void arm_offset_q31(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
/* Add offset and store result in destination buffer. */
|
/* Add offset and store result in destination buffer. */
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
*pDst++ = __QADD(*pSrc++, offset);
|
*pDst++ = __QADD(*pSrc++, offset);
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q31_t) clip_q63_to_q31((q63_t) * pSrc++ + offset);
|
*pDst++ = (q31_t)clip_q63_to_q31((q63_t)*pSrc++ + offset);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -47,20 +47,17 @@
|
||||||
|
|
||||||
@par Scaling and Overflow Behavior
|
@par Scaling and Overflow Behavior
|
||||||
The function uses saturating arithmetic.
|
The function uses saturating arithmetic.
|
||||||
Results outside of the allowable Q7 range [0x80 0x7F] are saturated.
|
Results outside of the allowable Q7 range [0x80 0x7F] are
|
||||||
|
saturated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_offset_q7(
|
void arm_offset_q7(const q7_t *pSrc, q7_t offset, q7_t *pDst,
|
||||||
const q7_t * pSrc,
|
uint32_t blockSize) {
|
||||||
q7_t offset,
|
|
||||||
q7_t * pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
q31_t offset_packed; /* Offset packed to 32 bit */
|
q31_t offset_packed; /* Offset packed to 32 bit */
|
||||||
|
|
||||||
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
/* Offset is packed to 32 bit in order to use SIMD32 for addition */
|
||||||
|
@ -70,18 +67,18 @@ void arm_offset_q7(
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
#if defined (ARM_MATH_DSP)
|
#if defined(ARM_MATH_DSP)
|
||||||
/* Add offset and store result in destination buffer (4 samples at a time). */
|
/* Add offset and store result in destination buffer (4 samples at a time).
|
||||||
write_q7x4_ia (&pDst, __QADD8(read_q7x4_ia ((q7_t **) &pSrc), offset_packed));
|
*/
|
||||||
|
write_q7x4_ia(&pDst, __QADD8(read_q7x4_ia((q7_t **)&pSrc), offset_packed));
|
||||||
#else
|
#else
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8);
|
*pDst++ = (q7_t)__SSAT(*pSrc++ + offset, 8);
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8);
|
*pDst++ = (q7_t)__SSAT(*pSrc++ + offset, 8);
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8);
|
*pDst++ = (q7_t)__SSAT(*pSrc++ + offset, 8);
|
||||||
*pDst++ = (q7_t) __SSAT(*pSrc++ + offset, 8);
|
*pDst++ = (q7_t)__SSAT(*pSrc++ + offset, 8);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
|
@ -98,17 +95,15 @@ void arm_offset_q7(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A + offset */
|
/* C = A + offset */
|
||||||
|
|
||||||
/* Add offset and store result in destination buffer. */
|
/* Add offset and store result in destination buffer. */
|
||||||
*pDst++ = (q7_t) __SSAT((q15_t) *pSrc++ + offset, 8);
|
*pDst++ = (q7_t)__SSAT((q15_t)*pSrc++ + offset, 8);
|
||||||
|
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -35,16 +35,17 @@
|
||||||
/**
|
/**
|
||||||
@defgroup BasicScale Vector Scale
|
@defgroup BasicScale Vector Scale
|
||||||
|
|
||||||
Multiply a vector by a scalar value. For floating-point data, the algorithm used is:
|
Multiply a vector by a scalar value. For floating-point data, the algorithm
|
||||||
|
used is:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
pDst[n] = pSrc[n] * scale, 0 <= n < blockSize.
|
pDst[n] = pSrc[n] * scale, 0 <= n < blockSize.
|
||||||
</pre>
|
</pre>
|
||||||
|
|
||||||
In the fixed-point Q7, Q15, and Q31 functions, <code>scale</code> is represented by
|
In the fixed-point Q7, Q15, and Q31 functions, <code>scale</code> is
|
||||||
a fractional multiplication <code>scaleFract</code> and an arithmetic shift <code>shift</code>.
|
represented by a fractional multiplication <code>scaleFract</code> and an
|
||||||
The shift allows the gain of the scaling operation to exceed 1.0.
|
arithmetic shift <code>shift</code>. The shift allows the gain of the scaling
|
||||||
The algorithm used with fixed-point data is:
|
operation to exceed 1.0. The algorithm used with fixed-point data is:
|
||||||
|
|
||||||
<pre>
|
<pre>
|
||||||
pDst[n] = (pSrc[n] * scaleFract) << shift, 0 <= n < blockSize.
|
pDst[n] = (pSrc[n] * scaleFract) << shift, 0 <= n < blockSize.
|
||||||
|
@ -73,21 +74,16 @@
|
||||||
@return none
|
@return none
|
||||||
*/
|
*/
|
||||||
|
|
||||||
void arm_scale_f32(
|
void arm_scale_f32(const float32_t *pSrc, float32_t scale, float32_t *pDst,
|
||||||
const float32_t *pSrc,
|
uint32_t blockSize) {
|
||||||
float32_t scale,
|
|
||||||
float32_t *pDst,
|
|
||||||
uint32_t blockSize)
|
|
||||||
{
|
|
||||||
uint32_t blkCnt; /* Loop counter */
|
uint32_t blkCnt; /* Loop counter */
|
||||||
|
|
||||||
#if defined (ARM_MATH_LOOPUNROLL)
|
#if defined(ARM_MATH_LOOPUNROLL)
|
||||||
|
|
||||||
/* Loop unrolling: Compute 4 outputs at a time */
|
/* Loop unrolling: Compute 4 outputs at a time */
|
||||||
blkCnt = blockSize >> 2U;
|
blkCnt = blockSize >> 2U;
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * scale */
|
/* C = A * scale */
|
||||||
|
|
||||||
/* Scale input and store result in destination buffer. */
|
/* Scale input and store result in destination buffer. */
|
||||||
|
@ -113,8 +109,7 @@ void arm_scale_f32(
|
||||||
|
|
||||||
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
#endif /* #if defined (ARM_MATH_LOOPUNROLL) */
|
||||||
|
|
||||||
while (blkCnt > 0U)
|
while (blkCnt > 0U) {
|
||||||
{
|
|
||||||
/* C = A * scale */
|
/* C = A * scale */
|
||||||
|
|
||||||
/* Scale input and store result in destination buffer. */
|
/* Scale input and store result in destination buffer. */
|
||||||
|
@ -123,7 +118,6 @@ void arm_scale_f32(
|
||||||
/* Decrement loop counter */
|
/* Decrement loop counter */
|
||||||
blkCnt--;
|
blkCnt--;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue