Make the mic button respect which slot it's plugged into.

*You need to open the Gamecube config page and reselect the devices in slot A and B after this commit*

Just jitil left...
This commit is contained in:
Shawn Hoffman 2011-10-09 03:18:15 -07:00
parent ceef98b882
commit 41424d98e8
12 changed files with 46 additions and 60 deletions

View File

@ -355,7 +355,7 @@ void SConfig::LoadSettings()
ini.Get("Core", "MemcardA", &m_strMemoryCardA); ini.Get("Core", "MemcardA", &m_strMemoryCardA);
ini.Get("Core", "MemcardB", &m_strMemoryCardB); ini.Get("Core", "MemcardB", &m_strMemoryCardB);
ini.Get("Core", "ReloadMemcardOnState", &b_reloadMCOnState, true); ini.Get("Core", "ReloadMemcardOnState", &b_reloadMCOnState, true);
ini.Get("Core", "SlotA", (int*)&m_EXIDevice[0], EXIDEVICE_MEMORYCARD_A); ini.Get("Core", "SlotA", (int*)&m_EXIDevice[0], EXIDEVICE_MEMORYCARD);
ini.Get("Core", "SlotB", (int*)&m_EXIDevice[1], EXIDEVICE_NONE); ini.Get("Core", "SlotB", (int*)&m_EXIDevice[1], EXIDEVICE_NONE);
ini.Get("Core", "SerialPort1", (int*)&m_EXIDevice[2], EXIDEVICE_NONE); ini.Get("Core", "SerialPort1", (int*)&m_EXIDevice[2], EXIDEVICE_NONE);
ini.Get("Core", "BBA_MAC", &m_bba_mac); ini.Get("Core", "BBA_MAC", &m_bba_mac);

View File

@ -75,18 +75,18 @@ void DoState(PointerWrap &p)
void ChangeDeviceCallback(u64 userdata, int cyclesLate) void ChangeDeviceCallback(u64 userdata, int cyclesLate)
{ {
u8 channel = (u8)(userdata >> 32); u8 channel = (u8)(userdata >> 32);
u8 device = (u8)(userdata >> 16); u8 type = (u8)(userdata >> 16);
u8 slot = (u8)userdata; u8 num = (u8)userdata;
g_Channels[channel]->AddDevice((TEXIDevices)device, slot); g_Channels[channel]->AddDevice((TEXIDevices)type, num);
} }
void ChangeDevice(u8 channel, TEXIDevices device, u8 slot) void ChangeDevice(const u8 channel, const TEXIDevices device_type, const u8 device_num)
{ {
// Called from GUI, so we need to make it thread safe. // Called from GUI, so we need to make it thread safe.
// Let the hardware see no device for .5b cycles // Let the hardware see no device for .5b cycles
CoreTiming::ScheduleEvent_Threadsafe(0, changeDevice, ((u64)channel << 32) | ((u64)EXIDEVICE_NONE << 16) | slot); CoreTiming::ScheduleEvent_Threadsafe(0, changeDevice, ((u64)channel << 32) | ((u64)EXIDEVICE_NONE << 16) | device_num);
CoreTiming::ScheduleEvent_Threadsafe(500000000, changeDevice, ((u64)channel << 32) | ((u64)device << 16) | slot); CoreTiming::ScheduleEvent_Threadsafe(500000000, changeDevice, ((u64)channel << 32) | ((u64)device_type << 16) | device_num);
} }
// Unused (?!) // Unused (?!)

View File

@ -33,7 +33,7 @@ void Update();
void UpdateInterrupts(); void UpdateInterrupts();
void ChangeDeviceCallback(u64 userdata, int cyclesLate); void ChangeDeviceCallback(u64 userdata, int cyclesLate);
void ChangeDevice(u8 channel, TEXIDevices device, u8 slot); void ChangeDevice(const u8 channel, const TEXIDevices device_type, const u8 device_num);
void Read32(u32& _uReturnValue, const u32 _iAddress); void Read32(u32& _uReturnValue, const u32 _iAddress);
void Write32(const u32 _iValue, const u32 _iAddress); void Write32(const u32 _iValue, const u32 _iAddress);

View File

@ -42,7 +42,7 @@ CEXIChannel::CEXIChannel(u32 ChannelId) :
m_Status.CHIP_SELECT = 1; m_Status.CHIP_SELECT = 1;
for (int i = 0; i < NUM_DEVICES; i++) for (int i = 0; i < NUM_DEVICES; i++)
m_pDevices[i] = EXIDevice_Create(EXIDEVICE_NONE); m_pDevices[i] = EXIDevice_Create(EXIDEVICE_NONE, i);
} }
CEXIChannel::~CEXIChannel() CEXIChannel::~CEXIChannel()
@ -59,19 +59,19 @@ void CEXIChannel::RemoveDevices()
} }
} }
void CEXIChannel::AddDevice(const TEXIDevices _device, const unsigned int _iSlot) void CEXIChannel::AddDevice(const TEXIDevices device_type, const int device_num)
{ {
_dbg_assert_(EXPANSIONINTERFACE, _iSlot < NUM_DEVICES); _dbg_assert_(EXPANSIONINTERFACE, device_num < NUM_DEVICES);
// delete the old device // delete the old device
if (m_pDevices[_iSlot] != NULL) if (m_pDevices[device_num] != NULL)
{ {
delete m_pDevices[_iSlot]; delete m_pDevices[device_num];
m_pDevices[_iSlot] = NULL; m_pDevices[device_num] = NULL;
} }
// create the new one // create the new one
m_pDevices[_iSlot] = EXIDevice_Create(_device); m_pDevices[device_num] = EXIDevice_Create(device_type, device_num);
// This means "device presence changed", software has to check // This means "device presence changed", software has to check
// m_Status.EXT to see if it is now present or not // m_Status.EXT to see if it is now present or not
@ -107,9 +107,9 @@ bool CEXIChannel::IsCausingInterrupt()
} }
} }
IEXIDevice* CEXIChannel::GetDevice(u8 _CHIP_SELECT) IEXIDevice* CEXIChannel::GetDevice(const u8 chip_select)
{ {
switch(_CHIP_SELECT) switch (chip_select)
{ {
case 1: return m_pDevices[0]; case 1: return m_pDevices[0];
case 2: return m_pDevices[1]; case 2: return m_pDevices[1];

View File

@ -112,12 +112,12 @@ private:
public: public:
// get device // get device
IEXIDevice* GetDevice(u8 _CHIP_SELECT); IEXIDevice* GetDevice(const u8 _CHIP_SELECT);
CEXIChannel(u32 ChannelId); CEXIChannel(u32 ChannelId);
~CEXIChannel(); ~CEXIChannel();
void AddDevice(const TEXIDevices _device, const unsigned int _iSlot); void AddDevice(const TEXIDevices device_type, const int device_num);
// Remove all devices // Remove all devices
void RemoveDevices(); void RemoveDevices();

View File

@ -102,20 +102,16 @@ public:
// F A C T O R Y // F A C T O R Y
IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice) IEXIDevice* EXIDevice_Create(TEXIDevices device_type, const int device_num)
{ {
switch(_EXIDevice) switch (device_type)
{ {
case EXIDEVICE_DUMMY: case EXIDEVICE_DUMMY:
return new CEXIDummy("Dummy"); return new CEXIDummy("Dummy");
break; break;
case EXIDEVICE_MEMORYCARD_A: case EXIDEVICE_MEMORYCARD:
return new CEXIMemoryCard("MemoryCardA", SConfig::GetInstance().m_strMemoryCardA, 0); return new CEXIMemoryCard(device_num);
break;
case EXIDEVICE_MEMORYCARD_B:
return new CEXIMemoryCard("MemoryCardB", SConfig::GetInstance().m_strMemoryCardB, 1);
break; break;
case EXIDEVICE_MASKROM: case EXIDEVICE_MASKROM:
@ -127,7 +123,7 @@ IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice)
break; break;
case EXIDEVICE_MIC: case EXIDEVICE_MIC:
return new CEXIMic(); return new CEXIMic(device_num);
break; break;
case EXIDEVICE_ETH: case EXIDEVICE_ETH:

View File

@ -53,8 +53,7 @@ public:
enum TEXIDevices enum TEXIDevices
{ {
EXIDEVICE_DUMMY, EXIDEVICE_DUMMY,
EXIDEVICE_MEMORYCARD_A, EXIDEVICE_MEMORYCARD,
EXIDEVICE_MEMORYCARD_B,
EXIDEVICE_MASKROM, EXIDEVICE_MASKROM,
EXIDEVICE_AD16, EXIDEVICE_AD16,
EXIDEVICE_MIC, EXIDEVICE_MIC,
@ -64,6 +63,6 @@ enum TEXIDevices
EXIDEVICE_NONE = (u8)-1 EXIDEVICE_NONE = (u8)-1
}; };
extern IEXIDevice* EXIDevice_Create(TEXIDevices _EXIDevice); extern IEXIDevice* EXIDevice_Create(const TEXIDevices device_type, const int device_num);
#endif #endif

View File

@ -43,13 +43,13 @@ void CEXIMemoryCard::FlushCallback(u64 userdata, int cyclesLate)
ptr->Flush(); ptr->Flush();
} }
CEXIMemoryCard::CEXIMemoryCard(const std::string& _rName, const std::string& _rFilename, int _card_index) : CEXIMemoryCard::CEXIMemoryCard(const int index)
m_strFilename(_rFilename), : card_index(index)
card_index(_card_index), , m_bDirty(false)
m_bDirty(false)
{ {
cards[_card_index] = this; m_strFilename = (card_index == 0) ? SConfig::GetInstance().m_strMemoryCardA : SConfig::GetInstance().m_strMemoryCardB;
et_this_card = CoreTiming::RegisterEvent(_rName.c_str(), FlushCallback); cards[card_index] = this;
et_this_card = CoreTiming::RegisterEvent((card_index == 0) ? "memcardA" : "memcardB", FlushCallback);
reloadOnState = SConfig::GetInstance().b_reloadMCOnState; reloadOnState = SConfig::GetInstance().b_reloadMCOnState;
interruptSwitch = 0; interruptSwitch = 0;
@ -426,9 +426,6 @@ void CEXIMemoryCard::DoState(PointerWrap &p)
{ {
if (reloadOnState) if (reloadOnState)
{ {
int slot = 0; ExpansionInterface::ChangeDevice(card_index, EXIDEVICE_MEMORYCARD, 0);
if (GetFileName() == SConfig::GetInstance().m_strMemoryCardA)
slot = 1;
ExpansionInterface::ChangeDevice(slot, slot ? EXIDEVICE_MEMORYCARD_B : EXIDEVICE_MEMORYCARD_A, 0);
} }
} }

View File

@ -32,7 +32,7 @@ struct FlushData
class CEXIMemoryCard : public IEXIDevice class CEXIMemoryCard : public IEXIDevice
{ {
public: public:
CEXIMemoryCard(const std::string& _rName, const std::string& _rFilename, int card_index); CEXIMemoryCard(const int index);
virtual ~CEXIMemoryCard(); virtual ~CEXIMemoryCard();
void SetCS(int cs); void SetCS(int cs);
void Update(); void Update();
@ -40,8 +40,6 @@ public:
bool IsPresent(); bool IsPresent();
void DoState(PointerWrap &p); void DoState(PointerWrap &p);
inline const std::string &GetFileName() const { return m_strFilename; };
private: private:
// This is scheduled whenever a page write is issued. The this pointer is passed // This is scheduled whenever a page write is issued. The this pointer is passed
// through the userdata parameter, so that it can then call Flush on the right card. // through the userdata parameter, so that it can then call Flush on the right card.

View File

@ -19,9 +19,6 @@
#if HAVE_PORTAUDIO #if HAVE_PORTAUDIO
#include "FileUtil.h"
#include "StringUtil.h"
#include "../Core.h"
#include "../CoreTiming.h" #include "../CoreTiming.h"
#include "SystemTimers.h" #include "SystemTimers.h"
@ -30,7 +27,6 @@
#include <portaudio.h> #include <portaudio.h>
#include "GCPadStatus.h"
#include "GCPad.h" #include "GCPad.h"
static bool pa_init = false; static bool pa_init = false;
@ -128,7 +124,8 @@ void CEXIMic::StreamReadOne()
u8 const CEXIMic::exi_id[] = { 0, 0x0a, 0, 0, 0 }; u8 const CEXIMic::exi_id[] = { 0, 0x0a, 0, 0, 0 };
int CEXIMic::mic_count = 0; int CEXIMic::mic_count = 0;
CEXIMic::CEXIMic() CEXIMic::CEXIMic(int index)
: slot(index)
{ {
m_position = 0; m_position = 0;
command = 0; command = 0;
@ -207,13 +204,11 @@ void CEXIMic::TransferByte(u8 &byte)
case cmdGetStatus: case cmdGetStatus:
if (pos == 0) if (pos == 0)
{ status.button = Pad::GetMicButton(slot);
status.button = Pad::GetMicButton(0); // TODO: slot A/B -> 0/1
}
byte = status.U8[pos ^ 1]; byte = status.U8[pos ^ 1];
if (pos == 1 && status.buff_ovrflw) if (pos == 1)
status.buff_ovrflw = 0; status.buff_ovrflw = 0;
break; break;

View File

@ -23,7 +23,7 @@
class CEXIMic : public IEXIDevice class CEXIMic : public IEXIDevice
{ {
public: public:
CEXIMic(); CEXIMic(const int index);
virtual ~CEXIMic(); virtual ~CEXIMic();
void SetCS(int cs); void SetCS(int cs);
bool IsInterruptSet(); bool IsInterruptSet();
@ -46,6 +46,8 @@ private:
}; };
// STATE_TO_SAVE // STATE_TO_SAVE
int slot;
u32 m_position; u32 m_position;
int command; int command;
union UStatus union UStatus
@ -101,7 +103,7 @@ protected:
class CEXIMic : public IEXIDevice class CEXIMic : public IEXIDevice
{ {
public: public:
CEXIMic() {} CEXIMic(const int) {}
}; };
#endif #endif

View File

@ -406,8 +406,7 @@ void CConfigMain::InitializeGUIValues()
case EXIDEVICE_NONE: case EXIDEVICE_NONE:
GCEXIDevice[i]->SetStringSelection(SlotDevices[0]); GCEXIDevice[i]->SetStringSelection(SlotDevices[0]);
break; break;
case EXIDEVICE_MEMORYCARD_A: case EXIDEVICE_MEMORYCARD:
case EXIDEVICE_MEMORYCARD_B:
isMemcard = GCEXIDevice[i]->SetStringSelection(SlotDevices[2]); isMemcard = GCEXIDevice[i]->SetStringSelection(SlotDevices[2]);
break; break;
case EXIDEVICE_MIC: case EXIDEVICE_MIC:
@ -1030,7 +1029,7 @@ void CConfigMain::ChooseMemcardPath(std::string& strMemcard, bool isSlotA)
// Change memcard to the new file // Change memcard to the new file
ExpansionInterface::ChangeDevice( ExpansionInterface::ChangeDevice(
isSlotA ? 0 : 1, // SlotA: channel 0, SlotB channel 1 isSlotA ? 0 : 1, // SlotA: channel 0, SlotB channel 1
isSlotA ? EXIDEVICE_MEMORYCARD_A : EXIDEVICE_MEMORYCARD_B, EXIDEVICE_MEMORYCARD,
0); // SP1 is device 2, slots are device 0 0); // SP1 is device 2, slots are device 0
} }
} }
@ -1068,7 +1067,7 @@ void CConfigMain::ChooseEXIDevice(std::string deviceName, int deviceNum)
TEXIDevices tempType; TEXIDevices tempType;
if (!deviceName.compare(CSTR_TRANS(EXIDEV_MEMCARD_STR))) if (!deviceName.compare(CSTR_TRANS(EXIDEV_MEMCARD_STR)))
tempType = deviceNum ? EXIDEVICE_MEMORYCARD_B : EXIDEVICE_MEMORYCARD_A; tempType = EXIDEVICE_MEMORYCARD;
else if (!deviceName.compare(CSTR_TRANS(EXIDEV_MIC_STR))) else if (!deviceName.compare(CSTR_TRANS(EXIDEV_MIC_STR)))
tempType = EXIDEVICE_MIC; tempType = EXIDEVICE_MIC;
else if (!deviceName.compare(EXIDEV_BBA_STR)) else if (!deviceName.compare(EXIDEV_BBA_STR))
@ -1083,7 +1082,7 @@ void CConfigMain::ChooseEXIDevice(std::string deviceName, int deviceNum)
tempType = EXIDEVICE_DUMMY; tempType = EXIDEVICE_DUMMY;
// Gray out the memcard path button if we're not on a memcard // Gray out the memcard path button if we're not on a memcard
if (tempType == EXIDEVICE_MEMORYCARD_A || tempType == EXIDEVICE_MEMORYCARD_B) if (tempType == EXIDEVICE_MEMORYCARD)
GCMemcardPath[deviceNum]->Enable(); GCMemcardPath[deviceNum]->Enable();
else if (deviceNum == 0 || deviceNum == 1) else if (deviceNum == 0 || deviceNum == 1)
GCMemcardPath[deviceNum]->Disable(); GCMemcardPath[deviceNum]->Disable();