12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061 |
- #include "main.h"
- #include <windowsx.h>
- #include "resource.h"
- #include "..\nu\listview.h"
- #include "../nu/DialogSkinner.h"
- #include "../nu/ChildSizer.h"
- #include "config.h"
- #include "../winamp/wa_ipc.h"
- #include "..\..\General\gen_ml/gaystring.h"
- #include <stdio.h>
- #include <shlobj.h>
- #include <time.h>
- #include "../nu/AutoChar.h"
- #include "../nu/AutoCharFn.h"
- #include "../nu/AutoWide.h"
- #include "ReplayGain.h"
- #include "M3UWriter.h"
- #include "PLSWriter.h"
- #include "./settings.h"
- #include <shlwapi.h>
- #include <windows.h>
- #include <strsafe.h>
- extern unsigned int FileTimeToUnixTime(FILETIME *ft);
- static UINT uMsgRipperNotify = 0;
- static INT_PTR WINAPI DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam);
- HWND CreateCDRipWindow(HWND hwndParent, CHAR cLetter)
- {
- return WASABI_API_CREATEDIALOGPARAMW(IDD_VIEW_CDROM_EX2, hwndParent, DlgProc, (LPARAM)cLetter);
- }
- //physically update metadata in a given file
- int updateFileInfo(char *filename, char *metadata, char *data)
- {
- extendedFileInfoStruct efis = {
- filename,
- metadata,
- data ? data : "",
- data ? strlen(data) : 0,
- };
- return (INT)(INT_PTR)SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&efis, IPC_SET_EXTENDED_FILE_INFO);
- }
- //physically update metadata in a given file
- int updateFileInfoW(wchar_t *filename, const wchar_t *metadata, const wchar_t *data)
- {
- extendedFileInfoStructW efis = {
- filename,
- metadata,
- data ? data : L"",
- data ? lstrlenW(data) : 0,
- };
- return (INT)(INT_PTR)SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&efis, IPC_SET_EXTENDED_FILE_INFOW);
- }
- static int m_extract_curtrack, m_extract_nb, m_extract_nb_total;
- static int m_db_has_upd;
- static convertFileStructW m_fcs;
- static wchar_t m_extract_src[64];
- static DWORD m_extract_time;
- static int m_extracting;
- static cdrip_params *m_rip_params;
- HWND m_extract_wnd = 0;
- static wchar_t m_last_total_status[512];
- static wchar_t m_last_item_status[512];
- static int m_cur_rg = 0;
- static int done = 0;
- bool RegisteredEncoder(DWORD fourcc)
- {
- if (fourcc == mmioFOURCC('M', 'P', '3', 'l')
- || fourcc == mmioFOURCC('A', 'A', 'C', 'H')
- || fourcc == mmioFOURCC('M', '4', 'A', 'H'))
- return true;
- else
- return false;
- }
- static void createDirForFile(char *str)
- {
- char *p = str;
- if ((p[0] == '\\' || p[0] == '/') && (p[1] == '\\' || p[1] == '/'))
- {
- p += 2;
- while (p && *p && *p != '\\' && *p != '/') p++;
- if (!p || !*p) return ;
- p++;
- while (p && *p && *p != '\\' && *p != '/') p++;
- }
- else
- {
- while (p && *p && *p != '\\' && *p != '/') p++;
- }
- while (p && *p)
- {
- while (p && *p != '\\' && *p != '/' && *p) p = CharNextA(p);
- if (p && *p)
- {
- char lp = *p;
- *p = 0;
- CreateDirectoryA(str, NULL);
- *p++ = lp;
- }
- }
- }
- static void createDirForFileW(wchar_t *str)
- {
- wchar_t *p = str;
- if ((p[0] ==L'\\' || p[0] ==L'/') && (p[1] ==L'\\' || p[1] ==L'/'))
- {
- p += 2;
- while (p && *p && *p !=L'\\' && *p !=L'/') p++;
- if (!p || !*p) return ;
- p++;
- while (p && *p && *p !=L'\\' && *p !=L'/') p++;
- }
- else
- {
- while (p && *p && *p !=L'\\' && *p !=L'/') p++;
- }
- while (p && *p)
- {
- while (p && *p !=L'\\' && *p !=L'/' && *p) p = CharNextW(p);
- if (p && *p)
- {
- wchar_t lp = *p;
- *p = 0;
- CreateDirectoryW(str, NULL);
- *p++ = lp;
- }
- }
- }
- static void LockCD(char cLetter, BOOL bLock)
- {
- wchar_t info[32] = {0};
- wchar_t name[] = L"cda://X";
- name[6] = cLetter;
- getFileInfoW(name, (bLock) ? L"cdlock" : L"cdunlock", info, sizeof(info)/sizeof(wchar_t));
- }
- static int m_pstat_bytesdone;
- static int m_pstat_bytesout;
- static int m_pstat_timedone;
- static int m_rip_done;
- static HWND m_hwndstatus;
- static W_ListView m_statuslist;
- static void NotifyInfoWindow(HWND hwnd, BOOL bForceRefresh)
- {
- HWND hwndParent;
- hwndParent = GetParent(hwnd);
- if (hwndParent) SendMessageW(hwndParent, WM_SHOWFILEINFO,
- (WPARAM) WISF_MESSAGE | ((bForceRefresh) ? WISF_FORCE : WISF_NORMAL),
- (LPARAM)WASABI_API_LNGSTRINGW(IDS_INFO_RIPPING));
- }
- static void ListView_OnItemChanged(HWND hwndDlg, NMLISTVIEW *pnmv)
- {
- if (LVIF_STATE & pnmv->uChanged)
- {
- if ((LVIS_FOCUSED & pnmv->uOldState) != (LVIS_FOCUSED & pnmv->uNewState))
- {
- NotifyInfoWindow(hwndDlg, TRUE);
- }
- }
- }
- static void Window_OnQueryInfo(HWND hwnd)
- {
- NotifyInfoWindow(hwnd, FALSE);
- }
- static INT_PTR Window_OnNotify(HWND hwndDlg, INT ctrlId, LPNMHDR phdr)
- {
- switch(phdr->idFrom)
- {
- case IDC_LIST2:
- switch(phdr->code)
- {
- case LVN_ITEMCHANGED: ListView_OnItemChanged(hwndDlg, (NMLISTVIEW*)phdr); break;
- }
- break;
- }
- return 0;
- }
- INT_PTR WINAPI DlgProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- static ChildWndResizeItem ripwnd_rlist[] = {
- {IDC_LIST2, 0x0011},
- {IDC_CDINFO, 0x0000},
- {IDC_RIPOPTS, 0x0101},
- {IDC_CANCEL_RIP, 0x0101},
- {IDC_BTN_SHOWINFO, 0x1111},
- };
- INT_PTR a = (INT_PTR)dialogSkinner.Handle(hwndDlg, uMsg, wParam, lParam); if (a) return a;
- switch (uMsg)
- {
- case WM_SIZE:
- if (wParam != SIZE_MINIMIZED)
- {
- childSizer.Resize(hwndDlg, ripwnd_rlist, sizeof(ripwnd_rlist) / sizeof(ripwnd_rlist[0]));
- }
- break;
- case WM_PAINT:
- {
- int tab[] = { IDC_LIST2 | DCW_SUNKENBORDER};
- dialogSkinner.Draw(hwndDlg, tab, 1);
- }
- return 0;
- case WM_INITDIALOG:
- m_hwndstatus = hwndDlg;
- SendMessageW(GetParent(hwndDlg), WM_COMMAND, MAKEWPARAM(IDC_BTN_SHOWINFO, BN_EX_GETTEXT), (LPARAM)GetDlgItem(hwndDlg, IDC_BTN_SHOWINFO));
- m_statuslist.setwnd(GetDlgItem(hwndDlg, IDC_LIST2));
- m_statuslist.AddCol(WASABI_API_LNGSTRINGW(IDS_TRACK_NUMBER), g_view_metaconf->ReadInt(L"col_track", 60));
- m_statuslist.AddCol(WASABI_API_LNGSTRINGW(IDS_TITLE), g_view_metaconf->ReadInt(L"col_title", 200));
- m_statuslist.AddCol(WASABI_API_LNGSTRINGW(IDS_LENGTH), g_view_metaconf->ReadInt(L"col_len", 80));
- m_statuslist.AddCol(WASABI_API_LNGSTRINGW(IDS_STATUS), g_view_metaconf->ReadInt(L"col_status", 200));
- SetDlgItemText(hwndDlg, IDC_CDINFO, m_last_total_status);
- {
- int l = m_rip_params->ntracks;
- int x = 0;
- for (int i = 0;i < l;i++) if (m_rip_params->tracks[i])
- {
- wchar_t buf[1024] = {0};
- StringCchPrintf(buf, 1024, L"%d", i + 1);
- m_statuslist.InsertItem(x, buf, 0);
- m_statuslist.SetItemText(x, 1, m_rip_params->tracks[i]);
- StringCchPrintf(buf, 512, L"%d:%02d", m_rip_params->lengths[i] / 60, m_rip_params->lengths[i] % 60);
- m_statuslist.SetItemText(x, 2, buf);
- if (i < m_extract_curtrack || m_rip_done)
- m_statuslist.SetItemText(x, 3, WASABI_API_LNGSTRINGW(IDS_COMPLETED));
- else if (i > m_extract_curtrack)
- m_statuslist.SetItemText(x, 3, WASABI_API_LNGSTRINGW(IDS_QUEUED));
- else
- {
- m_statuslist.SetItemText(x, 3, m_last_item_status[0] ? m_last_item_status : WASABI_API_LNGSTRINGW(IDS_RIPPING));
- }
- x++;
- }
- }
- if (!m_extract_wnd || m_rip_done)
- {
- SetDlgItemText(hwndDlg, IDC_CANCEL_RIP, WASABI_API_LNGSTRINGW(IDS_CLOSE));
- }
- if (g_config->ReadInt(L"cdripautoeject", 0)) CheckDlgButton(hwndDlg, IDC_CHECK2, BST_CHECKED);
- if (g_config->ReadInt(L"cdripautoplay", 0)) CheckDlgButton(hwndDlg, IDC_CHECK3, BST_CHECKED);
- if (g_config->ReadInt(L"cdripautoclose", 1)) CheckDlgButton(hwndDlg, IDC_CHECK1, BST_CHECKED);
- childSizer.Init(hwndDlg, ripwnd_rlist, sizeof(ripwnd_rlist) / sizeof(ripwnd_rlist[0]));
- ListView_SetTextColor(m_statuslist.getwnd(), dialogSkinner.Color(WADLG_ITEMFG));
- ListView_SetBkColor(m_statuslist.getwnd(), dialogSkinner.Color(WADLG_ITEMBG));
- ListView_SetTextBkColor(m_statuslist.getwnd(), dialogSkinner.Color(WADLG_ITEMBG));
-
- if(m_statuslist.getwnd())
- {
- MLSKINWINDOW sw;
- sw.hwndToSkin = m_statuslist.getwnd();
- sw.skinType = SKINNEDWND_TYPE_LISTVIEW;
- sw.style = SWLVS_FULLROWSELECT | SWLVS_DOUBLEBUFFER | SWLVS_ALTERNATEITEMS | SWS_USESKINFONT | SWS_USESKINCOLORS | SWS_USESKINCURSORS;
- MLSkinWindow(plugin.hwndLibraryParent, &sw);
- }
- NotifyInfoWindow(hwndDlg, TRUE);
- return 0;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_RIPOPTS:
- {
- RECT r;
- HMENU menu = GetSubMenu(g_context_menus, 5);
- GetWindowRect((HWND)lParam, &r);
- CheckMenuItem(menu, ID_RIPOPTIONS_RIPPINGSTATUSWINDOW, g_config->ReadInt(L"cdripstatuswnd", 0) ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_EJECTCDWHENCOMPLETED, g_config->ReadInt(L"cdripautoeject", 0) ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_PLAYTRACKSWHENCOMPLETED, g_config->ReadInt(L"cdripautoplay", 0) ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_CLOSEVIEWWHENCOMPLETE, g_config->ReadInt(L"cdripautoclose", 0) ? MF_CHECKED : MF_UNCHECKED);
- int prio = g_config->ReadInt(L"extractprio", THREAD_PRIORITY_NORMAL);
- CheckMenuItem(menu, ID_RIPOPTIONS_PRIORITY_IDLE, prio == THREAD_PRIORITY_IDLE ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_PRIORITY_LOWEST, prio == THREAD_PRIORITY_LOWEST ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_PRIORITY_BELOWNORMAL, prio == THREAD_PRIORITY_BELOW_NORMAL ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_PRIORITY_NORMAL, prio == THREAD_PRIORITY_NORMAL ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_PRIORITY_ABOVENORMAL, prio == THREAD_PRIORITY_ABOVE_NORMAL ? MF_CHECKED : MF_UNCHECKED);
- CheckMenuItem(menu, ID_RIPOPTIONS_PRIORITY_HIGH, prio == THREAD_PRIORITY_HIGHEST ? MF_CHECKED : MF_UNCHECKED);
- int x = Menu_TrackPopup(plugin.hwndLibraryParent, menu,
- TPM_RIGHTBUTTON | TPM_LEFTBUTTON | TPM_BOTTOMALIGN |
- TPM_LEFTALIGN | TPM_NONOTIFY | TPM_RETURNCMD,
- r.left, r.top, hwndDlg, NULL);
- switch (x)
- {
- case ID_RIPOPTIONS_RIPPINGSTATUSWINDOW:
- {
- int x = g_config->ReadInt(L"cdripstatuswnd", 0);
- g_config->WriteInt(L"cdripstatuswnd", !x);
- ShowWindow(m_extract_wnd, x ? SW_HIDE : SW_SHOW);
- }
- break;
- case ID_RIPOPTIONS_EJECTCDWHENCOMPLETED:
- g_config->WriteInt(L"cdripautoeject", !g_config->ReadInt(L"cdripautoeject", 0));
- break;
- case ID_RIPOPTIONS_PLAYTRACKSWHENCOMPLETED:
- g_config->WriteInt(L"cdripautoplay", !g_config->ReadInt(L"cdripautoplay", 0));
- break;
- case ID_RIPOPTIONS_CLOSEVIEWWHENCOMPLETE:
- g_config->WriteInt(L"cdripautoclose", !g_config->ReadInt(L"cdripautoclose", 0));
- break;
- case ID_RIPOPTIONS_PRIORITY_IDLE:
- case ID_RIPOPTIONS_PRIORITY_LOWEST:
- case ID_RIPOPTIONS_PRIORITY_BELOWNORMAL:
- case ID_RIPOPTIONS_PRIORITY_NORMAL:
- case ID_RIPOPTIONS_PRIORITY_ABOVENORMAL:
- case ID_RIPOPTIONS_PRIORITY_HIGH:
- {
- int prio = THREAD_PRIORITY_NORMAL;
- if (x == ID_RIPOPTIONS_PRIORITY_IDLE) prio = THREAD_PRIORITY_IDLE;
- if (x == ID_RIPOPTIONS_PRIORITY_LOWEST) prio = THREAD_PRIORITY_LOWEST;
- if (x == ID_RIPOPTIONS_PRIORITY_BELOWNORMAL) prio = THREAD_PRIORITY_BELOW_NORMAL;
- if (x == ID_RIPOPTIONS_PRIORITY_ABOVENORMAL) prio = THREAD_PRIORITY_ABOVE_NORMAL;
- if (x == ID_RIPOPTIONS_PRIORITY_HIGH) prio = THREAD_PRIORITY_HIGHEST;
- g_config->WriteInt(L"extractprio", prio);
- convertSetPriorityW csp = {
- &m_fcs,
- prio,
- };
- SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&csp, IPC_CONVERT_SET_PRIORITYW);
- }
- break;
- }
- Sleep(100);
- MSG msg;
- while (PeekMessage(&msg, NULL, WM_KEYFIRST, WM_KEYLAST, PM_REMOVE)); //eat return
- }
- return 0;
- case IDC_CANCEL_RIP:
- {
- wchar_t title[64] = {0};
- if (!m_extract_wnd ||
- m_rip_done ||
- MessageBox(hwndDlg, WASABI_API_LNGSTRINGW(IDS_CANCEL_RIP),
- WASABI_API_LNGSTRINGW_BUF(IDS_CD_RIP_QUESTION,title,64),
- MB_YESNO | MB_ICONQUESTION) == IDYES)
- {
- if (m_rip_params) LockCD(m_rip_params->drive_letter, FALSE);
- if (m_extract_wnd) DestroyWindow(m_extract_wnd);
- DestroyWindow(hwndDlg);
- }
- return 0;
- }
- case IDC_BTN_SHOWINFO:
- switch(HIWORD(wParam))
- {
- case BN_CLICKED:
- SendMessageW(GetParent(hwndDlg), WM_COMMAND, wParam, lParam);
- NotifyInfoWindow(hwndDlg, TRUE);
- break;
- }
- break;
- }
- break;
- case WM_DESTROY:
- if (m_statuslist.getwnd())
- {
- g_view_metaconf->WriteInt(L"col_track", m_statuslist.GetColumnWidth(0));
- g_view_metaconf->WriteInt(L"col_title", m_statuslist.GetColumnWidth(1));
- g_view_metaconf->WriteInt(L"col_len", m_statuslist.GetColumnWidth(2));
- g_view_metaconf->WriteInt(L"col_status", m_statuslist.GetColumnWidth(3));
- }
- m_hwndstatus = 0;
- return 0;
-
- case WM_ERASEBKGND: return 1; //handled by WADlg_DrawChildWindowBorders in WM_PAINT
- case WM_QUERYFILEINFO: Window_OnQueryInfo(hwndDlg); break;
- case WM_NOTIFY: return Window_OnNotify(hwndDlg, (INT)wParam, (LPNMHDR) lParam);
-
- }
- return 0;
- }
- static BOOL CALLBACK extract_dialogProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- switch (uMsg)
- {
- case WM_INITDIALOG:
- m_extract_wnd = hwndDlg;
- m_rip_done = 0;
- SetDlgItemText(hwndDlg, IDC_STATUS, WASABI_API_LNGSTRINGW(IDS_INITIALIZING));
- m_pstat_bytesdone = 0;
- m_pstat_bytesout = 0;
- m_pstat_timedone = 0;
- m_extract_nb = 0;
- m_extract_curtrack = -1;
- m_cur_rg = 0;
- {
- m_extract_nb_total = 0;
- int l = m_rip_params->ntracks;
- for (int i = 0;i < l;i++) if (m_rip_params->tracks[i]) m_extract_nb_total++;
- }
- LockCD(m_rip_params->drive_letter, TRUE);
-
- SetPropW(hwndDlg, L"WARIPPER", (HANDLE)hwndDlg);
- SetPropW(hwndDlg, L"DRIVE", (HANDLE)(INT_PTR)(0xFF & m_rip_params->drive_letter));
- if (!uMsgRipperNotify) uMsgRipperNotify = RegisterWindowMessageA("WARIPPER_BROADCAST_MSG");
- if (uMsgRipperNotify) SendNotifyMessage(HWND_BROADCAST, uMsgRipperNotify, (WPARAM)m_rip_params->drive_letter, (LPARAM)TRUE);
- SendDlgItemMessage(hwndDlg, IDC_PROGRESS1, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
- SendDlgItemMessage(hwndDlg, IDC_PROGRESS2, PBM_SETRANGE, 0, MAKELPARAM(0, 100));
- PostMessage(hwndDlg, WM_APP + 1, 0, 0);
- if (g_config->ReadInt(L"cdripstatuswnd", 0)) ShowWindow(hwndDlg, SW_SHOW);
- INT bVal;
-
- if (S_OK == Settings_GetBool(C_EXTRACT, EF_CALCULATERG, &bVal) && bVal)
- {
- CreateGain();
- QueueUserAPC(StartGain, rgThread,
- (ULONG_PTR)((m_rip_params->ntracks == m_extract_nb_total) ? RG_ALBUM : RG_INDIVIDUAL_TRACKS));
- }
- break;
- case WM_APP + 2: // track is starting to be RG scanned
- m_statuslist.SetItemText(m_cur_rg, 3, WASABI_API_LNGSTRINGW(IDS_CALCULATING_REPLAY_GAIN));
- break;
- case WM_APP + 3: // track is starting to be RG scanned
- m_statuslist.SetItemText(m_cur_rg, 3, WASABI_API_LNGSTRINGW(IDS_COMPLETED));
- m_cur_rg++;
- break;
- case WM_APP + 1:
- {
- INT trackOffset, cchDest;
- TCHAR szDestination[MAX_PATH] = {0}, szFormat[MAX_PATH] = {0};
- int l = m_rip_params->ntracks;
- done = 1;
-
- Settings_GetInt(C_EXTRACT, EF_TRACKOFFSET, &trackOffset);
- Settings_ReadString(C_EXTRACT, EF_TITLEFMT, szFormat, ARRAYSIZE(szFormat));
- Settings_ReadString(C_EXTRACT, EF_PATH, szDestination, ARRAYSIZE(szDestination));
- CleanupDirectoryString(szDestination);
- cchDest = lstrlen(szDestination);
- for (int i = m_extract_curtrack + 1;i < l;i++)
- {
- if (m_rip_params->tracks[i])
- {
- StringCchPrintfW(m_extract_src, 64, L"cda://%c,%d.cda", m_rip_params->drive_letter, i + 1);
- szDestination[cchDest] = TEXT('\0');
- if (cchDest) PathAddBackslash(szDestination);
- wchar_t tmp1[32] = {0}, tmp2[32] = {0}, tmp3[32] = {0}, tmp4[32] = {0}, tmp5[32] = {0};
- FormatFileName(szDestination,
- ARRAYSIZE(szDestination)-11, // ensure we're leaving enough room for the extension
- szFormat,
- i + trackOffset,
- (m_rip_params->artist && *(m_rip_params->artist)) ? (m_rip_params->artist) : WASABI_API_LNGSTRINGW_BUF(IDS_UNKNOWN_ARTIST,tmp1,32),
- (m_rip_params->album && *(m_rip_params->album)) ? (m_rip_params->album) : WASABI_API_LNGSTRINGW_BUF(IDS_UNKNOWN_ALBUM,tmp2,32),
- (m_rip_params->tracks[i] && *(m_rip_params->tracks[i])) ? (m_rip_params->tracks[i]) : L"0",
- (m_rip_params->genre && *(m_rip_params->genre)) ? (m_rip_params->genre) : WASABI_API_LNGSTRINGW_BUF(IDS_UNKNOWN,tmp3,32),
- (m_rip_params->year && *(m_rip_params->year)) ? (m_rip_params->year) : WASABI_API_LNGSTRINGW_BUF(IDS_UNKNOWN,tmp4,32),
- (m_rip_params->trackArtists[i] && m_rip_params->trackArtists[i][0])?m_rip_params->trackArtists[i] : WASABI_API_LNGSTRINGW_BUF(IDS_UNKNOWN,tmp5,32),
- NULL, (m_rip_params->disc && *(m_rip_params->disc)) ? (m_rip_params->disc) : L"");
- memset(&m_fcs, 0, sizeof(m_fcs));
- m_fcs.sourcefile = m_extract_src;
- INT fourcc;
- Settings_GetInt(C_EXTRACT, EF_FOURCC, &fourcc);
- m_fcs.destformat[0]=fourcc;
- if (m_fcs.destformat[0] == OLD_AAC_CODEC) Settings_GetDefault(C_EXTRACT, EF_FOURCC, &m_fcs.destformat[0]);
- // now determine the extension
- wchar_t fmt[10] = {0};
- GetExtensionString(fmt, ARRAYSIZE(fmt), (DWORD)m_fcs.destformat[0]);
- BOOL upperCase;
- if (SUCCEEDED(Settings_GetBool(C_EXTRACT, EF_UPPEREXTENSION, &upperCase)) && FALSE != upperCase)
- CharUpper(fmt);
- else
- CharLower(fmt);
- StringCchCat(szDestination, ARRAYSIZE(szDestination), TEXT("."));
- StringCchCat(szDestination, ARRAYSIZE(szDestination), fmt);
- if (m_rip_params->filenames[i]) free(m_rip_params->filenames[i]);
- m_rip_params->filenames[i] = _wcsdup(szDestination);
-
- wchar_t tempFile[MAX_PATH] = {0};
- wchar_t tmppath[MAX_PATH] = {0};
- GetTempPath(MAX_PATH,tmppath);
- GetTempFileName(tmppath,L"rip",0,tempFile);
- m_rip_params->tempFilenames[i] = _wcsdup(tempFile);
- createDirForFileW(m_rip_params->filenames[i]);
- m_fcs.destfile = _wcsdup(tempFile);
- createDirForFileW(m_fcs.destfile);
- m_fcs.callbackhwnd = hwndDlg;
- m_fcs.error = L"";
- m_extract_time = 0;
- m_extract_curtrack = i;
- wchar_t *ptr = m_rip_params->filenames[i];
- if (cchDest && cchDest < (int)lstrlenW(ptr)) ptr += (cchDest + 1);
- SetDlgItemText(hwndDlg, IDC_CURTRACK, ptr);
- if (SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&m_fcs, IPC_CONVERTFILEW) != 1)
- {
- wchar_t tmp[512] = {0};
- StringCchPrintf(tmp, 512, WASABI_API_LNGSTRINGW(IDS_ERROR_RIPPING_TRACK), i + 1, m_fcs.error ? m_fcs.error : L"");
- MessageBox(hwndDlg, tmp, WASABI_API_LNGSTRINGW(IDS_ERROR), MB_OK);
- done = -1;
- break;
- }
- convertSetPriorityW csp = {
- &m_fcs,
- g_config->ReadInt(L"extractprio", THREAD_PRIORITY_NORMAL),
- };
- SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&csp, IPC_CONVERT_SET_PRIORITYW);
- m_extracting = 1;
- done = 0;
- PostMessage(hwndDlg, WM_WA_IPC , 0, IPC_CB_CONVERT_STATUS);
- break;
- }
- }
- if (done && m_rip_params)
- {
- LockCD(m_rip_params->drive_letter, FALSE);
- if (g_config->ReadInt(L"cdripautoeject", 0) && done > 0)
- {
- char buf[64] = {0};
- StringCchPrintfA(buf, 64, "cda://%c.cda", m_rip_params->drive_letter);
- char buf2[32] = {0};
- getFileInfo(buf, "<eject>", buf2, sizeof(buf2));
- }
- if (g_config->ReadInt(L"cdripautoplay", 0) && done > 0)
- {
- SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_DELETE);
- for (int i = 0;i < m_rip_params->ntracks;i++)
- {
- if (m_rip_params->tracks[i])
- {
- COPYDATASTRUCT cds;
- cds.dwData = IPC_PLAYFILEW;
- cds.lpData = (void *) m_rip_params->filenames[i];
- cds.cbData = sizeof(wchar_t) * (lstrlenW(m_rip_params->filenames[i]) + 1); // include space for null char
- SendMessage(plugin.hwndWinampParent, WM_COPYDATA, (WPARAM)NULL, (LPARAM)&cds);
- }
- }
- SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_STARTPLAY);
- }
- if (m_rip_params->ntracks == m_extract_nb_total && done > 0)
- {
- INT bVal;
- if ((S_OK == Settings_GetBool(C_EXTRACT, EF_CREATEM3U, &bVal) && bVal) ||
- (S_OK == Settings_GetBool(C_EXTRACT, EF_CREATEPLS, &bVal) && bVal))
- {
- wchar_t str[MAX_PATH] = {0}, fmt[MAX_PATH] = {0};
- Settings_ReadString(C_EXTRACT, EF_PLAYLISTFMT, fmt, ARRAYSIZE(fmt));
- Settings_ReadString(C_EXTRACT, EF_PATH, str, ARRAYSIZE(str));
- int l = lstrlenW(str);
- if (l)
- PathAddBackslash(str);
- FormatFileName(str, ARRAYSIZE(str)-5, // ensure we're leaving enough room for the extension
- fmt, 0xdeadbeef,
- m_rip_params->artist ? m_rip_params->artist : L"",
- m_rip_params->album ? m_rip_params->album : L"",
- NULL,
- m_rip_params->genre ? m_rip_params->genre : L"",
- m_rip_params->year ? m_rip_params->year : L"",
- NULL,
- NULL,
- m_rip_params->disc ? m_rip_params->disc : L"");
- if (S_OK == Settings_GetBool(C_EXTRACT, EF_CREATEM3U, &bVal) && bVal)
- {
- wchar_t str2[MAX_PATH] = {0};
- lstrcpynW(str2, str, MAX_PATH);
- StringCchCatW(str2, MAX_PATH, L".m3u");
- createDirForFileW(str2);
- M3UWriter w;
- FILE *fp=_wfopen(str2, L"wt");
- w.Open(fp, AutoCharFn(str2), TRUE);
- BOOL ext;
- Settings_GetBool(C_EXTRACT, EF_USEM3UEXT, &ext);
- for (int i = 0;i < m_rip_params->ntracks;i++)
- {
- if (m_rip_params->tracks[i] && m_rip_params->filenames[i])
- {
- GayString str;
- str.Set(AutoChar(m_rip_params->artist));
- str.Append(" - ");
- str.Append(AutoChar(m_rip_params->tracks[i]));
- if (ext)
- w.SetExtended(AutoCharFn(m_rip_params->filenames[i]), str.Get(), m_rip_params->lengths[i]);
- else
- w.SetFilename(AutoCharFn(m_rip_params->filenames[i]));
- }
- }
- w.Close();
- }
- if (S_OK == Settings_GetBool(C_EXTRACT, EF_CREATEPLS, &bVal) && bVal)
- {
- char str2[MAX_PATH] = {0};
- lstrcpynA(str2, AutoChar(str), MAX_PATH);
- StringCchCatA(str2, MAX_PATH, ".pls");
- createDirForFile(str2);
- // TODO: check for bad unicode conversion
- PLSWriter w;
- w.Open(str2);
- for (int i = 0;i < m_rip_params->ntracks;i++)
- {
- if (m_rip_params->tracks[i] && m_rip_params->filenames[i])
- {
- GayString str;
- str.Set(AutoChar(m_rip_params->artist));
- str.Append(" - ");
- str.Append(AutoChar(m_rip_params->tracks[i]));
- w.SetFilename(AutoCharFn(m_rip_params->filenames[i]));
- w.SetTitle(str.Get());
- w.SetLength(m_rip_params->lengths[i]);
- w.Next();
- }
- }
- w.Close();
- }
- }
- if (S_OK == Settings_GetBool(C_EXTRACT, EF_CREATEMLPL, &bVal) && bVal)
- {
- itemRecordListW irl = {0, };
- allocRecordList(&irl, m_rip_params->ntracks, 0);
- for (int i = 0;i < m_rip_params->ntracks;i++)
- {
- if (m_rip_params->tracks[i])
- {
- int n = irl.Size;
- memset(&irl.Items[n], 0, sizeof(itemRecordW));
- irl.Items[n].filename = _wcsdup(m_rip_params->filenames[i]);
- irl.Items[n].album = _wcsdup(m_rip_params->album);
- irl.Items[n].artist = _wcsdup(m_rip_params->artist);
- irl.Items[n].title = _wcsdup(m_rip_params->tracks[i]);
- irl.Items[n].genre = _wcsdup(m_rip_params->genre);
- irl.Items[n].year = _wtoi(m_rip_params->year);
- irl.Items[n].length = m_rip_params->lengths[i];
- irl.Size++;
- }
- }
- GayString str;
- str.Set(AutoChar(m_rip_params->artist));
- str.Append(" - ");
- str.Append(AutoChar(m_rip_params->album));
- AutoWide name(str.Get());
- mlMakePlaylist pl = {sizeof(mlMakePlaylist), (const wchar_t*)name, ML_TYPE_ITEMRECORDLISTW, (void *) & irl, 0x01};
- SendMessage(plugin.hwndLibraryParent, WM_ML_IPC, (WPARAM)&pl, ML_IPC_PLAYLIST_MAKE);
- freeRecordList(&irl);
- }
- } // playlist creation
- if (rgThread)
- QueueUserAPC(WriteGain, rgThread, 0);
- else
- PostMessage(m_extract_wnd, WM_APP + 4, 0, 0);
- }
- }
- break;
- case WM_APP + 4:
- if (m_db_has_upd)
- {
- // TODO: benski> does mldb read metadata from this call or the 'add' call - because it won't have replaygain tags until now
- PostMessage(plugin.hwndLibraryParent, WM_ML_IPC, 0, ML_IPC_DB_SYNCDB);
- }
- m_rip_done = 1;
- if (g_config->ReadInt(L"cdripautoclose", 1))
- {
- DestroyWindow(hwndDlg);
- }
- else
- {
- SetWindowText(hwndDlg, WASABI_API_LNGSTRINGW(done > 0 ? IDS_RIP_COMPLETE : IDS_RIP_FAILED));
- SetDlgItemText(hwndDlg, IDC_BUTTON1, WASABI_API_LNGSTRINGW(IDS_CLOSE));
- if (m_hwndstatus)
- {
- SetDlgItemText(m_hwndstatus, IDC_CANCEL_RIP, WASABI_API_LNGSTRINGW(IDS_CLOSE));
- }
- SendDlgItemMessage(hwndDlg, IDC_PROGRESS1, PBM_SETPOS, 100, 0);
- SendDlgItemMessage(hwndDlg, IDC_PROGRESS2, PBM_SETPOS, 100, 0);
- int now = m_pstat_timedone;
- int bytesout = m_pstat_bytesout;
- double extracted_time = (double) m_pstat_bytesdone * (1.0 / 44100.0 / 4.0);
- if (extracted_time < 1.0) extracted_time = 1.0;
- int br = (int) (((double)bytesout * 8.0 / extracted_time) / 1000.0 + 0.5);
- if (done > 0)
- {
- wchar_t sstr[16] = {0};
- StringCchPrintf(m_last_total_status, 512,
- WASABI_API_LNGSTRINGW(IDS_X_TRACKS_RIPPED_IN_X),
- m_extract_nb_total,
- WASABI_API_LNGSTRINGW_BUF(m_extract_nb_total == 1 ? IDS_TRACK : IDS_TRACKS,sstr,16),
- now / 1000 / 60, (now / 1000) % 60,
- extracted_time / (now / 1000.0),
- br, (double)bytesout * (1.0 / (1024.0*1024.0))
- );
- }
- else
- {
- WASABI_API_LNGSTRINGW_BUF(IDS_RIP_FAILED,m_last_total_status,512);
- }
- SetDlgItemText(hwndDlg, IDC_STATUS2, m_last_total_status);
- SetDlgItemText(hwndDlg, IDC_CURTRACK, WASABI_API_LNGSTRINGW(IDS_COMPLETED));
- SetDlgItemText(hwndDlg, IDC_STATUS, L"");
- if (m_hwndstatus && IsWindow(m_hwndstatus))
- {
- SetDlgItemText(m_hwndstatus, IDC_CDINFO, m_last_total_status);
- SetDlgItemText(m_hwndstatus, IDC_CANCEL_RIP, WASABI_API_LNGSTRINGW(IDS_DONE));
- }
- }
- break;
- case WM_WA_IPC:
- switch (lParam)
- {
- case IPC_CB_CONVERT_STATUS:
- {
- if (!m_extract_time)
- {
- m_extract_time = GetTickCount();
- break;
- }
- DWORD now = GetTickCount() - m_extract_time;
- if (!now) now = 1000; //safety
- wchar_t tmp[512 + 128] = {0};
- {
- int total_t = 0;
- if (wParam) total_t = MulDiv(100, now, (int)wParam);
- int rem_t = total_t - now;
- double extracted_time = (double) m_fcs.bytes_done * (1.0 / 44100.0 / 4.0);
- if (extracted_time < 1.0) extracted_time = 1.0;
- int br = (int) (((double)m_fcs.bytes_out * 8.0 / extracted_time) / 1000.0 + 0.5);
- int estsize = 0;
- if (m_fcs.bytes_total > 0) estsize = MulDiv(m_fcs.bytes_out, m_fcs.bytes_total, m_fcs.bytes_done);
- if (rem_t < 0) rem_t = 0;
- if (total_t < 0) total_t = 0;
- StringCchPrintf(tmp, 640,
- WASABI_API_LNGSTRINGW(IDS_ELAPSED_X_REMAINING_X_TOTAL_X),
- now / 1000 / 60, (now / 1000) % 60,
- rem_t / 1000 / 60, (rem_t / 1000) % 60,
- total_t / 1000 / 60, (total_t / 1000) % 60,
- extracted_time / ((double)now / 1000.0),
- br, (double)estsize * (1.0 / (1024.0*1024.0))
- );
- SetDlgItemText(hwndDlg, IDC_STATUS, tmp);
- if (m_hwndstatus && IsWindow(m_hwndstatus))
- {
- StringCchPrintf(m_last_item_status, 512,
- WASABI_API_LNGSTRINGW(IDS_X_KBPS_AT_X_REALTIME),
- wParam,
- br,
- extracted_time / ((double)now / 1000.0)
- );
- m_statuslist.SetItemText(m_extract_nb, 3, m_last_item_status);
- }
- }
- {
- int total_in_bytes_calc = m_rip_params->total_length_bytes;
- now += m_pstat_timedone;
- int total_t = 0;
- int bytesdone = m_fcs.bytes_done + m_pstat_bytesdone;
- int bytesout = m_fcs.bytes_out + m_pstat_bytesout;
- if (bytesdone) total_t = MulDiv(total_in_bytes_calc, now, bytesdone);
- int rem_t = total_t - now;
- double extracted_time = (double) bytesdone * (1.0 / 44100.0 / 4.0);
- if (extracted_time < 1.0) extracted_time = 1.0;
- int br = (int) (((double)bytesout * 8.0 / extracted_time) / 1000.0 + 0.5);
- int estsize = 0;
- if (total_in_bytes_calc > 0) estsize = MulDiv(bytesout, total_in_bytes_calc, bytesdone);
- if (rem_t < 0) rem_t = 0;
- if (total_t < 0) total_t = 0;
- StringCchPrintf(m_last_total_status, 512,
- WASABI_API_LNGSTRINGW(IDS_X_OF_X_ELAPSED_X_REMAINING_X),
- m_extract_nb + 1, m_extract_nb_total,
- now / 1000 / 60, (now / 1000) % 60,
- rem_t / 1000 / 60, (rem_t / 1000) % 60,
- total_t / 1000 / 60, (total_t / 1000) % 60,
- extracted_time / ((double)now / 1000.0),
- br, (double)estsize * (1.0 / (1024.0*1024.0))
- );
- if (m_hwndstatus && IsWindow(m_hwndstatus))
- {
- SetDlgItemText(m_hwndstatus, IDC_CDINFO, m_last_total_status);
- }
- SetDlgItemText(hwndDlg, IDC_STATUS2, m_last_total_status);
- int a = 0;
- if (total_in_bytes_calc) a = MulDiv(bytesdone, 100, total_in_bytes_calc);
- SendDlgItemMessage(hwndDlg, IDC_PROGRESS2, PBM_SETPOS, a, 0);
- StringCchPrintf(tmp, 640, WASABI_API_LNGSTRINGW(IDS_X_PERCENT_RIPPING_FROM_CD), a);
- SetWindowText(hwndDlg, tmp);
- }
- SendDlgItemMessage(hwndDlg, IDC_PROGRESS1, PBM_SETPOS, wParam, 0);
- }
- break;
- case IPC_CB_CONVERT_DONE:
- SendMessage(plugin.hwndWinampParent , WM_WA_IPC, (WPARAM)&m_fcs, IPC_CONVERTFILEW_END);
- free(m_fcs.destfile);
- m_pstat_bytesdone += m_fcs.bytes_done;
- m_pstat_bytesout += m_fcs.bytes_out;
- if (m_extract_time) m_pstat_timedone += GetTickCount() - m_extract_time;
- CopyFileW(m_rip_params->tempFilenames[m_extract_curtrack], m_rip_params->filenames[m_extract_curtrack], FALSE);
- DeleteFileW(m_rip_params->tempFilenames[m_extract_curtrack]);
- if (AGAVE_API_STATS)
- {
- AGAVE_API_STATS->IncrementStat(api_stats::RIP_COUNT);
- AGAVE_API_STATS->SetStat(api_stats::RIP_FORMAT, m_fcs.destformat[0]);
- }
- wchar_t *lastfn = m_rip_params->filenames[m_extract_curtrack];
- if (g_config->ReadInt(L"extracttag", 1))
- {
- // add metadata to this file
- if (updateFileInfoW(lastfn, L"title", m_rip_params->tracks[m_extract_curtrack]))
- {
- updateFileInfoW(lastfn, L"conductor", m_rip_params->conductors[m_extract_curtrack]);
- updateFileInfoW(lastfn, L"composer", m_rip_params->composers[m_extract_curtrack]);
- updateFileInfoW(lastfn, L"GracenoteFileID", m_rip_params->gracenoteFileIDs[m_extract_curtrack]);
- updateFileInfoW(lastfn, L"GracenoteExtData", m_rip_params->gracenoteExtData[m_extract_curtrack]);
- updateFileInfoW(lastfn, L"artist", m_rip_params->trackArtists[m_extract_curtrack]);
- //if (lstrcmpiW(m_rip_params->trackArtists[m_extract_curtrack], m_rip_params->artist)) // only write albumartist if they're different
- updateFileInfoW(lastfn, L"albumartist", m_rip_params->artist);
- updateFileInfoW(lastfn, L"album", m_rip_params->album);
- updateFileInfoW(lastfn, L"genre", m_rip_params->genre);
- updateFileInfoW(lastfn, L"year", m_rip_params->year);
- updateFileInfoW(lastfn, L"disc", m_rip_params->disc);
- updateFileInfoW(lastfn, L"publisher", m_rip_params->publisher);
- if (m_rip_params->comment && m_rip_params->comment[0])
- updateFileInfoW(lastfn, L"comment", m_rip_params->comment);
- else
- {
- TCHAR szComment[8192] = {0};
- Settings_ReadString(C_EXTRACT, EF_COMMENTTEXT, szComment, ARRAYSIZE(szComment));
- updateFileInfoW(lastfn, L"comment", szComment);
- }
- wchar_t buf[32] = {0};
- if (m_extract_curtrack >= 0)
- {
- if (g_config->ReadInt(L"total_tracks", 0))
- StringCchPrintfW(buf, 32, L"%d/%d", m_extract_curtrack + g_config->ReadInt(L"trackoffs", 1), m_rip_params->ntracks);
- else
- StringCchPrintfW(buf, 32, L"%d", m_extract_curtrack + g_config->ReadInt(L"trackoffs", 1));
- }
- else buf[0] = 0;
- updateFileInfoW(lastfn, L"track", buf);
- if (WASABI_API_APP)
- updateFileInfoW(lastfn, L"tool", WASABI_API_APP->main_getVersionString());
- SendMessage(plugin.hwndWinampParent, WM_WA_IPC, 0, IPC_WRITE_EXTENDED_FILE_INFO);
- }
- }
- if (g_config->ReadInt(L"extractaddml", 1))
- {
- LMDB_FILE_ADD_INFOW fi = {lastfn, -1, -1};
- SENDMLIPC(plugin.hwndLibraryParent, ML_IPC_DB_ADDORUPDATEFILEW, (WPARAM)&fi);
- m_db_has_upd = 1;
- }
- if (m_hwndstatus && IsWindow(m_hwndstatus))
- {
- m_statuslist.SetItemText(m_extract_nb, 3, WASABI_API_LNGSTRING(IDS_WAITING));
- }
- if (rgThread)
- QueueUserAPC(CalculateGain, rgThread, (ULONG_PTR)_wcsdup(lastfn));
- else
- PostMessage(m_extract_wnd, WM_APP + 3, 0, 0);
- m_extract_nb++;
- m_extracting = 0;
- PostMessage(hwndDlg, WM_APP + 1, 0, 0);
- break;
- }
- break;
- case WM_COMMAND:
- switch (LOWORD(wParam))
- {
- case IDC_BUTTON1:
- {
- wchar_t title[64] = {0};
- if (m_rip_done ||
- MessageBox(hwndDlg, WASABI_API_LNGSTRINGW(IDS_CANCEL_RIP),
- WASABI_API_LNGSTRINGW_BUF(IDS_CD_RIP_QUESTION,title,64),
- MB_YESNO | MB_ICONQUESTION) == IDYES)
- {
- LockCD(m_rip_params->drive_letter, FALSE);
- DestroyWindow(hwndDlg);
- }
- return 0;
- }
- case IDCANCEL:
- g_config->WriteInt(L"cdripstatuswnd", 0);
- ShowWindow(hwndDlg, SW_HIDE);
- break;
- }
- break;
- case WM_CLOSE:
- return 0;
- case WM_DESTROY:
- if (m_extracting)
- {
- SendMessage(plugin.hwndWinampParent, WM_WA_IPC, (WPARAM)&m_fcs, IPC_CONVERTFILEW_END);
- // make sure we clean up on cancel!
- m_extracting = 0;
- DeleteFileW(m_rip_params->tempFilenames[m_extract_curtrack]);
- }
- if (uMsgRipperNotify) SendNotifyMessage(HWND_BROADCAST, uMsgRipperNotify, (WPARAM)(m_rip_params) ? m_rip_params->drive_letter : 0, (LPARAM)FALSE);
- if (m_rip_params)
- {
- int i;
- for (i = 0; i < m_rip_params->ntracks; i++)
- {
- free(m_rip_params->tracks[i]);
- free(m_rip_params->trackArtists[i]);
- free(m_rip_params->composers[i]);
- free(m_rip_params->gracenoteFileIDs[i]);
- free(m_rip_params->gracenoteExtData[i]);
- free(m_rip_params->conductors[i]);
- free(m_rip_params->filenames[i]);
- free(m_rip_params->tempFilenames[i]);
- }
- free(m_rip_params->gracenoteFileIDs);
- free(m_rip_params->gracenoteExtData);
- free(m_rip_params->composers);
- free(m_rip_params->conductors);
- free(m_rip_params->tracks);
- free(m_rip_params->trackArtists);
- free(m_rip_params->filenames);
- free(m_rip_params->tempFilenames);
- free(m_rip_params->lengths);
- free(m_rip_params->album);
- free(m_rip_params->artist);
- free(m_rip_params->genre);
- free(m_rip_params->year);
- free(m_rip_params->publisher);
- free(m_rip_params->comment);
- free(m_rip_params->disc);
- free(m_rip_params);
- m_rip_params = 0;
- }
- m_extract_wnd = 0;
- if (rgThread)
- QueueUserAPC(CloseGain, rgThread, 0);
-
- break;
- }
- return 0;
- }
- void cdrip_stop_all_extracts()
- {
- if (m_rip_params) LockCD(m_rip_params->drive_letter, FALSE);
- if (m_extract_wnd) DestroyWindow(m_extract_wnd);
- if (m_hwndstatus) DestroyWindow(m_hwndstatus);
- }
- int cdrip_isextracting(char drive)
- {
- if (!m_rip_params) return 0;
- if (drive == -1 && m_rip_done)
- {
- if (m_extract_wnd && IsWindow(m_extract_wnd)) DestroyWindow(m_extract_wnd);
- if (m_hwndstatus && IsWindow(m_hwndstatus)) DestroyWindow(m_hwndstatus);
- return 0;
- }
- if (drive == 0 || drive == -1) return toupper(m_rip_params->drive_letter);
- return toupper(m_rip_params->drive_letter) == toupper(drive);
- }
- HWND cdrip_FindBurningHWND(char cLetter)
- {
- HWND h = 0;
- while (NULL != (h = FindWindowExW(NULL, h, L"#32770", NULL)))
- {
- if (!GetPropW(h, L"WARIPPER")) continue;
- if (((char)(INT_PTR)GetPropW(h, L"DRIVE")) == cLetter) return h;
- }
- return NULL;
- }
- void cdrip_extractFiles(cdrip_params *parms)
- {
- WASABI_API_LNGSTRINGW_BUF(IDS_INITIALIZING,m_last_total_status,512);
- m_last_item_status[0] = 0;
- m_rip_params = parms;
- WASABI_API_CREATEDIALOGW(IDD_VIEW_CDROM_EXTRACT, plugin.hwndWinampParent, extract_dialogProc);
- }
|