xeye_ atsu
/
RiceGolombDPCM_Player
For BU9480F D-A Conv.
Diff: main.cpp
- Revision:
- 0:805cffac956b
- Child:
- 1:02bfb013660c
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/main.cpp Thu Aug 26 12:48:50 2010 +0000 @@ -0,0 +1,141 @@ +/* DPCM & Rice Golomb Lossless Audio Player and Realtime encoder */ +#include "mbed.h" +#include "string" +#include "SDHCFileSystem.h" +#include "_bitio.h" +//FILE *infp,*outfp; +SDFileSystem sd(p11, p12, p13, p14, "sd"); +DigitalOut led1(LED1); +DigitalOut led2(LED2); +AnalogOut DACout(p18); +Ticker tick; + +// a FIFO for the DAC +volatile short DAC_fifo[1024]; +volatile short DAC_wptr=0; +volatile short DAC_rptr=0; +volatile short DAC_on; +volatile short int DAC_diff=0; + + +void encode(long int n); +void decode(void); +void dac_out(); + + + + +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); +} + +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) & 0x3ff; + 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) & 0x3ff; + DAC_diff=(DAC_diff+1); + while (DAC_diff >= 1023){ + 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); + + + + } +}