177
static wchar_t *AnsiToWide(const char *src)
182
FLAC__ASSERT(0 != src);
184
len = strlen(src) + 1;
186
dest = (wchar_t*)malloc(len*sizeof(wchar_t));
187
if (dest) mbstowcs(dest, src, len);
178
192
* Infobox helpers
181
#define SetText(x,y) WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, FLAC_plugin__canonical_get(&data->tag, y), -1, buffer, sizeof(buffer), NULL, NULL); \
195
#define SetText(x,y) ucs2 = FLAC_plugin__tags_get_tag_ucs2(data->tags, y); \
196
WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, ucs2, -1, buffer, sizeof(buffer), NULL, NULL); \
197
if(ucs2) free(ucs2); \
182
198
SetDlgItemText(hwnd, x, buffer)
184
200
#define GetText(x,y) GetDlgItemText(hwnd, x, buffer, sizeof(buffer)); \
185
if (*buffer) FLAC_plugin__canonical_set_ansi(&data->tag, y, buffer); \
186
else FLAC_plugin__canonical_remove_all(&data->tag, y)
201
if (*buffer) { ucs2 = AnsiToWide(buffer); FLAC_plugin__tags_set_tag_ucs2(data->tags, y, ucs2, /*replace_all=*/false); free(ucs2); } \
202
else FLAC_plugin__tags_delete_tag(data->tags, y)
188
#define SetTextW(x,y) SetDlgItemTextW(hwnd, x, FLAC_plugin__canonical_get(&data->tag, y))
204
#define SetTextW(x,y) ucs2 = FLAC_plugin__tags_get_tag_ucs2(data->tags, y); \
205
SetDlgItemTextW(hwnd, x, ucs2); \
190
208
#define GetTextW(x,y) GetDlgItemTextW(hwnd, x, (WCHAR*)buffer, sizeof(buffer)/2); \
191
if (*(WCHAR*)buffer) FLAC_plugin__canonical_set(&data->tag, y, (WCHAR*)buffer); \
192
else FLAC_plugin__canonical_remove_all(&data->tag, y)
209
if (*(WCHAR*)buffer) FLAC_plugin__tags_set_tag_ucs2(data->tags, y, (WCHAR*)buffer, /*replace_all=*/false); \
210
else FLAC_plugin__tags_delete_tag(data->tags, y)
195
213
static BOOL InitInfoboxInfo(HWND hwnd, const char *file)
197
215
LOCALDATA *data = LocalAlloc(LPTR, sizeof(LOCALDATA));
198
217
FLAC__StreamMetadata streaminfo;
199
218
DWORD length, bps, ratio, rg;
200
219
LONGLONG filesize;
208
227
if (!filesize) return FALSE;
209
228
if (!FLAC__metadata_get_streaminfo(file, &streaminfo))
211
ReadTags(file, &data->tag, false);
230
ReadTags(file, &data->tags, false);
213
232
length = (DWORD)(streaminfo.data.stream_info.total_samples / streaminfo.data.stream_info.sample_rate);
214
233
bps = (DWORD)(filesize / (125*streaminfo.data.stream_info.total_samples/streaminfo.data.stream_info.sample_rate));
215
234
ratio = bps*1000000 / (streaminfo.data.stream_info.sample_rate*streaminfo.data.stream_info.channels*streaminfo.data.stream_info.bits_per_sample);
216
rg = FLAC_plugin__canonical_get(&data->tag, L"REPLAYGAIN_TRACK_GAIN") ? 1 : 0;
217
rg |= FLAC_plugin__canonical_get(&data->tag, L"REPLAYGAIN_ALBUM_GAIN") ? 2 : 0;
235
rg = FLAC_plugin__tags_get_tag_utf8(data->tags, "REPLAYGAIN_TRACK_GAIN") ? 1 : 0;
236
rg |= FLAC_plugin__tags_get_tag_utf8(data->tags, "REPLAYGAIN_ALBUM_GAIN") ? 2 : 0;
219
238
sprintf(buffer, "Sample rate: %d Hz\nChannels: %d\nBits per sample: %d\nMin block size: %d\nMax block size: %d\n"
220
239
"File size: %I64d bytes\nTotal samples: %I64d\nLength: %d:%02d\nAvg. bitrate: %d\nCompression ratio: %d.%d%%\n"
231
SetTextW(IDC_TITLE, L"TITLE");
232
SetTextW(IDC_ARTIST, L"ARTIST");
233
SetTextW(IDC_ALBUM, L"ALBUM");
234
SetTextW(IDC_COMMENT, L"COMMENT");
235
SetTextW(IDC_YEAR, L"DATE");
236
SetTextW(IDC_TRACK, L"TRACKNUMBER");
237
SetTextW(IDC_GENRE, L"GENRE");
250
SetTextW(IDC_TITLE, "TITLE");
251
SetTextW(IDC_ARTIST, "ARTIST");
252
SetTextW(IDC_ALBUM, "ALBUM");
253
SetTextW(IDC_COMMENT, "COMMENT");
254
SetTextW(IDC_YEAR, "DATE");
255
SetTextW(IDC_TRACK, "TRACKNUMBER");
256
SetTextW(IDC_GENRE, "GENRE");
241
SetText(IDC_TITLE, L"TITLE");
242
SetText(IDC_ARTIST, L"ARTIST");
243
SetText(IDC_ALBUM, L"ALBUM");
244
SetText(IDC_COMMENT, L"COMMENT");
245
SetText(IDC_YEAR, L"DATE");
246
SetText(IDC_TRACK, L"TRACKNUMBER");
247
SetText(IDC_GENRE, L"GENRE");
260
SetText(IDC_TITLE, "TITLE");
261
SetText(IDC_ARTIST, "ARTIST");
262
SetText(IDC_ALBUM, "ALBUM");
263
SetText(IDC_COMMENT, "COMMENT");
264
SetText(IDC_YEAR, "DATE");
265
SetText(IDC_TRACK, "TRACKNUMBER");
266
SetText(IDC_GENRE, "GENRE");
253
static void __inline SetTag(HWND hwnd, const char *filename, FLAC_Plugin__CanonicalTag *tag)
272
static void __inline SetTag(HWND hwnd, const char *filename, FLAC__StreamMetadata *tags)
255
274
strcpy(buffer, infoTitle);
257
if (FLAC_plugin__vorbiscomment_set(filename, tag))
276
if (FLAC_plugin__tags_set(filename, tags))
258
277
strcat(buffer, " [Updated]");
259
278
else strcat(buffer, " [Failed]");
264
283
static void UpdateTag(HWND hwnd)
266
285
LOCALDATA *data = (LOCALDATA*)GetWindowLong(hwnd, GWL_USERDATA);
271
GetTextW(IDC_TITLE, L"TITLE");
272
GetTextW(IDC_ARTIST, L"ARTIST");
273
GetTextW(IDC_ALBUM, L"ALBUM");
274
GetTextW(IDC_COMMENT, L"COMMENT");
275
GetTextW(IDC_YEAR, L"DATE");
276
GetTextW(IDC_TRACK, L"TRACKNUMBER");
277
GetTextW(IDC_GENRE, L"GENRE");
291
GetTextW(IDC_TITLE, "TITLE");
292
GetTextW(IDC_ARTIST, "ARTIST");
293
GetTextW(IDC_ALBUM, "ALBUM");
294
GetTextW(IDC_COMMENT, "COMMENT");
295
GetTextW(IDC_YEAR, "DATE");
296
GetTextW(IDC_TRACK, "TRACKNUMBER");
297
GetTextW(IDC_GENRE, "GENRE");
279
WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, FLAC_plugin__canonical_get(&data->tag, L"GENRE"), -1, buffer, sizeof(buffer), NULL, NULL);
299
ucs2 = FLAC_plugin__tags_get_tag_ucs2(data->tags, "GENRE");
300
WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK, ucs2, -1, buffer, sizeof(buffer), NULL, NULL);
283
GetText(IDC_TITLE, L"TITLE");
284
GetText(IDC_ARTIST, L"ARTIST");
285
GetText(IDC_ALBUM, L"ALBUM");
286
GetText(IDC_COMMENT, L"COMMENT");
287
GetText(IDC_YEAR, L"DATE");
288
GetText(IDC_TRACK, L"TRACKNUMBER");
289
GetText(IDC_GENRE, L"GENRE");
305
GetText(IDC_TITLE, "TITLE");
306
GetText(IDC_ARTIST, "ARTIST");
307
GetText(IDC_ALBUM, "ALBUM");
308
GetText(IDC_COMMENT, "COMMENT");
309
GetText(IDC_YEAR, "DATE");
310
GetText(IDC_TRACK, "TRACKNUMBER");
311
GetText(IDC_GENRE, "GENRE");
292
314
/* update genres list (buffer should contain genre) */
293
315
if (buffer[0]) AddGenre(hwnd, buffer);
296
SetTag(hwnd, data->filename, &data->tag);
318
SetTag(hwnd, data->filename, data->tags);
299
321
static void RemoveTag(HWND hwnd)
301
323
LOCALDATA *data = (LOCALDATA*)GetWindowLong(hwnd, GWL_USERDATA);
302
FLAC_plugin__canonical_tag_clear(&data->tag);
324
FLAC_plugin__tags_delete_all(data->tags);
304
326
SetDlgItemText(hwnd, IDC_TITLE, "");
305
327
SetDlgItemText(hwnd, IDC_ARTIST, "");
393
void ReadTags(const char *fileName, FLAC_Plugin__CanonicalTag *tag, BOOL forDisplay)
415
void ReadTags(const char *fileName, FLAC__StreamMetadata **tags, BOOL forDisplay)
395
FLAC_plugin__canonical_tag_init(tag);
396
FLAC_plugin__vorbiscomment_get(fileName, tag, forDisplay ? flac_cfg.title.sep : NULL);
402
FLAC_plugin__canonical_set_ansi(tag, L"filepath", fileName);
404
strcpy(buffer, GetFileName(fileName));
405
if (c = strrchr(buffer, '.')) *c = 0;
406
FLAC_plugin__canonical_set_ansi(tag, L"filename", buffer);
417
if(FLAC_plugin__tags_get(fileName, tags)) {
424
ucs2 = AnsiToWide(fileName);
425
FLAC_plugin__tags_set_tag_ucs2(*tags, "filepath", ucs2, /*replace_all=*/true);
428
strcpy(buffer, GetFileName(fileName));
429
if (c = strrchr(buffer, '.')) *c = 0;
430
ucs2 = AnsiToWide(buffer);
431
FLAC_plugin__tags_set_tag_ucs2(*tags, "filename", ucs2, /*replace_all=*/true);