xeye_ atsu
/
RiceGolombDPCM_Player
For BU9480F D-A Conv.
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); }