USB: windows mostly complete, linker issues left

This commit is contained in:
GovanifY 2020-11-04 00:39:36 +01:00 committed by refractionpcsx2
parent bc022789fc
commit 395b372ef7
54 changed files with 587 additions and 551 deletions

View File

@ -19,6 +19,7 @@
#include <cerrno> #include <cerrno>
#include <cassert> #include <cassert>
#include "PrecompiledHeader.h"
#include "Utilities/pxStreams.h" #include "Utilities/pxStreams.h"
#include "USB.h" #include "USB.h"
#include "osdebugout.h" #include "osdebugout.h"
@ -189,7 +190,11 @@ s32 USBinit()
if (conf.Log && !usbLog) if (conf.Log && !usbLog)
{ {
#ifdef _WIN32
usbLog = wfopen(LogDir.c_str(), L"wb"); // L"wb,ccs=UNICODE");
#else
usbLog = wfopen(LogDir.c_str(), "wb"); // L"wb,ccs=UNICODE"); usbLog = wfopen(LogDir.c_str(), "wb"); // L"wb,ccs=UNICODE");
#endif
//if(usbLog) setvbuf(usbLog, NULL, _IONBF, 0); //if(usbLog) setvbuf(usbLog, NULL, _IONBF, 0);
USB_LOG("USBinit\n"); USB_LOG("USBinit\n");
} }

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "AppCoreThread.h" #include "AppCoreThread.h"
#include "../USB.h" #include "../USB.h"
#include "resource.h" #include "resource.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "osdebugout.h" #include "osdebugout.h"
#include "deviceproxy.h" #include "deviceproxy.h"
#include "configuration.h" #include "configuration.h"
@ -30,13 +31,21 @@ CIniFile ciniFile;
void USBsetSettingsDir(const char* dir) void USBsetSettingsDir(const char* dir)
{ {
#ifdef _WIN32
IniPath = str_to_wstr(dir);
#else
IniPath = dir; IniPath = dir;
#endif
IniPath.append(iniFile); IniPath.append(iniFile);
} }
void USBsetLogDir(const char* dir) void USBsetLogDir(const char* dir)
{ {
#ifdef _WIN32
LogDir = str_to_wstr(dir);
#else
LogDir = dir; LogDir = dir;
#endif
} }
std::string GetSelectedAPI(const std::pair<int, std::string>& pair) std::string GetSelectedAPI(const std::pair<int, std::string>& pair)
@ -50,18 +59,37 @@ std::string GetSelectedAPI(const std::pair<int, std::string>& pair)
bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, TSTDSTRING& value) bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, TSTDSTRING& value)
{ {
CIniKey* key; CIniKey* key;
#ifdef _WIN32
auto sect = ciniFile.GetSection(section);
if (sect && (key = sect->GetKey(param)))
{
value = key->GetValue();
return true;
}
#else
auto sect = ciniFile.GetSection(str_to_wstr(section)); auto sect = ciniFile.GetSection(str_to_wstr(section));
if (sect && (key = sect->GetKey(str_to_wstr(param)))) if (sect && (key = sect->GetKey(str_to_wstr(param))))
{ {
value = wstr_to_str(key->GetValue()); value = wstr_to_str(key->GetValue());
return true; return true;
} }
#endif
return false; return false;
} }
bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, int32_t& value) bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, int32_t& value)
{ {
CIniKey* key; CIniKey* key;
#ifdef _WIN32
auto sect = ciniFile.GetSection(section);
if (sect && (key = sect->GetKey(param)))
{
try
{
value = std::stoi(key->GetValue());
return true;
}
#else
auto sect = ciniFile.GetSection(str_to_wstr(section)); auto sect = ciniFile.GetSection(str_to_wstr(section));
if (sect && (key = sect->GetKey(str_to_wstr(param)))) if (sect && (key = sect->GetKey(str_to_wstr(param))))
{ {
@ -70,6 +98,7 @@ bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TC
value = std::stoi(key->GetValue()); value = std::stoi(key->GetValue());
return true; return true;
} }
#endif
catch (std::exception& err) catch (std::exception& err)
{ {
OSDebugOut(TEXT("%" SFMTs "\n"), err.what()); OSDebugOut(TEXT("%" SFMTs "\n"), err.what());
@ -80,20 +109,32 @@ bool LoadSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TC
bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, const TSTDSTRING& value) bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, const TSTDSTRING& value)
{ {
#ifdef _WIN32
ciniFile.SetKeyValue(section, param, value);
#else
ciniFile.SetKeyValue(str_to_wstr(section), str_to_wstr(param), str_to_wstr(value)); ciniFile.SetKeyValue(str_to_wstr(section), str_to_wstr(param), str_to_wstr(value));
#endif
return true; return true;
} }
bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, int32_t value) bool SaveSettingValue(const TSTDSTRING& ini, const TSTDSTRING& section, const TCHAR* param, int32_t value)
{ {
#ifdef _WIN32
ciniFile.SetKeyValue(section, param, TSTDTOSTRING(value));
#else
ciniFile.SetKeyValue(str_to_wstr(section), str_to_wstr(param), str_to_wstr(TSTDTOSTRING(value))); ciniFile.SetKeyValue(str_to_wstr(section), str_to_wstr(param), str_to_wstr(TSTDTOSTRING(value)));
#endif
return true; return true;
} }
void SaveConfig() void SaveConfig()
{ {
#ifdef _WIN32
SaveSetting(L"MAIN", L"log", conf.Log);
#else
SaveSetting("MAIN", "log", conf.Log); SaveSetting("MAIN", "log", conf.Log);
#endif
SaveSetting(nullptr, 0, N_DEVICE_PORT, N_DEVICE, conf.Port[0]); SaveSetting(nullptr, 0, N_DEVICE_PORT, N_DEVICE, conf.Port[0]);
SaveSetting(nullptr, 1, N_DEVICE_PORT, N_DEVICE, conf.Port[1]); SaveSetting(nullptr, 1, N_DEVICE_PORT, N_DEVICE, conf.Port[1]);
@ -106,17 +147,27 @@ void SaveConfig()
SaveSetting(nullptr, k.first.first, k.first.second, N_DEVICE_API, k.second); SaveSetting(nullptr, k.first.first, k.first.second, N_DEVICE_API, k.second);
} }
ciniFile.Save(str_to_wstr(IniPath)); #ifdef _WIN32
bool ret = ciniFile.Save(IniPath);
OSDebugOut(_T("ciniFile.Save: %d [%s]\n"), ret, IniPath.c_str()); OSDebugOut(_T("ciniFile.Save: %d [%s]\n"), ret, IniPath.c_str());
#else
bool ret = ciniFile.Save(str_to_wstr(IniPath));
OSDebugOut(_T("ciniFile.Save: %d [%s]\n"), ret, IniPath.c_str());
#endif
} }
void LoadConfig() void LoadConfig()
{ {
std::cerr << "USB load config\n" std::cerr << "USB load config\n"
<< std::endl; << std::endl;
ciniFile.Load(str_to_wstr(IniPath));
#ifdef _WIN32
ciniFile.Load(IniPath);
LoadSetting(L"MAIN", L"log", conf.Log);
#else
ciniFile.Load(str_to_wstr(IniPath));
LoadSetting("MAIN", "log", conf.Log); LoadSetting("MAIN", "log", conf.Log);
#endif
LoadSetting(nullptr, 0, N_DEVICE_PORT, N_DEVICE, conf.Port[0]); LoadSetting(nullptr, 0, N_DEVICE_PORT, N_DEVICE, conf.Port[0]);
LoadSetting(nullptr, 1, N_DEVICE_PORT, N_DEVICE, conf.Port[1]); LoadSetting(nullptr, 1, N_DEVICE_PORT, N_DEVICE, conf.Port[1]);
@ -155,7 +206,11 @@ void LoadConfig()
void ClearSection(const TCHAR* section) void ClearSection(const TCHAR* section)
{ {
#ifdef _WIN32
auto s = ciniFile.GetSection(section);
#else
auto s = ciniFile.GetSection(str_to_wstr(section)); auto s = ciniFile.GetSection(str_to_wstr(section));
#endif
if (s) if (s)
{ {
s->RemoveAllKeys(); s->RemoveAllKeys();
@ -173,5 +228,9 @@ void RemoveSection(const char* dev_type, int port, const std::string& key)
section << tkey << _T(" ") << port; section << tkey << _T(" ") << port;
TSTDSTRING str = section.str(); TSTDSTRING str = section.str();
#ifdef _WIN32
ciniFile.RemoveSection(section.str());
#else
ciniFile.RemoveSection(str_to_wstr(section.str())); ciniFile.RemoveSection(str_to_wstr(section.str()));
#endif
} }

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "deviceproxy.h" #include "deviceproxy.h"
#include "usb-pad/usb-pad.h" #include "usb-pad/usb-pad.h"
#include "usb-msd/usb-msd.h" #include "usb-msd/usb-msd.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "deviceproxy.h" #include "deviceproxy.h"
#include "usb-pad/padproxy.h" #include "usb-pad/padproxy.h"
#include "usb-mic/audiodeviceproxy.h" #include "usb-mic/audiodeviceproxy.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "osdebugout.h" #include "osdebugout.h"
std::wostream& operator<<(std::wostream& os, const std::string& s) std::wostream& operator<<(std::wostream& os, const std::string& s)

View File

@ -57,9 +57,10 @@
#define TSTDTOSTRING std::to_wstring #define TSTDTOSTRING std::to_wstring
#ifdef _MSC_VER #ifdef _MSC_VER
typedef SSIZE_T ssize_t; //typedef SSIZE_T ssize_t;
#endif #endif
//FIXME narrow string fmt //FIXME narrow string fmt
#define SFMTs "S" #define SFMTs "S"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "USBinternal.h" #include "USBinternal.h"
#include "vl.h" #include "vl.h"

View File

@ -23,6 +23,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include "PrecompiledHeader.h"
#include "../osdebugout.h" #include "../osdebugout.h"
#include "../platcompat.h" #include "../platcompat.h"
#include "vl.h" #include "vl.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "vl.h" #include "vl.h"
#include "desc.h" #include "desc.h"
#include "glib.h" #include "glib.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "glib.h" #include "glib.h"
#include <cstdlib> #include <cstdlib>
#include <cstring> #include <cstring>

View File

@ -22,6 +22,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include "PrecompiledHeader.h"
#include "hid.h" #include "hid.h"
#include "input-keymap.h" #include "input-keymap.h"
#include "../osdebugout.h" #include "../osdebugout.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "input-keymap.h" #include "input-keymap.h"
//TODO how much does std::map kill perf if any? //TODO how much does std::map kill perf if any?

View File

@ -18,6 +18,7 @@
* To re-generate, run: * To re-generate, run:
* keymap-gen --lang=stdc++ --varname=qemu_input_map_win32_to_qcode code-map keymaps.csv win32 qcode * keymap-gen --lang=stdc++ --varname=qemu_input_map_win32_to_qcode code-map keymaps.csv win32 qcode
*/ */
#include "PrecompiledHeader.h"
#include "input-keymap-win32-to-qcode.h" #include "input-keymap-win32-to-qcode.h"
const std::array<QKeyCode, 252> qemu_input_map_win32_to_qcode = { const std::array<QKeyCode, 252> qemu_input_map_win32_to_qcode = {
Q_KEY_CODE_UNMAPPED, /* win32:0 (unnamed) -> linux:None (unnamed) -> qcode:None (unnamed) */ Q_KEY_CODE_UNMAPPED, /* win32:0 (unnamed) -> linux:None (unnamed) -> qcode:None (unnamed) */

View File

@ -16,6 +16,7 @@
* GNU GPL, version 2 or (at your option) any later version. * GNU GPL, version 2 or (at your option) any later version.
*/ */
#include "PrecompiledHeader.h"
#include "vl.h" #include "vl.h"
//#include "qemu-common.h" //#include "qemu-common.h"
#include "iov.h" #include "iov.h"

View File

@ -11,6 +11,8 @@
* the COPYING file in the top-level directory. * the COPYING file in the top-level directory.
*/ */
#include "../platcompat.h"
#ifndef IOV_H #ifndef IOV_H
#define IOV_H #define IOV_H

View File

@ -28,6 +28,7 @@
//typedef CPUReadMemoryFunc //typedef CPUReadMemoryFunc
#include "PrecompiledHeader.h"
#include "vl.h" #include "vl.h"
#include "queue.h" #include "queue.h"
#include "USBinternal.h" #include "USBinternal.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "vl.h" #include "vl.h"
/* compute with 96 bit intermediate result: (a*b)/c */ /* compute with 96 bit intermediate result: (a*b)/c */

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include <windows.h> #include <windows.h>
#include <setupapi.h> #include <setupapi.h>
#include "hidapi.h" #include "hidapi.h"

View File

@ -18,6 +18,8 @@
#include <pshpack4.h> #include <pshpack4.h>
#define NTSTATUS int
typedef USHORT USAGE, *PUSAGE; typedef USHORT USAGE, *PUSAGE;
#define HID_USAGE_PAGE_GENERIC ((USAGE)0x01) #define HID_USAGE_PAGE_GENERIC ((USAGE)0x01)

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "inifile.h" #include "inifile.h"
#include <algorithm> #include <algorithm>
#include <iostream> #include <iostream>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "rawinput.h" #include "rawinput.h"
#include <cstdio> #include <cstdio>
#include <vector> #include <vector>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "ringbuffer.h" #include "ringbuffer.h"
#include <cstring> #include <cstring>
#include <cassert> #include <cassert>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "shared.h" #include "shared.h"
#include <stdexcept> #include <stdexcept>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "videodeviceproxy.h" #include "videodeviceproxy.h"
#include "cam-windows.h" #include "cam-windows.h"

View File

@ -13,7 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include <guiddef.h> #include "PrecompiledHeader.h"
#include "videodev.h" #include "videodev.h"
#include "cam-windows.h" #include "cam-windows.h"
#include "usb-eyetoy-webcam.h" #include "usb-eyetoy-webcam.h"
@ -22,104 +22,6 @@
#include "../Win32/Config.h" #include "../Win32/Config.h"
#include "../Win32/resource.h" #include "../Win32/resource.h"
#ifndef DIBSIZE
#define WIDTHBYTES(BTIS) ((DWORD)(((BTIS) + 31) & (~31)) / 8)
#define DIBWIDTHBYTES(BI) (DWORD)(BI).biBitCount) * (DWORD)WIDTHBYTES((DWORD)(BI).biWidth
#define _DIBSIZE(BI) (DIBWIDTHBYTES(BI) * (DWORD)(BI).biHeight)
#define DIBSIZE(BI) ((BI).biHeight < 0 ? (-1) * (_DIBSIZE(BI)) : _DIBSIZE(BI))
#endif
constexpr GUID make_guid(const char* const spec)
{
#define nybble_from_hex(c) ((c >= '0' && c <= '9') ? (c - '0') : ((c >= 'a' && c <= 'f') ? (c - 'a' + 10) : ((c >= 'A' && c <= 'F') ? (c - 'A' + 10) : 0)))
#define byte_from_hex(c1, c2) ((nybble_from_hex(c1) << 4) | nybble_from_hex(c2))
return {
// Data1
(((((((((((((
static_cast<unsigned __int32>(nybble_from_hex(spec[0]))
<< 4) |
nybble_from_hex(spec[1]))
<< 4) |
nybble_from_hex(spec[2]))
<< 4) |
nybble_from_hex(spec[3]))
<< 4) |
nybble_from_hex(spec[4]))
<< 4) |
nybble_from_hex(spec[5]))
<< 4) |
nybble_from_hex(spec[6]))
<< 4) |
nybble_from_hex(spec[7]),
// Data2
static_cast<unsigned short>(
(((((
static_cast<unsigned>(nybble_from_hex(spec[9]))
<< 4) |
nybble_from_hex(spec[10]))
<< 4) |
nybble_from_hex(spec[11]))
<< 4) |
nybble_from_hex(spec[12])),
// Data 3
static_cast<unsigned short>(
(((((
static_cast<unsigned>(nybble_from_hex(spec[14]))
<< 4) |
nybble_from_hex(spec[15]))
<< 4) |
nybble_from_hex(spec[16]))
<< 4) |
nybble_from_hex(spec[17])),
// Data 4
{
static_cast<unsigned char>(byte_from_hex(spec[19], spec[20])),
static_cast<unsigned char>(byte_from_hex(spec[21], spec[22])),
static_cast<unsigned char>(byte_from_hex(spec[24], spec[25])),
static_cast<unsigned char>(byte_from_hex(spec[26], spec[27])),
static_cast<unsigned char>(byte_from_hex(spec[28], spec[29])),
static_cast<unsigned char>(byte_from_hex(spec[30], spec[31])),
static_cast<unsigned char>(byte_from_hex(spec[32], spec[33])),
static_cast<unsigned char>(byte_from_hex(spec[34], spec[35]))}};
}
#if defined(_MSC_VER)
#define CPPX_MSVC_UUID_FOR(name, spec) \
class __declspec(uuid(spec)) name
#else
#define CPPX_GNUC_UUID_FOR(name, spec) \
template <> \
inline auto __mingw_uuidof<name>() \
->GUID const& \
{ \
static constexpr GUID the_uuid = make_guid(spec); \
\
return the_uuid; \
} \
\
template <> \
inline auto __mingw_uuidof<name*>() \
->GUID const& \
{ \
return __mingw_uuidof<name>(); \
} \
\
static_assert(true, "")
#endif
#if !defined(CPPX_UUID_FOR)
#if defined(_MSC_VER)
#define CPPX_UUID_FOR CPPX_MSVC_UUID_FOR
#elif defined(__GNUC__)
#define CPPX_UUID_FOR CPPX_GNUC_UUID_FOR
#endif
#endif
CPPX_UUID_FOR(ISampleGrabber, "6b652fff-11fe-4fce-92ad-0266b5d7c78f");
CPPX_UUID_FOR(ISampleGrabberCB, "0579154a-2b53-4994-b0d0-e773148eff85");
//CPPX_UUID_FOR(SampleGrabber, "c1f400a0-3f08-11d3-9f0b-006008039e37");
namespace usb_eyetoy namespace usb_eyetoy
{ {
namespace windows_api namespace windows_api
@ -134,8 +36,8 @@ namespace usb_eyetoy
if (hr != S_OK) if (hr != S_OK)
return S_OK; return S_OK;
if (parent) if (callback)
std::invoke(&DirectShow::dshow_callback, parent, buffer, sample->GetActualDataLength(), BITS_PER_PIXEL); callback(buffer, sample->GetActualDataLength(), BITS_PER_PIXEL);
return S_OK; return S_OK;
} }
@ -152,7 +54,6 @@ namespace usb_eyetoy
std::vector<std::wstring> getDevList() std::vector<std::wstring> getDevList()
{ {
std::vector<std::wstring> devList; std::vector<std::wstring> devList;
devList.push_back(L"None");
ICreateDevEnum* pCreateDevEnum = 0; ICreateDevEnum* pCreateDevEnum = 0;
HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pCreateDevEnum)); HRESULT hr = CoCreateInstance(CLSID_SystemDeviceEnum, NULL, CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&pCreateDevEnum));
@ -163,9 +64,8 @@ namespace usb_eyetoy
} }
IEnumMoniker* pEnum = 0; IEnumMoniker* pEnum = 0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, NULL);
if (hr == S_FALSE || FAILED(hr)) if (FAILED(hr))
{
{ {
fprintf(stderr, "You have no video capture hardware"); fprintf(stderr, "You have no video capture hardware");
return devList; return devList;
@ -248,9 +148,8 @@ namespace usb_eyetoy
} }
IEnumMoniker* pEnum = 0; IEnumMoniker* pEnum = 0;
hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, 0); hr = pCreateDevEnum->CreateClassEnumerator(CLSID_VideoInputDeviceCategory, &pEnum, NULL);
if (hr == S_FALSE || FAILED(hr)) if (FAILED(hr))
{
{ {
fprintf(stderr, "You have no video capture hardware"); fprintf(stderr, "You have no video capture hardware");
return -1; return -1;
@ -402,9 +301,7 @@ namespace usb_eyetoy
} }
// if the stream is started, start capturing immediatly // if the stream is started, start capturing immediatly
LONGLONG start, stop; LONGLONG start = 0, stop = MAXLONGLONG;
start = 0;
stop = MAXLONGLONG;
hr = pGraphBuilder->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, sourcefilter, &start, &stop, 1, 2); hr = pGraphBuilder->ControlStream(&PIN_CATEGORY_CAPTURE, &MEDIATYPE_Video, sourcefilter, &start, &stop, 1, 2);
if (FAILED(hr)) if (FAILED(hr))
{ {
@ -444,8 +341,6 @@ namespace usb_eyetoy
void DirectShow::Stop() void DirectShow::Stop()
{ {
if (!sourcefilter)
return;
HRESULT hr = sourcefilter->Stop(); HRESULT hr = sourcefilter->Stop();
if (FAILED(hr)) if (FAILED(hr))
throw hr; throw hr;
@ -458,21 +353,26 @@ namespace usb_eyetoy
if (FAILED(hr)) if (FAILED(hr))
throw hr; throw hr;
} }
void DirectShow::store_mpeg_frame(const std::vector<unsigned char>& data)
buffer_t mpeg_buffer{};
std::mutex mpeg_mutex;
void store_mpeg_frame(unsigned char* data, unsigned int len)
{ {
std::lock_guard<std::mutex> lk(mpeg_mutex); mpeg_mutex.lock();
mpeg_buffer = data; memcpy(mpeg_buffer.start, data, len);
mpeg_buffer.length = len;
mpeg_mutex.unlock();
} }
void DirectShow::dshow_callback(unsigned char* data, int len, int bitsperpixel) void dshow_callback(unsigned char* data, int len, int bitsperpixel)
{ {
if (bitsperpixel == 24) if (bitsperpixel == 24)
{ {
std::vector<unsigned char> mpegData(320 * 240 * 2); unsigned char* mpegData = (unsigned char*)calloc(1, 320 * 240 * 2);
int mpegLen = jo_write_mpeg(mpegData.data(), data, 320, 240, JO_RGB24, JO_FLIP_X, JO_FLIP_Y); int mpegLen = jo_write_mpeg(mpegData, data, 320, 240, JO_RGB24, JO_FLIP_X, JO_FLIP_Y);
//OSDebugOut(_T("MPEG: alloced: %d, got: %d\n"), mpegData.size(), mpegLen); store_mpeg_frame(mpegData, mpegLen);
mpegData.resize(mpegLen); free(mpegData);
store_mpeg_frame(mpegData);
} }
else else
{ {
@ -480,28 +380,29 @@ namespace usb_eyetoy
} }
} }
void DirectShow::create_dummy_frame() void create_dummy_frame()
{ {
const int width = 320; const int width = 320;
const int height = 240; const int height = 240;
const int bytesPerPixel = 3; const int bytesPerPixel = 3;
std::vector<unsigned char> rgbData(width * height * bytesPerPixel, 0); unsigned char* rgbData = (unsigned char*)calloc(1, width * height * bytesPerPixel);
for (int y = 0; y < height; y++) for (int y = 0; y < height; y++)
{ {
for (int x = 0; x < width; x++) for (int x = 0; x < width; x++)
{ {
unsigned char* ptr = &rgbData[(y * width + x) * bytesPerPixel]; unsigned char* ptr = rgbData + (y * width + x) * bytesPerPixel;
int c = (255 * y) / height; ptr[0] = 255 - y;
ptr[0] = 255 - c; ptr[1] = y;
ptr[1] = c; ptr[2] = 255 - y;
ptr[2] = 255 - c;
} }
} }
std::vector<unsigned char> mpegData(width * height * bytesPerPixel, 255); unsigned char* mpegData = (unsigned char*)calloc(1, width * height * bytesPerPixel);
int mpegLen = jo_write_mpeg(mpegData.data(), rgbData.data(), width, height, JO_RGB24, JO_NONE, JO_NONE); int mpegLen = jo_write_mpeg(mpegData, rgbData, width, height, JO_RGB24, JO_NONE, JO_NONE);
mpegData.resize(mpegLen); free(rgbData);
store_mpeg_frame(mpegData);
store_mpeg_frame(mpegData, mpegLen);
free(mpegData);
} }
DirectShow::DirectShow(int port) DirectShow::DirectShow(int port)
@ -515,15 +416,13 @@ namespace usb_eyetoy
nullrenderer = NULL; nullrenderer = NULL;
pSourceConfig = NULL; pSourceConfig = NULL;
samplegrabber = NULL; samplegrabber = NULL;
callbackhandler = new CallbackHandler(this); callbackhandler = new CallbackHandler();
CoInitialize(NULL); CoInitialize(NULL);
} }
int DirectShow::Open() int DirectShow::Open()
{ {
mpeg_buffer.resize(320 * 240 * 2); mpeg_buffer.start = calloc(1, 320 * 240 * 2);
std::fill(mpeg_buffer.begin(), mpeg_buffer.end(), 0);
create_dummy_frame(); create_dummy_frame();
std::wstring selectedDevice; std::wstring selectedDevice;
@ -538,6 +437,7 @@ namespace usb_eyetoy
pControl->Run(); pControl->Run();
this->Stop(); this->Stop();
this->SetCallback(dshow_callback);
this->Start(); this->Start();
return 0; return 0;
@ -545,9 +445,8 @@ namespace usb_eyetoy
int DirectShow::Close() int DirectShow::Close()
{ {
if (!sourcefilter) if (sourcefilter != NULL)
return 0; {
this->Stop(); this->Stop();
pControl->Stop(); pControl->Stop();
@ -556,24 +455,28 @@ namespace usb_eyetoy
samplegrabberfilter->Release(); samplegrabberfilter->Release();
samplegrabber->Release(); samplegrabber->Release();
nullrenderer->Release(); nullrenderer->Release();
sourcefilter = nullptr; }
pGraphBuilder->Release(); pGraphBuilder->Release();
pGraph->Release(); pGraph->Release();
pControl->Release(); pControl->Release();
std::lock_guard<std::mutex> lck(mpeg_mutex); if (mpeg_buffer.start != NULL)
mpeg_buffer.resize(0); {
free(mpeg_buffer.start);
mpeg_buffer.start = NULL;
}
return 0; return 0;
}; };
int DirectShow::GetImage(uint8_t* buf, int len) int DirectShow::GetImage(uint8_t* buf, int len)
{ {
std::lock_guard<std::mutex> lck(mpeg_mutex); mpeg_mutex.lock();
int len2 = mpeg_buffer.size(); int len2 = mpeg_buffer.length;
if (len < mpeg_buffer.size()) if (len < mpeg_buffer.length)
len2 = len; len2 = len;
memcpy(buf, mpeg_buffer.data(), len2); memcpy(buf, mpeg_buffer.start, len2);
mpeg_mutex.unlock();
return len2; return len2;
}; };

View File

@ -28,14 +28,14 @@ extern GUID CLSID_NullRenderer;
} }
#pragma region qedit.h #pragma region qedit.h
struct //__declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85")) struct __declspec(uuid("0579154a-2b53-4994-b0d0-e773148eff85"))
ISampleGrabberCB : IUnknown ISampleGrabberCB : IUnknown
{ {
virtual HRESULT __stdcall SampleCB(double SampleTime, struct IMediaSample* pSample) = 0; virtual HRESULT __stdcall SampleCB(double SampleTime, struct IMediaSample* pSample) = 0;
virtual HRESULT __stdcall BufferCB(double SampleTime, unsigned char* pBuffer, long BufferLen) = 0; virtual HRESULT __stdcall BufferCB(double SampleTime, unsigned char* pBuffer, long BufferLen) = 0;
}; };
struct //__declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f")) struct __declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
ISampleGrabber : IUnknown ISampleGrabber : IUnknown
{ {
virtual HRESULT __stdcall SetOneShot(long OneShot) = 0; virtual HRESULT __stdcall SetOneShot(long OneShot) = 0;
@ -47,8 +47,8 @@ struct //__declspec(uuid("6b652fff-11fe-4fce-92ad-0266b5d7c78f"))
virtual HRESULT __stdcall SetCallback(struct ISampleGrabberCB* pCallback, long WhichMethodToCallback) = 0; virtual HRESULT __stdcall SetCallback(struct ISampleGrabberCB* pCallback, long WhichMethodToCallback) = 0;
}; };
//struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37")) struct __declspec(uuid("c1f400a0-3f08-11d3-9f0b-006008039e37"))
// SampleGrabber; SampleGrabber;
#pragma endregion #pragma endregion
@ -72,6 +72,12 @@ namespace usb_eyetoy
typedef void (*DShowVideoCaptureCallback)(unsigned char* data, int len, int bitsperpixel); typedef void (*DShowVideoCaptureCallback)(unsigned char* data, int len, int bitsperpixel);
typedef struct
{
void* start = NULL;
size_t length = 0;
} buffer_t;
static const char* APINAME = "DirectShow"; static const char* APINAME = "DirectShow";
class DirectShow : public VideoDevice class DirectShow : public VideoDevice
@ -94,12 +100,10 @@ namespace usb_eyetoy
void Port(int port) { mPort = port; } void Port(int port) { mPort = port; }
protected: protected:
void SetCallback(DShowVideoCaptureCallback cb) { callbackhandler->SetCallback(cb); }
void Start(); void Start();
void Stop(); void Stop();
int InitializeDevice(std::wstring selectedDevice); int InitializeDevice(std::wstring selectedDevice);
void store_mpeg_frame(const std::vector<unsigned char>& data);
void create_dummy_frame();
void dshow_callback(unsigned char* data, int len, int bitsperpixel);
private: private:
int mPort; int mPort;
@ -114,16 +118,10 @@ namespace usb_eyetoy
ISampleGrabber* samplegrabber; ISampleGrabber* samplegrabber;
IBaseFilter* nullrenderer; IBaseFilter* nullrenderer;
std::vector<unsigned char> mpeg_buffer{};
std::mutex mpeg_mutex;
class CallbackHandler : public ISampleGrabberCB class CallbackHandler : public ISampleGrabberCB
{ {
public: public:
CallbackHandler(DirectShow* parent_) CallbackHandler() { callback = 0; }
: parent(parent_)
{
}
~CallbackHandler() {} ~CallbackHandler() {}
void SetCallback(DShowVideoCaptureCallback cb) { callback = cb; } void SetCallback(DShowVideoCaptureCallback cb) { callback = cb; }
@ -135,7 +133,7 @@ namespace usb_eyetoy
virtual ULONG __stdcall Release() { return 2; } virtual ULONG __stdcall Release() { return 2; }
private: private:
DirectShow* parent; DShowVideoCaptureCallback callback;
} * callbackhandler; } * callbackhandler;
}; };

View File

@ -27,6 +27,7 @@
* http://www.cs.cornell.edu/dali/api/mpegvideo-c.html * http://www.cs.cornell.edu/dali/api/mpegvideo-c.html
* */ * */
#include "PrecompiledHeader.h"
#include <stdio.h> #include <stdio.h>
#include <math.h> #include <math.h>
#include <memory.h> #include <memory.h>

View File

@ -26,6 +26,8 @@
// Important: // Important:
// #define JPGD_USE_SSE2 to 0 to completely disable SSE2 usage. // #define JPGD_USE_SSE2 to 0 to completely disable SSE2 usage.
// //
#include "PrecompiledHeader.h"
#include "jpgd.h" #include "jpgd.h"
#include <string.h> #include <string.h>
#include <algorithm> #include <algorithm>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "videodeviceproxy.h" #include "videodeviceproxy.h"
#include "../osdebugout.h" #include "../osdebugout.h"
#include "usb-eyetoy-webcam.h" #include "usb-eyetoy-webcam.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "hidproxy.h" #include "hidproxy.h"
#include "raw/rawinput.h" #include "raw/rawinput.h"
#include "noop.h" #include "noop.h"

View File

@ -13,10 +13,11 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "rawinput.h" #include "rawinput.h"
#include "../../Win32/Config.h" #include "../../Win32/Config.h"
#include "qemu-usb/input-keymap.h" #include "../../qemu-usb/input-keymap.h"
#include "qemu-usb/input-keymap-win32-to-qcode.h" #include "../../qemu-usb/input-keymap-win32-to-qcode.h"
namespace usb_hid namespace usb_hid
{ {

View File

@ -13,7 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "shared/rawinput.h" #include "../../shared/rawinput.h"
#include "../hidproxy.h" #include "../hidproxy.h"
#include "../usb-hid.h" #include "../usb-hid.h"

View File

@ -22,6 +22,8 @@
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE. * THE SOFTWARE.
*/ */
#include "PrecompiledHeader.h"
#include "../deviceproxy.h" #include "../deviceproxy.h"
#include "hidproxy.h" #include "hidproxy.h"
#include "../qemu-usb/desc.h" #include "../qemu-usb/desc.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "audiodeviceproxy.h" #include "audiodeviceproxy.h"
#include "audiodev-noop.h" #include "audiodev-noop.h"
#include "audiodev-wasapi.h" #include "audiodev-wasapi.h"

View File

@ -15,6 +15,7 @@
// Used OBS as example // Used OBS as example
#include "PrecompiledHeader.h"
#include <assert.h> #include <assert.h>
#include <propsys.h> #include <propsys.h>
#include <typeinfo> #include <typeinfo>

View File

@ -17,7 +17,7 @@
#include "audiodeviceproxy.h" #include "audiodeviceproxy.h"
#include "../libsamplerate/samplerate.h" #include "../libsamplerate/samplerate.h"
#include "shared/ringbuffer.h" #include "../shared/ringbuffer.h"
#include <mmdeviceapi.h> #include <mmdeviceapi.h>
#include <audioclient.h> #include <audioclient.h>

View File

@ -24,6 +24,7 @@
// Most stuff is based on Qemu 1.7 USB soundcard passthrough code. // Most stuff is based on Qemu 1.7 USB soundcard passthrough code.
#include "PrecompiledHeader.h"
#include "../qemu-usb/vl.h" #include "../qemu-usb/vl.h"
#include "../qemu-usb/desc.h" #include "../qemu-usb/desc.h"
#include <assert.h> #include <assert.h>
@ -666,6 +667,7 @@ namespace usb_mic
int length, uint8_t* data) int length, uint8_t* data)
{ {
uint8_t cs = cscn >> 8; uint8_t cs = cscn >> 8;
uint8_t cn = cscn - 1; /* -1 for the non-present master control */
uint32_t aid = ATTRIB_ID(cs, attrib, ep); uint32_t aid = ATTRIB_ID(cs, attrib, ep);
int ret = USB_RET_STALL; int ret = USB_RET_STALL;

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "usb-mic-singstar.h" #include "usb-mic-singstar.h"
#include "audio.h" #include "audio.h"
#include "../qemu-usb/desc.h" #include "../qemu-usb/desc.h"

View File

@ -24,6 +24,7 @@
// Most stuff is based on Qemu 1.7 USB soundcard passthrough code. // Most stuff is based on Qemu 1.7 USB soundcard passthrough code.
#include "PrecompiledHeader.h"
#include "../qemu-usb/vl.h" #include "../qemu-usb/vl.h"
#include "../qemu-usb/desc.h" #include "../qemu-usb/desc.h"
#include "usb-mic-singstar.h" #include "usb-mic-singstar.h"

View File

@ -13,6 +13,8 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include <commdlg.h>
#include "usb-msd.h" #include "usb-msd.h"
#include "../Win32/Config.h" #include "../Win32/Config.h"
#include "../Win32/resource.h" #include "../Win32/resource.h"

View File

@ -7,6 +7,7 @@
* This code is licenced under the LGPL. * This code is licenced under the LGPL.
*/ */
#include "PrecompiledHeader.h"
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <string.h> #include <string.h>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "padproxy.h" #include "padproxy.h"
#include "raw/usb-pad-raw.h" #include "raw/usb-pad-raw.h"
#include "dx/usb-pad-dx.h" #include "dx/usb-pad-dx.h"

View File

@ -13,6 +13,8 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#pragma warning(push) #pragma warning(push)
// floats to int // floats to int
#pragma warning(disable : 4244) #pragma warning(disable : 4244)

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include <math.h> #include <math.h>
#include "dx.h" #include "dx.h"

View File

@ -29,7 +29,7 @@
#include "../usb-pad.h" #include "../usb-pad.h"
#include "../../configuration.h" #include "../../configuration.h"
#include "../../osdebugout.h" #include "../../osdebugout.h"
#include "usb-pad/lg/lg_ff.h" #include "../../usb-pad/lg/lg_ff.h"
#define DINPUT_AXES_COUNT 32 #define DINPUT_AXES_COUNT 32

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "usb-pad-dx.h" #include "usb-pad-dx.h"
#include "dx.h" #include "dx.h"
#include <cmath> #include <cmath>

View File

@ -3,6 +3,7 @@
License: GPLv3 License: GPLv3
*/ */
#include "PrecompiledHeader.h"
#include "lg_ff.h" #include "lg_ff.h"
typedef struct typedef struct

View File

@ -13,6 +13,8 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#define _WIN32_WINNT 0x0502 #define _WIN32_WINNT 0x0502
#include <stdio.h> #include <stdio.h>
#include <windows.h> #include <windows.h>

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "../../USB.h" #include "../../USB.h"
#include "../../Win32/Config.h" #include "../../Win32/Config.h"
#include "usb-pad-raw.h" #include "usb-pad-raw.h"

View File

@ -20,8 +20,8 @@
#include <atomic> #include <atomic>
#include "../padproxy.h" #include "../padproxy.h"
#include "../usb-pad.h" #include "../usb-pad.h"
#include "shared/rawinput.h" #include "../../shared/rawinput.h"
#include "readerwriterqueue/readerwriterqueue.h" #include "../../readerwriterqueue/readerwriterqueue.h"
namespace usb_pad namespace usb_pad
{ {

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "usb-pad.h" #include "usb-pad.h"
#include "lg/lg_ff.h" #include "lg/lg_ff.h"
#include "../osdebugout.h" #include "../osdebugout.h"

View File

@ -13,6 +13,7 @@
* If not, see <http://www.gnu.org/licenses/>. * If not, see <http://www.gnu.org/licenses/>.
*/ */
#include "PrecompiledHeader.h"
#include "padproxy.h" #include "padproxy.h"
#include "usb-pad.h" #include "usb-pad.h"
#include "../qemu-usb/desc.h" #include "../qemu-usb/desc.h"

View File

@ -1,3 +1,19 @@
/* PCSX2 - PS2 Emulator for PCs
* Copyright (C) 2002-2020 PCSX2 Dev Team
*
* PCSX2 is free software: you can redistribute it and/or modify it under the terms
* of the GNU Lesser General Public License as published by the Free Software Found-
* ation, either version 3 of the License, or (at your option) any later version.
*
* PCSX2 is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
* without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
* PURPOSE. See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License along with PCSX2.
* If not, see <http://www.gnu.org/licenses/>.
*/
#include "PrecompiledHeader.h"
#include "padproxy.h" #include "padproxy.h"
#include "usb-pad.h" #include "usb-pad.h"
#include "../qemu-usb/desc.h" #include "../qemu-usb/desc.h"