summaryrefslogtreecommitdiff
path: root/Source
diff options
context:
space:
mode:
authorLéo Lam <leo@leolam.fr>2021-04-12 12:49:29 +0200
committerLéo Lam <leo@leolam.fr>2021-04-12 18:16:56 +0200
commit336518049d0c1d63dbdfd9dcd55d1e84fcb5ba21 (patch)
tree76d8b451af0692be64f25d3c051a59001b5d2d9c /Source
parent136f59b434e8bdaf678f5b1888ba641e7031c568 (diff)
WiiUtils: Add helper functions to get emulated/real Bluetooth device
This adds a function to get the emulated or real Bluetooth device for an active emulation instance. This lets us deduplicate all the `ios->GetDeviceByName("/dev/usb/oh1/57e/305")` calls that are currently scattered in the codebase and ensures Bluetooth passthrough is being handled correctly. This also fixes the broken check in WiimoteCommon::UpdateSource. There was a confusion between "emulated Bluetooth" (as opposed to "real Bluetooth" aka Bluetooth passthrough) and "emulated Wiimote".
Diffstat (limited to 'Source')
-rw-r--r--Source/Core/Core/HW/Wiimote.cpp13
-rw-r--r--Source/Core/Core/Movie.cpp8
-rw-r--r--Source/Core/Core/WiiUtils.cpp22
-rw-r--r--Source/Core/Core/WiiUtils.h9
-rw-r--r--Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp15
-rw-r--r--Source/Core/DolphinQt/HotkeyScheduler.cpp13
-rw-r--r--Source/Core/DolphinQt/MainWindow.cpp7
-rw-r--r--Source/Core/DolphinQt/MenuBar.cpp8
8 files changed, 50 insertions, 45 deletions
diff --git a/Source/Core/Core/HW/Wiimote.cpp b/Source/Core/Core/HW/Wiimote.cpp
index ed4e6a7d03..f1ed84c216 100644
--- a/Source/Core/Core/HW/Wiimote.cpp
+++ b/Source/Core/Core/HW/Wiimote.cpp
@@ -16,6 +16,7 @@
#include "Core/IOS/USB/Bluetooth/WiimoteDevice.h"
#include "Core/Movie.h"
#include "Core/NetPlayClient.h"
+#include "Core/WiiUtils.h"
#include "InputCommon/ControllerEmu/ControlGroup/ControlGroup.h"
#include "InputCommon/InputConfig.h"
@@ -49,16 +50,8 @@ void SetSource(unsigned int index, WiimoteSource source)
void UpdateSource(unsigned int index)
{
- const auto ios = IOS::HLE::GetIOS();
- if (!ios)
- return;
-
- if (s_wiimote_sources[index] != WiimoteSource::Emulated)
- return;
-
- const auto bluetooth = std::static_pointer_cast<IOS::HLE::BluetoothEmuDevice>(
- ios->GetDeviceByName("/dev/usb/oh1/57e/305"));
- if (!bluetooth)
+ const auto bluetooth = WiiUtils::GetBluetoothEmuDevice();
+ if (bluetooth == nullptr)
return;
bluetooth->AccessWiimoteByIndex(index)->SetSource(GetHIDWiimoteSource(index));
diff --git a/Source/Core/Core/Movie.cpp b/Source/Core/Core/Movie.cpp
index 42bafd438d..ecb3e5b08a 100644
--- a/Source/Core/Core/Movie.cpp
+++ b/Source/Core/Core/Movie.cpp
@@ -62,6 +62,7 @@
#include "Core/IOS/USB/Bluetooth/WiimoteDevice.h"
#include "Core/NetPlayProto.h"
#include "Core/State.h"
+#include "Core/WiiUtils.h"
#include "DiscIO/Enums.h"
@@ -469,16 +470,13 @@ void ChangeWiiPads(bool instantly)
if (instantly && (s_controllers >> 4) == controllers)
return;
- const auto ios = IOS::HLE::GetIOS();
- const auto bt = ios ? std::static_pointer_cast<IOS::HLE::BluetoothEmuDevice>(
- ios->GetDeviceByName("/dev/usb/oh1/57e/305")) :
- nullptr;
+ const auto bt = WiiUtils::GetBluetoothEmuDevice();
for (int i = 0; i < MAX_WIIMOTES; ++i)
{
const bool is_using_wiimote = IsUsingWiimote(i);
WiimoteCommon::SetSource(i, is_using_wiimote ? WiimoteSource::Emulated : WiimoteSource::None);
- if (!SConfig::GetInstance().m_bt_passthrough_enabled && bt)
+ if (bt != nullptr)
bt->AccessWiimoteByIndex(i)->Activate(is_using_wiimote);
}
}
diff --git a/Source/Core/Core/WiiUtils.cpp b/Source/Core/Core/WiiUtils.cpp
index cfe11e3b28..670ddd8eeb 100644
--- a/Source/Core/Core/WiiUtils.cpp
+++ b/Source/Core/Core/WiiUtils.cpp
@@ -36,6 +36,8 @@
#include "Core/IOS/ES/Formats.h"
#include "Core/IOS/FS/FileSystem.h"
#include "Core/IOS/IOS.h"
+#include "Core/IOS/USB/Bluetooth/BTEmu.h"
+#include "Core/IOS/USB/Bluetooth/BTReal.h"
#include "Core/IOS/Uids.h"
#include "Core/SysConf.h"
#include "DiscIO/DiscExtractor.h"
@@ -957,4 +959,24 @@ bool RepairNAND(IOS::HLE::Kernel& ios)
{
return !CheckNAND(ios, true).bad;
}
+
+static std::shared_ptr<IOS::HLE::Device> GetBluetoothDevice()
+{
+ auto* ios = IOS::HLE::GetIOS();
+ return ios ? ios->GetDeviceByName("/dev/usb/oh1/57e/305") : nullptr;
+}
+
+std::shared_ptr<IOS::HLE::BluetoothEmuDevice> GetBluetoothEmuDevice()
+{
+ if (SConfig::GetInstance().m_bt_passthrough_enabled)
+ return nullptr;
+ return std::static_pointer_cast<IOS::HLE::BluetoothEmuDevice>(GetBluetoothDevice());
+}
+
+std::shared_ptr<IOS::HLE::BluetoothRealDevice> GetBluetoothRealDevice()
+{
+ if (!SConfig::GetInstance().m_bt_passthrough_enabled)
+ return nullptr;
+ return std::static_pointer_cast<IOS::HLE::BluetoothRealDevice>(GetBluetoothDevice());
+}
} // namespace WiiUtils
diff --git a/Source/Core/Core/WiiUtils.h b/Source/Core/Core/WiiUtils.h
index 29c4a380f3..631b4354b1 100644
--- a/Source/Core/Core/WiiUtils.h
+++ b/Source/Core/Core/WiiUtils.h
@@ -12,6 +12,7 @@
#include "Common/CommonTypes.h"
#include "Core/IOS/ES/Formats.h"
+#include "Core/IOS/USB/Bluetooth/BTReal.h"
// Small utility functions for common Wii related tasks.
@@ -22,6 +23,7 @@ class VolumeWAD;
namespace IOS::HLE
{
+class BluetoothEmuDevice;
class ESDevice;
class Kernel;
} // namespace IOS::HLE
@@ -101,4 +103,11 @@ struct NANDCheckResult
};
NANDCheckResult CheckNAND(IOS::HLE::Kernel& ios);
bool RepairNAND(IOS::HLE::Kernel& ios);
+
+// Get the BluetoothEmuDevice for an active emulation instance.
+// It is only safe to call this from the CPU thread.
+// Returns nullptr if we're not currently emulating a Wii game or if Bluetooth passthrough is used.
+std::shared_ptr<IOS::HLE::BluetoothEmuDevice> GetBluetoothEmuDevice();
+// Same as GetBluetoothEmuDevice, but for Bluetooth passthrough.
+std::shared_ptr<IOS::HLE::BluetoothRealDevice> GetBluetoothRealDevice();
} // namespace WiiUtils
diff --git a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp
index a871063b7e..bc3418b656 100644
--- a/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp
+++ b/Source/Core/DolphinQt/Config/WiimoteControllersWidget.cpp
@@ -24,6 +24,7 @@
#include "Core/HW/WiimoteReal/WiimoteReal.h"
#include "Core/IOS/IOS.h"
#include "Core/IOS/USB/Bluetooth/BTReal.h"
+#include "Core/WiiUtils.h"
#include "DolphinQt/Config/Mapping/MappingWindow.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
@@ -242,11 +243,9 @@ void WiimoteControllersWidget::OnBluetoothPassthroughResetPressed()
return;
}
- auto device = ios->GetDeviceByName("/dev/usb/oh1/57e/305");
+ auto device = WiiUtils::GetBluetoothRealDevice();
if (device != nullptr)
- {
- std::static_pointer_cast<IOS::HLE::BluetoothBaseDevice>(device)->TriggerSyncButtonHeldEvent();
- }
+ device->TriggerSyncButtonHeldEvent();
}
void WiimoteControllersWidget::OnBluetoothPassthroughSyncPressed()
@@ -260,13 +259,9 @@ void WiimoteControllersWidget::OnBluetoothPassthroughSyncPressed()
return;
}
- auto device = ios->GetDeviceByName("/dev/usb/oh1/57e/305");
-
+ auto device = WiiUtils::GetBluetoothRealDevice();
if (device != nullptr)
- {
- std::static_pointer_cast<IOS::HLE::BluetoothBaseDevice>(device)
- ->TriggerSyncButtonPressedEvent();
- }
+ device->TriggerSyncButtonPressedEvent();
}
void WiimoteControllersWidget::OnWiimoteRefreshPressed()
diff --git a/Source/Core/DolphinQt/HotkeyScheduler.cpp b/Source/Core/DolphinQt/HotkeyScheduler.cpp
index 7ac02353cb..30bc61aec0 100644
--- a/Source/Core/DolphinQt/HotkeyScheduler.cpp
+++ b/Source/Core/DolphinQt/HotkeyScheduler.cpp
@@ -25,7 +25,9 @@
#include "Core/HotkeyManager.h"
#include "Core/IOS/IOS.h"
#include "Core/IOS/USB/Bluetooth/BTBase.h"
+#include "Core/IOS/USB/Bluetooth/BTReal.h"
#include "Core/State.h"
+#include "Core/WiiUtils.h"
#include "DolphinQt/Settings.h"
@@ -231,15 +233,8 @@ void HotkeyScheduler::Run()
emit ToggleReadOnlyMode();
// Wiimote
- if (SConfig::GetInstance().m_bt_passthrough_enabled)
- {
- const auto ios = IOS::HLE::GetIOS();
- auto device = ios ? ios->GetDeviceByName("/dev/usb/oh1/57e/305") : nullptr;
-
- if (device != nullptr)
- std::static_pointer_cast<IOS::HLE::BluetoothBaseDevice>(device)->UpdateSyncButtonState(
- IsHotkey(HK_TRIGGER_SYNC_BUTTON, true));
- }
+ if (auto bt = WiiUtils::GetBluetoothRealDevice())
+ bt->UpdateSyncButtonState(IsHotkey(HK_TRIGGER_SYNC_BUTTON, true));
if (SConfig::GetInstance().bEnableDebugging)
{
diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp
index afe1c2a07b..3261a4b740 100644
--- a/Source/Core/DolphinQt/MainWindow.cpp
+++ b/Source/Core/DolphinQt/MainWindow.cpp
@@ -57,6 +57,7 @@
#include "Core/NetPlayProto.h"
#include "Core/NetPlayServer.h"
#include "Core/State.h"
+#include "Core/WiiUtils.h"
#include "DiscIO/NANDImporter.h"
@@ -1723,12 +1724,8 @@ void MainWindow::ShowTASInput()
void MainWindow::OnConnectWiiRemote(int id)
{
- const auto ios = IOS::HLE::GetIOS();
- if (!ios || SConfig::GetInstance().m_bt_passthrough_enabled)
- return;
Core::RunAsCPUThread([&] {
- if (const auto bt = std::static_pointer_cast<IOS::HLE::BluetoothEmuDevice>(
- ios->GetDeviceByName("/dev/usb/oh1/57e/305")))
+ if (const auto bt = WiiUtils::GetBluetoothEmuDevice())
{
const auto wm = bt->AccessWiimoteByIndex(id);
wm->Activate(!wm->IsConnected());
diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp
index 5b590abf14..38f16744ac 100644
--- a/Source/Core/DolphinQt/MenuBar.cpp
+++ b/Source/Core/DolphinQt/MenuBar.cpp
@@ -1023,12 +1023,8 @@ void MenuBar::UpdateToolsMenu(bool emulation_started)
m_perform_online_update_for_current_region->setEnabled(tmd.IsValid());
}
- const auto ios = IOS::HLE::GetIOS();
- const auto bt = ios ? std::static_pointer_cast<IOS::HLE::BluetoothEmuDevice>(
- ios->GetDeviceByName("/dev/usb/oh1/57e/305")) :
- nullptr;
- const bool enable_wiimotes =
- emulation_started && bt && !SConfig::GetInstance().m_bt_passthrough_enabled;
+ const auto bt = WiiUtils::GetBluetoothEmuDevice();
+ const bool enable_wiimotes = emulation_started && bt != nullptr;
for (std::size_t i = 0; i < m_wii_remotes.size(); i++)
{