Audio format changed to 8ch

This commit is contained in:
Nekotekina 2015-01-18 02:01:08 +03:00
parent 011362bf1c
commit d557ba2d97
7 changed files with 34 additions and 40 deletions

View file

@ -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);

View file

@ -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;
} }

View file

@ -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;

View file

@ -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);
@ -2402,7 +2399,7 @@ void RSXThread::Task()
m_sem_flush.post_and_wait(); m_sem_flush.post_and_wait();
} }
std::this_thread::sleep_for (std::chrono::milliseconds(1)); // hack std::this_thread::sleep_for(std::chrono::milliseconds(1)); // hack
continue; continue;
} }
@ -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();

View file

@ -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

View file

@ -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;
} }

View file

@ -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