パラメータを適応変化させる事により圧縮率を向上させた動的ライス・ゴロム符号を利用した可逆圧縮方式。圧縮ソフト、圧縮率のMATLABシミュレーションは詳細はInterface誌2011年8月号に掲載されるRX62Nマイコン連動特集にて掲載予定。
main.cpp@0:d920d64db582, 2011-03-30 (annotated)
- Committer:
- lynxeyed_atsu
- Date:
- Wed Mar 30 06:05:24 2011 +0000
- Revision:
- 0:d920d64db582
alpha
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
lynxeyed_atsu | 0:d920d64db582 | 1 | #include "mbed.h" |
lynxeyed_atsu | 0:d920d64db582 | 2 | #include "MSCFileSystem.h" |
lynxeyed_atsu | 0:d920d64db582 | 3 | #include "SDHCFileSystem.h" |
lynxeyed_atsu | 0:d920d64db582 | 4 | #include "TextLCD.h" |
lynxeyed_atsu | 0:d920d64db582 | 5 | #include "i2s_irq_test.h" |
lynxeyed_atsu | 0:d920d64db582 | 6 | #include "lpc17xx_i2s.h" |
lynxeyed_atsu | 0:d920d64db582 | 7 | #include "lpc17xx_clkpwr.h" |
lynxeyed_atsu | 0:d920d64db582 | 8 | #include "aic23b_comm.h" |
lynxeyed_atsu | 0:d920d64db582 | 9 | #include "string" |
lynxeyed_atsu | 0:d920d64db582 | 10 | #include "_bitio.h" |
lynxeyed_atsu | 0:d920d64db582 | 11 | |
lynxeyed_atsu | 0:d920d64db582 | 12 | #define _RGM_ADAPTIVE 1 /* 1:Adaptive 0:Constant */ |
lynxeyed_atsu | 0:d920d64db582 | 13 | |
lynxeyed_atsu | 0:d920d64db582 | 14 | #define k_bits 0x07 // k_bits:0x09 to 0x0b? |
lynxeyed_atsu | 0:d920d64db582 | 15 | #define min_of_k 0x07 |
lynxeyed_atsu | 0:d920d64db582 | 16 | #define max_of_k 0x0b /*for dynamic Rice-Golomb codings */ |
lynxeyed_atsu | 0:d920d64db582 | 17 | |
lynxeyed_atsu | 0:d920d64db582 | 18 | DigitalOut led1(LED1); |
lynxeyed_atsu | 0:d920d64db582 | 19 | DigitalOut led2(LED2); |
lynxeyed_atsu | 0:d920d64db582 | 20 | DigitalOut led3(LED3); |
lynxeyed_atsu | 0:d920d64db582 | 21 | DigitalOut led4(LED4); |
lynxeyed_atsu | 0:d920d64db582 | 22 | Serial pc(USBTX, USBRX); // tx, rx |
lynxeyed_atsu | 0:d920d64db582 | 23 | I2C AIC23B(p9,p10); //sda,scl |
lynxeyed_atsu | 0:d920d64db582 | 24 | |
lynxeyed_atsu | 0:d920d64db582 | 25 | TextLCD lcd(p24, p26, p27, p28, p29, p30); |
lynxeyed_atsu | 0:d920d64db582 | 26 | SDFileSystem sd(p11, p12, p13, p14, "sd");//p5,6,7,8 |
lynxeyed_atsu | 0:d920d64db582 | 27 | //MSCFileSystem msc("msc"); // Mount flash drive under the name "msc" |
lynxeyed_atsu | 0:d920d64db582 | 28 | FILE *infp,*outfp,*playlist; |
lynxeyed_atsu | 0:d920d64db582 | 29 | |
lynxeyed_atsu | 0:d920d64db582 | 30 | Ticker tick; |
lynxeyed_atsu | 0:d920d64db582 | 31 | Ticker fl_leds; |
lynxeyed_atsu | 0:d920d64db582 | 32 | |
lynxeyed_atsu | 0:d920d64db582 | 33 | #define AudioBufRow 256 /* length of proc_r */ |
lynxeyed_atsu | 0:d920d64db582 | 34 | volatile short int AudioBuf[2][AudioBufRow]; /* Audio Data Buffer:AudioBuf[empty_c][proc_r] */ |
lynxeyed_atsu | 0:d920d64db582 | 35 | volatile BYTE empty_c=0; /* Column of AudioBuf */ |
lynxeyed_atsu | 0:d920d64db582 | 36 | volatile BYTE proc_r=0; /* Row of AudioBuf */ |
lynxeyed_atsu | 0:d920d64db582 | 37 | bool dac_semp; /* Write AudioBuf Complete? true:Yes, false:No */ |
lynxeyed_atsu | 0:d920d64db582 | 38 | |
lynxeyed_atsu | 0:d920d64db582 | 39 | |
lynxeyed_atsu | 0:d920d64db582 | 40 | int aic23b_send(int addr,char ctrl_address,char ctrl_data){ |
lynxeyed_atsu | 0:d920d64db582 | 41 | int flag; |
lynxeyed_atsu | 0:d920d64db582 | 42 | char cmd[2]; |
lynxeyed_atsu | 0:d920d64db582 | 43 | cmd[0]=ctrl_address; |
lynxeyed_atsu | 0:d920d64db582 | 44 | cmd[1]=ctrl_data; |
lynxeyed_atsu | 0:d920d64db582 | 45 | flag = AIC23B.write(addr, cmd, 2); |
lynxeyed_atsu | 0:d920d64db582 | 46 | pc.printf("ADDR=0x%x, CTRL_ADD=0x%x, CTRL_DATA=0x%x, RESP=0x%x\r\n",(addr&0x7f),cmd[0],cmd[1],flag); |
lynxeyed_atsu | 0:d920d64db582 | 47 | return (flag); |
lynxeyed_atsu | 0:d920d64db582 | 48 | } |
lynxeyed_atsu | 0:d920d64db582 | 49 | |
lynxeyed_atsu | 0:d920d64db582 | 50 | int aic23b_init(void){ |
lynxeyed_atsu | 0:d920d64db582 | 51 | int flag=0; |
lynxeyed_atsu | 0:d920d64db582 | 52 | printf("*************************\r\nReset TLV320AIC23B\r\n*************************\r\n"); |
lynxeyed_atsu | 0:d920d64db582 | 53 | AIC23B.frequency(150000); |
lynxeyed_atsu | 0:d920d64db582 | 54 | flag = aic23b_send(AIC23B_ADDRESS,RESET_REFGISTER,RESET); |
lynxeyed_atsu | 0:d920d64db582 | 55 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 56 | flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,0); |
lynxeyed_atsu | 0:d920d64db582 | 57 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 58 | flag += aic23b_send(AIC23B_ADDRESS,POWER_DOWN_CONTROL,1); |
lynxeyed_atsu | 0:d920d64db582 | 59 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 60 | flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_INTERFACE_FORMAT,(MASTER_MODE|INPUT_DATA_16_BIT_LENGTH|I2S_FORMAT)); |
lynxeyed_atsu | 0:d920d64db582 | 61 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 62 | flag += aic23b_send(AIC23B_ADDRESS,SAMPLE_RATE_CONTROL,(SR_USB_44_1_KHZ_MODE| BOSR_USB_44_1_KHZ_MODE| USE_USB_CLOCK_44_1_KHZ_MODE)); |
lynxeyed_atsu | 0:d920d64db582 | 63 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 64 | flag += aic23b_send(AIC23B_ADDRESS,ANALOG_AUDIO_PATH_CONTROL,0x10); |
lynxeyed_atsu | 0:d920d64db582 | 65 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 66 | flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_AUDIO_PATH_CONTROL,0); |
lynxeyed_atsu | 0:d920d64db582 | 67 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 68 | flag += aic23b_send(AIC23B_ADDRESS,DIGITAL_INTERFACE_ACTIVATION,DIGITAL_INTERFACE_ACTIVE); |
lynxeyed_atsu | 0:d920d64db582 | 69 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 70 | flag += aic23b_send(AIC23B_ADDRESS,LEFT_CHANNEL_HEADPHONE_VOLUME_CONTROL,LHV_VOLUME_DEFAULT); |
lynxeyed_atsu | 0:d920d64db582 | 71 | wait(0.1); |
lynxeyed_atsu | 0:d920d64db582 | 72 | flag += aic23b_send(AIC23B_ADDRESS,RIGHT_CHANNEL_HEADPHONE_VOLUME_CONTROL,RHV_VOLUME_DEFAULT); |
lynxeyed_atsu | 0:d920d64db582 | 73 | |
lynxeyed_atsu | 0:d920d64db582 | 74 | if(!flag) { |
lynxeyed_atsu | 0:d920d64db582 | 75 | printf("*************************\r\nReset OK\r\n*************************\r\n"); |
lynxeyed_atsu | 0:d920d64db582 | 76 | return 0; |
lynxeyed_atsu | 0:d920d64db582 | 77 | } |
lynxeyed_atsu | 0:d920d64db582 | 78 | else{ |
lynxeyed_atsu | 0:d920d64db582 | 79 | printf("*************************\r\nReset FAILED\r\n*************************\r\n"); |
lynxeyed_atsu | 0:d920d64db582 | 80 | return -1; |
lynxeyed_atsu | 0:d920d64db582 | 81 | } |
lynxeyed_atsu | 0:d920d64db582 | 82 | } |
lynxeyed_atsu | 0:d920d64db582 | 83 | |
lynxeyed_atsu | 0:d920d64db582 | 84 | void pl_led_flash(void) |
lynxeyed_atsu | 0:d920d64db582 | 85 | { |
lynxeyed_atsu | 0:d920d64db582 | 86 | if(led1){ |
lynxeyed_atsu | 0:d920d64db582 | 87 | led1 = 0; |
lynxeyed_atsu | 0:d920d64db582 | 88 | led2 = 1; |
lynxeyed_atsu | 0:d920d64db582 | 89 | return; |
lynxeyed_atsu | 0:d920d64db582 | 90 | } |
lynxeyed_atsu | 0:d920d64db582 | 91 | |
lynxeyed_atsu | 0:d920d64db582 | 92 | if(led2){ |
lynxeyed_atsu | 0:d920d64db582 | 93 | led2 = 0; |
lynxeyed_atsu | 0:d920d64db582 | 94 | led3 = 1; |
lynxeyed_atsu | 0:d920d64db582 | 95 | return; |
lynxeyed_atsu | 0:d920d64db582 | 96 | } |
lynxeyed_atsu | 0:d920d64db582 | 97 | |
lynxeyed_atsu | 0:d920d64db582 | 98 | if(led3){ |
lynxeyed_atsu | 0:d920d64db582 | 99 | led3 = 0; |
lynxeyed_atsu | 0:d920d64db582 | 100 | led4 = 1; |
lynxeyed_atsu | 0:d920d64db582 | 101 | return; |
lynxeyed_atsu | 0:d920d64db582 | 102 | } |
lynxeyed_atsu | 0:d920d64db582 | 103 | |
lynxeyed_atsu | 0:d920d64db582 | 104 | if(led4){ |
lynxeyed_atsu | 0:d920d64db582 | 105 | led4 = 0; |
lynxeyed_atsu | 0:d920d64db582 | 106 | led1 = 1; |
lynxeyed_atsu | 0:d920d64db582 | 107 | return; |
lynxeyed_atsu | 0:d920d64db582 | 108 | } |
lynxeyed_atsu | 0:d920d64db582 | 109 | |
lynxeyed_atsu | 0:d920d64db582 | 110 | |
lynxeyed_atsu | 0:d920d64db582 | 111 | } |
lynxeyed_atsu | 0:d920d64db582 | 112 | |
lynxeyed_atsu | 0:d920d64db582 | 113 | void dac_out(void) |
lynxeyed_atsu | 0:d920d64db582 | 114 | { |
lynxeyed_atsu | 0:d920d64db582 | 115 | volatile static short i,j; // AudioBuf[j][i] |
lynxeyed_atsu | 0:d920d64db582 | 116 | volatile uint32_t DBufLR; // Buffer Data to send I2S_TX |
lynxeyed_atsu | 0:d920d64db582 | 117 | uint16_t BufLPCnt; |
lynxeyed_atsu | 0:d920d64db582 | 118 | for(BufLPCnt=0 ; BufLPCnt < 9 ; BufLPCnt++ ) |
lynxeyed_atsu | 0:d920d64db582 | 119 | { |
lynxeyed_atsu | 0:d920d64db582 | 120 | if(i >= AudioBufRow-1) |
lynxeyed_atsu | 0:d920d64db582 | 121 | { |
lynxeyed_atsu | 0:d920d64db582 | 122 | if(dac_semp) /* colunm (empty_c) is full? true:Yes */ |
lynxeyed_atsu | 0:d920d64db582 | 123 | { |
lynxeyed_atsu | 0:d920d64db582 | 124 | i=0; |
lynxeyed_atsu | 0:d920d64db582 | 125 | empty_c =(empty_c==1)?0:1; /* empty_c:empty column of buffer AudioBuf, Because I2S_TX used these data */ |
lynxeyed_atsu | 0:d920d64db582 | 126 | j=(empty_c==1)?0:1; /* Change column which buffer is filled with data by function decode() */ |
lynxeyed_atsu | 0:d920d64db582 | 127 | dac_semp = false; /* false: empty_c is ready to get data from function decode() */ |
lynxeyed_atsu | 0:d920d64db582 | 128 | |
lynxeyed_atsu | 0:d920d64db582 | 129 | }else{ /* Buffer is NOT ready to read? */ |
lynxeyed_atsu | 0:d920d64db582 | 130 | return; /* NO:return */ |
lynxeyed_atsu | 0:d920d64db582 | 131 | } |
lynxeyed_atsu | 0:d920d64db582 | 132 | } |
lynxeyed_atsu | 0:d920d64db582 | 133 | //Send I2S_TX |
lynxeyed_atsu | 0:d920d64db582 | 134 | if(I2S_GetLevel(LPC_I2S, I2S_TX_MODE)==TXFIFO_FULL)break; |
lynxeyed_atsu | 0:d920d64db582 | 135 | DBufLR = (0xffff0000 & (AudioBuf[j][i++]<<16))|(0x0000ffff & AudioBuf[j][i++]); |
lynxeyed_atsu | 0:d920d64db582 | 136 | I2S_Send(LPC_I2S,DBufLR); |
lynxeyed_atsu | 0:d920d64db582 | 137 | } |
lynxeyed_atsu | 0:d920d64db582 | 138 | } |
lynxeyed_atsu | 0:d920d64db582 | 139 | |
lynxeyed_atsu | 0:d920d64db582 | 140 | void encode(long int n){ |
lynxeyed_atsu | 0:d920d64db582 | 141 | int zero_shift = 0; |
lynxeyed_atsu | 0:d920d64db582 | 142 | |
lynxeyed_atsu | 0:d920d64db582 | 143 | if(n < 0){ |
lynxeyed_atsu | 0:d920d64db582 | 144 | putbit(0); // sign (put 0:if n as negative) |
lynxeyed_atsu | 0:d920d64db582 | 145 | n = -n; // n = abs(n) |
lynxeyed_atsu | 0:d920d64db582 | 146 | //printf("\t 0"); |
lynxeyed_atsu | 0:d920d64db582 | 147 | } |
lynxeyed_atsu | 0:d920d64db582 | 148 | else{ |
lynxeyed_atsu | 0:d920d64db582 | 149 | putbit(1); // sign (put 1:if n as positive) |
lynxeyed_atsu | 0:d920d64db582 | 150 | //printf("\t 1"); |
lynxeyed_atsu | 0:d920d64db582 | 151 | } |
lynxeyed_atsu | 0:d920d64db582 | 152 | zero_shift = (n >> (_lsb_k)); |
lynxeyed_atsu | 0:d920d64db582 | 153 | //printf("\t shift= %d",zero_shift); |
lynxeyed_atsu | 0:d920d64db582 | 154 | while(zero_shift > 0){ |
lynxeyed_atsu | 0:d920d64db582 | 155 | |
lynxeyed_atsu | 0:d920d64db582 | 156 | zero_shift--; |
lynxeyed_atsu | 0:d920d64db582 | 157 | putbit(0); |
lynxeyed_atsu | 0:d920d64db582 | 158 | } // put n/(2^_lsb_k) 0's |
lynxeyed_atsu | 0:d920d64db582 | 159 | |
lynxeyed_atsu | 0:d920d64db582 | 160 | putbit(1); // terminating "1" |
lynxeyed_atsu | 0:d920d64db582 | 161 | putbits(_lsb_k,rightbits(_lsb_k,n)); |
lynxeyed_atsu | 0:d920d64db582 | 162 | //printf("\t finish= %d \r\n",(n & ((1U<<_lsb_k)-1))); |
lynxeyed_atsu | 0:d920d64db582 | 163 | } |
lynxeyed_atsu | 0:d920d64db582 | 164 | |
lynxeyed_atsu | 0:d920d64db582 | 165 | |
lynxeyed_atsu | 0:d920d64db582 | 166 | |
lynxeyed_atsu | 0:d920d64db582 | 167 | void decode(void) |
lynxeyed_atsu | 0:d920d64db582 | 168 | { |
lynxeyed_atsu | 0:d920d64db582 | 169 | volatile short i=0,j=0; |
lynxeyed_atsu | 0:d920d64db582 | 170 | |
lynxeyed_atsu | 0:d920d64db582 | 171 | volatile long int diff=0,diff2=0; /* differential of previous data buffer */ |
lynxeyed_atsu | 0:d920d64db582 | 172 | volatile unsigned int buff_sign,zero_shift; /* sign buffer,register for unary codings */ |
lynxeyed_atsu | 0:d920d64db582 | 173 | volatile long int decode_buff; |
lynxeyed_atsu | 0:d920d64db582 | 174 | |
lynxeyed_atsu | 0:d920d64db582 | 175 | volatile unsigned char k1= k_bits; /* Coding Parameter (init:k_bits) */ |
lynxeyed_atsu | 0:d920d64db582 | 176 | volatile unsigned char k2= k_bits; |
lynxeyed_atsu | 0:d920d64db582 | 177 | |
lynxeyed_atsu | 0:d920d64db582 | 178 | init_bit_o(); |
lynxeyed_atsu | 0:d920d64db582 | 179 | init_bit_i(); /* init bit control function */ |
lynxeyed_atsu | 0:d920d64db582 | 180 | while(1){ |
lynxeyed_atsu | 0:d920d64db582 | 181 | |
lynxeyed_atsu | 0:d920d64db582 | 182 | if(i!=empty_c) |
lynxeyed_atsu | 0:d920d64db582 | 183 | { |
lynxeyed_atsu | 0:d920d64db582 | 184 | if(j>=AudioBufRow-1) |
lynxeyed_atsu | 0:d920d64db582 | 185 | { |
lynxeyed_atsu | 0:d920d64db582 | 186 | i=empty_c; /* Choose empty buffer*/ |
lynxeyed_atsu | 0:d920d64db582 | 187 | j=0; |
lynxeyed_atsu | 0:d920d64db582 | 188 | } |
lynxeyed_atsu | 0:d920d64db582 | 189 | } |
lynxeyed_atsu | 0:d920d64db582 | 190 | |
lynxeyed_atsu | 0:d920d64db582 | 191 | if (j<AudioBufRow-1) |
lynxeyed_atsu | 0:d920d64db582 | 192 | { |
lynxeyed_atsu | 0:d920d64db582 | 193 | /* decode */ |
lynxeyed_atsu | 0:d920d64db582 | 194 | if((buff_sign = getbit()) == OVERRUN)break; /*get sign*/ |
lynxeyed_atsu | 0:d920d64db582 | 195 | |
lynxeyed_atsu | 0:d920d64db582 | 196 | zero_shift = 0; |
lynxeyed_atsu | 0:d920d64db582 | 197 | while(getbit()==0) |
lynxeyed_atsu | 0:d920d64db582 | 198 | zero_shift++; /* decode unary code */ |
lynxeyed_atsu | 0:d920d64db582 | 199 | |
lynxeyed_atsu | 0:d920d64db582 | 200 | decode_buff = (signed int)(zero_shift*(1U<<k1)); /*decode Rice-Golomb code*/ |
lynxeyed_atsu | 0:d920d64db582 | 201 | decode_buff += getbits(k1); |
lynxeyed_atsu | 0:d920d64db582 | 202 | |
lynxeyed_atsu | 0:d920d64db582 | 203 | if(!buff_sign)decode_buff =- decode_buff; /*add sign */ |
lynxeyed_atsu | 0:d920d64db582 | 204 | diff =(diff + decode_buff); /* get audio data */ |
lynxeyed_atsu | 0:d920d64db582 | 205 | |
lynxeyed_atsu | 0:d920d64db582 | 206 | AudioBuf[i][j]=(short int)(diff); /* write AudioBuf */ |
lynxeyed_atsu | 0:d920d64db582 | 207 | j++; |
lynxeyed_atsu | 0:d920d64db582 | 208 | |
lynxeyed_atsu | 0:d920d64db582 | 209 | |
lynxeyed_atsu | 0:d920d64db582 | 210 | #if _RGM_ADAPTIVE |
lynxeyed_atsu | 0:d920d64db582 | 211 | /* calc k */ |
lynxeyed_atsu | 0:d920d64db582 | 212 | if(zero_shift > 2)k1=k1+1; |
lynxeyed_atsu | 0:d920d64db582 | 213 | if(zero_shift == 0)k1=k1-1; |
lynxeyed_atsu | 0:d920d64db582 | 214 | if(k1 < min_of_k)k1 = min_of_k; |
lynxeyed_atsu | 0:d920d64db582 | 215 | if(k1 > max_of_k)k1 = max_of_k; |
lynxeyed_atsu | 0:d920d64db582 | 216 | #endif |
lynxeyed_atsu | 0:d920d64db582 | 217 | |
lynxeyed_atsu | 0:d920d64db582 | 218 | if((buff_sign = getbit()) == OVERRUN)break; /* get sign */ |
lynxeyed_atsu | 0:d920d64db582 | 219 | |
lynxeyed_atsu | 0:d920d64db582 | 220 | zero_shift = 0; |
lynxeyed_atsu | 0:d920d64db582 | 221 | while(getbit()==0) |
lynxeyed_atsu | 0:d920d64db582 | 222 | zero_shift++; /* decode unary code */ |
lynxeyed_atsu | 0:d920d64db582 | 223 | |
lynxeyed_atsu | 0:d920d64db582 | 224 | decode_buff = (signed int)(zero_shift*(1U<<k2)); /* decode Rice-Golomb code */ |
lynxeyed_atsu | 0:d920d64db582 | 225 | decode_buff += getbits(k2); |
lynxeyed_atsu | 0:d920d64db582 | 226 | |
lynxeyed_atsu | 0:d920d64db582 | 227 | if(!buff_sign)decode_buff =- decode_buff; /* add sign */ |
lynxeyed_atsu | 0:d920d64db582 | 228 | diff2 =(diff2 + decode_buff); /* get Audio data */ |
lynxeyed_atsu | 0:d920d64db582 | 229 | |
lynxeyed_atsu | 0:d920d64db582 | 230 | AudioBuf[i][j]=(short int)(diff2); /* Write Buffer */ |
lynxeyed_atsu | 0:d920d64db582 | 231 | j++; |
lynxeyed_atsu | 0:d920d64db582 | 232 | |
lynxeyed_atsu | 0:d920d64db582 | 233 | #if _RGM_ADAPTIVE |
lynxeyed_atsu | 0:d920d64db582 | 234 | /* calc k */ |
lynxeyed_atsu | 0:d920d64db582 | 235 | if(zero_shift > 2)k2=k2+1; |
lynxeyed_atsu | 0:d920d64db582 | 236 | if(zero_shift == 0)k2=k2-1; |
lynxeyed_atsu | 0:d920d64db582 | 237 | if(k2 < min_of_k)k2 = min_of_k; |
lynxeyed_atsu | 0:d920d64db582 | 238 | if(k2 > max_of_k)k2 = max_of_k; |
lynxeyed_atsu | 0:d920d64db582 | 239 | #endif |
lynxeyed_atsu | 0:d920d64db582 | 240 | |
lynxeyed_atsu | 0:d920d64db582 | 241 | } |
lynxeyed_atsu | 0:d920d64db582 | 242 | if(j>=AudioBufRow-1){ /* AudioBuf is filled with data? */ |
lynxeyed_atsu | 0:d920d64db582 | 243 | dac_semp = true; |
lynxeyed_atsu | 0:d920d64db582 | 244 | } |
lynxeyed_atsu | 0:d920d64db582 | 245 | } |
lynxeyed_atsu | 0:d920d64db582 | 246 | } |
lynxeyed_atsu | 0:d920d64db582 | 247 | |
lynxeyed_atsu | 0:d920d64db582 | 248 | |
lynxeyed_atsu | 0:d920d64db582 | 249 | int main() { |
lynxeyed_atsu | 0:d920d64db582 | 250 | |
lynxeyed_atsu | 0:d920d64db582 | 251 | char s[256]; |
lynxeyed_atsu | 0:d920d64db582 | 252 | char* p; |
lynxeyed_atsu | 0:d920d64db582 | 253 | |
lynxeyed_atsu | 0:d920d64db582 | 254 | lcd.cls(); |
lynxeyed_atsu | 0:d920d64db582 | 255 | lcd.locate(0,0); |
lynxeyed_atsu | 0:d920d64db582 | 256 | lcd.printf("I2S Codec:"); |
lynxeyed_atsu | 0:d920d64db582 | 257 | mbed_i2s_init(); //DAC:44100Hz sampling ,16bit ,Stereo ,MCLK Disable, TLV320AIC23B=Master |
lynxeyed_atsu | 0:d920d64db582 | 258 | if(aic23b_init()==0){ |
lynxeyed_atsu | 0:d920d64db582 | 259 | lcd.locate(12,0); |
lynxeyed_atsu | 0:d920d64db582 | 260 | lcd.printf("OK"); |
lynxeyed_atsu | 0:d920d64db582 | 261 | }else{ |
lynxeyed_atsu | 0:d920d64db582 | 262 | lcd.locate(12,0); |
lynxeyed_atsu | 0:d920d64db582 | 263 | lcd.printf("NG"); |
lynxeyed_atsu | 0:d920d64db582 | 264 | } |
lynxeyed_atsu | 0:d920d64db582 | 265 | Buffer_Init(); |
lynxeyed_atsu | 0:d920d64db582 | 266 | pc.printf("CCLKCFG= %d \r\n",LPC_SC->CCLKCFG); |
lynxeyed_atsu | 0:d920d64db582 | 267 | pc.printf("I2S Send start.\r\n"); |
lynxeyed_atsu | 0:d920d64db582 | 268 | led1=1; |
lynxeyed_atsu | 0:d920d64db582 | 269 | lcd.locate(0,1); |
lynxeyed_atsu | 0:d920d64db582 | 270 | lcd.printf("> Please Wait..."); |
lynxeyed_atsu | 0:d920d64db582 | 271 | |
lynxeyed_atsu | 0:d920d64db582 | 272 | if ( NULL == (playlist = fopen( "/sd/play.txt", "r" )) ) { |
lynxeyed_atsu | 0:d920d64db582 | 273 | printf( "\r\nError: The Playlist file cannot be accessed\r\n" ); |
lynxeyed_atsu | 0:d920d64db582 | 274 | return -1; |
lynxeyed_atsu | 0:d920d64db582 | 275 | } |
lynxeyed_atsu | 0:d920d64db582 | 276 | |
lynxeyed_atsu | 0:d920d64db582 | 277 | |
lynxeyed_atsu | 0:d920d64db582 | 278 | while(1){ |
lynxeyed_atsu | 0:d920d64db582 | 279 | if((fgets( s, 256, playlist ))==NULL){ |
lynxeyed_atsu | 0:d920d64db582 | 280 | fseek(playlist, 0L, SEEK_SET); |
lynxeyed_atsu | 0:d920d64db582 | 281 | fgets( s, 256, playlist ); |
lynxeyed_atsu | 0:d920d64db582 | 282 | } |
lynxeyed_atsu | 0:d920d64db582 | 283 | p=strchr(s,'\n'); |
lynxeyed_atsu | 0:d920d64db582 | 284 | if(p!=NULL){ |
lynxeyed_atsu | 0:d920d64db582 | 285 | *p='\0'; |
lynxeyed_atsu | 0:d920d64db582 | 286 | |
lynxeyed_atsu | 0:d920d64db582 | 287 | } //remove CR code for Macintosh text-file |
lynxeyed_atsu | 0:d920d64db582 | 288 | p=strchr(s,'\r'); |
lynxeyed_atsu | 0:d920d64db582 | 289 | if(p!=NULL){ |
lynxeyed_atsu | 0:d920d64db582 | 290 | *p='\0'; |
lynxeyed_atsu | 0:d920d64db582 | 291 | |
lynxeyed_atsu | 0:d920d64db582 | 292 | } //remove LF code for Linux & Windows text-file |
lynxeyed_atsu | 0:d920d64db582 | 293 | printf("\r\n open file:%s \r\n",s); // cut '\n' symbol |
lynxeyed_atsu | 0:d920d64db582 | 294 | lcd.locate(0,1); |
lynxeyed_atsu | 0:d920d64db582 | 295 | lcd.printf("> "); |
lynxeyed_atsu | 0:d920d64db582 | 296 | s[15]='\0'; |
lynxeyed_atsu | 0:d920d64db582 | 297 | lcd.locate(1,1); |
lynxeyed_atsu | 0:d920d64db582 | 298 | lcd.printf("%s",s); |
lynxeyed_atsu | 0:d920d64db582 | 299 | if ( NULL == (infp = fopen( s, "r" )) ) { |
lynxeyed_atsu | 0:d920d64db582 | 300 | printf( "\r\nError: The message file cannot be accessed\r\n" ); |
lynxeyed_atsu | 0:d920d64db582 | 301 | return -1; |
lynxeyed_atsu | 0:d920d64db582 | 302 | } |
lynxeyed_atsu | 0:d920d64db582 | 303 | |
lynxeyed_atsu | 0:d920d64db582 | 304 | fseek(infp, 0L, SEEK_SET); |
lynxeyed_atsu | 0:d920d64db582 | 305 | tick.attach_us(&dac_out, 181); //set 44.1kHz/8(word FIFO) sampling data |
lynxeyed_atsu | 0:d920d64db582 | 306 | fl_leds.attach(&pl_led_flash,1); |
lynxeyed_atsu | 0:d920d64db582 | 307 | |
lynxeyed_atsu | 0:d920d64db582 | 308 | |
lynxeyed_atsu | 0:d920d64db582 | 309 | decode(); |
lynxeyed_atsu | 0:d920d64db582 | 310 | |
lynxeyed_atsu | 0:d920d64db582 | 311 | fclose( infp ); |
lynxeyed_atsu | 0:d920d64db582 | 312 | infp = NULL; |
lynxeyed_atsu | 0:d920d64db582 | 313 | tick.detach(); |
lynxeyed_atsu | 0:d920d64db582 | 314 | fl_leds.detach(); |
lynxeyed_atsu | 0:d920d64db582 | 315 | lcd.locate(0,1); |
lynxeyed_atsu | 0:d920d64db582 | 316 | lcd.printf("> Please Wait..."); |
lynxeyed_atsu | 0:d920d64db582 | 317 | } |
lynxeyed_atsu | 0:d920d64db582 | 318 | } |
lynxeyed_atsu | 0:d920d64db582 | 319 | |
lynxeyed_atsu | 0:d920d64db582 | 320 |