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)
{
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");
}
@ -135,7 +135,7 @@ void OpenALThread::AddData(const void* src, int 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");
alSourceQueueBuffers(m_source, 1, &buffer);

View file

@ -21,9 +21,9 @@ struct AudioInfo
void Init()
{
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.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.downMixer = CELL_AUDIO_OUT_DOWNMIXER_NONE;
}

View file

@ -94,13 +94,14 @@ void XAudio2Thread::Open(const void* src, int size)
HRESULT hr;
WORD sample_size = Ini.AudioConvertToU16.GetValue() ? sizeof(u16) : sizeof(float);
WORD channels = 8;
WAVEFORMATEX waveformatex;
waveformatex.wFormatTag = Ini.AudioConvertToU16.GetValue() ? WAVE_FORMAT_PCM : WAVE_FORMAT_IEEE_FLOAT;
waveformatex.nChannels = 2;
waveformatex.nChannels = channels;
waveformatex.nSamplesPerSec = 48000;
waveformatex.nAvgBytesPerSec = 48000 * 2 * (DWORD)sample_size;
waveformatex.nBlockAlign = 2 * sample_size;
waveformatex.nAvgBytesPerSec = 48000 * (DWORD)channels * (DWORD)sample_size;
waveformatex.nBlockAlign = channels * sample_size;
waveformatex.wBitsPerSample = sample_size * 8;
waveformatex.cbSize = 0;

View file

@ -2348,9 +2348,8 @@ void RSXThread::Task()
OnInitThread();
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();
@ -2374,8 +2373,6 @@ void RSXThread::Task()
std::this_thread::sleep_for (std::chrono::milliseconds(1)); // hack
}
is_vblank_stopped = true;
});
while (!TestDestroy()) try
@ -2383,7 +2380,7 @@ void RSXThread::Task()
if (Emu.IsStopped())
{
LOG_WARNING(RSX, "RSX thread aborted");
return;
break;
}
std::lock_guard<std::mutex> lock(m_cs_main);
@ -2402,7 +2399,7 @@ void RSXThread::Task()
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;
}
@ -2469,24 +2466,17 @@ void RSXThread::Task()
value += (count + 1) * 4;
});
}
catch (const std::string& e)
{
LOG_ERROR(RSX, "Exception: %s", e.c_str());
Emu.Pause();
}
catch (const char* e)
{
LOG_ERROR(RSX, "Exception: %s", e);
Emu.Pause();
}
while (!is_vblank_stopped)
{
std::this_thread::sleep_for (std::chrono::milliseconds(1)); // hack
}
LOG_NOTICE(RSX, "RSX thread ended");
OnExitThread();

View file

@ -54,7 +54,7 @@ s32 cellAudioInit()
const bool do_dump = Ini.AudioDumpToFile.GetValue();
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";
}
@ -62,13 +62,13 @@ s32 cellAudioInit()
float buf2ch[2 * BUFFER_SIZE]; // intermediate buffer for 2 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];
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;
@ -347,9 +347,16 @@ s32 cellAudioInit()
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.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)
{
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

View file

@ -390,7 +390,7 @@ int cellAudioOutGetSoundAvailability(u32 audioOut, u32 type, u32 fs, u32 option)
option = 0;
int available = 2; // should be at least 2
int available = 8; // should be at least 2
switch(fs)
{
@ -431,7 +431,7 @@ int cellAudioOutGetSoundAvailability2(u32 audioOut, u32 type, u32 fs, u32 ch, u3
option = 0;
int available = 2; // should be at least 2
int available = 8; // should be at least 2
switch(fs)
{
@ -578,9 +578,9 @@ int cellAudioOutGetDeviceInfo(u32 audioOut, u32 deviceIndex, vm::ptr<CellAudioOu
info->state = CELL_AUDIO_OUT_DEVICE_STATE_AVAILABLE;
info->latency = 1000;
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].layout = CELL_AUDIO_OUT_SPEAKER_LAYOUT_2CH;
info->availableModes[0].layout = CELL_AUDIO_OUT_SPEAKER_LAYOUT_8CH_LREClrxy;
return CELL_AUDIO_OUT_SUCCEEDED;
}

View file

@ -354,17 +354,13 @@ void Emulator::Stop()
SendDbgCommand(DID_STOP_EMU);
m_status = Stopped;
u32 uncounted = 0;
while (true)
while (g_thread_count)
{
if (g_thread_count <= uncounted)
{
LOG_NOTICE(HLE, "All threads stopped...");
break;
}
std::this_thread::sleep_for(std::chrono::milliseconds(1));
}
LOG_NOTICE(HLE, "All threads stopped...");
m_rsx_callback = 0;
// TODO: check finalization order