mirror of https://github.com/PCSX2/pcsx2.git
cdvdgigaherz: Switch to using the new settings system
Also refactor the default drive selection and GUI code so optical drive detection is shared. Note: This breaks the current config, but there's only one setting anyway.
This commit is contained in:
parent
dce3c57e6a
commit
59247c7838
|
@ -17,6 +17,9 @@
|
|||
#include <cstdio>
|
||||
#include "svnrev.h"
|
||||
|
||||
Settings g_settings;
|
||||
static std::string s_config_file{"inis/cdvdGigaherz.ini"};
|
||||
|
||||
void (*newDiscCB)();
|
||||
|
||||
HANDLE hThread_keepAlive = nullptr;
|
||||
|
@ -113,12 +116,20 @@ void __inline lba_to_msf(s32 lba, u8 *m, u8 *s, u8 *f)
|
|||
*f = (u8)(lba % 75);
|
||||
}
|
||||
|
||||
void ReadSettings()
|
||||
{
|
||||
g_settings.Load(s_config_file);
|
||||
}
|
||||
|
||||
void WriteSettings()
|
||||
{
|
||||
g_settings.Save(s_config_file);
|
||||
}
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
// CDVD processing functions //
|
||||
|
||||
char csrc[20];
|
||||
|
||||
bool cdvd_is_open = false;
|
||||
bool cdvdKeepAlive_is_open = false;
|
||||
bool disc_has_changed = false;
|
||||
|
@ -192,7 +203,7 @@ void StopKeepAliveThread()
|
|||
|
||||
void CALLBACK CDVDsetSettingsDir(const char *dir)
|
||||
{
|
||||
CfgSetSettingsDir(dir);
|
||||
s_config_file = std::string(dir ? dir : "inis") + "/cdvdGigaherz.ini";
|
||||
}
|
||||
|
||||
s32 CALLBACK CDVDinit()
|
||||
|
@ -204,29 +215,13 @@ s32 CALLBACK CDVDopen(const char *pTitleFilename)
|
|||
{
|
||||
ReadSettings();
|
||||
|
||||
if (source_drive == '-') {
|
||||
// MSDN : Trailing backslash is required to ensure consistent behavior across
|
||||
// various versions of Windows and storage types.
|
||||
char temp[] = "A:\\";
|
||||
|
||||
for (char d = 'A'; d <= 'Z'; d++) {
|
||||
temp[0] = d;
|
||||
if (GetDriveType(temp) == DRIVE_CDROM) {
|
||||
source_drive = d;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (source_drive == '-')
|
||||
return -1;
|
||||
}
|
||||
|
||||
sprintf(csrc, "\\\\.\\%c:", source_drive);
|
||||
|
||||
printf(" * CDVD: Opening drive '%s'...\n", csrc);
|
||||
auto drive = GetValidDrive();
|
||||
if (drive.empty())
|
||||
return -1;
|
||||
|
||||
// open device file
|
||||
try {
|
||||
src = new IOCtlSrc(csrc);
|
||||
src = new IOCtlSrc(drive);
|
||||
} catch (std::runtime_error &ex) {
|
||||
fputs(ex.what(), stdout);
|
||||
return -1;
|
||||
|
|
|
@ -28,6 +28,7 @@
|
|||
|
||||
#define CDVDdefs
|
||||
#include <PS2Edefs.h>
|
||||
#include "Settings.h"
|
||||
|
||||
struct track
|
||||
{
|
||||
|
@ -69,7 +70,7 @@ class IOCtlSrc
|
|||
bool Reopen();
|
||||
|
||||
public:
|
||||
IOCtlSrc(const char *filename);
|
||||
IOCtlSrc(decltype(m_filename) filename);
|
||||
~IOCtlSrc();
|
||||
|
||||
u32 GetSectorCount() const;
|
||||
|
@ -86,13 +87,13 @@ extern IOCtlSrc *src;
|
|||
|
||||
void configure();
|
||||
|
||||
extern char source_drive;
|
||||
|
||||
extern HINSTANCE hinst;
|
||||
|
||||
void ReadSettings();
|
||||
void WriteSettings();
|
||||
void CfgSetSettingsDir(const char *dir);
|
||||
std::string GetValidDrive();
|
||||
|
||||
extern Settings g_settings;
|
||||
|
||||
extern bool cdvd_is_open;
|
||||
extern bool cdvdKeepAlive_is_open;
|
||||
|
|
|
@ -30,7 +30,7 @@
|
|||
#include <array>
|
||||
#include <stdexcept>
|
||||
|
||||
IOCtlSrc::IOCtlSrc(const char *filename)
|
||||
IOCtlSrc::IOCtlSrc(decltype(m_filename) filename)
|
||||
: m_filename(filename)
|
||||
{
|
||||
if (!Reopen())
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
//GiGaHeRz SPU2 Driver
|
||||
//Copyright (C) 2016 PCSX2 Dev Team
|
||||
//Copyright (c) David Quintana <DavidQuintana@canal21.com>
|
||||
//
|
||||
//This library is free software; you can redistribute it and/or
|
||||
|
@ -21,23 +21,8 @@
|
|||
#include <commctrl.h>
|
||||
#include "resource.h"
|
||||
|
||||
// Config Vars
|
||||
|
||||
// DEBUG
|
||||
|
||||
char source_drive;
|
||||
|
||||
char CfgFile[MAX_PATH + 10] = "inis/cdvdGigaherz.ini";
|
||||
|
||||
void CfgSetSettingsDir(const char *dir)
|
||||
{
|
||||
// a better std::string version, but it's inconvenient for other reasons.
|
||||
//CfgFile = std::string(( dir == NULL ) ? "inis/" : dir) + "cdvdGigaherz.ini";
|
||||
|
||||
strcpy_s(CfgFile, (dir == NULL) ? "inis" : dir);
|
||||
strcat_s(CfgFile, "/cdvdGigaherz.ini");
|
||||
}
|
||||
|
||||
|
||||
/*| Config File Format: |¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯*\
|
||||
+--+---------------------+------------------------+
|
||||
|
@ -127,72 +112,39 @@ void CfgReadStr(char *Section, char *Name, char *Data, int DataSize, char *Defau
|
|||
|
||||
/*****************************************************************************/
|
||||
|
||||
void ReadSettings()
|
||||
{
|
||||
char temp[512];
|
||||
|
||||
CfgReadStr("Config", "Source", temp, 511, "-");
|
||||
source_drive = temp[0];
|
||||
}
|
||||
|
||||
/*****************************************************************************/
|
||||
|
||||
void WriteSettings()
|
||||
{
|
||||
char temp[2];
|
||||
|
||||
temp[0] = source_drive;
|
||||
temp[1] = 0;
|
||||
|
||||
CfgWriteStr("Config", "Source", temp);
|
||||
}
|
||||
|
||||
char *path[] = {
|
||||
"A:", "B:", "C:", "D:", "E:", "F:", "G:", "H:", "I:", "J:", "K:", "L:", "M:",
|
||||
"N:", "O:", "P:", "Q:", "R:", "S:", "T:", "U:", "V:", "W:", "X:", "Y:", "Z:",
|
||||
};
|
||||
|
||||
static INT_PTR CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
|
||||
{
|
||||
int wmId, wmEvent;
|
||||
char temp[20] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
|
||||
|
||||
switch (uMsg) {
|
||||
case WM_INITDIALOG: {
|
||||
int n = -1;
|
||||
int s = 0;
|
||||
|
||||
SendMessage(GetDlgItem(hWnd, IDC_DRIVE), CB_RESETCONTENT, 0, 0);
|
||||
for (char d = 'A'; d <= 'Z'; d++) {
|
||||
if (GetDriveType(path[d - 'A']) == DRIVE_CDROM) {
|
||||
n++;
|
||||
|
||||
SendMessage(GetDlgItem(hWnd, IDC_DRIVE), CB_ADDSTRING, 0, (LPARAM)path[d - 'A']);
|
||||
|
||||
if (source_drive == d) {
|
||||
s = n;
|
||||
}
|
||||
}
|
||||
std::vector<std::string> &drives =
|
||||
*reinterpret_cast<std::vector<std::string> *>(lParam);
|
||||
HWND combobox = GetDlgItem(hWnd, IDC_DRIVE);
|
||||
std::string drive;
|
||||
g_settings.Get("drive", drive);
|
||||
for (size_t n = 0; n < drives.size(); ++n) {
|
||||
SendMessage(combobox, CB_ADDSTRING, 0,
|
||||
reinterpret_cast<LPARAM>(drives[n].c_str()));
|
||||
if (drive == drives[n])
|
||||
SendMessage(combobox, CB_SETCURSEL, n, 0);
|
||||
}
|
||||
|
||||
if (n != -1)
|
||||
SendMessage(GetDlgItem(hWnd, IDC_DRIVE), CB_SETCURSEL, s, 0);
|
||||
|
||||
} break;
|
||||
case WM_COMMAND:
|
||||
wmId = LOWORD(wParam);
|
||||
wmEvent = HIWORD(wParam);
|
||||
// Parse the menu selections:
|
||||
switch (wmId) {
|
||||
case IDOK:
|
||||
if (SendMessage(GetDlgItem(hWnd, IDC_DRIVE), CB_GETCOUNT, 0, 0) > 0) {
|
||||
GetDlgItemText(hWnd, IDC_DRIVE, temp, 20);
|
||||
temp[19] = 0;
|
||||
source_drive = temp[0];
|
||||
switch (LOWORD(wParam)) {
|
||||
case IDOK: {
|
||||
HWND combobox = GetDlgItem(hWnd, IDC_DRIVE);
|
||||
LRESULT index = SendMessage(combobox, CB_GETCURSEL, 0, 0);
|
||||
if (index != CB_ERR) {
|
||||
LRESULT length = SendMessage(combobox, CB_GETLBTEXTLEN,
|
||||
index, 0);
|
||||
std::vector<char> drive(length + 1);
|
||||
SendMessage(combobox, CB_GETLBTEXT, index,
|
||||
reinterpret_cast<LPARAM>(drive.data()));
|
||||
g_settings.Set("drive", std::string(drive.data()));
|
||||
WriteSettings();
|
||||
}
|
||||
EndDialog(hWnd, 0);
|
||||
break;
|
||||
} break;
|
||||
case IDCANCEL:
|
||||
EndDialog(hWnd, 0);
|
||||
break;
|
||||
|
@ -207,13 +159,47 @@ static INT_PTR CALLBACK ConfigProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM l
|
|||
return TRUE;
|
||||
}
|
||||
|
||||
static std::vector<std::string> GetOpticalDriveList()
|
||||
{
|
||||
DWORD size = GetLogicalDriveStrings(0, nullptr);
|
||||
std::vector<char> drive_strings(size);
|
||||
if (GetLogicalDriveStrings(size, drive_strings.data()) != size - 1)
|
||||
return {};
|
||||
|
||||
std::vector<std::string> drives;
|
||||
for (auto p = drive_strings.data(); *p; ++p) {
|
||||
if (GetDriveType(p) == DRIVE_CDROM)
|
||||
drives.push_back(p);
|
||||
while (*p)
|
||||
++p;
|
||||
}
|
||||
return drives;
|
||||
}
|
||||
|
||||
std::string GetValidDrive()
|
||||
{
|
||||
std::string drive;
|
||||
g_settings.Get("drive", drive);
|
||||
if (drive.empty() || GetDriveType(drive.c_str()) != DRIVE_CDROM) {
|
||||
auto drives = GetOpticalDriveList();
|
||||
if (drives.empty())
|
||||
return {};
|
||||
drive = drives.front();
|
||||
}
|
||||
|
||||
printf(" * CDVD: Opening drive '%s'...\n", drive.c_str());
|
||||
|
||||
// The drive string has the form "X:\", but to open the drive, the string
|
||||
// has to be in the form "\\.\X:"
|
||||
drive.pop_back();
|
||||
drive.insert(0, "\\\\.\\");
|
||||
return drive;
|
||||
}
|
||||
|
||||
void configure()
|
||||
{
|
||||
ReadSettings();
|
||||
INT_PTR ret = DialogBoxParam(hinst, MAKEINTRESOURCE(IDD_CONFIG), GetActiveWindow(), ConfigProc, 1);
|
||||
if (ret == -1) {
|
||||
MessageBoxEx(GetActiveWindow(), "Error Opening the config dialog.", "OMG ERROR!", MB_OK, 0);
|
||||
return;
|
||||
}
|
||||
ReadSettings();
|
||||
auto drives = GetOpticalDriveList();
|
||||
DialogBoxParam(hinst, MAKEINTRESOURCE(IDD_CONFIG), GetActiveWindow(),
|
||||
ConfigProc, reinterpret_cast<LPARAM>(&drives));
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue