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/
GSDPlayer.cpp@0:6fa19738f62e, 2014-09-08 (annotated)
- 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?
User | Revision | Line number | New 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 |