Skip to content

Commit

Permalink
Loopback mon 🇯🇲 (#736)
Browse files Browse the repository at this point in the history
* add mux to codec program to select loop back

* add codec runtime update logic to select the mux

* codec runtime update control command

loop back seems to be on channel 2, so
```
cram 0 2
x $r $a
x $a$t $r
```
will show activity while
```
cram 0 2
x $r $a
x $a$t $r
```
will not.

And
`cram 0 1`
will restore normal operation

* sample digital feedback and reset if failed

* set val

* feedback var

* update on reset

* update prop

* Revert "update prop"

This reverts commit 46941d9.

* remove runtime update on init

* update playback task only

* expose api

* reset codec when done

* last 100 samples

last second on 10ms delay

* cleanup

* fix logic

* reset when done

* change to define

* restart playback on error

* push correctly

* reshuffle logic

* remove unused

* fix things

* can resume

* stble

* destroy future

* don't close the stream on reset, resume on reset

* monitor loop back always
  • Loading branch information
zer0page authored and plasticchris committed Feb 10, 2017
1 parent 27535ce commit 011dfa8
Show file tree
Hide file tree
Showing 9 changed files with 2,502 additions and 1,185 deletions.
2,157 changes: 1,685 additions & 472 deletions 3263_48k/3263_48k.pfw

Large diffs are not rendered by default.

1,413 changes: 753 additions & 660 deletions kitsune/audio_codec_pps_driver.h

Large diffs are not rendered by default.

43 changes: 36 additions & 7 deletions kitsune/audiotask.c
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,8 @@

#include "led_cmd.h"
#include "led_animations.h"
#include "hlo_audio_tools.h"
#include "codec_runtime_update.h"

#if 0
#define PRINT_TIMING
Expand Down Expand Up @@ -73,6 +75,7 @@ static void QueueFileForUpload(const char * filename,uint8_t delete_after_upload
#include "wifi_cmd.h"
extern bool encode_device_id_string(pb_ostream_t *stream, const pb_field_t *field, void * const *arg);
static bool _playing = false;
static bool _playback_interrupted = false;
bool audio_playing() {
return _playing;
}
Expand Down Expand Up @@ -172,13 +175,29 @@ typedef struct{

int32_t set_volume(int v, unsigned int dly);

extern volatile int16_t i2s_mon; /* fun times */

static void _change_volume_task(hlo_future_t * result, void * ctx){
volatile ramp_ctx_t * v = (ramp_ctx_t*)ctx;
portTickType t0 = xTaskGetTickCount();
int32_t count = 0;
codec_runtime_prop_update(MUX_LOOPBACK_SELECTOR, MUX_SELECT_LOOPBACK);
while( v->target || v->current ){
if ( (v->duration - (int32_t)(xTaskGetTickCount() - t0)) < 0 && v->duration > 0){
v->target = 0;
}

if (i2s_mon == 0 && count++ > 10) {
SetAudioSignal(FILTER_SIG_RESET);
LOGE("\r\nDAC Overflow Detected\r\n");
_playback_interrupted = true;
count = 0;
break;
} else if (i2s_mon != 0) {
count = 0;
}


if(v->current > v->target ){
vTaskDelay(v->ramp_down_ms);
v->current--;
Expand Down Expand Up @@ -209,6 +228,7 @@ static void _change_volume_task(hlo_future_t * result, void * ctx){
}
}
AudioTask_StopPlayback();
codec_runtime_prop_update(MUX_LOOPBACK_SELECTOR, MUX_SELECT_MIC);
hlo_future_write(result, NULL, 0, 0);


Expand All @@ -224,6 +244,7 @@ static uint8_t fadeout_sig(void * ctx) {
}

extern volatile int last_set_volume;
extern int audio_sig_stop;

////-------------------------------------------
//playback sample app
Expand Down Expand Up @@ -267,11 +288,15 @@ static void _playback_loop(AudioPlaybackDesc_t * desc, hlo_stream_signal sig_sto
vol.current = last_set_volume; //handles fade out if the system volume has changed during the last playback
ret = transfer_function(fs, spkr, vol_task, fadeout_sig);
}

hlo_stream_close(fs);
if( audio_sig_stop != FILTER_SIG_RESET ) {
hlo_stream_close(fs);
}
hlo_stream_close(spkr);
if(desc->onFinished){
desc->onFinished(desc->context);
hlo_future_destroy(vol_task);
if( audio_sig_stop != FILTER_SIG_RESET ) {
if(desc->onFinished){
desc->onFinished(desc->context);
}
}
DISP("Playback Task Finished %d\r\n", ret);
}
Expand All @@ -286,14 +311,14 @@ void AudioPlaybackTask(void * data) {

hlo_future_t * state_update_task = hlo_future_create_task_bg(_sense_state_task, NULL, 1024);
assert(state_update_task);

AudioMessage_t last_playback_message;
while(1){
AudioMessage_t m;
if (xQueueReceive( _playback_queue,(void *) &m, AUDIO_TASK_IDLE_RESET_TIME )) {
switch (m.command) {

case eAudioPlaybackStart:
{
memcpy(&last_playback_message, &m, sizeof(m));
AudioPlaybackDesc_t * info = &m.message.playbackdesc;
/** prep **/
_queue_audio_playback_state(PLAYING, info);
Expand All @@ -313,6 +338,11 @@ void AudioPlaybackTask(void * data) {
reset_audio();
LOGI("done.\r\n");
hlo_future_write(m.message.reset_sync, NULL,0, 0);

if (_playback_interrupted) {
_playback_interrupted = false;
xQueueSend(_playback_queue, &last_playback_message, 0);
}
break;
default:
break;
Expand Down Expand Up @@ -365,7 +395,6 @@ void AudioTask_StartPlayback(const AudioPlaybackDesc_t * desc) {
xQueueSendToFront(_playback_queue,(void *)&m,0);
_queue_audio_playback_state(PLAYING, desc);
}

}

int Cmd_AudioPlayback(int argc, char * argv[]){
Expand Down
31 changes: 13 additions & 18 deletions kitsune/codec_runtime_update.c
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,9 @@ typedef enum{
*/
static const control_t control[MAX_CONTROL_BLOCKS] = {

{DAC_ADAPTIVE_COEFFICIENT_BANK_1, 0, 1, 1}, // DAC_ADAPTIVE_COEFF_BANK1_CONFIG,
{DAC_ADAPTIVE_COEFFICIENT_BANK_2, 0, 1, 1}, // DAC_ADAPTIVE_COEFF_BANK2_CONFIG,
{ADC_ADAPTIVE_COEFFICIENT_BANK, 0, 1, 1}, // ADC_ADAPTIVE_COEFF_BANK_CONFIG,
{ADC_ADAPTIVE_COEFFICIENT_BANK, 3, 16, 1}, // MUX_SELECT_MIC_RAW
{DAC_ADAPTIVE_COEFFICIENT_BANK_1, 2, 24, 1}, // MUX_SELECT_AEC_INPUT
{DAC_ADAPTIVE_COEFFICIENT_BANK_1, 1, 108, 1}, // MUX_SELECT_AEC_LEVEL
{ADC_ADAPTIVE_COEFFICIENT_BANK, 2, 108, 1} // MUX_SELECT_AEC_LEVEL
{ADC_ADAPTIVE_COEFFICIENT_BANK, 6, 20, 1}, // MUX_LOOPBACK_SELECTOR


};


Expand Down Expand Up @@ -210,19 +206,12 @@ int32_t codec_update_minidsp_mux(control_blocks_t type, uint32_t data){
}

// Only for testing
int32_t codec_test_runtime_prop_update(void){

static bool switchit = true;
int32_t codec_runtime_prop_update(control_blocks_t type, uint32_t value){
uint32_t read_data[10];
uint32_t test_data[1] = {(uint32_t)MUX_MIC_RAW_1};

test_data[0] = (switchit) ? (uint32_t)MUX_MIC_RAW_1 : (uint32_t)MUX_MIC_RAW_2;

switchit = (switchit) ? false :true;
uint32_t test_data[1] = {(uint32_t)value};

codec_update_minidsp_mux(MUX_SELECT_MIC_RAW, test_data[0]);

codec_update_cram(MUX_SELECT_MIC_RAW, read_data, codec_cram_read);
codec_update_minidsp_mux(type, test_data[0]);
codec_update_cram(type, read_data, codec_cram_read);

if(test_data[0] != read_data[0]){
UARTprintf("Runtime Update Error: Test %x, Read %x\n", test_data[0],read_data[0]);
Expand All @@ -234,3 +223,9 @@ int32_t codec_test_runtime_prop_update(void){
return 0;
}


int cmd_codec_runtime_update(int argc, char *argv[]) {
codec_runtime_prop_update(atoi(argv[1]), atoi(argv[2]));
return 0;
}

33 changes: 7 additions & 26 deletions kitsune/codec_runtime_update.h
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,11 @@

#include "stdint.h"

/* MUX PROPERTIES FOR MUX_SELECT_MIC_RAW */
#define MUX_MIC_RAW_1 1
#define MUX_MIC_RAW_2 2
#define MUX_MIC_RAW_3 3

/* MUX PROPERTIES FOR MUX_SELECT_AEC_INPUT */
#define MUX_AEC_INPUT_BEAM_1 1
#define MUX_AEC_INPUT_BEAM_2 2
#define MUX_AEC_INPUT_BEAM_3 3
#define MUX_AEC_INPUT_MIC_RAW 4

/* MUX PROPERTIES FOR MUX_SELECT_AEC_LEVEL */
#define MUX_AEC_LEVEL_0 1
#define MUX_AEC_LEVEL_1 2
#define MUX_AEC_LEVEL_2 3

/* MUX PROPERTIES FOR MUX_SELECT_CH4_OUT */
#define MUX_CH4_SELECT_AEC_OUT 1
#define MUX_CH4_SELECT_DEGREE 2
/* MUX PROPERTIES */
#define MUX_SELECT_MIC 1
#define MUX_SELECT_LOOPBACK 2

#define MUX_LOOPBACK_CHANNEL 2

/********************************************************************************
* IMPORTANT: PLEASE READ
Expand All @@ -31,13 +17,7 @@
********************************************************************************
*/
typedef enum{
DAC_ADAPTIVE_COEFF_BANK1_CONFIG,
DAC_ADAPTIVE_COEFF_BANK2_CONFIG,
ADC_ADAPTIVE_COEFF_BANK_CONFIG,
MUX_SELECT_MIC_RAW,
MUX_SELECT_AEC_INPUT,
MUX_SELECT_AEC_LEVEL,
MUX_SELECT_CH4_OUT,
MUX_LOOPBACK_SELECTOR,
MAX_CONTROL_BLOCKS

}control_blocks_t;
Expand All @@ -49,5 +29,6 @@ typedef enum{
int32_t codec_update_minidsp_mux(control_blocks_t type, uint32_t data);

int32_t codec_test_runtime_prop_update(void);
int32_t codec_runtime_prop_update(control_blocks_t type, uint32_t value);
#endif

2 changes: 2 additions & 0 deletions kitsune/commands.c
Original file line number Diff line number Diff line change
Expand Up @@ -1985,6 +1985,7 @@ int cmd_codec(int argc, char *argv[]);
int cmd_confidence(int argc, char *argv[]);
int cmd_pwr_speaker(int argc, char * argv[]);
int cmd_codec_read(int argc, char *argv[]);
int cmd_codec_runtime_update(int argc, char *argv[]);


int cmd_button(int argc, char *argv[]) {
Expand Down Expand Up @@ -2013,6 +2014,7 @@ tCmdLineEntry g_sCmdTable[] = {
{ "nnc", cmd_confidence, " " },
{ "co", cmd_codec, " " },
{"spkr",cmd_pwr_speaker,""},
{ "cram", cmd_codec_runtime_update, " " },

#if 0
{ "time_test", Cmd_time_test, "" },
Expand Down
1 change: 1 addition & 0 deletions kitsune/hlo_audio_tools.h
Original file line number Diff line number Diff line change
Expand Up @@ -34,3 +34,4 @@ int Cmd_stream_transfer(int argc, char * argv[]);


void AudioControlTask(void * unused);
void SetAudioSignal(int s);
2 changes: 1 addition & 1 deletion kitsune/i2c_cmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -1009,7 +1009,7 @@ int cmd_pwr_speaker(int argc, char * argv[]) {




int32_t codec_runtime_prop_update(control_blocks_t type, uint32_t value);
int32_t codec_init(void)
{
uint32_t i;
Expand Down
5 changes: 4 additions & 1 deletion kitsune/pcm_handler.c
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,7 @@
#include "uartstdio.h"

#include "codec_debug_config.h"
#include "codec_runtime_update.h"

//*****************************************************************************
// LOCAL DEFINES
Expand Down Expand Up @@ -153,7 +154,7 @@ void pcm_set_ping_pong_incoming_stream_mode(const int mode) {
*/
#define MCASP_WR_DMA_DONE_INT_STS_ACTIVE ((1UL << 11) << 20)
#define MCASP_RD_DMA_DONE_INT_STS_ACTIVE ((1UL << 10) << 20)

volatile int16_t i2s_mon;

/*ramcode*/
void DMAPingPongCompleteAppCB_opt()
Expand Down Expand Up @@ -199,6 +200,7 @@ void DMAPingPongCompleteAppCB_opt()
#endif

#if (CODEC_ENABLE_MULTI_CHANNEL==1)
i2s_mon = pong[MUX_LOOPBACK_CHANNEL];
if (_pcm_ping_pong_incoming_stream_mode == PCM_PING_PONG_MODE_SINGLE_CHANNEL_HALF_RATE) {
int k=0;
for (i = 0; i<= CB_TRANSFER_SZ/2-2 ; i+=2 ) {
Expand Down Expand Up @@ -242,6 +244,7 @@ void DMAPingPongCompleteAppCB_opt()
#endif

#if (CODEC_ENABLE_MULTI_CHANNEL==1)
i2s_mon = ping[MUX_LOOPBACK_CHANNEL];
if (_pcm_ping_pong_incoming_stream_mode == PCM_PING_PONG_MODE_SINGLE_CHANNEL_HALF_RATE) {
int k=0;
for (i = 0; i<= CB_TRANSFER_SZ/2-2; i+=2 ) {
Expand Down

0 comments on commit 011dfa8

Please sign in to comment.