diff options
Diffstat (limited to 'Src/Plugins/Library/ml_rg/Results.cpp')
-rw-r--r-- | Src/Plugins/Library/ml_rg/Results.cpp | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/Src/Plugins/Library/ml_rg/Results.cpp b/Src/Plugins/Library/ml_rg/Results.cpp new file mode 100644 index 00000000..592bd47b --- /dev/null +++ b/Src/Plugins/Library/ml_rg/Results.cpp @@ -0,0 +1,172 @@ +#include "main.h" +#include "resource.h" +#include "../nu/listview.h" +#include "api__ml_rg.h" +#include <shlwapi.h> +#include <strsafe.h> + +// this isn't nice but it localises the values for display as they're saved in "C" locale +enum { GAIN_MODE=0, PEAK_MODE }; +wchar_t* LocaliseNumericText(wchar_t str[64], int mode){ +static wchar_t tmp[64]; +double value; + tmp[0]=0; + value = _wtof_l(str,WASABI_API_LNG->Get_C_NumericLocale()); + StringCchPrintfW(tmp,64,(mode==GAIN_MODE?L"%-+.2f dB":L"%-.9f"),value); + return tmp; +} + +static void AddQueueToListView(W_ListView *listView, WorkQueue::RGWorkQueue *queue) +{ + int i=listView->GetCount(); + for(WorkQueue::RGWorkQueue::iterator itr = queue->begin(); itr!= queue->end(); itr++) + { + listView->InsertItem(i, PathFindFileNameW(itr->filename), (int)&*itr); + listView->SetItemText(i, 1, LocaliseNumericText(itr->track_gain,GAIN_MODE)); + listView->SetItemText(i, 2, LocaliseNumericText(itr->track_peak,PEAK_MODE)); + listView->SetItemText(i, 3, LocaliseNumericText(itr->album_gain,GAIN_MODE)); + listView->SetItemText(i, 4, LocaliseNumericText(itr->album_peak,PEAK_MODE)); + i++; + } +} + +INT_PTR WINAPI ReplayGainDialogProc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + W_ListView listView(GetDlgItem(hwndDlg, IDC_RGLIST)); + listView.setwnd(GetDlgItem(hwndDlg, IDC_RGLIST)); + + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_FILENAME), 200); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_TRACK_GAIN), 65); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_TRACK_PEAK), 80); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_ALBUM_GAIN), 65); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_ALBUM_PEAK), 80); + + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + WorkQueue::RGWorkQueue *queue = (WorkQueue::RGWorkQueue *)lParam; + + AddQueueToListView(&listView, queue); + + POINT pt = {(LONG)GetPrivateProfileIntA("ml_rg", "res_x", -1, iniFile), + (LONG)GetPrivateProfileIntA("ml_rg", "res_y", -1, iniFile)}; + if (!windowOffScreen(hwndDlg, pt)) + SetWindowPos(hwndDlg, HWND_TOP, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOSENDCHANGING); + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + { + WorkQueue::RGWorkQueue *queue = (WorkQueue::RGWorkQueue *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + WriteAlbum(*queue); + } + case IDCANCEL: + { + RECT rect = {0}; + GetWindowRect(hwndDlg, &rect); + char buf[16] = {0}; + StringCchPrintfA(buf, 16, "%d", rect.left); + WritePrivateProfileStringA("ml_rg", "res_x", buf, iniFile); + StringCchPrintfA(buf, 16, "%d", rect.top); + WritePrivateProfileStringA("ml_rg", "res_y", buf, iniFile); + EndDialog(hwndDlg, 0); + } + break; + case IDC_SAVETRACK: + { + WorkQueue::RGWorkQueue *queue = (WorkQueue::RGWorkQueue *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + WriteTracks(*queue); + EndDialog(hwndDlg, 0); + } + break; + } + } + return 0; +} + +INT_PTR WINAPI ReplayGainDialogProcAll(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam) +{ + switch(msg) + { + case WM_INITDIALOG: + { + W_ListView listView(GetDlgItem(hwndDlg, IDC_RGLIST)); + listView.setwnd(GetDlgItem(hwndDlg, IDC_RGLIST)); + + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_FILENAME), 200); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_TRACK_GAIN), 65); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_TRACK_PEAK), 80); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_ALBUM_GAIN), 65); + listView.AddCol(WASABI_API_LNGSTRINGW(IDS_COL_ALBUM_PEAK), 80); + + SetWindowLongPtr(hwndDlg, GWLP_USERDATA, lParam); + + WorkQueue *queue = (WorkQueue *)lParam; + + AddQueueToListView(&listView, &queue->unclassified); + for (WorkQueue::AlbumMap::iterator mapItr=queue->albums.begin();mapItr!=queue->albums.end();mapItr++) + { + AddQueueToListView(&listView, &mapItr->second); + } + + POINT pt = {(LONG)GetPrivateProfileIntA("ml_rg", "res_x", -1, iniFile), + (LONG)GetPrivateProfileIntA("ml_rg", "res_y", -1, iniFile)}; + if (!windowOffScreen(hwndDlg, pt)) + SetWindowPos(hwndDlg, HWND_TOP, pt.x, pt.y, 0, 0, SWP_NOSIZE | SWP_SHOWWINDOW | SWP_NOSENDCHANGING); + } + break; + case WM_COMMAND: + switch(LOWORD(wParam)) + { + case IDOK: + { + WorkQueue *queue = (WorkQueue *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + WriteAlbum(queue->unclassified); + for (WorkQueue::AlbumMap::iterator mapItr=queue->albums.begin();mapItr!=queue->albums.end();mapItr++) + { + WriteAlbum(mapItr->second); + } + } + case IDCANCEL: + { + RECT rect = {0}; + GetWindowRect(hwndDlg, &rect); + char buf[16] = {0}; + StringCchPrintfA(buf, 16, "%d", rect.left); + WritePrivateProfileStringA("ml_rg", "res_x", buf, iniFile); + StringCchPrintfA(buf, 16, "%d", rect.top); + WritePrivateProfileStringA("ml_rg", "res_y", buf, iniFile); + EndDialog(hwndDlg, 0); + } + break; + case IDC_SAVETRACK: + { + WorkQueue *queue = (WorkQueue *)GetWindowLongPtr(hwndDlg, GWLP_USERDATA); + WriteTracks(queue->unclassified); + for (WorkQueue::AlbumMap::iterator mapItr=queue->albums.begin();mapItr!=queue->albums.end();mapItr++) + { + WriteTracks(mapItr->second); + } + EndDialog(hwndDlg, 0); + } + break; + } + } + return 0; +} + +void DoResults(WorkQueue::RGWorkQueue &queue) +{ + if (!queue.empty()) + WASABI_API_DIALOGBOXPARAM(IDD_RESULTS, GetDialogBoxParent(), ReplayGainDialogProc, (LPARAM)&queue); +} + +void DoResults(WorkQueue &queue) +{ + WASABI_API_DIALOGBOXPARAM(IDD_RESULTS, GetDialogBoxParent(), ReplayGainDialogProcAll, (LPARAM)&queue); +}
\ No newline at end of file |