Music Player for ARCH-PRO

Dependencies:   GT20L16J1Y_font TinyJpgDec mbed

SeeedStudio Arch Pro + aitendo TFT-LCD w/Touch panel => .wav File Player
LPC1768 + aitendo TFT-LCD w/Touch panel => .wav File Player
http://goji2100.com/
/media/uploads/Goji/017s.png

Committer:
Goji
Date:
Mon Sep 08 16:07:05 2014 +0000
Revision:
0:6fa19738f62e
Music Player for ARCH-PRO

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Goji 0:6fa19738f62e 1 // --------------------------------------------------------
Goji 0:6fa19738f62e 2 // GSDPlayer (c) CopYright 2013-2014 Goji. goji2100.com
Goji 0:6fa19738f62e 3 // --------------------------------------------------------
Goji 0:6fa19738f62e 4
Goji 0:6fa19738f62e 5 #include "mbed.h"
Goji 0:6fa19738f62e 6 #include "mainconf.h"
Goji 0:6fa19738f62e 7
Goji 0:6fa19738f62e 8 #include "SDFileSystem.h"
Goji 0:6fa19738f62e 9 #include "TinyJpgDec.h"
Goji 0:6fa19738f62e 10
Goji 0:6fa19738f62e 11 #include "mGTFT.h"
Goji 0:6fa19738f62e 12 #include "mGTP.h"
Goji 0:6fa19738f62e 13 #include "GT20L16J1Y_font.h"
Goji 0:6fa19738f62e 14
Goji 0:6fa19738f62e 15
Goji 0:6fa19738f62e 16 /* SDFileSystem.cpp change
Goji 0:6fa19738f62e 17 -----------------------------------------------------------------------
Goji 0:6fa19738f62e 18 144: _spi.frequency(16000000);
Goji 0:6fa19738f62e 19 210: _spi.frequency(24000000); // Set to 1MHz for data transfer
Goji 0:6fa19738f62e 20 */
Goji 0:6fa19738f62e 21
Goji 0:6fa19738f62e 22
Goji 0:6fa19738f62e 23 //#define Level_Indicator 4000 // for Level Indicator
Goji 0:6fa19738f62e 24 //#define Test // for Simple Player
Goji 0:6fa19738f62e 25
Goji 0:6fa19738f62e 26 #define FILESYS "sd"
Goji 0:6fa19738f62e 27 #if defined(_ARCH_PRO)
Goji 0:6fa19738f62e 28 SDFileSystem sd(P0_9, P0_8, P0_7, P0_6, FILESYS); // Arch Pro SPI1SD
Goji 0:6fa19738f62e 29 #define BUFF_SIZE (512 * 4) // WAV file buffer size
Goji 0:6fa19738f62e 30 #define LLow 1
Goji 0:6fa19738f62e 31 #define LHigh 0
Goji 0:6fa19738f62e 32 PwmOut Line_R(P2_0), Line_L(P2_1); // PWM_1, PWM_2
Goji 0:6fa19738f62e 33 BusOut TFTBus(D8, D9, D2, D3, D4, D5, D6, D7);
Goji 0:6fa19738f62e 34 #else
Goji 0:6fa19738f62e 35 #endif
Goji 0:6fa19738f62e 36
Goji 0:6fa19738f62e 37 Serial pc(USBTX, USBRX);
Goji 0:6fa19738f62e 38 DigitalOut statLED1(LED1), statLED2(LED2), statLED3(LED3), statLED4(LED4);
Goji 0:6fa19738f62e 39
Goji 0:6fa19738f62e 40 #define PWM_CLKMHZ 24 // 24MHz
Goji 0:6fa19738f62e 41 Ticker Tick_Timer;
Goji 0:6fa19738f62e 42
Goji 0:6fa19738f62e 43 volatile uint16_t ps_stat = 0; // Player status
Goji 0:6fa19738f62e 44 uint16_t tp_stat = 0, tp_statN = 0;
Goji 0:6fa19738f62e 45 #define PS_PLAY BIT1(15)
Goji 0:6fa19738f62e 46 #define PS_PAUSE BIT1(14)
Goji 0:6fa19738f62e 47 #define PS_FFR BIT1(13)
Goji 0:6fa19738f62e 48 #define PS_FFF BIT1(12)
Goji 0:6fa19738f62e 49 #define PS_SEEK BIT1(11)
Goji 0:6fa19738f62e 50 #define PS_FR BIT1(10)
Goji 0:6fa19738f62e 51 #define PS_FF BIT1( 9)
Goji 0:6fa19738f62e 52 #define PS_VDOWN BIT1( 8)
Goji 0:6fa19738f62e 53 #define PS_VUP BIT1( 7)
Goji 0:6fa19738f62e 54 #define PS_EOR BIT1( 6) // End of Root
Goji 0:6fa19738f62e 55 #define PS_EOD BIT1( 5) // End of DIR
Goji 0:6fa19738f62e 56 #define PS_EOF BIT1( 4) // Eod of File
Goji 0:6fa19738f62e 57
Goji 0:6fa19738f62e 58 #define SWBuff() { if (buffNX==0) { buffNW=0,buffNX=1; } else { buffNW=1,buffNX=0; } buffLN[buffNX]=buffGP=0; }
Goji 0:6fa19738f62e 59 volatile int32_t buffNW, buffNX, buffLN[2], buffGP;
Goji 0:6fa19738f62e 60 unsigned char Wave_buff[2][BUFF_SIZE];
Goji 0:6fa19738f62e 61 #define _WS16(n,v) *(short* )&Wave_buff[n][v]
Goji 0:6fa19738f62e 62 #define _WU16(n,v) *(unsigned short*)&Wave_buff[n][v]
Goji 0:6fa19738f62e 63 #define _WU32(n,v) *(unsigned long* )&Wave_buff[n][v]
Goji 0:6fa19738f62e 64 uint8_t Wave_CHs, Wave_Bits;
Goji 0:6fa19738f62e 65 uint32_t Wave_BPS, Wave_Size, Wave_Rlen, Wave_Play, Wave_FPos;
Goji 0:6fa19738f62e 66 uint16_t Wave_Prid;
Goji 0:6fa19738f62e 67
Goji 0:6fa19738f62e 68 volatile uint16_t Pwm_Ratio, Line_Vols = 16, Line_Vol = 160;
Goji 0:6fa19738f62e 69
Goji 0:6fa19738f62e 70 #if defined(Level_Indicator)
Goji 0:6fa19738f62e 71 volatile uint32_t Pwm_cnt = 0;
Goji 0:6fa19738f62e 72 volatile uint16_t Pwm_aveL = 0, Pwm_aveR = 0;
Goji 0:6fa19738f62e 73 #endif
Goji 0:6fa19738f62e 74
Goji 0:6fa19738f62e 75 void PwmLR_Out16(int16_t lv, int16_t rv)
Goji 0:6fa19738f62e 76 {
Goji 0:6fa19738f62e 77 int16_t lw = ((lv + 32768) / Pwm_Ratio);
Goji 0:6fa19738f62e 78 int16_t rw = ((rv + 32768) / Pwm_Ratio);
Goji 0:6fa19738f62e 79 // if (lw >= LPC_PWM1->MR0) lw = LPC_PWM1->MR0;
Goji 0:6fa19738f62e 80 // if (rw >= LPC_PWM1->MR0) rw = LPC_PWM1->MR0;
Goji 0:6fa19738f62e 81 #if defined(_ARCH_PRO)
Goji 0:6fa19738f62e 82 LPC_PWM1->MR1 = lw;
Goji 0:6fa19738f62e 83 LPC_PWM1->MR2 = rw;
Goji 0:6fa19738f62e 84 if (Line_Vols)
Goji 0:6fa19738f62e 85 LPC_PWM1->LER |= ((1 << 1) | (1 << 2));
Goji 0:6fa19738f62e 86 #else
Goji 0:6fa19738f62e 87 LPC_PWM1->MR6 = lw;
Goji 0:6fa19738f62e 88 LPC_PWM1->MR5 = rw;
Goji 0:6fa19738f62e 89 if (Line_Vols)
Goji 0:6fa19738f62e 90 LPC_PWM1->LER |= ((1 << 6) | (1 << 5));
Goji 0:6fa19738f62e 91 #endif
Goji 0:6fa19738f62e 92 #if defined(Level_Indicator)
Goji 0:6fa19738f62e 93 Pwm_cnt++;
Goji 0:6fa19738f62e 94 Pwm_aveL = (Pwm_aveL + ((uint16_t)(lv) + 32768) >> 8) / 2;
Goji 0:6fa19738f62e 95 Pwm_aveR = (Pwm_aveR + ((uint16_t)(rv) + 32768) >> 8) / 2;
Goji 0:6fa19738f62e 96 #endif
Goji 0:6fa19738f62e 97 }
Goji 0:6fa19738f62e 98
Goji 0:6fa19738f62e 99
Goji 0:6fa19738f62e 100 void ISR_Tick(void)
Goji 0:6fa19738f62e 101 {
Goji 0:6fa19738f62e 102 if (!(ps_stat & PS_PAUSE) && (buffGP < buffLN[buffNW])) {
Goji 0:6fa19738f62e 103 statLED2 = LHigh;
Goji 0:6fa19738f62e 104 PwmLR_Out16(_WS16(buffNW, buffGP), _WS16(buffNW, buffGP + 2));
Goji 0:6fa19738f62e 105 buffGP += 4;
Goji 0:6fa19738f62e 106 if ((buffGP >= buffLN[buffNW]) && (buffNX != -1)) SWBuff();
Goji 0:6fa19738f62e 107 statLED2 = LLow;
Goji 0:6fa19738f62e 108 }
Goji 0:6fa19738f62e 109 }
Goji 0:6fa19738f62e 110
Goji 0:6fa19738f62e 111
Goji 0:6fa19738f62e 112 extern TFT_INFO TFT_info;
Goji 0:6fa19738f62e 113 int32_t Last_Err;
Goji 0:6fa19738f62e 114
Goji 0:6fa19738f62e 115 GT20L16J1Y_FONT font(p11, p12, p13, P0_16);
Goji 0:6fa19738f62e 116 void draw_kanji(int x1, int y1, uint16_t c1, uint16_t c2)
Goji 0:6fa19738f62e 117 {
Goji 0:6fa19738f62e 118 for (int x = 0; x < 32; x++)
Goji 0:6fa19738f62e 119 for (int y = 0, m = 0x01; y < 8; y++, m <<= 1)
Goji 0:6fa19738f62e 120 TFT_setPixel(x1 + x%16, y1 + y + (8 * (x >> 4)), ((font.bitmap[x] & m) ? c1 : c2));
Goji 0:6fa19738f62e 121 }
Goji 0:6fa19738f62e 122
Goji 0:6fa19738f62e 123
Goji 0:6fa19738f62e 124 uint16_t bmpXsize, bmpYsize;
Goji 0:6fa19738f62e 125
Goji 0:6fa19738f62e 126 void BMP24Bits(int16_t x1, int16_t y1, char *fn)
Goji 0:6fa19738f62e 127 {
Goji 0:6fa19738f62e 128 uint8_t rbuff[64];
Goji 0:6fa19738f62e 129
Goji 0:6fa19738f62e 130 FILE *fp = fopen(fn, "rb");
Goji 0:6fa19738f62e 131 if (!fp) {
Goji 0:6fa19738f62e 132 pc.printf("open error\n");
Goji 0:6fa19738f62e 133 return;
Goji 0:6fa19738f62e 134 }
Goji 0:6fa19738f62e 135
Goji 0:6fa19738f62e 136 fread(rbuff, 1, (14 + 40), fp);
Goji 0:6fa19738f62e 137 bmpXsize = *(uint16_t*)&rbuff[18];
Goji 0:6fa19738f62e 138 bmpYsize = *(uint16_t*)&rbuff[22];
Goji 0:6fa19738f62e 139
Goji 0:6fa19738f62e 140 if ((bmpXsize > TFT_MAX_X) ||
Goji 0:6fa19738f62e 141 (bmpYsize > TFT_MAX_Y) ||
Goji 0:6fa19738f62e 142 (rbuff[28] != 24)) {
Goji 0:6fa19738f62e 143 pc.printf("format error\n");
Goji 0:6fa19738f62e 144 return;
Goji 0:6fa19738f62e 145 }
Goji 0:6fa19738f62e 146
Goji 0:6fa19738f62e 147 int dummy = (bmpXsize * 3) % 4;
Goji 0:6fa19738f62e 148 for (int z = 0, y = y1; z < bmpYsize; z++, y--) {
Goji 0:6fa19738f62e 149 TFT_setXY(x1, y);
Goji 0:6fa19738f62e 150 for (int i = 0; i < bmpXsize; i++) {
Goji 0:6fa19738f62e 151 fread(rbuff, 1, 3, fp);
Goji 0:6fa19738f62e 152 TFT_wr_data((uint16_t)(
Goji 0:6fa19738f62e 153 ((rbuff[2] & 0xF8) << 8) | // R
Goji 0:6fa19738f62e 154 ((rbuff[1] & 0xFC) << 3) | // G
Goji 0:6fa19738f62e 155 ((rbuff[0] ) >> 3) )); // B
Goji 0:6fa19738f62e 156 }
Goji 0:6fa19738f62e 157 if (dummy) fread(rbuff, 1, dummy, fp);
Goji 0:6fa19738f62e 158 }
Goji 0:6fa19738f62e 159 fclose(fp);
Goji 0:6fa19738f62e 160 }
Goji 0:6fa19738f62e 161
Goji 0:6fa19738f62e 162
Goji 0:6fa19738f62e 163 FILE *jfp;
Goji 0:6fa19738f62e 164 UINT jpeg_input(JDEC *jd, BYTE *buff, UINT ndata)
Goji 0:6fa19738f62e 165 {
Goji 0:6fa19738f62e 166 if (buff) {
Goji 0:6fa19738f62e 167 int n = fread(buff, 1, ndata, jfp);
Goji 0:6fa19738f62e 168 return(n == -1 ? 0 : n);
Goji 0:6fa19738f62e 169 }
Goji 0:6fa19738f62e 170 return(fseek(jfp, ndata, SEEK_CUR) == -1 ? 0 : ndata);
Goji 0:6fa19738f62e 171 }
Goji 0:6fa19738f62e 172
Goji 0:6fa19738f62e 173 int16_t Cover_tlx, Cover_tly;
Goji 0:6fa19738f62e 174
Goji 0:6fa19738f62e 175 UINT jpeg_output(JDEC *jd, void *bitmap, JRECT *rect)
Goji 0:6fa19738f62e 176 {
Goji 0:6fa19738f62e 177 WORD *src = (WORD *)bitmap;
Goji 0:6fa19738f62e 178
Goji 0:6fa19738f62e 179 int x0 = rect->left;
Goji 0:6fa19738f62e 180 int x1 = rect->right;
Goji 0:6fa19738f62e 181 int y0 = rect->top;
Goji 0:6fa19738f62e 182 int y1 = rect->bottom;
Goji 0:6fa19738f62e 183 int w = x1 - x0 + 1;
Goji 0:6fa19738f62e 184
Goji 0:6fa19738f62e 185 if (x0 >= TFT_MAX_X || y0 >= TFT_MAX_Y) return 1;
Goji 0:6fa19738f62e 186 if (x1 >= TFT_MAX_X) x1 = TFT_MAX_X - 1;
Goji 0:6fa19738f62e 187 if (y1 >= TFT_MAX_Y) y1 = TFT_MAX_Y - 1;
Goji 0:6fa19738f62e 188
Goji 0:6fa19738f62e 189 for (int y = y0; y <= y1; y++) {
Goji 0:6fa19738f62e 190 TFT_setXY(Cover_tlx + x0, Cover_tly + y);
Goji 0:6fa19738f62e 191 WORD *p = src + w * (y - y0);
Goji 0:6fa19738f62e 192 for (int x = x0; x <= x1; x++)
Goji 0:6fa19738f62e 193 TFT_wr_data(*p++);
Goji 0:6fa19738f62e 194 }
Goji 0:6fa19738f62e 195 return 1;
Goji 0:6fa19738f62e 196 }
Goji 0:6fa19738f62e 197
Goji 0:6fa19738f62e 198
Goji 0:6fa19738f62e 199 #define MM_TLX 0
Goji 0:6fa19738f62e 200 #define MM_TLY (TFT_MAX_Y - bmpYsize)
Goji 0:6fa19738f62e 201 #define MM_YH bmpYsize
Goji 0:6fa19738f62e 202
Goji 0:6fa19738f62e 203 #define MM_FR 80
Goji 0:6fa19738f62e 204 #define MM_PLAY (MM_FR + 50)
Goji 0:6fa19738f62e 205 #define MM_FF (MM_PLAY + 54)
Goji 0:6fa19738f62e 206 #define MM_FFE (MM_FF + 50)
Goji 0:6fa19738f62e 207 #define MM_VUPD (TFT_MAX_X - 58)
Goji 0:6fa19738f62e 208
Goji 0:6fa19738f62e 209 #define MM_VUP (TFT_MAX_Y - bmpYsize)
Goji 0:6fa19738f62e 210 #define MM_VDWN (TFT_MAX_Y - (bmpYsize / 2))
Goji 0:6fa19738f62e 211
Goji 0:6fa19738f62e 212 uint16_t tp_menu()
Goji 0:6fa19738f62e 213 {
Goji 0:6fa19738f62e 214 int16_t wposX, wposY;
Goji 0:6fa19738f62e 215
Goji 0:6fa19738f62e 216 if (TPC_getXY(&wposX, &wposY) == 2) {
Goji 0:6fa19738f62e 217 if (wposY < MM_TLY) return(PS_SEEK);
Goji 0:6fa19738f62e 218 if (wposX < MM_FR ) return(0);
Goji 0:6fa19738f62e 219 if (wposX < MM_PLAY) return(PS_FFR);
Goji 0:6fa19738f62e 220 else if (wposX < MM_FF ) return(PS_PAUSE);
Goji 0:6fa19738f62e 221 else if (wposX < MM_FFE ) return(PS_FFF);
Goji 0:6fa19738f62e 222 else if (wposY < MM_VDWN) return(PS_VUP);
Goji 0:6fa19738f62e 223 else if (wposY > MM_VDWN) return(PS_VDOWN);
Goji 0:6fa19738f62e 224 }
Goji 0:6fa19738f62e 225 return(0);
Goji 0:6fa19738f62e 226 }
Goji 0:6fa19738f62e 227
Goji 0:6fa19738f62e 228 //#define SEEK_Dump()
Goji 0:6fa19738f62e 229 #define SEEK_Dump() pc.printf("%d - (%8d - %d = %8d) = %8d(%8d)\n", Wave_Size,Wave_FPos,Wave_Play,Wave_FPos-Wave_Play,Wave_Rlen,Wave_Rlen-(Wave_Size-(Wave_FPos-Wave_Play)))
Goji 0:6fa19738f62e 230
Goji 0:6fa19738f62e 231 uint16_t event_chk()
Goji 0:6fa19738f62e 232 {
Goji 0:6fa19738f62e 233 static uint16_t stepS = 0, timep, barp, bcp;
Goji 0:6fa19738f62e 234 static int16_t tp_cnt = 0;
Goji 0:6fa19738f62e 235
Goji 0:6fa19738f62e 236 int16_t px, py;
Goji 0:6fa19738f62e 237 uint16_t statN = 0, tw, barl, bc;
Goji 0:6fa19738f62e 238 char times[8];
Goji 0:6fa19738f62e 239
Goji 0:6fa19738f62e 240 while (1) {
Goji 0:6fa19738f62e 241 switch (stepS) {
Goji 0:6fa19738f62e 242 case 0:
Goji 0:6fa19738f62e 243 case 50:
Goji 0:6fa19738f62e 244 tw = (Wave_FPos - Wave_Play) / (Wave_BPS * 4); // (Wave_FPos * 8) / (Wave_BPS * 16 * 4)
Goji 0:6fa19738f62e 245 if (tw != timep) {
Goji 0:6fa19738f62e 246 timep = tw;
Goji 0:6fa19738f62e 247 sprintf(times, "%02d:%02d", (timep / 60), (timep % 60));
Goji 0:6fa19738f62e 248 TFT_drawText( 28, (TFT_MAX_Y - 1) - 6 - (bmpYsize / 2), (uint8_t*)times, WHITE, BLACK);
Goji 0:6fa19738f62e 249 barp = 0;
Goji 0:6fa19738f62e 250 }
Goji 0:6fa19738f62e 251 stepS += 10;
Goji 0:6fa19738f62e 252 break;
Goji 0:6fa19738f62e 253
Goji 0:6fa19738f62e 254 case 10:
Goji 0:6fa19738f62e 255 case 60:
Goji 0:6fa19738f62e 256 barl = (((Wave_FPos - Wave_Play) / 1000) * TFT_MAX_X) / (Wave_Size / 1000);
Goji 0:6fa19738f62e 257 bc = (ps_stat & PS_PAUSE) ? YELLOW : BLUE;
Goji 0:6fa19738f62e 258 if ((stepS >= 50) || (barp != barl) || (bcp != bc)) {
Goji 0:6fa19738f62e 259 TFT_fillRectangle( 0, (TFT_MAX_Y - 1) - bmpYsize - 2, barl, (TFT_MAX_Y - 1) - bmpYsize, bc, bc);
Goji 0:6fa19738f62e 260 if (barl < (TFT_MAX_X - 1))
Goji 0:6fa19738f62e 261 TFT_fillRectangle(barl, (TFT_MAX_Y - 1) - bmpYsize - 2, (TFT_MAX_X - 1), (TFT_MAX_Y - 1) - bmpYsize, BLACK, BLACK);
Goji 0:6fa19738f62e 262 barp = barl;
Goji 0:6fa19738f62e 263 bcp = bc;
Goji 0:6fa19738f62e 264 }
Goji 0:6fa19738f62e 265 if (stepS > 50) stepS += 10;
Goji 0:6fa19738f62e 266 else stepS = 20;
Goji 0:6fa19738f62e 267 break;
Goji 0:6fa19738f62e 268
Goji 0:6fa19738f62e 269 case 70:
Goji 0:6fa19738f62e 270 if (TPC_getXY(&px, &py) == 2) {
Goji 0:6fa19738f62e 271 if (px < ((320 * 1) / 10)) px = ((320 * 1) / 10);
Goji 0:6fa19738f62e 272 if (px > ((320 * 9) / 10)) px = ((320 * 9) / 10);
Goji 0:6fa19738f62e 273 if (px < ((320 * 1) / 7)) {
Goji 0:6fa19738f62e 274 if (Wave_FPos < (Wave_BPS * 2 * 2 * 2)) {
Goji 0:6fa19738f62e 275 SEEK_Dump();
Goji 0:6fa19738f62e 276 statN = PS_FFR;
Goji 0:6fa19738f62e 277 tp_cnt = 0;
Goji 0:6fa19738f62e 278 stepS = 0;
Goji 0:6fa19738f62e 279 break;
Goji 0:6fa19738f62e 280 }
Goji 0:6fa19738f62e 281 Wave_FPos = Wave_Play;
Goji 0:6fa19738f62e 282 Wave_Rlen = Wave_Size;
Goji 0:6fa19738f62e 283 } else if (px >= ((320 * 9) / 10)) {
Goji 0:6fa19738f62e 284 Wave_FPos = Wave_Play + Wave_Size;
Goji 0:6fa19738f62e 285 Wave_Rlen = 0;
Goji 0:6fa19738f62e 286 } else {
Goji 0:6fa19738f62e 287 uint64_t pr = (px - ((320 * 1) / 10)) * 1000 / (((320 * 8) / 10));
Goji 0:6fa19738f62e 288 Wave_FPos = ((Wave_Size * pr) / 1000);
Goji 0:6fa19738f62e 289 if (Wave_FPos > (Wave_Play + Wave_Size)) Wave_FPos = Wave_Size + Wave_Play;
Goji 0:6fa19738f62e 290 if (Wave_FPos < Wave_Play) Wave_FPos = Wave_Play;
Goji 0:6fa19738f62e 291 Wave_Rlen = Wave_Size - (Wave_FPos - Wave_Play);
Goji 0:6fa19738f62e 292 }
Goji 0:6fa19738f62e 293 } else {
Goji 0:6fa19738f62e 294 tp_cnt++;
Goji 0:6fa19738f62e 295 if (tp_cnt > 100) {
Goji 0:6fa19738f62e 296 if (Wave_FPos < Wave_Size + Wave_Play) {
Goji 0:6fa19738f62e 297 Wave_FPos &= (uint64_t)-BUFF_SIZE;
Goji 0:6fa19738f62e 298 if (Wave_FPos < Wave_Play) Wave_FPos = Wave_Play;
Goji 0:6fa19738f62e 299 Wave_Rlen = Wave_Size - (Wave_FPos - Wave_Play);
Goji 0:6fa19738f62e 300 }
Goji 0:6fa19738f62e 301 SEEK_Dump();
Goji 0:6fa19738f62e 302 statN = PS_SEEK;
Goji 0:6fa19738f62e 303 tp_cnt = 0;
Goji 0:6fa19738f62e 304 stepS = 0;
Goji 0:6fa19738f62e 305 break;
Goji 0:6fa19738f62e 306 }
Goji 0:6fa19738f62e 307 }
Goji 0:6fa19738f62e 308 stepS = 50;
Goji 0:6fa19738f62e 309 break;
Goji 0:6fa19738f62e 310
Goji 0:6fa19738f62e 311 case 20:
Goji 0:6fa19738f62e 312 if (tp_stat != 0) {
Goji 0:6fa19738f62e 313 stepS = 22;
Goji 0:6fa19738f62e 314 break;
Goji 0:6fa19738f62e 315 }
Goji 0:6fa19738f62e 316 tp_stat = tp_menu();
Goji 0:6fa19738f62e 317 tp_cnt = 0;
Goji 0:6fa19738f62e 318 if (tp_stat & PS_SEEK) {
Goji 0:6fa19738f62e 319 ps_stat |= PS_PAUSE;
Goji 0:6fa19738f62e 320 stepS = 50;
Goji 0:6fa19738f62e 321 SEEK_Dump();
Goji 0:6fa19738f62e 322 break;
Goji 0:6fa19738f62e 323 }
Goji 0:6fa19738f62e 324 if (tp_stat == 0) stepS = 0;
Goji 0:6fa19738f62e 325 else stepS = 22;
Goji 0:6fa19738f62e 326 break;
Goji 0:6fa19738f62e 327
Goji 0:6fa19738f62e 328 case 22:
Goji 0:6fa19738f62e 329 tp_statN = tp_menu();
Goji 0:6fa19738f62e 330 if (tp_statN == 0) {
Goji 0:6fa19738f62e 331 tp_cnt = 0;
Goji 0:6fa19738f62e 332 tp_stat = 0;
Goji 0:6fa19738f62e 333 stepS = 0;
Goji 0:6fa19738f62e 334 break;
Goji 0:6fa19738f62e 335 }
Goji 0:6fa19738f62e 336 if (tp_stat == tp_statN) {
Goji 0:6fa19738f62e 337 if (tp_cnt != -1) tp_cnt++;
Goji 0:6fa19738f62e 338 stepS = 24;
Goji 0:6fa19738f62e 339 break;
Goji 0:6fa19738f62e 340 }
Goji 0:6fa19738f62e 341 tp_cnt = 0;
Goji 0:6fa19738f62e 342 tp_stat = tp_statN;
Goji 0:6fa19738f62e 343 stepS = 22;
Goji 0:6fa19738f62e 344 break;
Goji 0:6fa19738f62e 345
Goji 0:6fa19738f62e 346 case 24:
Goji 0:6fa19738f62e 347 if (tp_cnt > 1) {
Goji 0:6fa19738f62e 348 if (tp_stat & PS_VUP) {
Goji 0:6fa19738f62e 349 if (tp_cnt == 3) statN = tp_stat;
Goji 0:6fa19738f62e 350 if (tp_cnt >= 5) tp_cnt = 0;
Goji 0:6fa19738f62e 351 } else if (tp_stat & PS_VDOWN) {
Goji 0:6fa19738f62e 352 if (tp_cnt == 2) statN = tp_stat;
Goji 0:6fa19738f62e 353 if (tp_cnt >= 3) tp_cnt = 0;
Goji 0:6fa19738f62e 354 } else {
Goji 0:6fa19738f62e 355 statN = tp_stat;
Goji 0:6fa19738f62e 356 tp_cnt = -1;
Goji 0:6fa19738f62e 357 }
Goji 0:6fa19738f62e 358 }
Goji 0:6fa19738f62e 359 stepS = 0;
Goji 0:6fa19738f62e 360 break;
Goji 0:6fa19738f62e 361
Goji 0:6fa19738f62e 362 default:
Goji 0:6fa19738f62e 363 stepS = 0;
Goji 0:6fa19738f62e 364 break;
Goji 0:6fa19738f62e 365 }
Goji 0:6fa19738f62e 366 if (stepS < 50) break;
Goji 0:6fa19738f62e 367 }
Goji 0:6fa19738f62e 368 return(statN);
Goji 0:6fa19738f62e 369 }
Goji 0:6fa19738f62e 370
Goji 0:6fa19738f62e 371
Goji 0:6fa19738f62e 372 void poll()
Goji 0:6fa19738f62e 373 {
Goji 0:6fa19738f62e 374 uint16_t statN;
Goji 0:6fa19738f62e 375 char stext[8];
Goji 0:6fa19738f62e 376
Goji 0:6fa19738f62e 377 if ((statN = event_chk()) == 0) return;
Goji 0:6fa19738f62e 378 if (statN & PS_PAUSE) { ps_stat ^= PS_PAUSE; return; }
Goji 0:6fa19738f62e 379 if (statN & (PS_FFR | PS_FFF | PS_SEEK)) { ps_stat |= statN; return; }
Goji 0:6fa19738f62e 380 if (statN & (PS_VUP | PS_VDOWN)) {
Goji 0:6fa19738f62e 381 if (statN & PS_VUP) {
Goji 0:6fa19738f62e 382 if (Line_Vols < 32) { Line_Vol -= (Line_Vols >= 16 ? 10 : 40); Line_Vols++; }
Goji 0:6fa19738f62e 383 } else {
Goji 0:6fa19738f62e 384 if (Line_Vols > 0) { Line_Vol += (Line_Vols > 16 ? 10 : 40); Line_Vols--; }
Goji 0:6fa19738f62e 385 }
Goji 0:6fa19738f62e 386 sprintf(stext, "%2d", Line_Vols);
Goji 0:6fa19738f62e 387 TFT_drawText((TFT_MAX_X - 76), (TFT_MAX_Y - 1) - 6 - (bmpYsize / 2), (uint8_t*)stext, WHITE, BLACK);
Goji 0:6fa19738f62e 388 Pwm_Ratio = ((65536 / PWM_CLKMHZ) / Wave_Prid) + Line_Vol;
Goji 0:6fa19738f62e 389 }
Goji 0:6fa19738f62e 390 return;
Goji 0:6fa19738f62e 391 }
Goji 0:6fa19738f62e 392
Goji 0:6fa19738f62e 393
Goji 0:6fa19738f62e 394 DIR *dp;
Goji 0:6fa19738f62e 395 FILE *fp;
Goji 0:6fa19738f62e 396 struct dirent *p;
Goji 0:6fa19738f62e 397
Goji 0:6fa19738f62e 398 int Open_Wave(char *path)
Goji 0:6fa19738f62e 399 {
Goji 0:6fa19738f62e 400 fp = fopen(path, "rb");
Goji 0:6fa19738f62e 401 if (fp == NULL) return (Last_Err = -3); // can't open
Goji 0:6fa19738f62e 402
Goji 0:6fa19738f62e 403 buffLN[0] = fread(Wave_buff[0], 1, BUFF_SIZE, fp);
Goji 0:6fa19738f62e 404 if (buffLN[0] < 46) return (Last_Err = -4); // invalid file
Goji 0:6fa19738f62e 405
Goji 0:6fa19738f62e 406 // "RIFF", (long)File size, "WAVE"
Goji 0:6fa19738f62e 407 if ((_WU32(0, 0) != 0x46464952) ||
Goji 0:6fa19738f62e 408 (_WU32(0, 8) != 0x45564157))
Goji 0:6fa19738f62e 409 return (Last_Err = -5); // invalid file
Goji 0:6fa19738f62e 410
Goji 0:6fa19738f62e 411 buffGP = 12;
Goji 0:6fa19738f62e 412 while (buffGP < BUFF_SIZE) {
Goji 0:6fa19738f62e 413 unsigned long tagn = _WU32(0, buffGP);
Goji 0:6fa19738f62e 414 unsigned long tagl = _WU32(0, buffGP + 4);
Goji 0:6fa19738f62e 415 buffGP += 8;
Goji 0:6fa19738f62e 416
Goji 0:6fa19738f62e 417 if (tagn == 0x20746D66) { // "fmt "
Goji 0:6fa19738f62e 418 Wave_CHs = _WU16(0, buffGP + 2);
Goji 0:6fa19738f62e 419 Wave_BPS = _WU32(0, buffGP + 4);
Goji 0:6fa19738f62e 420 Wave_Bits = _WU32(0, buffGP +14);
Goji 0:6fa19738f62e 421 Wave_Prid = 2000000 / Wave_BPS;
Goji 0:6fa19738f62e 422 if (Wave_Prid & 1) Wave_Prid++;
Goji 0:6fa19738f62e 423 Wave_Prid >>= 1;
Goji 0:6fa19738f62e 424 }
Goji 0:6fa19738f62e 425
Goji 0:6fa19738f62e 426 // "fact" 0x74636166)
Goji 0:6fa19738f62e 427 // "LIST" 0x74636166)
Goji 0:6fa19738f62e 428 if (tagn != 0x61746164) { // !"data"
Goji 0:6fa19738f62e 429 buffGP += tagl;
Goji 0:6fa19738f62e 430 continue;
Goji 0:6fa19738f62e 431 }
Goji 0:6fa19738f62e 432
Goji 0:6fa19738f62e 433 if ((Wave_BPS == 24000) ||
Goji 0:6fa19738f62e 434 (Wave_BPS == 32000) ||
Goji 0:6fa19738f62e 435 (Wave_BPS == 44100) ||
Goji 0:6fa19738f62e 436 (Wave_BPS == 48000)) {
Goji 0:6fa19738f62e 437 Wave_Size = tagl;
Goji 0:6fa19738f62e 438 return 0;
Goji 0:6fa19738f62e 439 }
Goji 0:6fa19738f62e 440 break;
Goji 0:6fa19738f62e 441 }
Goji 0:6fa19738f62e 442 return (Last_Err = -6); // invalid file
Goji 0:6fa19738f62e 443 }
Goji 0:6fa19738f62e 444
Goji 0:6fa19738f62e 445
Goji 0:6fa19738f62e 446 int music_nw, music_nx;
Goji 0:6fa19738f62e 447
Goji 0:6fa19738f62e 448 int Play_Wave()
Goji 0:6fa19738f62e 449 {
Goji 0:6fa19738f62e 450 int32_t getln;
Goji 0:6fa19738f62e 451
Goji 0:6fa19738f62e 452 if (((buffNX != -1) && (buffLN[buffNX] == 0)) ||(ps_stat & (PS_SEEK | PS_FFR))) {
Goji 0:6fa19738f62e 453 statLED1 = LHigh;
Goji 0:6fa19738f62e 454 if (ps_stat & (PS_SEEK | PS_FFR)) {
Goji 0:6fa19738f62e 455 if (fseek(fp, Wave_FPos, SEEK_SET) == -1) {
Goji 0:6fa19738f62e 456 ps_stat |= PS_EOF;
Goji 0:6fa19738f62e 457 buffNX = -1;
Goji 0:6fa19738f62e 458 return (Last_Err = -7); // read error
Goji 0:6fa19738f62e 459 }
Goji 0:6fa19738f62e 460 Wave_Rlen = Wave_Size - (Wave_FPos - Wave_Play);
Goji 0:6fa19738f62e 461 ps_stat &= ~PS_FFR;
Goji 0:6fa19738f62e 462 }
Goji 0:6fa19738f62e 463
Goji 0:6fa19738f62e 464 if (Wave_FPos <= Wave_Play)
Goji 0:6fa19738f62e 465 getln = ((BUFF_SIZE - Wave_Play) > Wave_Rlen) ? Wave_Rlen : (BUFF_SIZE - Wave_Play);
Goji 0:6fa19738f62e 466 else
Goji 0:6fa19738f62e 467 getln = (Wave_Rlen > BUFF_SIZE) ? BUFF_SIZE : Wave_Rlen;
Goji 0:6fa19738f62e 468 if (getln && (buffNX != -1)) {
Goji 0:6fa19738f62e 469 if (fread(Wave_buff[buffNX], 1, getln, fp) != getln) {
Goji 0:6fa19738f62e 470 ps_stat |= PS_EOF;
Goji 0:6fa19738f62e 471 buffNX = -1;
Goji 0:6fa19738f62e 472 return (Last_Err = -7); // read error
Goji 0:6fa19738f62e 473 }
Goji 0:6fa19738f62e 474 buffLN[buffNX] = getln & -4;
Goji 0:6fa19738f62e 475 Wave_FPos += getln;
Goji 0:6fa19738f62e 476 if (Wave_Rlen > getln) Wave_Rlen -= getln; else Wave_Rlen = 0;
Goji 0:6fa19738f62e 477
Goji 0:6fa19738f62e 478 if (ps_stat & PS_SEEK) {
Goji 0:6fa19738f62e 479 buffLN[buffNW] = buffLN[buffNX];
Goji 0:6fa19738f62e 480 SWBuff();
Goji 0:6fa19738f62e 481 ps_stat &= ~(PS_SEEK | PS_PAUSE);
Goji 0:6fa19738f62e 482 }
Goji 0:6fa19738f62e 483 }
Goji 0:6fa19738f62e 484 statLED1 = LLow;
Goji 0:6fa19738f62e 485
Goji 0:6fa19738f62e 486 if (Wave_Rlen == 0) {
Goji 0:6fa19738f62e 487 buffNX = -1;
Goji 0:6fa19738f62e 488 ps_stat |= PS_EOF;
Goji 0:6fa19738f62e 489 wait_ms(50);
Goji 0:6fa19738f62e 490 return(0);
Goji 0:6fa19738f62e 491 }
Goji 0:6fa19738f62e 492 return getln;
Goji 0:6fa19738f62e 493 }
Goji 0:6fa19738f62e 494
Goji 0:6fa19738f62e 495 if (ps_stat & PS_PAUSE) return(1);
Goji 0:6fa19738f62e 496 return 0;
Goji 0:6fa19738f62e 497 }
Goji 0:6fa19738f62e 498
Goji 0:6fa19738f62e 499
Goji 0:6fa19738f62e 500 #if defined(Test)
Goji 0:6fa19738f62e 501 int main()
Goji 0:6fa19738f62e 502 {
Goji 0:6fa19738f62e 503 if (Open_Wave("/" FILESYS "/music/01.wav")) error("open error\n");
Goji 0:6fa19738f62e 504
Goji 0:6fa19738f62e 505 Pwm_Ratio = ((65535 / PWM_CLKMHZ) / Wave_Prid) + Line_Vol;
Goji 0:6fa19738f62e 506 buffNW = 0, buffNX = 1;
Goji 0:6fa19738f62e 507 buffLN[buffNX] = 0;
Goji 0:6fa19738f62e 508
Goji 0:6fa19738f62e 509 Line_R.period_us(Wave_Prid);
Goji 0:6fa19738f62e 510 Line_L.period_us(Wave_Prid);
Goji 0:6fa19738f62e 511 Tick_Timer.attach_us(&ISR_Tick, Wave_Prid);
Goji 0:6fa19738f62e 512
Goji 0:6fa19738f62e 513 pc.printf("start\n");
Goji 0:6fa19738f62e 514 while (1) {
Goji 0:6fa19738f62e 515 if (buffLN[buffNX] == 0) {
Goji 0:6fa19738f62e 516 if (fread(Wave_buff[buffNX], 1, BUFF_SIZE, fp) != BUFF_SIZE) break;
Goji 0:6fa19738f62e 517 if (Wave_Size >= BUFF_SIZE) Wave_Size -= BUFF_SIZE; else break;
Goji 0:6fa19738f62e 518 buffLN[buffNX] = BUFF_SIZE;
Goji 0:6fa19738f62e 519 }
Goji 0:6fa19738f62e 520 }
Goji 0:6fa19738f62e 521 Tick_Timer.detach();
Goji 0:6fa19738f62e 522 fclose(fp);
Goji 0:6fa19738f62e 523 pc.printf("stop\n");
Goji 0:6fa19738f62e 524 }
Goji 0:6fa19738f62e 525
Goji 0:6fa19738f62e 526 #else
Goji 0:6fa19738f62e 527
Goji 0:6fa19738f62e 528 int main()
Goji 0:6fa19738f62e 529 {
Goji 0:6fa19738f62e 530 char path[256], msc_file[256], stext[20];
Goji 0:6fa19738f62e 531
Goji 0:6fa19738f62e 532 pc.baud(115200);
Goji 0:6fa19738f62e 533 TFT_init();
Goji 0:6fa19738f62e 534 TPC_Init();
Goji 0:6fa19738f62e 535 TFT_clearScreen(GRAY);
Goji 0:6fa19738f62e 536
Goji 0:6fa19738f62e 537 while (1) {
Goji 0:6fa19738f62e 538
Goji 0:6fa19738f62e 539 // Open Music Directory
Goji 0:6fa19738f62e 540 // ---------------------
Goji 0:6fa19738f62e 541 if (sd.disk_initialize()) return -1;
Goji 0:6fa19738f62e 542
Goji 0:6fa19738f62e 543 BMP24Bits(0, (TFT_MAX_Y - 1), "/" FILESYS "/images/Play.bmp");
Goji 0:6fa19738f62e 544 dp = 0, music_nw = 1, music_nx = 1;
Goji 0:6fa19738f62e 545
Goji 0:6fa19738f62e 546 while (1) {
Goji 0:6fa19738f62e 547
Goji 0:6fa19738f62e 548 // Get Music file(.wav)
Goji 0:6fa19738f62e 549 // ---------------------
Goji 0:6fa19738f62e 550 {
Goji 0:6fa19738f62e 551 int i;
Goji 0:6fa19738f62e 552
Goji 0:6fa19738f62e 553 if (music_nw >= music_nx) {
Goji 0:6fa19738f62e 554 if (dp) closedir(dp);
Goji 0:6fa19738f62e 555 dp = opendir("/" FILESYS "/music");
Goji 0:6fa19738f62e 556 if (dp == NULL) {
Goji 0:6fa19738f62e 557 pc.printf("\n" "/" FILESYS "/music/ open error.\n");
Goji 0:6fa19738f62e 558 return 0;
Goji 0:6fa19738f62e 559 }
Goji 0:6fa19738f62e 560 music_nw = 0;
Goji 0:6fa19738f62e 561 }
Goji 0:6fa19738f62e 562
Goji 0:6fa19738f62e 563 if ((p = readdir(dp)) == NULL) break;
Goji 0:6fa19738f62e 564 for (i = 0; p->d_name[i]; i++)
Goji 0:6fa19738f62e 565 msc_file[i] = p->d_name[i];
Goji 0:6fa19738f62e 566 msc_file[i] = '\0';
Goji 0:6fa19738f62e 567
Goji 0:6fa19738f62e 568 if (msc_file[i - 4] == '.') msc_file[i - 4] = '\0';
Goji 0:6fa19738f62e 569 if (strcmp(p->d_name + (i - 3), "wav") != 0) {
Goji 0:6fa19738f62e 570 pc.printf("Skip - music/%s\n", p->d_name);
Goji 0:6fa19738f62e 571 continue;
Goji 0:6fa19738f62e 572 }
Goji 0:6fa19738f62e 573
Goji 0:6fa19738f62e 574 if (++music_nw < music_nx) continue;
Goji 0:6fa19738f62e 575 music_nx++;
Goji 0:6fa19738f62e 576 }
Goji 0:6fa19738f62e 577
Goji 0:6fa19738f62e 578 // View Navigate(Play time, Sound volume)
Goji 0:6fa19738f62e 579 // ---------------------------------------
Goji 0:6fa19738f62e 580 {
Goji 0:6fa19738f62e 581 snprintf(path, sizeof path, "/" FILESYS "/music/%s", msc_file);
Goji 0:6fa19738f62e 582 pc.printf("Play - %s\n", path);
Goji 0:6fa19738f62e 583
Goji 0:6fa19738f62e 584 TFT_fillRectangle( 0, 0, 319, 239 - bmpYsize, GRAY, GRAY);
Goji 0:6fa19738f62e 585 TFT_drawText( 28, 239 - 6 - (bmpYsize / 2), (uint8_t*)"00:00", WHITE, BLACK);
Goji 0:6fa19738f62e 586 sprintf(stext, "%2d", Line_Vols);
Goji 0:6fa19738f62e 587 TFT_drawText(244, 239 - 6 - (bmpYsize / 2), (uint8_t*)stext, WHITE, BLACK);
Goji 0:6fa19738f62e 588 TFT_fillRectangle( 0, 239 - bmpYsize - 2, 319, 239 - bmpYsize, BLACK, BLACK);
Goji 0:6fa19738f62e 589 }
Goji 0:6fa19738f62e 590
Goji 0:6fa19738f62e 591 // View Image
Goji 0:6fa19738f62e 592 // -----------
Goji 0:6fa19738f62e 593 {
Goji 0:6fa19738f62e 594 JDEC jdec;
Goji 0:6fa19738f62e 595 WORD work[4000/sizeof(WORD)];
Goji 0:6fa19738f62e 596
Goji 0:6fa19738f62e 597 snprintf(path, sizeof path, "/" FILESYS "/music/%s" ".jpg", msc_file);
Goji 0:6fa19738f62e 598 pc.printf("jpg - %s\n", path);
Goji 0:6fa19738f62e 599 jfp = fopen(path, "rb");
Goji 0:6fa19738f62e 600 if (!jfp) jfp = fopen("/" FILESYS "/images/NoImage.jpg", "rb");
Goji 0:6fa19738f62e 601 if (jfp) {
Goji 0:6fa19738f62e 602 JRESULT r = jd_prepare(&jdec, jpeg_input, work, sizeof(work), jfp);
Goji 0:6fa19738f62e 603 if (r == JDR_OK) {
Goji 0:6fa19738f62e 604 uint16_t ww = jdec.width & 0x3FF; // struct jdec ???
Goji 0:6fa19738f62e 605 uint16_t wh = jdec.width >> 16; // ..
Goji 0:6fa19738f62e 606 Cover_tlx = (ww < 170) ? ((176 - ww) / 2) : 4;
Goji 0:6fa19738f62e 607 Cover_tly = (wh < 180) ? ((188 - wh) / 2) : 4;
Goji 0:6fa19738f62e 608 r = jd_decomp(&jdec, jpeg_output, 0);
Goji 0:6fa19738f62e 609 #if (0)
Goji 0:6fa19738f62e 610 TFT_drawLine(Cover_tlx + 1, Cover_tly + wh, Cover_tlx + ww, Cover_tly + wh, WHITE);
Goji 0:6fa19738f62e 611 TFT_drawLine(Cover_tlx + ww, Cover_tly + 1, Cover_tlx + ww, Cover_tly + wh, WHITE);
Goji 0:6fa19738f62e 612 #endif
Goji 0:6fa19738f62e 613 }
Goji 0:6fa19738f62e 614 fclose(jfp);
Goji 0:6fa19738f62e 615 }
Goji 0:6fa19738f62e 616 }
Goji 0:6fa19738f62e 617
Goji 0:6fa19738f62e 618 // View Song title
Goji 0:6fa19738f62e 619 // ----------------
Goji 0:6fa19738f62e 620 {
Goji 0:6fa19738f62e 621 int l = 0;
Goji 0:6fa19738f62e 622 char msc_Text[256];
Goji 0:6fa19738f62e 623
Goji 0:6fa19738f62e 624 snprintf(path, sizeof path, "/" FILESYS "/music/%s" ".txt", msc_file);
Goji 0:6fa19738f62e 625 pc.printf("txt - %s\n", path);
Goji 0:6fa19738f62e 626
Goji 0:6fa19738f62e 627 fp = fopen(path, "r");
Goji 0:6fa19738f62e 628 if (fp) {
Goji 0:6fa19738f62e 629 l = fread(msc_Text, 1, 256, fp);
Goji 0:6fa19738f62e 630 fclose(fp);
Goji 0:6fa19738f62e 631 }
Goji 0:6fa19738f62e 632
Goji 0:6fa19738f62e 633 if (l > 4)
Goji 0:6fa19738f62e 634 msc_Text[l] = '\0';
Goji 0:6fa19738f62e 635 else snprintf(msc_Text, sizeof(msc_Text), "||%s||", msc_file);
Goji 0:6fa19738f62e 636 pc.printf("%02d - %s\n\n", music_nw, msc_Text);
Goji 0:6fa19738f62e 637
Goji 0:6fa19738f62e 638 int ps, pl = 0;
Goji 0:6fa19738f62e 639 int px = 176, py = Cover_tly + 2;
Goji 0:6fa19738f62e 640 uint8_t ws[2];
Goji 0:6fa19738f62e 641 ws[1] = '\0';
Goji 0:6fa19738f62e 642
Goji 0:6fa19738f62e 643 for (ps = 0; ps < 256; ps++) {
Goji 0:6fa19738f62e 644 if (msc_Text[ps] == '|') {
Goji 0:6fa19738f62e 645 if (++pl > 2) break;
Goji 0:6fa19738f62e 646 py += 20;
Goji 0:6fa19738f62e 647 px = 176;
Goji 0:6fa19738f62e 648 continue;
Goji 0:6fa19738f62e 649 }
Goji 0:6fa19738f62e 650 if (msc_Text[ps] & 0x80) { // KANJI ?
Goji 0:6fa19738f62e 651 font.read((msc_Text[ps] << 8)| msc_Text[ps + 1]);
Goji 0:6fa19738f62e 652 draw_kanji(px, py, ((pl == 2) ? WHITE : DWHITE), GRAY);
Goji 0:6fa19738f62e 653 px += 16;
Goji 0:6fa19738f62e 654 ps++;
Goji 0:6fa19738f62e 655 } else {
Goji 0:6fa19738f62e 656 ws[0] = msc_Text[ps];
Goji 0:6fa19738f62e 657 TFT_drawText(px, py + 2, ws, ((pl == 2) ? WHITE : DWHITE), GRAY);
Goji 0:6fa19738f62e 658 px += 8;
Goji 0:6fa19738f62e 659 }
Goji 0:6fa19738f62e 660 }
Goji 0:6fa19738f62e 661 }
Goji 0:6fa19738f62e 662
Goji 0:6fa19738f62e 663 // Play Music
Goji 0:6fa19738f62e 664 // -----------
Goji 0:6fa19738f62e 665 {
Goji 0:6fa19738f62e 666 snprintf(path, sizeof path, "/" FILESYS "/music/%s" ".wav", msc_file);
Goji 0:6fa19738f62e 667 int rc = Open_Wave(path);
Goji 0:6fa19738f62e 668 if (rc) {
Goji 0:6fa19738f62e 669 if (fp != NULL) fclose(fp);
Goji 0:6fa19738f62e 670 pc.printf(" rc=%d, Last_Err=%d\n", rc, Last_Err);
Goji 0:6fa19738f62e 671 Last_Err = 0;
Goji 0:6fa19738f62e 672 continue;
Goji 0:6fa19738f62e 673 }
Goji 0:6fa19738f62e 674
Goji 0:6fa19738f62e 675 uint16_t tw = Wave_Size / (Wave_BPS * 4);
Goji 0:6fa19738f62e 676 sprintf(stext, "%02d %2dks %02d:%02d", music_nw, (Wave_BPS / 1000), (tw / 60), (tw % 60));
Goji 0:6fa19738f62e 677 TFT_drawText(214, (222 - bmpYsize), (uint8_t*)stext, BLACK, GRAY);
Goji 0:6fa19738f62e 678
Goji 0:6fa19738f62e 679 Wave_Play = buffGP;
Goji 0:6fa19738f62e 680 Wave_FPos = BUFF_SIZE;
Goji 0:6fa19738f62e 681 Wave_Rlen = Wave_Size - (Wave_FPos - Wave_Play);
Goji 0:6fa19738f62e 682 buffNW = 0, buffNX = 1;
Goji 0:6fa19738f62e 683 buffLN[buffNX] = 0;
Goji 0:6fa19738f62e 684
Goji 0:6fa19738f62e 685 Last_Err = 0;
Goji 0:6fa19738f62e 686 ps_stat = PS_PLAY;
Goji 0:6fa19738f62e 687
Goji 0:6fa19738f62e 688 Pwm_Ratio = ((65535 / PWM_CLKMHZ) / Wave_Prid) + Line_Vol;
Goji 0:6fa19738f62e 689 Line_R.period_us(Wave_Prid);
Goji 0:6fa19738f62e 690 Line_L.period_us(Wave_Prid);
Goji 0:6fa19738f62e 691 Tick_Timer.attach_us(&ISR_Tick, Wave_Prid); // Play!
Goji 0:6fa19738f62e 692
Goji 0:6fa19738f62e 693 while (!(ps_stat & PS_EOF) && (ps_stat & PS_PLAY) && (Last_Err == 0)) {
Goji 0:6fa19738f62e 694
Goji 0:6fa19738f62e 695 #if defined(Level_Indicator)
Goji 0:6fa19738f62e 696 uint16_t yl0 = 0, yr0 = 0, yl, yr;
Goji 0:6fa19738f62e 697 if (Pwm_cnt > Level_Indicator) {
Goji 0:6fa19738f62e 698 yl = 238 - (((Pwm_aveL - 64) * (bmpYsize - 2)) / 200);
Goji 0:6fa19738f62e 699 yr = 238 - (((Pwm_aveR - 64) * (bmpYsize - 2)) / 200);
Goji 0:6fa19738f62e 700 Pwm_cnt = 0;
Goji 0:6fa19738f62e 701 if (yl > 237) yl = 238;
Goji 0:6fa19738f62e 702 if (yr > 237) yr = 238;
Goji 0:6fa19738f62e 703 yl0 = (yl > yl0) ? yl : ((yl0 + yl) / 2);
Goji 0:6fa19738f62e 704 yr0 = (yr > yr0) ? yr : ((yr0 + yl) / 2);
Goji 0:6fa19738f62e 705 TFT_fillRectangle(MM_VUPD + 5, MM_VUP + 1, MM_VUPD + 7, yl0, BLACK, BLACK);
Goji 0:6fa19738f62e 706 TFT_fillRectangle(MM_VUPD + 9, MM_VUP + 1, MM_VUPD + 11, yr0, BLACK, BLACK);
Goji 0:6fa19738f62e 707 if (yl0 < 238) TFT_fillRectangle(MM_VUPD + 5, yl0, MM_VUPD + 7, 238, YELLOW, YELLOW);
Goji 0:6fa19738f62e 708 if (yr0 < 238) TFT_fillRectangle(MM_VUPD + 9, yr0, MM_VUPD + 11, 238, YELLOW, YELLOW);
Goji 0:6fa19738f62e 709 }
Goji 0:6fa19738f62e 710 #endif
Goji 0:6fa19738f62e 711
Goji 0:6fa19738f62e 712 if (Play_Wave()) {
Goji 0:6fa19738f62e 713
Goji 0:6fa19738f62e 714 statLED4 = LHigh;
Goji 0:6fa19738f62e 715 if (ps_stat & PS_PAUSE) wait_ms(5);
Goji 0:6fa19738f62e 716 poll();
Goji 0:6fa19738f62e 717 statLED4 = LLow;
Goji 0:6fa19738f62e 718
Goji 0:6fa19738f62e 719 if (ps_stat & PS_FFF) {
Goji 0:6fa19738f62e 720 buffNX = -1;
Goji 0:6fa19738f62e 721 break;
Goji 0:6fa19738f62e 722 }
Goji 0:6fa19738f62e 723
Goji 0:6fa19738f62e 724 if (ps_stat & PS_FFR) {
Goji 0:6fa19738f62e 725 if (Wave_FPos < (Wave_BPS * 2 * 2 * 2)) {
Goji 0:6fa19738f62e 726 buffNX = -1;
Goji 0:6fa19738f62e 727 if (music_nx > music_nw)
Goji 0:6fa19738f62e 728 music_nx = (music_nw > 1) ? music_nw - 1 : 1;
Goji 0:6fa19738f62e 729 break;
Goji 0:6fa19738f62e 730 } else
Goji 0:6fa19738f62e 731 Wave_FPos = Wave_Play;
Goji 0:6fa19738f62e 732 }
Goji 0:6fa19738f62e 733 }
Goji 0:6fa19738f62e 734 }
Goji 0:6fa19738f62e 735
Goji 0:6fa19738f62e 736 Tick_Timer.detach();
Goji 0:6fa19738f62e 737 fclose(fp);
Goji 0:6fa19738f62e 738 pc.printf("Close stat=%04X, %d - %d\n", ps_stat, Wave_Rlen, Last_Err);
Goji 0:6fa19738f62e 739 ps_stat = 0;
Goji 0:6fa19738f62e 740 Last_Err = 0;
Goji 0:6fa19738f62e 741 }
Goji 0:6fa19738f62e 742 }
Goji 0:6fa19738f62e 743 closedir(dp);
Goji 0:6fa19738f62e 744 }
Goji 0:6fa19738f62e 745 }
Goji 0:6fa19738f62e 746 #endif