////////////////////////////////////////////////////////////////////////////////
// Audio play back demo code use TI's TMS320C6748 dsp 
// by duweitao @ cuc.edu.cn
////////////////////////////////////////////////////////////////////////////////

#include "board.h"
#include "fir_proc.h"
// conver input audio int to float
// input is a signed short val with 2MSByte 0x0000
// convert to float (-1, 1)
float AuIn2Float(unsigned int in_val_i){
  float scale = 1.0/32767;
  float out_f = 0;
  short temp = 0;
  temp = in_val_i & 0xffff;
  out_f = scale * temp; 
  return out_f;
}

// conver float to output audio int 
// float val should be  (-1, 1)
// output is a signed short val with 2MSByte 0x0000
unsigned int Float2AuOut(float in_val_f){
  float scale = 32767;
  unsigned int out_i = 0;
  short temp_s = 0;
  int temp_i = 0;
  temp_s = in_val_f *scale; 
  temp_i =  temp_s;
  out_i = temp_i & 0xffff; 
  return out_i;
}

float proc_buf_L[NUM_SAMPLES_PER_AUDIO_CH];
float proc_buf_R[NUM_SAMPLES_PER_AUDIO_CH];

void main(){
  
  unsigned int * src_ptr = NULL;
  unsigned int * dst_ptr = NULL;
  unsigned int   rx_cnt  = 0;
  
  int i = 0;
 
  board_init();
  
  while(1) {
    unsigned int addr = 0;
    if(is_rx_new()){
      addr = get_new_rx_buf();
      src_ptr = (unsigned int *) addr;
      
      addr = get_rdy_tx_buf();
      dst_ptr = (unsigned int *)addr;
      // copy input data to proc buf, perform proc, then output  
      for(i = 0 ; i < NUM_SAMPLES_PER_AUDIO_CH; i ++){
        // copy left and right channel input data to proc buf
        proc_buf_L[i] = AuIn2Float(src_ptr[i*2]);
        proc_buf_R[i] = AuIn2Float(src_ptr[i*2+1]);
      }
      fir_proc(proc_buf_L, proc_buf_L, NUM_SAMPLES_PER_AUDIO_CH);
      for(i = 0 ; i < NUM_SAMPLES_PER_AUDIO_CH; i ++){
        float temp_L, temp_R;
        // copy the left and right channel proc data to output buffer
        temp_L = proc_buf_L[i] ;
        temp_R = proc_buf_R[i] ;
        dst_ptr[i*2]   = Float2AuOut(temp_L); 
        dst_ptr[i*2+1] = Float2AuOut(temp_R); 
      }


      rx_cnt ++;
    } // if(is_rx_new()) 
  }   // while(1)

} // main
