For BU9480F D-A Conv.

Dependencies:   mbed

main.cpp

Committer:
lynxeyed_atsu
Date:
2010-09-03
Revision:
2:baf5bf51cd28
Parent:
1:02bfb013660c
Child:
3:64c3ed0fc4b4

File content as of revision 2:baf5bf51cd28:

/* DPCM & Rice Golomb Lossless Audio Player and Realtime encoder */
#include "SDHCFileSystem.h"

#include "mbed.h"
#include "string"

#include "_bitio.h"
//FILE    *infp,*outfp;
SDFileSystem sd(p5, p6, p7, p8, "sd");
DigitalOut led1(LED1);
DigitalOut led2(LED2);
AnalogOut DACout(p18);
Ticker tick;

// a FIFO for the DAC
#define RAM_LENGTH 4096//8192
#define RAM_LIMIT (RAM_LENGTH - 1) 
volatile short DAC_fifo[RAM_LENGTH];
volatile short DAC_wptr=0;
volatile short DAC_rptr=0;
volatile short DAC_on;
volatile short int DAC_diff=0;

void dac_out()
{
  //  printf("\t%d\r\n",DAC_diff);
    if (DAC_diff > 0) {
        led2 = 0;
        DACout.write_u16(DAC_fifo[DAC_rptr]);
        DAC_rptr=(DAC_rptr+1) & (RAM_LIMIT);
        DAC_diff--;
   }else led2 = 1;
}
void encode(long int n){
    int zero_shift = 0;
    
    if(n < 0){
        putbit(0);                    // sign (put 0:if n as negative)
        n = -n;                        // n = abs(n)
        //printf("\t 0");
    }
    else{ 
        putbit(1);                    // sign (put 1:if n as positive)
        //printf("\t 1");
    }
    zero_shift = (n >> (k));
    //printf("\t shift= %d",zero_shift);
    while(zero_shift > 0){

        zero_shift--;
        putbit(0);
    }    // put n/(2^k) 0's
    
    putbit(1);                        // terminating "1"
    putbits(k,rightbits(k,n));
    //printf("\t finish= %d \r\n",(n & ((1U<<k)-1)));
}



void decode(void){
    short dac_data;
    long int decode_buff;
    short diff,diff2;
    unsigned int buff_sign,zero_shift;
    //char flag;

    diff = 0;
    diff2 = 0;
    // get sign(1 for positive, 0 for negative)
    while(1){
        
        if((buff_sign = getbit())==OVERRUN)break;
        zero_shift = 0;
        while(getbit()==0)zero_shift++;
        
        decode_buff = (signed int)((1U << k)*zero_shift);
        decode_buff += (getbits(k));
        
        if(!buff_sign)decode_buff =- decode_buff;
        /* return decode_buff; */
        diff =(diff + decode_buff);
        
        dac_data = ((int)diff + 32768) >> 1;
        DAC_fifo[DAC_wptr]=dac_data;
        DAC_wptr=(DAC_wptr+1) & (RAM_LIMIT);
        DAC_diff=(DAC_diff+1);
        while (DAC_diff > RAM_LIMIT){
            led1 = 1;
        }   //wait
        led1=0;
        if(DAC_diff <= 0)
            led2=1;
        else led2=0;
 
        
        if((buff_sign = getbit())==OVERRUN)break;
        zero_shift = 0;
        while(getbit()==0)zero_shift++;
        
        decode_buff = (signed int)((1U << k)*zero_shift);
        decode_buff += (getbits(k));
        
        if(!buff_sign)decode_buff =- decode_buff;
        /* return decode_buff; */
        diff2 =(diff2 + decode_buff);

       /* 
        drawc((unsigned char)diff2 & 0xff);
        drawc((unsigned char)((diff2>>8) &0xff));
        */
        //fwrite(&diff2, sizeof(short int), 1, outfp);
        
    
         
    }
}

  
int main() {

    
    if ( NULL == (infp = fopen( "/sd/test.rgm", "rb" )) ) {
        printf( "\r\nError: The message file cannot be accessed\r\n" );
        return -1;
    }
    //tick.detach();
    tick.attach_us(&dac_out, 45); //set 22.050kHz sampling data    
    decode();
    tick.detach();    
        
    fclose( infp );
    //fclose( outfp );  

 
    
    while (1);
}