2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
** GNU General Public License for more details.
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
** Any non-GPL usage of this software or parts of this software is strictly
22
** Commercial non-GPL licensing of this software is possible.
23
** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25
** $Id: id3v2tag.c,v 1.4 2003/07/29 08:20:11 menno Exp $
28
#define WIN32_LEAN_AND_MEAN
46
"Encryption method registration",
49
"General encapsulated object",
50
"Group identification registration",
51
"Involved people list",
53
"Music CD identifier",
54
"MPEG location lookup table",
59
"Position synchronisation frame",
60
"Recommended buffer size",
61
"Relative volume adjustment",
64
"Synchronized tempo codes",
66
"BPM (beats per minute)",
68
"Genre", //"Content type",
76
"Content group description",
83
"Original album title",
85
"Original lyricist(s)",
87
"Original release year",
90
"Band/orchestra/accompaniment",
91
"Conductor/performer refinement",
92
"Interpreted, remixed, or otherwise modified by",
97
"Internet radio station name",
98
"Internet radio station owner",
100
"ISRC (international standard recording code)",
101
"Software/Hardware and settings used for encoding",
102
"User defined text information",
104
"Unique file identifier",
106
"Unsynchronized lyric",
107
"Commercial information",
108
"Copyright/Legal information",
109
"Official audio file webpage",
110
"Official artist webpage",
111
"Official audio source webpage",
112
"Official internet radio station homepage",
114
"Official publisher webpage",
115
"User defined URL link",
116
"Encrypted meta frame (id3v2.2.x)",
117
"Compressed meta frame (id3v2.2.1)"
120
ID3GENRES ID3Genres[]=
140
104, "Chamber Music",
159
98, "Easy Listening",
184
46, "Instrumental Pop",
185
47, "Instrumental Rock",
195
64, "Native American",
211
92, "Progressive Rock",
213
93, "Psychedelic Rock",
222
118, "Rhythmic Soul",
239
94, "Symphonic Rock",
243
51, "Techno-Industrial",
252
const int NUMFRAMES = sizeof(ID3Frames)/sizeof(ID3Frames[0]);
253
const int NUMGENRES = sizeof(ID3Genres)/sizeof(ID3Genres[0]);
256
LPSTR DupString(LPSTR lpsz)
258
int cb = lstrlen(lpsz) + 1;
259
LPSTR lpszNew = LocalAlloc(LMEM_FIXED, cb);
261
CopyMemory(lpszNew, lpsz, cb);
265
LPSTR GetFrameDesc(ID3_FrameID id)
267
return DupString(ID3Frames[id]);
270
LPSTR GetGenre(LPSTR lpsz)
272
int id = atoi(lpsz + 1);
275
if ((*(lpsz + 1) > '0') && (*(lpsz + 1) < '9'))
277
for (i = 0; i < NUMGENRES; i++)
279
if (id == ID3Genres[i].id)
280
return DupString(ID3Genres[i].name);
283
return DupString(lpsz);
286
void FillID3List(HWND hwndDlg, HWND hwndList, char *filename)
291
ID3_FrameID eFrameID;
298
if ((tag = ID3Tag_New()) != NULL)
300
ID3Tag_Link(tag, filename);
302
numFrames = ID3Tag_NumFrames(tag);
304
for (i = 0; i < numFrames; i++)
308
frame = ID3Tag_GetFrameNum(tag, i);
309
eFrameID = ID3Frame_GetID(frame);
313
case ID3FID_ALBUM: case ID3FID_BPM:
314
case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE:
315
case ID3FID_COPYRIGHT: case ID3FID_DATE:
316
case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY:
317
case ID3FID_LYRICIST: case ID3FID_FILETYPE:
318
case ID3FID_TIME: case ID3FID_CONTENTGROUP:
319
case ID3FID_TITLE: case ID3FID_SUBTITLE:
320
case ID3FID_INITIALKEY: case ID3FID_LANGUAGE:
321
case ID3FID_SONGLEN: case ID3FID_MEDIATYPE:
322
case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME:
323
case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST:
324
case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER:
325
case ID3FID_LEADARTIST: case ID3FID_BAND:
326
case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST:
327
case ID3FID_PARTINSET: case ID3FID_PUBLISHER:
328
case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES:
329
case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER:
330
case ID3FID_SIZE: case ID3FID_ISRC:
331
case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR:
334
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
336
/* Initialize LV_ITEM members that are common to all items. */
337
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
340
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
345
pItem->frameId = eFrameID;
346
pItem->aCols[0] = GetFrameDesc(eFrameID);
348
field = ID3Frame_GetField(frame, ID3FN_TEXT);
349
ID3Field_GetASCII(field, info, 1024, 1);
350
if (eFrameID == ID3FID_CONTENTTYPE)
351
pItem->aCols[1] = GetGenre(info);
353
pItem->aCols[1] = DupString(info);
355
lvi.lParam = (LPARAM)pItem; /* item data */
358
ListView_InsertItem(hwndList, &lvi);
362
case ID3FID_USERTEXT:
363
case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
364
case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
367
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
369
/* Initialize LV_ITEM members that are common to all items. */
370
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
373
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
378
pItem->frameId = eFrameID;
380
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
381
ID3Field_GetASCII(field, info, 1024, 1);
382
pItem->aCols[0] = DupString(info);
384
field = ID3Frame_GetField(frame, ID3FN_TEXT);
385
ID3Field_GetASCII(field, info, 1024, 1);
386
pItem->aCols[1] = DupString(info);
388
lvi.lParam = (LPARAM)pItem; /* item data */
391
ListView_InsertItem(hwndList, &lvi);
395
case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST:
396
case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO:
397
case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER:
398
case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE:
401
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
403
/* Initialize LV_ITEM members that are common to all items. */
404
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
407
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
412
pItem->frameId = eFrameID;
414
pItem->aCols[0] = GetFrameDesc(eFrameID);
416
field = ID3Frame_GetField(frame, ID3FN_URL);
417
ID3Field_GetASCII(field, info, 1024, 1);
418
pItem->aCols[1] = DupString(info);
420
lvi.lParam = (LPARAM)pItem; /* item data */
423
ListView_InsertItem(hwndList, &lvi);
430
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
432
/* Initialize LV_ITEM members that are common to all items. */
433
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
436
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
441
pItem->frameId = eFrameID;
443
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
444
ID3Field_GetASCII(field, info, 1024, 1);
445
pItem->aCols[0] = DupString(info);
447
field = ID3Frame_GetField(frame, ID3FN_URL);
448
ID3Field_GetASCII(field, info, 1024, 1);
449
pItem->aCols[1] = DupString(info);
451
lvi.lParam = (LPARAM)pItem; /* item data */
454
ListView_InsertItem(hwndList, &lvi);
466
BOOL CALLBACK AddFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
472
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
473
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
475
/* Note: FRAMEID is the index in the combo box + 1 */
476
for (i = 1; i < NUMFRAMES; i++)
478
SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)ID3Frames[i]);
483
switch (LOWORD(wParam)) {
485
if (HIWORD(wParam) == CBN_SELCHANGE)
487
cursel = SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_GETCURSEL, 0, 0);
491
case ID3FID_ALBUM: case ID3FID_BPM:
492
case ID3FID_COMPOSER: case ID3FID_COPYRIGHT:
493
case ID3FID_DATE: case ID3FID_PLAYLISTDELAY:
494
case ID3FID_ENCODEDBY: case ID3FID_LYRICIST:
495
case ID3FID_FILETYPE: case ID3FID_TIME:
496
case ID3FID_CONTENTGROUP: case ID3FID_TITLE:
497
case ID3FID_SUBTITLE: case ID3FID_INITIALKEY:
498
case ID3FID_LANGUAGE: case ID3FID_SONGLEN:
499
case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM:
500
case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST:
501
case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR:
502
case ID3FID_FILEOWNER: case ID3FID_LEADARTIST:
503
case ID3FID_BAND: case ID3FID_CONDUCTOR:
504
case ID3FID_MIXARTIST: case ID3FID_PARTINSET:
505
case ID3FID_PUBLISHER: case ID3FID_TRACKNUM:
506
case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION:
507
case ID3FID_NETRADIOOWNER: case ID3FID_SIZE:
508
case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS:
509
case ID3FID_YEAR: case ID3FID_WWWAUDIOFILE:
510
case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE:
511
case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT:
512
case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT:
513
case ID3FID_WWWRADIOPAGE: case ID3FID_CONTENTTYPE:
515
SetDlgItemText(hwndDlg, IDC_COL0, ID3Frames[cursel+1]);
516
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
517
EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
520
case ID3FID_USERTEXT: case ID3FID_COMMENT:
521
case ID3FID_UNSYNCEDLYRICS: case ID3FID_WWWUSER:
523
SetDlgItemText(hwndDlg, IDC_COL0, ID3Frames[cursel+1]);
524
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), TRUE);
525
EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
529
MessageBox(hwndDlg, "Sorry, this frame type cannot be added (yet).", "Sorry", MB_OK);
530
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
531
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
539
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
540
char *col0 = LocalAlloc(LPTR, 1024);
541
char *col1 = LocalAlloc(LPTR, 1024);
543
/* Initialize LV_ITEM members that are common to all items. */
544
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
547
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
549
lvi.iItem = ListView_GetItemCount(m_hwndList) + 1;
552
cursel = SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_GETCURSEL, 0, 0);
553
pItem->frameId = cursel + 1;
554
GetDlgItemText(hwndDlg, IDC_COL0, col0, 1024);
555
GetDlgItemText(hwndDlg, IDC_COL1, col1, 1024);
556
pItem->aCols[0] = col0;
557
pItem->aCols[1] = col1;
559
lvi.lParam = (LPARAM)pItem; /* item data */
562
ListView_InsertItem(m_hwndList, &lvi);
563
ListView_Update(m_hwndList, lvi.iItem);
566
EndDialog(hwndDlg, wParam);
573
BOOL List_AddFrame(HWND hwndApp, HWND hwndList)
577
m_hwndList = hwndList;
579
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_ADDFRAME),
580
hwndApp, AddFrameProc);
582
if (LOWORD(result) == IDOK)
588
void InsertTextFrame(HWND dlg, HWND list, int control, int item, int frame_id)
591
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
593
/* Initialize LV_ITEM members that are common to all items. */
594
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
597
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
602
pItem->frameId = frame_id;
603
pItem->aCols[0] = GetFrameDesc(frame_id);
605
pItem->aCols[1] = LocalAlloc(LPTR, 1024);
606
GetDlgItemText(dlg, control, pItem->aCols[1], 1024);
608
lvi.lParam = (LPARAM)pItem; /* item data */
611
ListView_InsertItem(list, &lvi);
614
void AddFrameFromRAWData(HWND hwndList, int frameId, LPSTR data1, LPSTR data2)
617
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
620
nextItem = ListView_GetItemCount(hwndList);
622
/* Initialize LV_ITEM members that are common to all items. */
623
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
626
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
628
lvi.iItem = nextItem;
631
pItem->frameId = frameId;
633
pItem->aCols[0] = LocalAlloc(LPTR, 1024);
634
pItem->aCols[1] = LocalAlloc(LPTR, 1024);
636
lstrcpy(pItem->aCols[0], data1);
637
lstrcpy(pItem->aCols[1], data2);
639
lvi.lParam = (LPARAM)pItem; /* item data */
642
ListView_InsertItem(hwndList, &lvi);
648
BOOL CALLBACK AddStandardProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
658
switch (LOWORD(wParam)) {
661
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_TRACK)) > 0) {
662
InsertTextFrame(hwndDlg, m_hwndList, IDC_TRACK, ListView_GetItemCount(m_hwndList)+1, ID3FID_TRACKNUM);
666
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_TITLE)) > 0) {
667
InsertTextFrame(hwndDlg, m_hwndList, IDC_TITLE, ListView_GetItemCount(m_hwndList)+1, ID3FID_TITLE);
671
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ARTIST)) > 0) {
672
InsertTextFrame(hwndDlg, m_hwndList, IDC_ARTIST, ListView_GetItemCount(m_hwndList)+1, ID3FID_LEADARTIST);
676
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ALBUM)) > 0) {
677
InsertTextFrame(hwndDlg, m_hwndList, IDC_ALBUM, ListView_GetItemCount(m_hwndList)+1, ID3FID_ALBUM);
681
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_YEAR)) > 0) {
682
InsertTextFrame(hwndDlg, m_hwndList, IDC_YEAR, ListView_GetItemCount(m_hwndList)+1, ID3FID_YEAR);
686
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_GENRE)) > 0) {
687
InsertTextFrame(hwndDlg, m_hwndList, IDC_GENRE, ListView_GetItemCount(m_hwndList)+1, ID3FID_CONTENTTYPE);
691
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COMMENT)) > 0) {
692
InsertTextFrame(hwndDlg, m_hwndList, IDC_COMMENT, ListView_GetItemCount(m_hwndList)+1, ID3FID_COMMENT);
696
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COMPOSER)) > 0) {
697
InsertTextFrame(hwndDlg, m_hwndList, IDC_COMPOSER, ListView_GetItemCount(m_hwndList)+1, ID3FID_COMPOSER);
701
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ORIGARTIST)) > 0) {
702
InsertTextFrame(hwndDlg, m_hwndList, IDC_ORIGARTIST, ListView_GetItemCount(m_hwndList)+1, ID3FID_ORIGARTIST);
706
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COPYRIGHT)) > 0) {
707
InsertTextFrame(hwndDlg, m_hwndList, IDC_COPYRIGHT, ListView_GetItemCount(m_hwndList)+1, ID3FID_COPYRIGHT);
711
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_URL)) > 0) {
712
InsertTextFrame(hwndDlg, m_hwndList, IDC_URL, ListView_GetItemCount(m_hwndList)+1, ID3FID_WWWARTIST);
716
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ENCBY)) > 0) {
717
InsertTextFrame(hwndDlg, m_hwndList, IDC_ENCBY, ListView_GetItemCount(m_hwndList)+1, ID3FID_ENCODEDBY);
725
EndDialog(hwndDlg, changed);
733
BOOL List_AddStandardFrames(HWND hwndApp, HWND hwndList)
737
m_hwndList = hwndList;
740
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_ADDSTANDARD),
741
hwndApp, AddStandardProc);
743
return result?TRUE:FALSE;
747
/* List_OnGetDispInfo - processes the LVN_GETDISPINFO */
748
/* notification message. */
749
/* pnmv - value of lParam (points to an LV_DISPINFO structure) */
750
void List_OnGetDispInfo(LV_DISPINFO *pnmv)
752
/* Provide the item or subitem's text, if requested. */
753
if (pnmv->item.mask & LVIF_TEXT) {
754
ID3ITEM *pItem = (ID3ITEM *) (pnmv->item.lParam);
755
lstrcpy(pnmv->item.pszText,
756
pItem->aCols[pnmv->item.iSubItem]);
763
BOOL CALLBACK EditTextFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
769
SetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0]);
770
SetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1]);
772
switch (pItem->frameId)
774
case ID3FID_ALBUM: case ID3FID_BPM:
775
case ID3FID_COMPOSER: case ID3FID_COPYRIGHT:
776
case ID3FID_DATE: case ID3FID_PLAYLISTDELAY:
777
case ID3FID_ENCODEDBY: case ID3FID_LYRICIST:
778
case ID3FID_FILETYPE: case ID3FID_TIME:
779
case ID3FID_CONTENTGROUP: case ID3FID_TITLE:
780
case ID3FID_SUBTITLE: case ID3FID_INITIALKEY:
781
case ID3FID_LANGUAGE: case ID3FID_SONGLEN:
782
case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM:
783
case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST:
784
case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR:
785
case ID3FID_FILEOWNER: case ID3FID_LEADARTIST:
786
case ID3FID_BAND: case ID3FID_CONDUCTOR:
787
case ID3FID_MIXARTIST: case ID3FID_PARTINSET:
788
case ID3FID_PUBLISHER: case ID3FID_TRACKNUM:
789
case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION:
790
case ID3FID_NETRADIOOWNER: case ID3FID_SIZE:
791
case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS:
792
case ID3FID_YEAR: case ID3FID_WWWAUDIOFILE:
793
case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE:
794
case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT:
795
case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT:
796
case ID3FID_WWWRADIOPAGE: case ID3FID_CONTENTTYPE:
798
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
799
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
802
case ID3FID_USERTEXT: case ID3FID_COMMENT:
803
case ID3FID_UNSYNCEDLYRICS: case ID3FID_WWWUSER:
805
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), TRUE);
806
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
810
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
811
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
812
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), FALSE);
818
switch (LOWORD(wParam)) {
821
GetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0], 1024);
822
GetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1], 1024);
823
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
826
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
828
lvi.iItem = editItemIndex;
830
lvi.lParam = (LPARAM)pItem; /* item data */
833
ListView_SetItem(m_hwndList, &lvi);
834
ListView_Update(m_hwndList, editItemIndex);
837
EndDialog(hwndDlg, wParam);
845
/* Double clicking means editing a frame */
846
BOOL List_EditData(HWND hwndApp, HWND hwndList)
851
/* First get the selected item */
852
int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
854
m_hwndList = hwndList;
858
lvi.mask = LVIF_PARAM;
862
if (ListView_GetItem(hwndList, &lvi) == TRUE)
864
pItem = (ID3ITEM*)lvi.lParam;
865
editItemIndex = lvi.iItem;
867
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_EDITTEXTFRAME),
868
hwndApp, EditTextFrameProc);
869
if (LOWORD(result) == IDOK)
877
/* Delete the selected frame */
878
BOOL List_DeleteSelected(HWND hwndApp, HWND hwndList)
882
/* First get the selected item */
883
int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
886
ListView_DeleteItem(hwndList, index);
888
items = ListView_GetItemCount(hwndList);
889
if (index != -1) return TRUE;
894
/* Save the ID3 to the file */
895
void List_SaveID3(HWND hwndApp, HWND hwndList, char *filename)
904
/* Strip the tag first, before completely rewriting it */
905
if ((tag = ID3Tag_New()) != NULL)
907
ID3Tag_Link(tag, filename);
908
ID3Tag_Strip(tag, ID3TT_ALL);
911
if (SendMessage(GetDlgItem(hwndApp, IDC_ID3V2TAG), BM_GETCHECK, 0, 0) == BST_UNCHECKED)
913
/* No frames saved */
915
EnableWindow(GetDlgItem(hwndApp, IDC_ID3V2TAG), FALSE);
916
ListView_DeleteAllItems(hwndList);
920
/* First get the number of items */
921
items = ListView_GetItemCount(hwndList);
925
for (i = 0; i < items; i++)
927
lvi.mask = LVIF_PARAM;
931
if (ListView_GetItem(hwndList, &lvi) == TRUE)
933
pItem1 = (ID3ITEM*)lvi.lParam;
935
frame = ID3Frame_NewID(pItem1->frameId);
937
switch (pItem1->frameId)
939
case ID3FID_ALBUM: case ID3FID_BPM:
940
case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE:
941
case ID3FID_COPYRIGHT: case ID3FID_DATE:
942
case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY:
943
case ID3FID_LYRICIST: case ID3FID_FILETYPE:
944
case ID3FID_TIME: case ID3FID_CONTENTGROUP:
945
case ID3FID_TITLE: case ID3FID_SUBTITLE:
946
case ID3FID_INITIALKEY: case ID3FID_LANGUAGE:
947
case ID3FID_SONGLEN: case ID3FID_MEDIATYPE:
948
case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME:
949
case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST:
950
case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER:
951
case ID3FID_LEADARTIST: case ID3FID_BAND:
952
case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST:
953
case ID3FID_PARTINSET: case ID3FID_PUBLISHER:
954
case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES:
955
case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER:
956
case ID3FID_SIZE: case ID3FID_ISRC:
957
case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR:
959
field = ID3Frame_GetField(frame, ID3FN_TEXT);
960
ID3Field_SetASCII(field, pItem1->aCols[1]);
961
ID3Tag_AddFrame(tag, frame);
964
case ID3FID_USERTEXT:
965
case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
966
case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
968
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
969
ID3Field_SetASCII(field, pItem1->aCols[0]);
970
field = ID3Frame_GetField(frame, ID3FN_TEXT);
971
ID3Field_SetASCII(field, pItem1->aCols[1]);
972
ID3Tag_AddFrame(tag, frame);
975
case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST:
976
case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO:
977
case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER:
978
case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE:
980
field = ID3Frame_GetField(frame, ID3FN_URL);
981
ID3Field_SetASCII(field, pItem1->aCols[1]);
982
ID3Tag_AddFrame(tag, frame);
987
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
988
ID3Field_SetASCII(field, pItem1->aCols[0]);
989
field = ID3Frame_GetField(frame, ID3FN_URL);
990
ID3Field_SetASCII(field, pItem1->aCols[1]);
991
ID3Tag_AddFrame(tag, frame);
999
ID3Tag_UpdateByTagType(tag, ID3TT_ID3V2);
1006
/* Get the title from the file */
1007
void GetID3FileTitle(char *filename, char *title, char *format)
1016
char *bound = out + (MAX_PATH - 10 - 1);
1019
if ((tag = ID3Tag_New()) != NULL)
1021
ID3Tag_Link(tag, filename);
1023
while (*in && out < bound)
1035
/* handle % escape sequence */
1038
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TRACKNUM)) != NULL) {
1040
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1041
size = ID3Field_GetASCII(field, buffer, 255, 1);
1042
lstrcpy(out, buffer); out += size;
1047
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) {
1049
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1050
size = ID3Field_GetASCII(field, buffer, 255, 1);
1051
lstrcpy(out, buffer); out += size;
1056
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) {
1058
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1059
size = ID3Field_GetASCII(field, buffer, 255, 1);
1060
lstrcpy(out, buffer); out += size;
1065
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) {
1067
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1068
size = ID3Field_GetASCII(field, buffer, 255, 1);
1069
lstrcpy(out, buffer); out += size;
1074
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_YEAR)) != NULL) {
1076
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1077
size = ID3Field_GetASCII(field, buffer, 255, 1);
1078
lstrcpy(out, buffer); out += size;
1083
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_COMMENT)) != NULL) {
1085
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1086
size = ID3Field_GetASCII(field, buffer, 255, 1);
1087
lstrcpy(out, buffer); out += size;
1092
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_CONTENTTYPE)) != NULL) {
1093
int size; char *tmp;
1094
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1095
size = ID3Field_GetASCII(field, buffer, 255, 1);
1096
tmp = GetGenre(buffer);
1097
lstrcpy(out, tmp); out += size;
1103
char *p=filename+lstrlen(filename);
1105
while (*p != '\\' && p >= filename) { p--; len++; }
1106
lstrcpy(out, ++p); out += len;
1119
char *p=filename+lstrlen(filename);
1120
while (*p != '\\' && p >= filename) p--;
2
** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding
3
** Copyright (C) 2003 M. Bakker, Ahead Software AG, http://www.nero.com
5
** This program is free software; you can redistribute it and/or modify
6
** it under the terms of the GNU General Public License as published by
7
** the Free Software Foundation; either version 2 of the License, or
8
** (at your option) any later version.
10
** This program is distributed in the hope that it will be useful,
11
** but WITHOUT ANY WARRANTY; without even the implied warranty of
12
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13
** GNU General Public License for more details.
15
** You should have received a copy of the GNU General Public License
16
** along with this program; if not, write to the Free Software
17
** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19
** Any non-GPL usage of this software or parts of this software is strictly
22
** Commercial non-GPL licensing of this software is possible.
23
** For more info contact Ahead Software through Mpeg4AAClicense@nero.com.
25
** $Id: id3v2tag.c,v 1.4 2003/07/29 08:20:11 menno Exp $
28
#define WIN32_LEAN_AND_MEAN
46
"Encryption method registration",
49
"General encapsulated object",
50
"Group identification registration",
51
"Involved people list",
53
"Music CD identifier",
54
"MPEG location lookup table",
59
"Position synchronisation frame",
60
"Recommended buffer size",
61
"Relative volume adjustment",
64
"Synchronized tempo codes",
66
"BPM (beats per minute)",
68
"Genre", //"Content type",
76
"Content group description",
83
"Original album title",
85
"Original lyricist(s)",
87
"Original release year",
90
"Band/orchestra/accompaniment",
91
"Conductor/performer refinement",
92
"Interpreted, remixed, or otherwise modified by",
97
"Internet radio station name",
98
"Internet radio station owner",
100
"ISRC (international standard recording code)",
101
"Software/Hardware and settings used for encoding",
102
"User defined text information",
104
"Unique file identifier",
106
"Unsynchronized lyric",
107
"Commercial information",
108
"Copyright/Legal information",
109
"Official audio file webpage",
110
"Official artist webpage",
111
"Official audio source webpage",
112
"Official internet radio station homepage",
114
"Official publisher webpage",
115
"User defined URL link",
116
"Encrypted meta frame (id3v2.2.x)",
117
"Compressed meta frame (id3v2.2.1)"
120
ID3GENRES ID3Genres[]=
140
104, "Chamber Music",
159
98, "Easy Listening",
184
46, "Instrumental Pop",
185
47, "Instrumental Rock",
195
64, "Native American",
211
92, "Progressive Rock",
213
93, "Psychedelic Rock",
222
118, "Rhythmic Soul",
239
94, "Symphonic Rock",
243
51, "Techno-Industrial",
252
const int NUMFRAMES = sizeof(ID3Frames)/sizeof(ID3Frames[0]);
253
const int NUMGENRES = sizeof(ID3Genres)/sizeof(ID3Genres[0]);
256
LPSTR DupString(LPSTR lpsz)
258
int cb = lstrlen(lpsz) + 1;
259
LPSTR lpszNew = LocalAlloc(LMEM_FIXED, cb);
261
CopyMemory(lpszNew, lpsz, cb);
265
LPSTR GetFrameDesc(ID3_FrameID id)
267
return DupString(ID3Frames[id]);
270
LPSTR GetGenre(LPSTR lpsz)
272
int id = atoi(lpsz + 1);
275
if ((*(lpsz + 1) > '0') && (*(lpsz + 1) < '9'))
277
for (i = 0; i < NUMGENRES; i++)
279
if (id == ID3Genres[i].id)
280
return DupString(ID3Genres[i].name);
283
return DupString(lpsz);
286
void FillID3List(HWND hwndDlg, HWND hwndList, char *filename)
291
ID3_FrameID eFrameID;
298
if ((tag = ID3Tag_New()) != NULL)
300
ID3Tag_Link(tag, filename);
302
numFrames = ID3Tag_NumFrames(tag);
304
for (i = 0; i < numFrames; i++)
308
frame = ID3Tag_GetFrameNum(tag, i);
309
eFrameID = ID3Frame_GetID(frame);
313
case ID3FID_ALBUM: case ID3FID_BPM:
314
case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE:
315
case ID3FID_COPYRIGHT: case ID3FID_DATE:
316
case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY:
317
case ID3FID_LYRICIST: case ID3FID_FILETYPE:
318
case ID3FID_TIME: case ID3FID_CONTENTGROUP:
319
case ID3FID_TITLE: case ID3FID_SUBTITLE:
320
case ID3FID_INITIALKEY: case ID3FID_LANGUAGE:
321
case ID3FID_SONGLEN: case ID3FID_MEDIATYPE:
322
case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME:
323
case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST:
324
case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER:
325
case ID3FID_LEADARTIST: case ID3FID_BAND:
326
case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST:
327
case ID3FID_PARTINSET: case ID3FID_PUBLISHER:
328
case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES:
329
case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER:
330
case ID3FID_SIZE: case ID3FID_ISRC:
331
case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR:
334
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
336
/* Initialize LV_ITEM members that are common to all items. */
337
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
340
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
345
pItem->frameId = eFrameID;
346
pItem->aCols[0] = GetFrameDesc(eFrameID);
348
field = ID3Frame_GetField(frame, ID3FN_TEXT);
349
ID3Field_GetASCII(field, info, 1024, 1);
350
if (eFrameID == ID3FID_CONTENTTYPE)
351
pItem->aCols[1] = GetGenre(info);
353
pItem->aCols[1] = DupString(info);
355
lvi.lParam = (LPARAM)pItem; /* item data */
358
ListView_InsertItem(hwndList, &lvi);
362
case ID3FID_USERTEXT:
363
case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
364
case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
367
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
369
/* Initialize LV_ITEM members that are common to all items. */
370
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
373
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
378
pItem->frameId = eFrameID;
380
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
381
ID3Field_GetASCII(field, info, 1024, 1);
382
pItem->aCols[0] = DupString(info);
384
field = ID3Frame_GetField(frame, ID3FN_TEXT);
385
ID3Field_GetASCII(field, info, 1024, 1);
386
pItem->aCols[1] = DupString(info);
388
lvi.lParam = (LPARAM)pItem; /* item data */
391
ListView_InsertItem(hwndList, &lvi);
395
case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST:
396
case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO:
397
case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER:
398
case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE:
401
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
403
/* Initialize LV_ITEM members that are common to all items. */
404
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
407
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
412
pItem->frameId = eFrameID;
414
pItem->aCols[0] = GetFrameDesc(eFrameID);
416
field = ID3Frame_GetField(frame, ID3FN_URL);
417
ID3Field_GetASCII(field, info, 1024, 1);
418
pItem->aCols[1] = DupString(info);
420
lvi.lParam = (LPARAM)pItem; /* item data */
423
ListView_InsertItem(hwndList, &lvi);
430
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
432
/* Initialize LV_ITEM members that are common to all items. */
433
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
436
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
441
pItem->frameId = eFrameID;
443
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
444
ID3Field_GetASCII(field, info, 1024, 1);
445
pItem->aCols[0] = DupString(info);
447
field = ID3Frame_GetField(frame, ID3FN_URL);
448
ID3Field_GetASCII(field, info, 1024, 1);
449
pItem->aCols[1] = DupString(info);
451
lvi.lParam = (LPARAM)pItem; /* item data */
454
ListView_InsertItem(hwndList, &lvi);
466
BOOL CALLBACK AddFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
472
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
473
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
475
/* Note: FRAMEID is the index in the combo box + 1 */
476
for (i = 1; i < NUMFRAMES; i++)
478
SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_ADDSTRING, 0, (LPARAM)(LPCTSTR)ID3Frames[i]);
483
switch (LOWORD(wParam)) {
485
if (HIWORD(wParam) == CBN_SELCHANGE)
487
cursel = SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_GETCURSEL, 0, 0);
491
case ID3FID_ALBUM: case ID3FID_BPM:
492
case ID3FID_COMPOSER: case ID3FID_COPYRIGHT:
493
case ID3FID_DATE: case ID3FID_PLAYLISTDELAY:
494
case ID3FID_ENCODEDBY: case ID3FID_LYRICIST:
495
case ID3FID_FILETYPE: case ID3FID_TIME:
496
case ID3FID_CONTENTGROUP: case ID3FID_TITLE:
497
case ID3FID_SUBTITLE: case ID3FID_INITIALKEY:
498
case ID3FID_LANGUAGE: case ID3FID_SONGLEN:
499
case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM:
500
case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST:
501
case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR:
502
case ID3FID_FILEOWNER: case ID3FID_LEADARTIST:
503
case ID3FID_BAND: case ID3FID_CONDUCTOR:
504
case ID3FID_MIXARTIST: case ID3FID_PARTINSET:
505
case ID3FID_PUBLISHER: case ID3FID_TRACKNUM:
506
case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION:
507
case ID3FID_NETRADIOOWNER: case ID3FID_SIZE:
508
case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS:
509
case ID3FID_YEAR: case ID3FID_WWWAUDIOFILE:
510
case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE:
511
case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT:
512
case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT:
513
case ID3FID_WWWRADIOPAGE: case ID3FID_CONTENTTYPE:
515
SetDlgItemText(hwndDlg, IDC_COL0, ID3Frames[cursel+1]);
516
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
517
EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
520
case ID3FID_USERTEXT: case ID3FID_COMMENT:
521
case ID3FID_UNSYNCEDLYRICS: case ID3FID_WWWUSER:
523
SetDlgItemText(hwndDlg, IDC_COL0, ID3Frames[cursel+1]);
524
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), TRUE);
525
EnableWindow(GetDlgItem(hwndDlg, IDOK), TRUE);
529
MessageBox(hwndDlg, "Sorry, this frame type cannot be added (yet).", "Sorry", MB_OK);
530
EnableWindow(GetDlgItem(hwndDlg, IDC_COL0), FALSE);
531
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
539
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
540
char *col0 = LocalAlloc(LPTR, 1024);
541
char *col1 = LocalAlloc(LPTR, 1024);
543
/* Initialize LV_ITEM members that are common to all items. */
544
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
547
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
549
lvi.iItem = ListView_GetItemCount(m_hwndList) + 1;
552
cursel = SendMessage(GetDlgItem(hwndDlg, IDC_FRAMETYPE), CB_GETCURSEL, 0, 0);
553
pItem->frameId = cursel + 1;
554
GetDlgItemText(hwndDlg, IDC_COL0, col0, 1024);
555
GetDlgItemText(hwndDlg, IDC_COL1, col1, 1024);
556
pItem->aCols[0] = col0;
557
pItem->aCols[1] = col1;
559
lvi.lParam = (LPARAM)pItem; /* item data */
562
ListView_InsertItem(m_hwndList, &lvi);
563
ListView_Update(m_hwndList, lvi.iItem);
566
EndDialog(hwndDlg, wParam);
573
BOOL List_AddFrame(HWND hwndApp, HWND hwndList)
577
m_hwndList = hwndList;
579
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_ADDFRAME),
580
hwndApp, AddFrameProc);
582
if (LOWORD(result) == IDOK)
588
void InsertTextFrame(HWND dlg, HWND list, int control, int item, int frame_id)
591
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
593
/* Initialize LV_ITEM members that are common to all items. */
594
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
597
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
602
pItem->frameId = frame_id;
603
pItem->aCols[0] = GetFrameDesc(frame_id);
605
pItem->aCols[1] = LocalAlloc(LPTR, 1024);
606
GetDlgItemText(dlg, control, pItem->aCols[1], 1024);
608
lvi.lParam = (LPARAM)pItem; /* item data */
611
ListView_InsertItem(list, &lvi);
614
void AddFrameFromRAWData(HWND hwndList, int frameId, LPSTR data1, LPSTR data2)
617
ID3ITEM *pItem = LocalAlloc(LPTR, sizeof(ID3ITEM));
620
nextItem = ListView_GetItemCount(hwndList);
622
/* Initialize LV_ITEM members that are common to all items. */
623
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
626
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
628
lvi.iItem = nextItem;
631
pItem->frameId = frameId;
633
pItem->aCols[0] = LocalAlloc(LPTR, 1024);
634
pItem->aCols[1] = LocalAlloc(LPTR, 1024);
636
lstrcpy(pItem->aCols[0], data1);
637
lstrcpy(pItem->aCols[1], data2);
639
lvi.lParam = (LPARAM)pItem; /* item data */
642
ListView_InsertItem(hwndList, &lvi);
648
BOOL CALLBACK AddStandardProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
658
switch (LOWORD(wParam)) {
661
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_TRACK)) > 0) {
662
InsertTextFrame(hwndDlg, m_hwndList, IDC_TRACK, ListView_GetItemCount(m_hwndList)+1, ID3FID_TRACKNUM);
666
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_TITLE)) > 0) {
667
InsertTextFrame(hwndDlg, m_hwndList, IDC_TITLE, ListView_GetItemCount(m_hwndList)+1, ID3FID_TITLE);
671
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ARTIST)) > 0) {
672
InsertTextFrame(hwndDlg, m_hwndList, IDC_ARTIST, ListView_GetItemCount(m_hwndList)+1, ID3FID_LEADARTIST);
676
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ALBUM)) > 0) {
677
InsertTextFrame(hwndDlg, m_hwndList, IDC_ALBUM, ListView_GetItemCount(m_hwndList)+1, ID3FID_ALBUM);
681
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_YEAR)) > 0) {
682
InsertTextFrame(hwndDlg, m_hwndList, IDC_YEAR, ListView_GetItemCount(m_hwndList)+1, ID3FID_YEAR);
686
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_GENRE)) > 0) {
687
InsertTextFrame(hwndDlg, m_hwndList, IDC_GENRE, ListView_GetItemCount(m_hwndList)+1, ID3FID_CONTENTTYPE);
691
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COMMENT)) > 0) {
692
InsertTextFrame(hwndDlg, m_hwndList, IDC_COMMENT, ListView_GetItemCount(m_hwndList)+1, ID3FID_COMMENT);
696
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COMPOSER)) > 0) {
697
InsertTextFrame(hwndDlg, m_hwndList, IDC_COMPOSER, ListView_GetItemCount(m_hwndList)+1, ID3FID_COMPOSER);
701
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ORIGARTIST)) > 0) {
702
InsertTextFrame(hwndDlg, m_hwndList, IDC_ORIGARTIST, ListView_GetItemCount(m_hwndList)+1, ID3FID_ORIGARTIST);
706
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_COPYRIGHT)) > 0) {
707
InsertTextFrame(hwndDlg, m_hwndList, IDC_COPYRIGHT, ListView_GetItemCount(m_hwndList)+1, ID3FID_COPYRIGHT);
711
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_URL)) > 0) {
712
InsertTextFrame(hwndDlg, m_hwndList, IDC_URL, ListView_GetItemCount(m_hwndList)+1, ID3FID_WWWARTIST);
716
if (GetWindowTextLength(GetDlgItem(hwndDlg, IDC_ENCBY)) > 0) {
717
InsertTextFrame(hwndDlg, m_hwndList, IDC_ENCBY, ListView_GetItemCount(m_hwndList)+1, ID3FID_ENCODEDBY);
725
EndDialog(hwndDlg, changed);
733
BOOL List_AddStandardFrames(HWND hwndApp, HWND hwndList)
737
m_hwndList = hwndList;
740
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_ADDSTANDARD),
741
hwndApp, AddStandardProc);
743
return result?TRUE:FALSE;
747
/* List_OnGetDispInfo - processes the LVN_GETDISPINFO */
748
/* notification message. */
749
/* pnmv - value of lParam (points to an LV_DISPINFO structure) */
750
void List_OnGetDispInfo(LV_DISPINFO *pnmv)
752
/* Provide the item or subitem's text, if requested. */
753
if (pnmv->item.mask & LVIF_TEXT) {
754
ID3ITEM *pItem = (ID3ITEM *) (pnmv->item.lParam);
755
lstrcpy(pnmv->item.pszText,
756
pItem->aCols[pnmv->item.iSubItem]);
763
BOOL CALLBACK EditTextFrameProc(HWND hwndDlg, UINT message, WPARAM wParam, LPARAM lParam)
769
SetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0]);
770
SetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1]);
772
switch (pItem->frameId)
774
case ID3FID_ALBUM: case ID3FID_BPM:
775
case ID3FID_COMPOSER: case ID3FID_COPYRIGHT:
776
case ID3FID_DATE: case ID3FID_PLAYLISTDELAY:
777
case ID3FID_ENCODEDBY: case ID3FID_LYRICIST:
778
case ID3FID_FILETYPE: case ID3FID_TIME:
779
case ID3FID_CONTENTGROUP: case ID3FID_TITLE:
780
case ID3FID_SUBTITLE: case ID3FID_INITIALKEY:
781
case ID3FID_LANGUAGE: case ID3FID_SONGLEN:
782
case ID3FID_MEDIATYPE: case ID3FID_ORIGALBUM:
783
case ID3FID_ORIGFILENAME: case ID3FID_ORIGLYRICIST:
784
case ID3FID_ORIGARTIST: case ID3FID_ORIGYEAR:
785
case ID3FID_FILEOWNER: case ID3FID_LEADARTIST:
786
case ID3FID_BAND: case ID3FID_CONDUCTOR:
787
case ID3FID_MIXARTIST: case ID3FID_PARTINSET:
788
case ID3FID_PUBLISHER: case ID3FID_TRACKNUM:
789
case ID3FID_RECORDINGDATES: case ID3FID_NETRADIOSTATION:
790
case ID3FID_NETRADIOOWNER: case ID3FID_SIZE:
791
case ID3FID_ISRC: case ID3FID_ENCODERSETTINGS:
792
case ID3FID_YEAR: case ID3FID_WWWAUDIOFILE:
793
case ID3FID_WWWARTIST: case ID3FID_WWWAUDIOSOURCE:
794
case ID3FID_WWWCOMMERCIALINFO: case ID3FID_WWWCOPYRIGHT:
795
case ID3FID_WWWPUBLISHER: case ID3FID_WWWPAYMENT:
796
case ID3FID_WWWRADIOPAGE: case ID3FID_CONTENTTYPE:
798
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
799
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
802
case ID3FID_USERTEXT: case ID3FID_COMMENT:
803
case ID3FID_UNSYNCEDLYRICS: case ID3FID_WWWUSER:
805
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), TRUE);
806
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), TRUE);
810
EnableWindow(GetDlgItem(hwndDlg, IDOK), FALSE);
811
EnableWindow(GetDlgItem(hwndDlg, IDC_TEXTFRAMENAME), FALSE);
812
EnableWindow(GetDlgItem(hwndDlg, IDC_EDITTEXTFRAME), FALSE);
818
switch (LOWORD(wParam)) {
821
GetDlgItemText(hwndDlg, IDC_TEXTFRAMENAME, pItem->aCols[0], 1024);
822
GetDlgItemText(hwndDlg, IDC_EDITTEXTFRAME, pItem->aCols[1], 1024);
823
lvi.mask = LVIF_TEXT | LVIF_IMAGE | LVIF_PARAM | LVIF_STATE;
826
lvi.pszText = LPSTR_TEXTCALLBACK; /* app. maintains text */
828
lvi.iItem = editItemIndex;
830
lvi.lParam = (LPARAM)pItem; /* item data */
833
ListView_SetItem(m_hwndList, &lvi);
834
ListView_Update(m_hwndList, editItemIndex);
837
EndDialog(hwndDlg, wParam);
845
/* Double clicking means editing a frame */
846
BOOL List_EditData(HWND hwndApp, HWND hwndList)
851
/* First get the selected item */
852
int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
854
m_hwndList = hwndList;
858
lvi.mask = LVIF_PARAM;
862
if (ListView_GetItem(hwndList, &lvi) == TRUE)
864
pItem = (ID3ITEM*)lvi.lParam;
865
editItemIndex = lvi.iItem;
867
result = DialogBox(hInstance_for_id3editor, MAKEINTRESOURCE(IDD_EDITTEXTFRAME),
868
hwndApp, EditTextFrameProc);
869
if (LOWORD(result) == IDOK)
877
/* Delete the selected frame */
878
BOOL List_DeleteSelected(HWND hwndApp, HWND hwndList)
882
/* First get the selected item */
883
int index = ListView_GetNextItem(hwndList, -1, LVNI_SELECTED);
886
ListView_DeleteItem(hwndList, index);
888
items = ListView_GetItemCount(hwndList);
889
if (index != -1) return TRUE;
894
/* Save the ID3 to the file */
895
void List_SaveID3(HWND hwndApp, HWND hwndList, char *filename)
904
/* Strip the tag first, before completely rewriting it */
905
if ((tag = ID3Tag_New()) != NULL)
907
ID3Tag_Link(tag, filename);
908
ID3Tag_Strip(tag, ID3TT_ALL);
911
if (SendMessage(GetDlgItem(hwndApp, IDC_ID3V2TAG), BM_GETCHECK, 0, 0) == BST_UNCHECKED)
913
/* No frames saved */
915
EnableWindow(GetDlgItem(hwndApp, IDC_ID3V2TAG), FALSE);
916
ListView_DeleteAllItems(hwndList);
920
/* First get the number of items */
921
items = ListView_GetItemCount(hwndList);
925
for (i = 0; i < items; i++)
927
lvi.mask = LVIF_PARAM;
931
if (ListView_GetItem(hwndList, &lvi) == TRUE)
933
pItem1 = (ID3ITEM*)lvi.lParam;
935
frame = ID3Frame_NewID(pItem1->frameId);
937
switch (pItem1->frameId)
939
case ID3FID_ALBUM: case ID3FID_BPM:
940
case ID3FID_COMPOSER: case ID3FID_CONTENTTYPE:
941
case ID3FID_COPYRIGHT: case ID3FID_DATE:
942
case ID3FID_PLAYLISTDELAY: case ID3FID_ENCODEDBY:
943
case ID3FID_LYRICIST: case ID3FID_FILETYPE:
944
case ID3FID_TIME: case ID3FID_CONTENTGROUP:
945
case ID3FID_TITLE: case ID3FID_SUBTITLE:
946
case ID3FID_INITIALKEY: case ID3FID_LANGUAGE:
947
case ID3FID_SONGLEN: case ID3FID_MEDIATYPE:
948
case ID3FID_ORIGALBUM: case ID3FID_ORIGFILENAME:
949
case ID3FID_ORIGLYRICIST: case ID3FID_ORIGARTIST:
950
case ID3FID_ORIGYEAR: case ID3FID_FILEOWNER:
951
case ID3FID_LEADARTIST: case ID3FID_BAND:
952
case ID3FID_CONDUCTOR: case ID3FID_MIXARTIST:
953
case ID3FID_PARTINSET: case ID3FID_PUBLISHER:
954
case ID3FID_TRACKNUM: case ID3FID_RECORDINGDATES:
955
case ID3FID_NETRADIOSTATION: case ID3FID_NETRADIOOWNER:
956
case ID3FID_SIZE: case ID3FID_ISRC:
957
case ID3FID_ENCODERSETTINGS: case ID3FID_YEAR:
959
field = ID3Frame_GetField(frame, ID3FN_TEXT);
960
ID3Field_SetASCII(field, pItem1->aCols[1]);
961
ID3Tag_AddFrame(tag, frame);
964
case ID3FID_USERTEXT:
965
case ID3FID_COMMENT: /* Can also contain an extra language field (but not used now) */
966
case ID3FID_UNSYNCEDLYRICS: /* Can also contain an extra language field (but not used now) */
968
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
969
ID3Field_SetASCII(field, pItem1->aCols[0]);
970
field = ID3Frame_GetField(frame, ID3FN_TEXT);
971
ID3Field_SetASCII(field, pItem1->aCols[1]);
972
ID3Tag_AddFrame(tag, frame);
975
case ID3FID_WWWAUDIOFILE: case ID3FID_WWWARTIST:
976
case ID3FID_WWWAUDIOSOURCE: case ID3FID_WWWCOMMERCIALINFO:
977
case ID3FID_WWWCOPYRIGHT: case ID3FID_WWWPUBLISHER:
978
case ID3FID_WWWPAYMENT: case ID3FID_WWWRADIOPAGE:
980
field = ID3Frame_GetField(frame, ID3FN_URL);
981
ID3Field_SetASCII(field, pItem1->aCols[1]);
982
ID3Tag_AddFrame(tag, frame);
987
field = ID3Frame_GetField(frame, ID3FN_DESCRIPTION);
988
ID3Field_SetASCII(field, pItem1->aCols[0]);
989
field = ID3Frame_GetField(frame, ID3FN_URL);
990
ID3Field_SetASCII(field, pItem1->aCols[1]);
991
ID3Tag_AddFrame(tag, frame);
999
ID3Tag_UpdateByTagType(tag, ID3TT_ID3V2);
1006
/* Get the title from the file */
1007
void GetID3FileTitle(char *filename, char *title, char *format)
1016
char *bound = out + (MAX_PATH - 10 - 1);
1019
if ((tag = ID3Tag_New()) != NULL)
1021
ID3Tag_Link(tag, filename);
1023
while (*in && out < bound)
1035
/* handle % escape sequence */
1038
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TRACKNUM)) != NULL) {
1040
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1041
size = ID3Field_GetASCII(field, buffer, 255, 1);
1042
lstrcpy(out, buffer); out += size;
1047
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_LEADARTIST)) != NULL) {
1049
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1050
size = ID3Field_GetASCII(field, buffer, 255, 1);
1051
lstrcpy(out, buffer); out += size;
1056
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_TITLE)) != NULL) {
1058
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1059
size = ID3Field_GetASCII(field, buffer, 255, 1);
1060
lstrcpy(out, buffer); out += size;
1065
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_ALBUM)) != NULL) {
1067
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1068
size = ID3Field_GetASCII(field, buffer, 255, 1);
1069
lstrcpy(out, buffer); out += size;
1074
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_YEAR)) != NULL) {
1076
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1077
size = ID3Field_GetASCII(field, buffer, 255, 1);
1078
lstrcpy(out, buffer); out += size;
1083
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_COMMENT)) != NULL) {
1085
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1086
size = ID3Field_GetASCII(field, buffer, 255, 1);
1087
lstrcpy(out, buffer); out += size;
1092
if ((frame = ID3Tag_FindFrameWithID(tag, ID3FID_CONTENTTYPE)) != NULL) {
1093
int size; char *tmp;
1094
field = ID3Frame_GetField(frame, ID3FN_TEXT);
1095
size = ID3Field_GetASCII(field, buffer, 255, 1);
1096
tmp = GetGenre(buffer);
1097
lstrcpy(out, tmp); out += size;
1103
char *p=filename+lstrlen(filename);
1105
while (*p != '\\' && p >= filename) { p--; len++; }
1106
lstrcpy(out, ++p); out += len;
1119
char *p=filename+lstrlen(filename);
1120
while (*p != '\\' && p >= filename) p--;