diff --git a/rpcs3/Emu/Audio/sysutil_audio.h b/rpcs3/Emu/Audio/sysutil_audio.h index b8c1061e54..ea470c4779 100644 --- a/rpcs3/Emu/Audio/sysutil_audio.h +++ b/rpcs3/Emu/Audio/sysutil_audio.h @@ -158,7 +158,7 @@ struct CellAudioOutConfiguration u8 channel; u8 encoder; u8 reserved[10]; - u32 downMixer; + be_t downMixer; }; struct CellAudioOutSoundMode @@ -167,7 +167,7 @@ struct CellAudioOutSoundMode u8 channel; u8 fs; u8 reserved; - u32 layout; + be_t layout; }; struct CellAudioOutDeviceInfo @@ -175,9 +175,9 @@ struct CellAudioOutDeviceInfo u8 portType; u8 availableModeCount; u8 state; - u8 reserved[3]; - u16 latency; - CellAudioOutSoundMode availableModes[16]; + u8 reserved[3]; + be_t latency; + CellAudioOutSoundMode availableModes[16]; }; struct CellAudioOutState @@ -185,7 +185,7 @@ struct CellAudioOutState u8 state; u8 encoder; u8 reserved[6]; - u32 downMixer; + be_t downMixer; CellAudioOutSoundMode soundMode; }; @@ -193,7 +193,7 @@ struct CellAudioOutSoundMode2 { u8 type; u8 channel; - u16 fs; + be_t fs; u8 reserved[4]; }; @@ -204,8 +204,8 @@ struct CellAudioOutDeviceInfo2 u8 state; u8 deviceNumber; u8 reserved[12]; - u64 deviceId; - u64 type; + be_t deviceId; + be_t type; char name[64]; CellAudioOutSoundMode2 availableModes2[16]; }; @@ -229,7 +229,7 @@ struct CellAudioInSoundMode { u8 type; u8 channel; - u16 fs; + be_t fs; u8 reserved[4]; }; @@ -240,8 +240,8 @@ struct CellAudioInDeviceInfo u8 state; u8 deviceNumber; u8 reserved[12]; - u64 deviceId; - u64 type; + be_t deviceId; + be_t type; char name[64]; CellAudioInSoundMode availableModes[16]; }; diff --git a/rpcs3/Emu/CPU/CPUThread.cpp b/rpcs3/Emu/CPU/CPUThread.cpp index 1e881bcd91..dff8da61f6 100644 --- a/rpcs3/Emu/CPU/CPUThread.cpp +++ b/rpcs3/Emu/CPU/CPUThread.cpp @@ -96,7 +96,7 @@ bool CPUThread::Sync() int CPUThread::ThreadStatus() { - if(Emu.IsStopped() || IsStopped() ) + if (Emu.IsStopped() || IsStopped()) { return CPUThread_Stopped; } @@ -106,12 +106,12 @@ int CPUThread::ThreadStatus() return CPUThread_Step; } - if (TestDestroy()) + if (TestDestroy() || IsPaused()) { return CPUThread_Break; } - if(Emu.IsPaused() || Sync()) + if (Emu.IsPaused() || Sync()) { return CPUThread_Sleeping; } diff --git a/rpcs3/Emu/Cell/SPUInterpreter.h b/rpcs3/Emu/Cell/SPUInterpreter.h index 361e8c7e27..2f087d0fac 100644 --- a/rpcs3/Emu/Cell/SPUInterpreter.h +++ b/rpcs3/Emu/Cell/SPUInterpreter.h @@ -32,8 +32,11 @@ private: //0 - 10 void STOP(u32 code) { - ConLog.Warning("STOP: 0x%x (m_exit_status -> 0)", code); - CPU.SetExitStatus(0); + if (CPU.SPU.Out_MBox.GetCount()) // the real exit status is probably stored there + ConLog.Warning("STOP: 0x%x (message=0x%x)", code, CPU.SPU.Out_MBox.GetValue()); + else + ConLog.Warning("STOP: 0x%x (no message)", code); + CPU.SetExitStatus(code); CPU.Stop(); } void LNOP() diff --git a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp index e8a886f930..8cf5a2bbe6 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellAudio.cpp @@ -91,7 +91,7 @@ struct AudioPortConfig AudioPortConfig(); - ~AudioPortConfig(); + void finalize(); }; struct AudioConfig //custom structure @@ -127,15 +127,15 @@ struct AudioConfig //custom structure AudioPortConfig::AudioPortConfig() : m_is_audio_port_started(false) - , m_buffer(Memory.Alloc(1024 * 128, 1024)) - , m_index(Memory.Alloc(16, 16)) + , m_buffer(Memory.Alloc(1024 * 128, 1024)) // max 128K size + , m_index(Memory.Alloc(16, 16)) // allocation for u64 value "read index" { m_config.m_port_in_use++; mem64_t index(m_index); index = 0; } -AudioPortConfig::~AudioPortConfig() +void AudioPortConfig::finalize() { m_config.m_port_in_use--; Memory.Free(m_buffer); @@ -330,12 +330,11 @@ int cellAudioGetPortConfig(u32 portNum, mem_ptr_t portConfi portConfig->status = CELL_AUDIO_STATUS_READY; portConfig->nChannel = ref.nChannel; portConfig->nBlock = ref.nBlock; - portConfig->portSize = ref.nChannel * ref.nBlock * 256; + portConfig->portSize = ref.nChannel * ref.nBlock * 256 * sizeof(float); portConfig->portAddr = m_config.m_ports[portNum]->m_buffer; // 0x20020000 portConfig->readIndexAddr = m_config.m_ports[portNum]->m_index; // 0x20010010 on ps3 // portAddr - readIndexAddr == 0xFFF0 on ps3 - // Memory.Write64(portConfig->readIndexAddr, 1); } return CELL_OK; @@ -361,6 +360,25 @@ int cellAudioPortStart(u32 portNum) } m_config.m_ports[portNum]->m_is_audio_port_started = true; + + std::string t_name = "AudioPort0"; + t_name[9] += portNum; + + thread t(t_name, [portNum]() + { + AudioPortConfig& ref = *m_config.m_ports[portNum]; + mem64_t index(ref.m_index); + + ConLog.Write("Port started"); + while (ref.m_is_audio_port_started && !Emu.IsStopped()) + { + Sleep(5); + index = (index.GetValue() + 1) % ref.m_param.nBlock; + } + ConLog.Write("Port finished"); + }); + t.detach(); + return CELL_OK; } @@ -378,8 +396,8 @@ int cellAudioPortClose(u32 portNum) return CELL_AUDIO_ERROR_PORT_NOT_OPEN; } - delete m_config.m_ports[portNum]; - m_config.m_ports[portNum] = nullptr; + m_config.m_ports[portNum]->finalize(); + safe_delete(m_config.m_ports[portNum]); return CELL_OK; } @@ -402,7 +420,7 @@ int cellAudioPortStop(u32 portNum) return CELL_AUDIO_ERROR_PORT_NOT_RUN; } - m_config.m_ports[portNum]->m_is_audio_port_started = false; + m_config.m_ports[portNum]->m_is_audio_port_started = false; return CELL_OK; } @@ -449,7 +467,7 @@ int cellAudioSetNotifyEventQueue(u64 key) return CELL_AUDIO_ERROR_PARAM; } - eq->events.push(0, 0, 0, 0); + // eq->events.push(0, 0, 0, 0); return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp index cfa5459a24..f30fbc0e98 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellResc.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellResc.cpp @@ -713,7 +713,7 @@ int cellRescSetConvertAndFlip(mem_ptr_t cntxt, s32 idx) int cellRescSetWaitFlip() { cellResc.Log("cellRescSetWaitFlip()"); - GSLockCurrent lock(GS_LOCK_WAIT_FLIP); + GSLockCurrent lock(GS_LOCK_WAIT_FLIP); // could stall on exit return CELL_OK; } diff --git a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp index 4b13707b9a..2c16b024ec 100644 --- a/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp +++ b/rpcs3/Emu/SysCalls/Modules/cellSysutil.cpp @@ -641,11 +641,13 @@ int cellMsgDialogOpenErrorCode(u32 errorCode, mem_func_ptr_t config, mem_ptr_t option, u32 waitForEvent) { - cellSysutil.Warning("cellAudioOutConfigure(audioOut=%d, config_addr=0x%x, option_addr=0x%x, waitForEvent=0x%x)", - audioOut, config_addr, option_addr, waitForEvent); + cellSysutil.Warning("cellAudioOutConfigure(audioOut=%d, config_addr=0x%x, option_addr=0x%x, (!)waitForEvent=%d)", + audioOut, config.GetAddr(), option.GetAddr(), waitForEvent); - if(!Memory.IsGoodAddr(config_addr, sizeof(CellAudioOutConfiguration))) + if (!config.IsGood()) { return CELL_EFAULT; } - CellAudioOutConfiguration& config = (CellAudioOutConfiguration&)Memory[config_addr]; - switch(audioOut) { case CELL_AUDIO_OUT_PRIMARY: - if(config.channel) + if (config->channel) { - Emu.GetAudioManager().GetInfo().mode.channel = config.channel; + Emu.GetAudioManager().GetInfo().mode.channel = config->channel; } - Emu.GetAudioManager().GetInfo().mode.encoder = config.encoder; + Emu.GetAudioManager().GetInfo().mode.encoder = config->encoder; - if(config.downMixer) + if(config->downMixer) { - Emu.GetAudioManager().GetInfo().mode.downMixer = config.downMixer; + Emu.GetAudioManager().GetInfo().mode.downMixer = config->downMixer; } return CELL_AUDIO_OUT_SUCCEEDED;