mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-07 23:41:26 +12:00
Audio format changed to 8ch
This commit is contained in:
parent
011362bf1c
commit
d557ba2d97
7 changed files with 34 additions and 40 deletions
|
@ -100,7 +100,7 @@ void OpenALThread::Open(const void* src, int size)
|
||||||
|
|
||||||
for (uint i = 0; i<g_al_buffers_count; ++i)
|
for (uint i = 0; i<g_al_buffers_count; ++i)
|
||||||
{
|
{
|
||||||
alBufferData(m_buffers[i], Ini.AudioConvertToU16.GetValue() ? AL_FORMAT_STEREO16 : AL_FORMAT_STEREO_FLOAT32, src, m_buffer_size, 48000);
|
alBufferData(m_buffers[i], Ini.AudioConvertToU16.GetValue() ? AL_FORMAT_71CHN16 : AL_FORMAT_71CHN32, src, m_buffer_size, 48000);
|
||||||
checkForAlError("alBufferData");
|
checkForAlError("alBufferData");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,7 +135,7 @@ void OpenALThread::AddData(const void* src, int size)
|
||||||
|
|
||||||
int bsize = size < m_buffer_size ? size : m_buffer_size;
|
int bsize = size < m_buffer_size ? size : m_buffer_size;
|
||||||
|
|
||||||
alBufferData(buffer, Ini.AudioConvertToU16.GetValue() ? AL_FORMAT_STEREO16 : AL_FORMAT_STEREO_FLOAT32, bsrc, bsize, 48000);
|
alBufferData(buffer, Ini.AudioConvertToU16.GetValue() ? AL_FORMAT_71CHN16 : AL_FORMAT_71CHN32, bsrc, bsize, 48000);
|
||||||
checkForAlError("alBufferData");
|
checkForAlError("alBufferData");
|
||||||
|
|
||||||
alSourceQueueBuffers(m_source, 1, &buffer);
|
alSourceQueueBuffers(m_source, 1, &buffer);
|
||||||
|
|
|
@ -21,9 +21,9 @@ struct AudioInfo
|
||||||
void Init()
|
void Init()
|
||||||
{
|
{
|
||||||
mode.type = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
|
mode.type = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
|
||||||
mode.channel = CELL_AUDIO_OUT_CHNUM_2;
|
mode.channel = CELL_AUDIO_OUT_CHNUM_8;
|
||||||
mode.fs = CELL_AUDIO_OUT_FS_48KHZ;
|
mode.fs = CELL_AUDIO_OUT_FS_48KHZ;
|
||||||
mode.layout = CELL_AUDIO_OUT_SPEAKER_LAYOUT_2CH;
|
mode.layout = CELL_AUDIO_OUT_SPEAKER_LAYOUT_8CH_LREClrxy;
|
||||||
mode.encoder = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
|
mode.encoder = CELL_AUDIO_OUT_CODING_TYPE_LPCM;
|
||||||
mode.downMixer = CELL_AUDIO_OUT_DOWNMIXER_NONE;
|
mode.downMixer = CELL_AUDIO_OUT_DOWNMIXER_NONE;
|
||||||
}
|
}
|
||||||
|
|
|
@ -94,13 +94,14 @@ void XAudio2Thread::Open(const void* src, int size)
|
||||||
HRESULT hr;
|
HRESULT hr;
|
||||||
|
|
||||||
WORD sample_size = Ini.AudioConvertToU16.GetValue() ? sizeof(u16) : sizeof(float);
|
WORD sample_size = Ini.AudioConvertToU16.GetValue() ? sizeof(u16) : sizeof(float);
|
||||||
|
WORD channels = 8;
|
||||||
|
|
||||||
WAVEFORMATEX waveformatex;
|
WAVEFORMATEX waveformatex;
|
||||||
waveformatex.wFormatTag = Ini.AudioConvertToU16.GetValue() ? WAVE_FORMAT_PCM : WAVE_FORMAT_IEEE_FLOAT;
|
waveformatex.wFormatTag = Ini.AudioConvertToU16.GetValue() ? WAVE_FORMAT_PCM : WAVE_FORMAT_IEEE_FLOAT;
|
||||||
waveformatex.nChannels = 2;
|
waveformatex.nChannels = channels;
|
||||||
waveformatex.nSamplesPerSec = 48000;
|
waveformatex.nSamplesPerSec = 48000;
|
||||||
waveformatex.nAvgBytesPerSec = 48000 * 2 * (DWORD)sample_size;
|
waveformatex.nAvgBytesPerSec = 48000 * (DWORD)channels * (DWORD)sample_size;
|
||||||
waveformatex.nBlockAlign = 2 * sample_size;
|
waveformatex.nBlockAlign = channels * sample_size;
|
||||||
waveformatex.wBitsPerSample = sample_size * 8;
|
waveformatex.wBitsPerSample = sample_size * 8;
|
||||||
waveformatex.cbSize = 0;
|
waveformatex.cbSize = 0;
|
||||||
|
|
||||||
|
|
|
@ -2348,9 +2348,8 @@ void RSXThread::Task()
|
||||||
OnInitThread();
|
OnInitThread();
|
||||||
|
|
||||||
m_last_flip_time = get_system_time() - 1000000;
|
m_last_flip_time = get_system_time() - 1000000;
|
||||||
volatile bool is_vblank_stopped = false;
|
|
||||||
|
|
||||||
thread_t vblank("VBlank thread", [&]()
|
thread_t vblank("VBlank thread", true /* autojoin */, [this]()
|
||||||
{
|
{
|
||||||
const u64 start_time = get_system_time();
|
const u64 start_time = get_system_time();
|
||||||
|
|
||||||
|
@ -2374,8 +2373,6 @@ void RSXThread::Task()
|
||||||
|
|
||||||
std::this_thread::sleep_for (std::chrono::milliseconds(1)); // hack
|
std::this_thread::sleep_for (std::chrono::milliseconds(1)); // hack
|
||||||
}
|
}
|
||||||
|
|
||||||
is_vblank_stopped = true;
|
|
||||||
});
|
});
|
||||||
|
|
||||||
while (!TestDestroy()) try
|
while (!TestDestroy()) try
|
||||||
|
@ -2383,7 +2380,7 @@ void RSXThread::Task()
|
||||||
if (Emu.IsStopped())
|
if (Emu.IsStopped())
|
||||||
{
|
{
|
||||||
LOG_WARNING(RSX, "RSX thread aborted");
|
LOG_WARNING(RSX, "RSX thread aborted");
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
std::lock_guard<std::mutex> lock(m_cs_main);
|
std::lock_guard<std::mutex> lock(m_cs_main);
|
||||||
|
|
||||||
|
@ -2469,24 +2466,17 @@ void RSXThread::Task()
|
||||||
value += (count + 1) * 4;
|
value += (count + 1) * 4;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (const std::string& e)
|
catch (const std::string& e)
|
||||||
{
|
{
|
||||||
LOG_ERROR(RSX, "Exception: %s", e.c_str());
|
LOG_ERROR(RSX, "Exception: %s", e.c_str());
|
||||||
Emu.Pause();
|
Emu.Pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
catch (const char* e)
|
catch (const char* e)
|
||||||
{
|
{
|
||||||
LOG_ERROR(RSX, "Exception: %s", e);
|
LOG_ERROR(RSX, "Exception: %s", e);
|
||||||
Emu.Pause();
|
Emu.Pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
while (!is_vblank_stopped)
|
|
||||||
{
|
|
||||||
std::this_thread::sleep_for (std::chrono::milliseconds(1)); // hack
|
|
||||||
}
|
|
||||||
|
|
||||||
LOG_NOTICE(RSX, "RSX thread ended");
|
LOG_NOTICE(RSX, "RSX thread ended");
|
||||||
|
|
||||||
OnExitThread();
|
OnExitThread();
|
||||||
|
|
|
@ -54,7 +54,7 @@ s32 cellAudioInit()
|
||||||
const bool do_dump = Ini.AudioDumpToFile.GetValue();
|
const bool do_dump = Ini.AudioDumpToFile.GetValue();
|
||||||
|
|
||||||
AudioDumper m_dump;
|
AudioDumper m_dump;
|
||||||
if (do_dump && !m_dump.Init(8)) // Init AudioDumper for 8 channels
|
if (do_dump && !m_dump.Init(2)) // Init AudioDumper for 2 channels
|
||||||
{
|
{
|
||||||
throw "AudioDumper::Init() failed";
|
throw "AudioDumper::Init() failed";
|
||||||
}
|
}
|
||||||
|
@ -62,13 +62,13 @@ s32 cellAudioInit()
|
||||||
float buf2ch[2 * BUFFER_SIZE]; // intermediate buffer for 2 channels
|
float buf2ch[2 * BUFFER_SIZE]; // intermediate buffer for 2 channels
|
||||||
float buf8ch[8 * BUFFER_SIZE]; // intermediate buffer for 8 channels
|
float buf8ch[8 * BUFFER_SIZE]; // intermediate buffer for 8 channels
|
||||||
|
|
||||||
static const size_t out_buffer_size = 2 * BUFFER_SIZE;
|
static const size_t out_buffer_size = 8 * BUFFER_SIZE; // output buffer for 8 channels
|
||||||
|
|
||||||
std::unique_ptr<float[]> out_buffer[BUFFER_NUM];
|
std::unique_ptr<float[]> out_buffer[BUFFER_NUM];
|
||||||
|
|
||||||
for (u32 i = 0; i < BUFFER_NUM; i++)
|
for (u32 i = 0; i < BUFFER_NUM; i++)
|
||||||
{
|
{
|
||||||
out_buffer[i].reset(new float[2 * BUFFER_SIZE] {});
|
out_buffer[i].reset(new float[out_buffer_size] {});
|
||||||
}
|
}
|
||||||
|
|
||||||
squeue_t<float*, BUFFER_NUM - 1> out_queue;
|
squeue_t<float*, BUFFER_NUM - 1> out_queue;
|
||||||
|
@ -347,9 +347,16 @@ s32 cellAudioInit()
|
||||||
|
|
||||||
if (!first_mix)
|
if (!first_mix)
|
||||||
{
|
{
|
||||||
for (u32 i = 0; i < (sizeof(buf2ch) / sizeof(float)); i++)
|
// copy output data (2 ch)
|
||||||
|
//for (u32 i = 0; i < (sizeof(buf2ch) / sizeof(float)); i++)
|
||||||
|
//{
|
||||||
|
// out_buffer[out_pos][i] = buf2ch[i];
|
||||||
|
//}
|
||||||
|
|
||||||
|
// copy output data (8 ch)
|
||||||
|
for (u32 i = 0; i < (sizeof(buf8ch) / sizeof(float)); i++)
|
||||||
{
|
{
|
||||||
out_buffer[out_pos][i] = buf2ch[i];
|
out_buffer[out_pos][i] = buf8ch[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,16 +406,16 @@ s32 cellAudioInit()
|
||||||
{
|
{
|
||||||
if (m_dump.GetCh() == 8)
|
if (m_dump.GetCh() == 8)
|
||||||
{
|
{
|
||||||
if (m_dump.WriteData(&buf8ch, sizeof(buf8ch)) != sizeof(buf8ch)) // write file data
|
if (m_dump.WriteData(&buf8ch, sizeof(buf8ch)) != sizeof(buf8ch)) // write file data (8 ch)
|
||||||
{
|
{
|
||||||
throw "AudioDumper::WriteData() failed (2 ch)";
|
throw "AudioDumper::WriteData() failed (8 ch)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (m_dump.GetCh() == 2)
|
else if (m_dump.GetCh() == 2)
|
||||||
{
|
{
|
||||||
if (m_dump.WriteData(&buf2ch, sizeof(buf2ch)) != sizeof(buf2ch)) // write file data
|
if (m_dump.WriteData(&buf2ch, sizeof(buf2ch)) != sizeof(buf2ch)) // write file data (2 ch)
|
||||||
{
|
{
|
||||||
throw "AudioDumper::WriteData() failed (8 ch)";
|
throw "AudioDumper::WriteData() failed (2 ch)";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
|
@ -390,7 +390,7 @@ int cellAudioOutGetSoundAvailability(u32 audioOut, u32 type, u32 fs, u32 option)
|
||||||
|
|
||||||
option = 0;
|
option = 0;
|
||||||
|
|
||||||
int available = 2; // should be at least 2
|
int available = 8; // should be at least 2
|
||||||
|
|
||||||
switch(fs)
|
switch(fs)
|
||||||
{
|
{
|
||||||
|
@ -431,7 +431,7 @@ int cellAudioOutGetSoundAvailability2(u32 audioOut, u32 type, u32 fs, u32 ch, u3
|
||||||
|
|
||||||
option = 0;
|
option = 0;
|
||||||
|
|
||||||
int available = 2; // should be at least 2
|
int available = 8; // should be at least 2
|
||||||
|
|
||||||
switch(fs)
|
switch(fs)
|
||||||
{
|
{
|
||||||
|
@ -578,9 +578,9 @@ int cellAudioOutGetDeviceInfo(u32 audioOut, u32 deviceIndex, vm::ptr<CellAudioOu
|
||||||
info->state = CELL_AUDIO_OUT_DEVICE_STATE_AVAILABLE;
|
info->state = CELL_AUDIO_OUT_DEVICE_STATE_AVAILABLE;
|
||||||
info->latency = 1000;
|
info->latency = 1000;
|
||||||
info->availableModes[0].type = CELL_AUDIO_IN_CODING_TYPE_LPCM;
|
info->availableModes[0].type = CELL_AUDIO_IN_CODING_TYPE_LPCM;
|
||||||
info->availableModes[0].channel = CELL_AUDIO_OUT_CHNUM_2;
|
info->availableModes[0].channel = CELL_AUDIO_OUT_CHNUM_8;
|
||||||
info->availableModes[0].fs = CELL_AUDIO_OUT_FS_48KHZ;
|
info->availableModes[0].fs = CELL_AUDIO_OUT_FS_48KHZ;
|
||||||
info->availableModes[0].layout = CELL_AUDIO_OUT_SPEAKER_LAYOUT_2CH;
|
info->availableModes[0].layout = CELL_AUDIO_OUT_SPEAKER_LAYOUT_8CH_LREClrxy;
|
||||||
|
|
||||||
return CELL_AUDIO_OUT_SUCCEEDED;
|
return CELL_AUDIO_OUT_SUCCEEDED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -354,17 +354,13 @@ void Emulator::Stop()
|
||||||
SendDbgCommand(DID_STOP_EMU);
|
SendDbgCommand(DID_STOP_EMU);
|
||||||
m_status = Stopped;
|
m_status = Stopped;
|
||||||
|
|
||||||
u32 uncounted = 0;
|
while (g_thread_count)
|
||||||
while (true)
|
|
||||||
{
|
{
|
||||||
if (g_thread_count <= uncounted)
|
|
||||||
{
|
|
||||||
LOG_NOTICE(HLE, "All threads stopped...");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
std::this_thread::sleep_for(std::chrono::milliseconds(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_NOTICE(HLE, "All threads stopped...");
|
||||||
|
|
||||||
m_rsx_callback = 0;
|
m_rsx_callback = 0;
|
||||||
|
|
||||||
// TODO: check finalization order
|
// TODO: check finalization order
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue