mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-07-23 22:29:39 -06:00
Fixed Wii Sound
git-svn-id: https://dolphin-emu.googlecode.com/svn/trunk@1160 8ced0084-cf51-0410-be5f-012b33b47a6e
This commit is contained in:
@ -143,7 +143,7 @@ if(m_frame->ScanMails)
|
||||
{
|
||||
TmpMailLog += Msg;
|
||||
TmpMailLog += "\n";
|
||||
g_dspInitialize.pLog(Msg);
|
||||
LOG_(1, Msg);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -74,10 +74,15 @@ struct PBDpop
|
||||
s16 unknown[9];
|
||||
};
|
||||
|
||||
struct PBDpopWii
|
||||
{
|
||||
s16 unknown[12];
|
||||
};
|
||||
struct PBDpopWii
|
||||
{
|
||||
s16 unknown[12];
|
||||
};
|
||||
|
||||
struct PBDpopWii_
|
||||
{
|
||||
s16 unknown[7];
|
||||
};
|
||||
|
||||
struct PBVolumeEnvelope
|
||||
{
|
||||
@ -199,6 +204,35 @@ struct AXParamBlockWii
|
||||
/* 106 */ u16 pad[22];
|
||||
};
|
||||
|
||||
struct AXParamBlockWii_
|
||||
{
|
||||
u16 next_pb_hi;
|
||||
u16 next_pb_lo;
|
||||
|
||||
u16 this_pb_hi;
|
||||
u16 this_pb_lo;
|
||||
|
||||
u16 src_type; // Type of sample rate converter (none, ?, linear)
|
||||
u16 coef_select;
|
||||
u32 mixer_control;
|
||||
|
||||
u16 running; // 1=RUN 0=STOP
|
||||
u16 is_stream; // 1 = stream, 0 = one shot
|
||||
|
||||
/* 10 */ PBMixerWii mixer;
|
||||
/* 34 */ PBInitialTimeDelay initial_time_delay;
|
||||
/* 41 */ PBUpdatesWii updates;
|
||||
/* 46 */ PBDpopWii_ dpop;
|
||||
/* 53 */ PBVolumeEnvelope vol_env;
|
||||
/* 55 */ PBAudioAddr audio_addr;
|
||||
/* 63 */ PBADPCMInfo adpcm;
|
||||
/* 83 */ PBSampleRateConverter src;
|
||||
/* 90 */ PBADPCMLoopInfo adpcm_loop_info;
|
||||
/* 93 */ PBLpf lpf;
|
||||
/* 97 */ PBHpf hpf;
|
||||
/* 101 */ u16 pad[27];
|
||||
};
|
||||
|
||||
enum {
|
||||
AUDIOFORMAT_ADPCM = 0,
|
||||
AUDIOFORMAT_PCM8 = 0x19,
|
||||
|
@ -15,6 +15,8 @@
|
||||
// Official SVN repository and contact information can be found at
|
||||
// http://code.google.com/p/dolphin-emu/
|
||||
|
||||
#include "StringUtil.h"
|
||||
|
||||
#include "../Debugger/Debugger.h"
|
||||
#include "../Logging/Console.h" // for aprintf
|
||||
|
||||
@ -40,7 +42,7 @@ extern CDebugger * m_frame;
|
||||
// -----------
|
||||
|
||||
|
||||
CUCode_AXWii::CUCode_AXWii(CMailHandler& _rMailHandler)
|
||||
CUCode_AXWii::CUCode_AXWii(CMailHandler& _rMailHandler, u32 _CRC)
|
||||
: IUCode(_rMailHandler)
|
||||
, m_addressPBs(0xFFFFFFFF)
|
||||
{
|
||||
@ -52,6 +54,7 @@ CUCode_AXWii::CUCode_AXWii(CMailHandler& _rMailHandler)
|
||||
temprbuffer = new int[1024 * 1024];
|
||||
|
||||
lCUCode_AX = new CUCode_AX(_rMailHandler);
|
||||
_CRC = _CRC;
|
||||
}
|
||||
|
||||
CUCode_AXWii::~CUCode_AXWii()
|
||||
@ -73,70 +76,27 @@ void CUCode_AXWii::HandleMail(u32 _uMail)
|
||||
}
|
||||
}
|
||||
|
||||
int ReadOutPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num)
|
||||
{
|
||||
int count = 0;
|
||||
u32 blockAddr = pbs_address;
|
||||
u32 pAddr = 0;
|
||||
|
||||
// reading and 'halfword' swap
|
||||
for (int i = 0; i < _num; i++)
|
||||
{
|
||||
const short *pSrc = (const short *)g_dspInitialize.pGetMemoryPointer(blockAddr);
|
||||
pAddr = blockAddr;
|
||||
|
||||
if (pSrc != NULL)
|
||||
{
|
||||
short *pDest = (short *)&_pPBs[i];
|
||||
for (int p = 0; p < sizeof(AXParamBlockWii) / 2; p++)
|
||||
{
|
||||
if(p == 6 || p == 7) pDest[p] = pSrc[p]; // control for the u32
|
||||
else pDest[p] = Common::swap16(pSrc[p]);
|
||||
|
||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||
gLastBlock = blockAddr + p*2 + 2; // save last block location
|
||||
#endif
|
||||
}
|
||||
_pPBs[i].mixer_control = Common::swap32(_pPBs[i].mixer_control);
|
||||
blockAddr = (_pPBs[i].next_pb_hi << 16) | _pPBs[i].next_pb_lo;
|
||||
count++;
|
||||
|
||||
// Detect the last mail by checking when next_pb = 0
|
||||
u32 next_pb = (Common::swap16(pSrc[0]) << 16) | Common::swap16(pSrc[1]);
|
||||
if(next_pb == 0) break;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
// return the number of read PBs
|
||||
return count;
|
||||
}
|
||||
|
||||
void WriteBackPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num)
|
||||
{
|
||||
u32 blockAddr = pbs_address;
|
||||
|
||||
// write back and 'halfword'swap
|
||||
for (int i = 0; i < _num; i++)
|
||||
{
|
||||
short* pSrc = (short*)&_pPBs[i];
|
||||
short* pDest = (short*)g_dspInitialize.pGetMemoryPointer(blockAddr);
|
||||
_pPBs[i].mixer_control = Common::swap32(_pPBs[i].mixer_control);
|
||||
for (size_t p = 0; p < sizeof(AXParamBlockWii) / 2; p++)
|
||||
{
|
||||
if(p == 6 || p == 7) pDest[p] = pSrc[p]; // control for the u32
|
||||
else pDest[p] = Common::swap16(pSrc[p]);
|
||||
}
|
||||
|
||||
// next block
|
||||
blockAddr = (_pPBs[i].next_pb_hi << 16) | _pPBs[i].next_pb_lo;
|
||||
}
|
||||
}
|
||||
|
||||
void CUCode_AXWii::MixAdd(short* _pBuffer, int _iSize)
|
||||
{
|
||||
AXParamBlockWii PBs[NUMBER_OF_PBS];
|
||||
if(_CRC == 0xfa450138)
|
||||
{
|
||||
AXParamBlockWii PBs[NUMBER_OF_PBS];
|
||||
MixAdd_( _pBuffer, _iSize, PBs);
|
||||
}
|
||||
else
|
||||
{
|
||||
AXParamBlockWii_ PBs[NUMBER_OF_PBS];
|
||||
MixAdd_(_pBuffer, _iSize, PBs);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
template<class ParamBlockType>
|
||||
void CUCode_AXWii::MixAdd_(short* _pBuffer, int _iSize, ParamBlockType &PBs)
|
||||
//void CUCode_AXWii::MixAdd_(short* _pBuffer, int _iSize)
|
||||
{
|
||||
//AXParamBlockWii PBs[NUMBER_OF_PBS];
|
||||
|
||||
// read out pbs
|
||||
int numberOfPBs = ReadOutPBsWii(m_addressPBs, PBs, NUMBER_OF_PBS);
|
||||
@ -152,8 +112,41 @@ void CUCode_AXWii::MixAdd(short* _pBuffer, int _iSize)
|
||||
if (m_frame)
|
||||
{
|
||||
lCUCode_AX->Logging(_pBuffer, _iSize, 0, true);
|
||||
|
||||
// -------------------------------------------
|
||||
// Write the first block values
|
||||
int p = numberOfPBs - 1;
|
||||
if(numberOfPBs > p)
|
||||
{
|
||||
if(PBs[p].running && !m_frame->upd95)
|
||||
{
|
||||
const u32 blockAddr = (u32)(PBs[p].this_pb_hi<< 16) | PBs[p].this_pb_lo;
|
||||
const short *pSrc = (const short *)g_dspInitialize.pGetMemoryPointer(blockAddr);
|
||||
for (int i = 0; i < sizeof(AXParamBlockWii) / 2; i+=2)
|
||||
{
|
||||
if(i == 10 || i == 34 || i == 41 || i == 46 || i == 46 || i == 58 || i == 60
|
||||
|| i == 68 || i == 88 || i == 95)
|
||||
{m_frame->str0 += "\n"; m_frame->str95 += "\n";}
|
||||
|
||||
std::string line = StringFromFormat("%02i|%02i : %s : %s",
|
||||
i/2, i,
|
||||
m_frame->PBn[i].c_str(), m_frame->PBp[i].c_str()
|
||||
);
|
||||
for (int i = 0; i < 50 - line.length(); ++i)
|
||||
line += " ";
|
||||
m_frame->str0 += line;
|
||||
|
||||
m_frame->str0 += "\n";
|
||||
m_frame->str95 += StringFromFormat(" : %02i|%02i : %04x%04x\n",
|
||||
i/2, i,
|
||||
Common::swap16(pSrc[i]), Common::swap16(pSrc[i+1]));
|
||||
}
|
||||
m_frame->m_bl95->AppendText(m_frame->str95.c_str());
|
||||
m_frame->m_bl0->AppendText(m_frame->str0.c_str());
|
||||
m_frame->upd95 = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// ---------------------------------------------------------------------------------------
|
||||
// Make the updates we are told to do. This code may be buggy, TODO - fix. If multiple
|
||||
@ -188,8 +181,19 @@ void CUCode_AXWii::MixAdd(short* _pBuffer, int _iSize)
|
||||
|
||||
for (int i = 0; i < numberOfPBs; i++)
|
||||
{
|
||||
AXParamBlockWii& pb = PBs[i];
|
||||
MixAddVoice(pb, templbuffer, temprbuffer, _iSize);
|
||||
if(_CRC == 0xfa450138)
|
||||
{
|
||||
//ParamBlockType pb = PBs[i];
|
||||
//AXParamBlockWii& pb = PBs[i];
|
||||
//MixAddVoice(pb, templbuffer, temprbuffer, _iSize);
|
||||
MixAddVoice(PBs[i], templbuffer, temprbuffer, _iSize);
|
||||
}
|
||||
else
|
||||
{
|
||||
//AXParamBlockWii_& pb = PBs[i];
|
||||
//MixAddVoice(pb, templbuffer, temprbuffer, _iSize);
|
||||
MixAddVoice(PBs[i], templbuffer, temprbuffer, _iSize);
|
||||
}
|
||||
}
|
||||
|
||||
WriteBackPBsWii(m_addressPBs, PBs, numberOfPBs);
|
||||
@ -312,7 +316,7 @@ bool CUCode_AXWii::AXTask(u32& _uMail)
|
||||
mixer_HLEready = true;
|
||||
SaveLog("%08x : AXLIST PB address: %08x", uAddress, m_addressPBs);
|
||||
#ifdef _WIN32
|
||||
DebugLog("Update the SoundThread to be in sync");
|
||||
//DebugLog("Update the SoundThread to be in sync");
|
||||
DSound::DSound_UpdateSound(); //do it in this thread to avoid sync problems
|
||||
#endif
|
||||
uAddress += 4;
|
||||
|
@ -25,18 +25,20 @@
|
||||
class CUCode_AXWii : public IUCode
|
||||
{
|
||||
public:
|
||||
CUCode_AXWii(CMailHandler& _rMailHandler);
|
||||
CUCode_AXWii(CMailHandler& _rMailHandler, u32 _CRC);
|
||||
virtual ~CUCode_AXWii();
|
||||
|
||||
void HandleMail(u32 _uMail);
|
||||
void MixAdd(short* _pBuffer, int _iSize);
|
||||
template<class ParamBlockType>
|
||||
//void Logging(short* _pBuffer, int _iSize, int a, bool Wii, ParamBlockType &PBs, int numberOfPBs);
|
||||
void MixAdd_(short* _pBuffer, int _iSize, ParamBlockType &PBs);
|
||||
void Update();
|
||||
|
||||
// this is a little ugly perhaps, feel free to move it out of here
|
||||
// The logging function for the debugger
|
||||
void Logging(short* _pBuffer, int _iSize, int a);
|
||||
CUCode_AX * lCUCode_AX; // we need the logging functions in there
|
||||
|
||||
|
||||
private:
|
||||
enum
|
||||
{
|
||||
@ -45,6 +47,7 @@ private:
|
||||
|
||||
// PBs
|
||||
u32 m_addressPBs;
|
||||
u32 _CRC;
|
||||
|
||||
int *templbuffer;
|
||||
int *temprbuffer;
|
||||
@ -55,7 +58,7 @@ private:
|
||||
void SendMail(u32 _uMail);
|
||||
};
|
||||
|
||||
int ReadOutPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num);
|
||||
void WriteBackPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num);
|
||||
//int ReadOutPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num);
|
||||
//void WriteBackPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num);
|
||||
|
||||
#endif // _UCODE_AXWII
|
||||
|
@ -27,6 +27,84 @@
|
||||
extern bool gSequenced;
|
||||
extern bool gVolume;
|
||||
|
||||
|
||||
|
||||
|
||||
template<class ParamBlockType>
|
||||
inline int ReadOutPBsWii(u32 pbs_address, ParamBlockType& _pPBs, int _num)
|
||||
//int ReadOutPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num)
|
||||
{
|
||||
int count = 0;
|
||||
u32 blockAddr = pbs_address;
|
||||
u32 pAddr = 0;
|
||||
|
||||
// reading and 'halfword' swap
|
||||
for (int i = 0; i < _num; i++)
|
||||
{
|
||||
const short *pSrc = (const short *)g_dspInitialize.pGetMemoryPointer(blockAddr);
|
||||
pAddr = blockAddr;
|
||||
|
||||
if (pSrc != NULL)
|
||||
{
|
||||
short *pDest = (short *)&_pPBs[i];
|
||||
for (int p = 0; p < sizeof(AXParamBlockWii) / 2; p++)
|
||||
{
|
||||
if(p == 6 || p == 7) pDest[p] = pSrc[p]; // control for the u32
|
||||
//else if(p == 62 || p == 63 || p == 64 || p == 65 || p == 66 || p == 67)
|
||||
// pDest[p] = Common::swap16(pSrc[p-1]);
|
||||
else pDest[p] = Common::swap16(pSrc[p]);
|
||||
|
||||
#if defined(_DEBUG) || defined(DEBUGFAST)
|
||||
gLastBlock = blockAddr + p*2 + 2; // save last block location
|
||||
#endif
|
||||
}
|
||||
_pPBs[i].mixer_control = Common::swap32(_pPBs[i].mixer_control);
|
||||
blockAddr = (_pPBs[i].next_pb_hi << 16) | _pPBs[i].next_pb_lo;
|
||||
count++;
|
||||
|
||||
// Detect the last mail by checking when next_pb = 0
|
||||
u32 next_pb = (Common::swap16(pSrc[0]) << 16) | Common::swap16(pSrc[1]);
|
||||
if(next_pb == 0) break;
|
||||
}
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
// return the number of read PBs
|
||||
return count;
|
||||
}
|
||||
|
||||
template<class ParamBlockType>
|
||||
inline void WriteBackPBsWii(u32 pbs_address, ParamBlockType& _pPBs, int _num)
|
||||
//void WriteBackPBsWii(u32 pbs_address, AXParamBlockWii* _pPBs, int _num)
|
||||
{
|
||||
u32 blockAddr = pbs_address;
|
||||
|
||||
// write back and 'halfword'swap
|
||||
for (int i = 0; i < _num; i++)
|
||||
{
|
||||
short* pSrc = (short*)&_pPBs[i];
|
||||
short* pDest = (short*)g_dspInitialize.pGetMemoryPointer(blockAddr);
|
||||
_pPBs[i].mixer_control = Common::swap32(_pPBs[i].mixer_control);
|
||||
for (size_t p = 0; p < sizeof(AXParamBlockWii) / 2; p++)
|
||||
{
|
||||
if(p == 6 || p == 7) pDest[p] = pSrc[p]; // control for the u32
|
||||
//else if(p == 62 || p == 63 || p == 64 || p == 65 || p == 66 || p == 67)
|
||||
// pDest[p-1] = Common::swap16(pSrc[p]);
|
||||
else pDest[p] = Common::swap16(pSrc[p]);
|
||||
}
|
||||
|
||||
// next block
|
||||
blockAddr = (_pPBs[i].next_pb_hi << 16) | _pPBs[i].next_pb_lo;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
template<class ParamBlockType>
|
||||
inline void MixAddVoice(ParamBlockType &pb, int *templbuffer, int *temprbuffer, int _iSize)
|
||||
{
|
||||
|
@ -76,7 +76,7 @@ IUCode* UCodeFactory(u32 _CRC, CMailHandler& _rMailHandler)
|
||||
case 0x347112ba: // raving rabbits
|
||||
case 0xfa450138: // wii sports - PAL
|
||||
DebugLog("Wii - AXWii chosen");
|
||||
return new CUCode_AXWii(_rMailHandler);
|
||||
return new CUCode_AXWii(_rMailHandler, _CRC);
|
||||
|
||||
default:
|
||||
PanicAlert("Unknown ucode (CRC = %08x) - forcing AX", _CRC);
|
||||
|
Reference in New Issue
Block a user