rtoss - Diff between revs 14 and 26

Subversion Repositories:
Rev:
Show entire file - Ignore whitespace
Rev 14 Rev 26
Line 1... Line 1...
1 #include <windows.h> 1 #include <windows.h>
2 #include <tchar.h> 2 #include <tchar.h>
3 #include "maplay.h" 3 #include "maplay.h"
4 #include "reader.h" 4 #include "reader.h"
5 #include "mahelper.h" 5 #include "mahelper.h"
-   6
-   7 #ifndef _WIN32_WCE
-   8 #include "stdio.h"
-   9 #endif // _WIN32_WCE
6 10
7 const int tabbitrate[3][3][16] = 11 const int tabbitrate[3][3][16] =
8 { 12 {
9    {{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},          //V1L1 13    {{0,32,64,96,128,160,192,224,256,288,320,352,384,416,448,},          //V1L1
10         {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},              //V1L2 14         {0,32,48,56, 64, 80, 96,112,128,160,192,224,256,320,384,},              //V1L2
Line 195... Line 199...
195 #else 199 #else
196         strcpy(pszBuff, szBuff); 200         strcpy(pszBuff, szBuff);
197 #endif 201 #endif
198 } 202 }
199 203
200 BOOL GetId3Tag(LPCTSTR pszFile, ID3TAGV1* pTag) -  
-   204 int UTF8toUTF16(char* pszSrc, WCHAR* pszDst, DWORD dwDstLen)
201 { 205 {
202         memset(pTag, 0, sizeof(ID3_TAG_V1)); -  
203         BOOL fRet = FALSE; -  
-   206         DWORD dwLen = 0;
-   207         while (*pszSrc) {
-   208                 if (++dwLen == dwDstLen)
-   209                         break;
-   210                 if ((*pszSrc & 0x80) == 0x0) {
-   211                         // 1 byte
-   212                         *pszDst++ = *pszSrc++;
-   213                 }
-   214                 else if ((*pszSrc & 0xE0) == 0xC0) {
-   215                         // 2 bytes
-   216                         *pszDst++ = (((WORD)*pszSrc & 0x1F) << 6) | ((WORD)*(pszSrc + 1) & 0x3F);
-   217                         pszSrc += 2;
-   218                 }
-   219                 else if ((*pszSrc & 0xE0) == 0xE0) {
-   220                         // 3 bytes
-   221                         *pszDst++ = (((WORD)*pszSrc & 0x0F) << 12) | (((WORD)*(pszSrc + 1) & 0x3F) << 6) | ((WORD)*(pszSrc + 2) & 0x3F);
-   222                         pszSrc += 3;
-   223                 }
-   224         }
204 225
205         // this supports ID3TAG v1 only !! -  
206         CReader* pReader = new CReader(); -  
207         if (!pReader->Open(pszFile)) -  
208                 return FALSE; -  
-   226         *pszDst = NULL;
-   227         return dwLen;
-   228 }
209 229
210         LONGLONG llSize = pReader->GetSize(); -  
211         llSize -= sizeof(ID3_TAG_V1); -  
212         pReader->SetPointer(llSize, FILE_BEGIN); -  
-   230 BOOL CopyTagStringW(BYTE *buf, int buflen, LPWSTR str, int strlen)
-   231 {
-   232         int len, i;
-   233         BOOL ret = FALSE;
-   234         BYTE tmp;
-   235         LPBYTE ptr;
-   236         char* psz = NULL;
213 237
214         DWORD dwRead; -  
215         ID3_TAG_V1 id3tag; -  
216         if (pReader->Read((LPBYTE)&id3tag, sizeof(id3tag), &dwRead) && -  
217                 dwRead == sizeof(id3tag)) { -  
218                 if (id3tag.tag[0] == 'T' && id3tag.tag[1] == 'A' && id3tag.tag[2] == 'G') { -  
219                         // it's ID3TAG v1 !! -  
220                         fRet = TRUE; -  
221                         pTag->nTrackNum = 0; -  
-   238         if (buf[0] == 0) {
-   239                 // ANSI
-   240                 len = buflen - 1;
-   241                 psz = new char[len + 1];
-   242                 if (!psz)
-   243                         return FALSE;
-   244                
-   245                 memset(psz, 0, len + 1);
-   246                 memcpy(psz, (char*)&buf[1], len);
-   247                
-   248                 MultiByteToWideChar(CP_ACP, 0, psz, -1, str, strlen);
-   249                 str [strlen - 1] = NULL;
-   250                 ret = TRUE;
-   251         }
-   252         else if (buf[1] == 0xFF && buf[2] == 0xFE) {
-   253                 // UCS2LE with BOM
-   254                 len = buflen - 3;
-   255                 len = len < (strlen - 1) * sizeof(WCHAR) ? len : (strlen - 1) * sizeof(WCHAR);
-   256                 memcpy(str, &buf[3], len);
-   257                 str[len / 2] = NULL;
-   258                 ret = TRUE;
-   259         }
-   260         else if (buf[1] == 0xFE && buf[2] == 0xFF) {
-   261                 // UCS2BE with BOM
-   262                 len = buflen - 3;
-   263                 len = len < (strlen - 1) * sizeof(WCHAR) ? len : (strlen - 1) * sizeof(WCHAR);
-   264                 memcpy(str, &buf[3], len);
-   265                 str[len / 2] = NULL;
222 266
223                         char buff[5]; -  
224                         memset(buff, 0, sizeof(buff)); -  
225                         memcpy(buff, id3tag.year, sizeof(id3tag.year)); -  
226                         pTag->nYear = atoi(buff); -  
-   267                 ptr = (LPBYTE)str;
-   268                 for (i = 0; i < len / 2; i++) {
-   269                         tmp = ptr[i * 2 + 1];
-   270                         ptr[i * 2] = ptr[i * 2 + 1];
-   271                         ptr[i * 2 + 1] = tmp;
-   272                 }
-   273                 ret = TRUE;
-   274         }
-   275         else if (buf[0] == 2) {
-   276                 // UCS2BE
-   277                 len = buflen - 1;
-   278                 len = len < (strlen - 1) * sizeof(WCHAR) ? len : (strlen - 1) * sizeof(WCHAR);
-   279                 memcpy(str, &buf[1], len);
-   280                 str[len / 2] = NULL;
227 281
228                         ConvertFromTagStr(id3tag.albumName, pTag->szAlbum); -  
229                         ConvertFromTagStr(id3tag.artistName, pTag->szArtist); -  
230                         ConvertFromTagStr(id3tag.trackName, pTag->szTrack); -  
-   282                 ptr = (LPBYTE)str;
-   283                 for (i = 0; i < len / 2; i++) {
-   284                         tmp = ptr[i * 2 + 1];
-   285                         ptr[i * 2] = ptr[i * 2 + 1];
-   286                         ptr[i * 2 + 1] = tmp;
-   287                 }
-   288                 ret = TRUE;
-   289         }
-   290         else if (buf[0] == 3) {
-   291                 // UTF-8
-   292                 len = buflen - 1;
-   293                 psz = new char[len + 1];
-   294                 if (!psz)
-   295                         return FALSE;
231 296
232                         //ID3TAG v1.1 -  
233                         if (id3tag.comment[28] == NULL) { -  
234                                 pTag->nTrackNum = id3tag.comment[29]; -  
235                                 ConvertFromTagStr(id3tag.comment, pTag->szComment, 28); -  
-   297                 memset(psz, 0, len + 1);
-   298                 memcpy(psz, (char*)&buf[1], len);
-   299                 UTF8toUTF16(psz, str, strlen);
-   300                 ret = TRUE;
-   301         }
-   302
-   303         if (psz) delete [] psz;
-   304         return ret;
-   305 }
-   306
-   307 BOOL CopyTagString(BYTE *buf, int buflen, LPTSTR str, int strlen)
-   308 {
-   309 #ifdef _UNICODE
-   310         return CopyTagStringW(buf, buflen, str, strlen);
-   311 #else
-   312         WCHAR szTemp[MAX_PLUGIN_TAG_STR];
-   313         if (!CopyTagStringW(buf, buflen, szTemp, MAX_PLUGIN_TAG_STR))
-   314                 return FALSE;
-   315
-   316         WideCharToMultiByte(CP_ACP, 0, szTemp, -1, str, strlen, NULL, NULL);
-   317         str[strlen - 1] = NULL;
-   318         return TRUE;
-   319 #endif
-   320 }
-   321
-   322 BOOL ParseGenre(LPTSTR src, LPTSTR str, int strlen)
-   323 {
-   324         LPTSTR psz;
-   325         int nGenre;
-   326
-   327         if (src[0] == _T('(')) {
-   328                 psz = _tcschr(&src[1], _T(')'));
-   329                 if (psz) {
-   330                         *psz = NULL;
-   331                         nGenre = _tcstol(&src[1], 0, 10);
-   332
-   333                         if (nGenre < sizeof(genre_strings) / sizeof(LPTSTR)) {
-   334                                 _tcsncpy(str, genre_strings[nGenre], strlen);
-   335                                 str[strlen - 1] = NULL;
-   336                                 return TRUE;
236                         } 337                         }
237                         else -  
238                                 ConvertFromTagStr(id3tag.comment, pTag->szComment); -  
-   338                 }
-   339         }
-   340        
-   341         _tcsncpy(str, src, strlen);
-   342         str[strlen - 1] = NULL;
-   343        
-   344         return TRUE;
-   345 }
239 346
240                         if (id3tag.genre < 148) -  
241                                 _tcscpy(pTag->szGenre, genre_strings[id3tag.genre]); -  
242                         else -  
243                                 memset(pTag->szGenre, 0, sizeof(pTag->szGenre)); -  
-   347 BOOL ParseFrameV20(BYTE *buf, int len, ID3TAGV1* pTag)
-   348 {
-   349         LPTSTR psz;
-   350         TCHAR szTemp[MAX_PLUGIN_TAG_STR];
-   351         LPBYTE data = buf + ID3TAG20_FRAME_LEN;
-   352         int datalen = len - ID3TAG20_FRAME_LEN;
-   353        
-   354         if (memcmp(buf, "TT2", 3) == 0) {
-   355                 return CopyTagString(data, datalen, pTag->szTrack, MAX_PLUGIN_TAG_STR);
-   356         }
-   357         else if (memcmp(buf, "TAL", 3) == 0) {
-   358                 return CopyTagString(data, datalen, pTag->szAlbum, MAX_PLUGIN_TAG_STR);
-   359         }
-   360         else if (memcmp(buf, "TP1", 3) == 0) {
-   361                 return CopyTagString(data, datalen, pTag->szArtist, MAX_PLUGIN_TAG_STR);
-   362         }
-   363         else if (memcmp(buf, "TCO", 3) == 0) {
-   364                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   365                         return ParseGenre(szTemp, pTag->szGenre, MAX_PLUGIN_TAG_STR);
244                 } 366                 }
245         } 367         }
246         pReader->Close(); -  
247         delete pReader; -  
248         return fRet; -  
-   368         else if (memcmp(buf, "TRK", 3) == 0) {
-   369                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   370                         psz = _tcschr(szTemp, _T('/'));
-   371                         if (psz)
-   372                                 *psz = NULL;
-   373                         pTag->nTrackNum = _tcstol(szTemp, 0, 10);
-   374                         return TRUE;
-   375                 }
-   376         }
-   377         else if (memcmp(buf, "TYE", 3) == 0) {
-   378                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   379                         pTag->nYear = _tcstol(szTemp, 0, 10);
-   380                         return TRUE;
-   381                 }
-   382         }
-   383
-   384         return FALSE;
-   385 }
-   386
-   387 BOOL ParseFrameV23(BYTE *buf, int len, ID3TAGV1* pTag)
-   388 {
-   389         LPTSTR psz;
-   390         TCHAR szTemp[MAX_PLUGIN_TAG_STR];
-   391         LPBYTE data = buf + ID3TAG23_FRAME_LEN;
-   392         int datalen = len - ID3TAG23_FRAME_LEN;
-   393        
-   394         if (memcmp(buf, "TIT2", 4) == 0) {
-   395                 return CopyTagString(data, datalen, pTag->szTrack, MAX_PLUGIN_TAG_STR);
-   396         }
-   397         else if (memcmp(buf, "TALB", 4) == 0) {
-   398                 return CopyTagString(data, datalen, pTag->szAlbum, MAX_PLUGIN_TAG_STR);
-   399         }
-   400         else if (memcmp(buf, "TPE1", 4) == 0) {
-   401                 return CopyTagString(data, datalen, pTag->szArtist, MAX_PLUGIN_TAG_STR);
-   402         }
-   403         else if (memcmp(buf, "TCON", 4) == 0) {
-   404                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   405                         return ParseGenre(szTemp, pTag->szGenre, MAX_PLUGIN_TAG_STR);
-   406                 }
-   407         }
-   408         else if (memcmp(buf, "TRCK", 4) == 0) {
-   409                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   410                         psz = _tcschr(szTemp, _T('/'));
-   411                         if (psz)
-   412                                 *psz = NULL;
-   413                         pTag->nTrackNum = _tcstol(szTemp, 0, 10);
-   414                         return TRUE;
-   415                 }
-   416         }
-   417         else if (memcmp(buf, "TDRC", 4) == 0) {
-   418                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   419                         if (_tcslen(szTemp) > 4)
-   420                                 szTemp[4] = NULL;
-   421                         pTag->nYear = _tcstol(szTemp, 0, 10);
-   422                         return TRUE;
-   423                 }
-   424         }
-   425         else if (memcmp(buf, "TYER", 4) == 0) {
-   426                 if (CopyTagString(data, datalen, szTemp, MAX_PLUGIN_TAG_STR)) {
-   427                         pTag->nYear = _tcstol(szTemp, 0, 10);
-   428                         return TRUE;
-   429                 }
-   430         }
-   431
-   432         return FALSE;
-   433 }
-   434
-   435 BOOL ParseId3TagV20(LPBYTE buf, int buflen, ID3TAGV1* pTag)
-   436 {
-   437         int tagsize, framesize;
-   438
-   439         if (buflen < ID3TAG_HEADER_LEN + ID3TAG20_FRAME_LEN)
-   440                 return FALSE;
-   441
-   442         tagsize = (buf[6] << 21) | (buf[7] << 14) | (buf[8] << 7) | (buf[9] << 0);
-   443         if (buflen < tagsize + ID3TAG_HEADER_LEN)
-   444                 tagsize = buflen - ID3TAG_HEADER_LEN;
-   445
-   446         buf += ID3TAG_HEADER_LEN;
-   447         while (tagsize > ID3TAG20_FRAME_LEN) {
-   448                 framesize = (buf[3] << 16 | buf[4] << 8 | buf[5] << 0);
-   449                 if (framesize == 0)
-   450                         break;
-   451
-   452                 if (framesize > tagsize)
-   453                         break;
-   454
-   455                 ParseFrameV20(buf, framesize + ID3TAG20_FRAME_LEN, pTag);
-   456                 tagsize -= framesize + ID3TAG20_FRAME_LEN;
-   457                 buf += framesize + ID3TAG20_FRAME_LEN;
-   458         }
-   459         return TRUE;
-   460 }
-   461
-   462 BOOL ParseId3TagV23(LPBYTE buf, int buflen, ID3TAGV1* pTag)
-   463 {
-   464         int tagsize, framesize;
-   465
-   466         if (buflen < ID3TAG_HEADER_LEN + ID3TAG23_FRAME_LEN)
-   467                 return FALSE;
-   468
-   469         tagsize = (buf[6] << 21) | (buf[7] << 14) | (buf[8] << 7) | (buf[9] << 0);
-   470         if (buflen < tagsize + ID3TAG_HEADER_LEN)
-   471                 tagsize = buflen - ID3TAG_HEADER_LEN;
-   472
-   473         buf += ID3TAG_HEADER_LEN;
-   474         while (tagsize > ID3TAG23_FRAME_LEN) {
-   475                 framesize = (buf[4] << 24 | buf[5] << 16 | buf[6] << 8 | buf[7] << 0) & 0x7FFFFFFF;
-   476                 if (framesize == 0)
-   477                         break;
-   478
-   479                 if (framesize > tagsize)
-   480                         break;
-   481
-   482                 ParseFrameV23(buf, framesize + ID3TAG23_FRAME_LEN, pTag);
-   483                 tagsize -= framesize + ID3TAG23_FRAME_LEN;
-   484                 buf += framesize + ID3TAG23_FRAME_LEN;
-   485         }
-   486         return TRUE;
-   487 }
-   488
-   489 BOOL ParseId3TagV2(LPBYTE buf, int buflen, ID3TAGV1* pTag)
-   490 {
-   491         if (buflen < ID3TAG_HEADER_LEN)
-   492                 return FALSE;
-   493
-   494         if (memcmp(buf, "ID3", 3) != 0)
-   495                 return FALSE;
-   496
-   497         if (buf[3] > 4)
-   498                 return FALSE;
-   499
-   500         else if (buf[3] < 3)
-   501                 return ParseId3TagV20(buf, buflen, pTag);
-   502         else
-   503                 return ParseId3TagV23(buf, buflen, pTag);
-   504 }
-   505
-   506 BOOL GetId3TagV2(FILE* fp, ID3TAGV1* pTag)
-   507 {
-   508         BYTE header[10];
-   509         BYTE *buf = NULL;
-   510         BYTE *ptr = NULL;
-   511         BOOL ret = FALSE;
-   512         long curoffset = ftell(fp);
-   513         int tagsize;
-   514         fseek(fp, 0, SEEK_SET);
-   515         int version;
-   516
-   517         if (fread(header, 1, ID3TAG_HEADER_LEN, fp) != ID3TAG_HEADER_LEN) {
-   518                 goto done;
-   519         }
-   520
-   521         if (memcmp(header, "ID3", 3) != 0) {
-   522                 goto done;
-   523         }
-   524
-   525         version = header[3];
-   526         if (version > 4)
-   527                 goto done;
-   528
-   529         tagsize = (header[6] << 21) | (header[7] << 14) | (header[8] << 7) | (header[9] << 0);
-   530         buf = new BYTE[tagsize + ID3TAG_HEADER_LEN];
-   531         if (!buf) {
-   532                 goto done;
-   533         }
-   534         memcpy(buf, header, ID3TAG_HEADER_LEN);
-   535         if (fread(buf + ID3TAG_HEADER_LEN, 1, tagsize, fp) != tagsize) {
-   536                 goto done;
-   537         }
-   538
-   539         ret = ParseId3TagV2(buf, tagsize + ID3TAG_HEADER_LEN, pTag);
-   540        
-   541 done:
-   542         if (buf) delete [] buf;
-   543         fseek(fp, curoffset, SEEK_SET);
-   544         return ret;
-   545 }
-   546
-   547 BOOL GetId3TagV1(FILE* fp, ID3TAGV1* pTag)
-   548 {
-   549         char buff[5];
-   550         ID3_TAG_V1 id3tag;
-   551         BOOL bRet = FALSE;
-   552
-   553         long curoffset = ftell(fp);
-   554         fseek(fp, -sizeof(ID3_TAG_V1), SEEK_END);
-   555        
-   556         if (!fread(&id3tag, sizeof(ID3_TAG_V1), 1, fp))
-   557                 goto done;
-   558
-   559         if (id3tag.tag[0] != 'T' || id3tag.tag[1] != 'A' || id3tag.tag[2] != 'G')
-   560                 goto done;
-   561
-   562         bRet = TRUE;
-   563         memset(buff, 0, sizeof(buff));
-   564         memcpy(buff, id3tag.year, sizeof(id3tag.year));
-   565         pTag->nYear = atoi(buff);
-   566
-   567         ConvertFromTagStr(id3tag.albumName, pTag->szAlbum, 30);
-   568         ConvertFromTagStr(id3tag.artistName, pTag->szArtist, 30);
-   569         ConvertFromTagStr(id3tag.trackName, pTag->szTrack, 30);
-   570
-   571         //ID3TAG v1.1
-   572         if (id3tag.comment[28] == NULL) {
-   573                 pTag->nTrackNum = id3tag.comment[29];
-   574                 ConvertFromTagStr(id3tag.comment, pTag->szComment, 28);
-   575         }
-   576         else
-   577                 ConvertFromTagStr(id3tag.comment, pTag->szComment, 30);
-   578
-   579         if (id3tag.genre < 148)
-   580                 _tcscpy(pTag->szGenre, genre_strings[id3tag.genre]);
-   581         else
-   582                 memset(pTag->szGenre, 0, sizeof(pTag->szGenre));
-   583        
-   584 done:
-   585         fseek(fp, curoffset, SEEK_SET);
-   586         return bRet;
-   587 }
-   588
-   589 BOOL GetId3Tag(LPCTSTR pszFile, ID3TAGV1* pTag)
-   590 {
-   591         BOOL bRet;
-   592         FILE* fp = _tfopen(pszFile, _T("rb"));
-   593         if (!fp)
-   594                 return FALSE;
-   595
-   596         bRet = GetId3TagV2(fp, pTag);
-   597         if (!bRet)
-   598                 bRet = GetId3TagV1(fp, pTag);
-   599
-   600         fclose(fp);
-   601         return bRet;
249 } 602 }
250 603
251 BOOL SetId3Tag(LPCTSTR pszFile, ID3TAGV1* pTag) 604 BOOL SetId3Tag(LPCTSTR pszFile, ID3TAGV1* pTag)
252 { 605 {
253         return FALSE; 606         return FALSE;
254 } 607 }