mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-02-13 07:49:19 +01:00
Implement Wiimote audio output in AXWii. Not very useful yet as no sound is currently being mixed to the wiimote channels.
This commit is contained in:
parent
affdf08fd6
commit
9d85052a66
@ -105,10 +105,18 @@ void CUCode_AXWii::HandleCommandList()
|
|||||||
|
|
||||||
case CMD_UNK_0C: curr_idx += 5; break;
|
case CMD_UNK_0C: curr_idx += 5; break;
|
||||||
|
|
||||||
case CMD_UNK_0D:
|
case CMD_WM_OUTPUT:
|
||||||
// Wiimote output?
|
{
|
||||||
|
u32 addresses[4] = {
|
||||||
|
(u32)(m_cmdlist[curr_idx + 0] << 16) | m_cmdlist[curr_idx + 1],
|
||||||
|
(u32)(m_cmdlist[curr_idx + 2] << 16) | m_cmdlist[curr_idx + 3],
|
||||||
|
(u32)(m_cmdlist[curr_idx + 4] << 16) | m_cmdlist[curr_idx + 5],
|
||||||
|
(u32)(m_cmdlist[curr_idx + 6] << 16) | m_cmdlist[curr_idx + 7],
|
||||||
|
};
|
||||||
curr_idx += 8;
|
curr_idx += 8;
|
||||||
|
OutputWMSamples(addresses);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
case CMD_END:
|
case CMD_END:
|
||||||
end = true;
|
end = true;
|
||||||
@ -126,19 +134,31 @@ void CUCode_AXWii::SetupProcessing(u32 init_addr)
|
|||||||
init_data[i] = HLEMemory_Read_U16(init_addr + 2 * i);
|
init_data[i] = HLEMemory_Read_U16(init_addr + 2 * i);
|
||||||
|
|
||||||
// List of all buffers we have to initialize
|
// List of all buffers we have to initialize
|
||||||
int* buffers[] = {
|
struct {
|
||||||
m_samples_left,
|
int* ptr;
|
||||||
m_samples_right,
|
u32 samples;
|
||||||
m_samples_surround,
|
} buffers[] = {
|
||||||
m_samples_auxA_left,
|
{ m_samples_left, 32 },
|
||||||
m_samples_auxA_right,
|
{ m_samples_right, 32 },
|
||||||
m_samples_auxA_surround,
|
{ m_samples_surround, 32 },
|
||||||
m_samples_auxB_left,
|
{ m_samples_auxA_left, 32 },
|
||||||
m_samples_auxB_right,
|
{ m_samples_auxA_right, 32 },
|
||||||
m_samples_auxB_surround,
|
{ m_samples_auxA_surround, 32 },
|
||||||
m_samples_auxC_left,
|
{ m_samples_auxB_left, 32 },
|
||||||
m_samples_auxC_right,
|
{ m_samples_auxB_right, 32 },
|
||||||
m_samples_auxC_surround
|
{ m_samples_auxB_surround, 32 },
|
||||||
|
{ m_samples_auxC_left, 32 },
|
||||||
|
{ m_samples_auxC_right, 32 },
|
||||||
|
{ m_samples_auxC_surround, 32 },
|
||||||
|
|
||||||
|
{ m_samples_wm0, 6 },
|
||||||
|
{ m_samples_aux0, 6 },
|
||||||
|
{ m_samples_wm1, 6 },
|
||||||
|
{ m_samples_aux1, 6 },
|
||||||
|
{ m_samples_wm2, 6 },
|
||||||
|
{ m_samples_aux2, 6 },
|
||||||
|
{ m_samples_wm3, 6 },
|
||||||
|
{ m_samples_aux3, 6 }
|
||||||
};
|
};
|
||||||
|
|
||||||
u32 init_idx = 0;
|
u32 init_idx = 0;
|
||||||
@ -150,12 +170,12 @@ void CUCode_AXWii::SetupProcessing(u32 init_addr)
|
|||||||
init_idx += 3;
|
init_idx += 3;
|
||||||
|
|
||||||
if (!init_val)
|
if (!init_val)
|
||||||
memset(buffers[i], 0, 3 * 32 * sizeof (int));
|
memset(buffers[i].ptr, 0, 3 * buffers[i].samples * sizeof (int));
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
for (u32 j = 0; j < 3 * 32; ++j)
|
for (u32 j = 0; j < 3 * buffers[i].samples; ++j)
|
||||||
{
|
{
|
||||||
buffers[i][j] = init_val;
|
buffers[i].ptr[j] = init_val;
|
||||||
init_val += delta;
|
init_val += delta;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -313,6 +333,29 @@ void CUCode_AXWii::OutputSamples(u32 lr_addr, u32 surround_addr, u16 volume)
|
|||||||
memcpy(HLEMemory_Get_Pointer(lr_addr), buffer, sizeof (buffer));
|
memcpy(HLEMemory_Get_Pointer(lr_addr), buffer, sizeof (buffer));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CUCode_AXWii::OutputWMSamples(u32* addresses)
|
||||||
|
{
|
||||||
|
int* buffers[] = {
|
||||||
|
m_samples_wm0,
|
||||||
|
m_samples_wm1,
|
||||||
|
m_samples_wm2,
|
||||||
|
m_samples_wm3
|
||||||
|
};
|
||||||
|
|
||||||
|
for (u32 i = 0; i < 4; ++i)
|
||||||
|
{
|
||||||
|
int* in = buffers[i];
|
||||||
|
u16* out = (u16*)HLEMemory_Get_Pointer(addresses[i]);
|
||||||
|
for (u32 j = 0; j < 3 * 6; ++j)
|
||||||
|
{
|
||||||
|
int sample = in[j];
|
||||||
|
if (sample < -32767) sample = -32767;
|
||||||
|
if (sample > 32767) sample = 32767;
|
||||||
|
out[j] = Common::swap16((u16)sample);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CUCode_AXWii::DoState(PointerWrap &p)
|
void CUCode_AXWii::DoState(PointerWrap &p)
|
||||||
{
|
{
|
||||||
std::lock_guard<std::mutex> lk(m_processing);
|
std::lock_guard<std::mutex> lk(m_processing);
|
||||||
|
@ -33,6 +33,16 @@ protected:
|
|||||||
int m_samples_auxC_right[32 * 3];
|
int m_samples_auxC_right[32 * 3];
|
||||||
int m_samples_auxC_surround[32 * 3];
|
int m_samples_auxC_surround[32 * 3];
|
||||||
|
|
||||||
|
// Wiimote buffers
|
||||||
|
int m_samples_wm0[6 * 3];
|
||||||
|
int m_samples_aux0[6 * 3];
|
||||||
|
int m_samples_wm1[6 * 3];
|
||||||
|
int m_samples_aux1[6 * 3];
|
||||||
|
int m_samples_wm2[6 * 3];
|
||||||
|
int m_samples_aux2[6 * 3];
|
||||||
|
int m_samples_wm3[6 * 3];
|
||||||
|
int m_samples_aux3[6 * 3];
|
||||||
|
|
||||||
// Convert a mixer_control bitfield to our internal representation for that
|
// Convert a mixer_control bitfield to our internal representation for that
|
||||||
// value. Required because that bitfield has a different meaning in some
|
// value. Required because that bitfield has a different meaning in some
|
||||||
// versions of AX.
|
// versions of AX.
|
||||||
@ -44,6 +54,7 @@ protected:
|
|||||||
void ProcessPBList(u32 pb_addr);
|
void ProcessPBList(u32 pb_addr);
|
||||||
void MixAUXSamples(int aux_id, u32 write_addr, u32 read_addr, u16 volume);
|
void MixAUXSamples(int aux_id, u32 write_addr, u32 read_addr, u16 volume);
|
||||||
void OutputSamples(u32 lr_addr, u32 surround_addr, u16 volume);
|
void OutputSamples(u32 lr_addr, u32 surround_addr, u16 volume);
|
||||||
|
void OutputWMSamples(u32* addresses); // 4 addresses
|
||||||
|
|
||||||
private:
|
private:
|
||||||
enum CmdType
|
enum CmdType
|
||||||
@ -61,7 +72,7 @@ private:
|
|||||||
CMD_UNK_0A = 0x0A,
|
CMD_UNK_0A = 0x0A,
|
||||||
CMD_OUTPUT = 0x0B,
|
CMD_OUTPUT = 0x0B,
|
||||||
CMD_UNK_0C = 0x0C,
|
CMD_UNK_0C = 0x0C,
|
||||||
CMD_UNK_0D = 0x0D,
|
CMD_WM_OUTPUT = 0x0D,
|
||||||
CMD_END = 0x0E
|
CMD_END = 0x0E
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
Loading…
x
Reference in New Issue
Block a user