void CUCode_AX::StartWorking() { if (m_run_on_thread) NotifyAXThread(); else m_work_available = true; }
CUCode_AX::~CUCode_AX() { m_cmdlist_size = (u16)-1; // Special value to signal end NotifyAXThread(); m_axthread.join(); m_rMailHandler.Clear(); }
void CUCode_AX::HandleMail(u32 mail) { // Indicates if the next message is a command list address. static bool next_is_cmdlist = false; static u16 cmdlist_size = 0; bool set_next_is_cmdlist = false; // Wait for DSP processing to be done before answering any mail. This is // safe to do because it matches what the DSP does on real hardware: there // is no interrupt when a mail from CPU is received. m_processing.lock(); if (next_is_cmdlist) { CopyCmdList(mail, cmdlist_size); StartWorking(); NotifyAXThread(); } else if (m_UploadSetupInProgress) { PrepareBootUCode(mail); } else if (mail == MAIL_RESUME) { // Acknowledge the resume request m_rMailHandler.PushMail(DSP_RESUME); DSP::GenerateDSPInterruptFromDSPEmu(DSP::INT_DSP); } else if (mail == MAIL_NEW_UCODE) { soundStream->GetMixer()->SetHLEReady(false); m_UploadSetupInProgress = true; } else if (mail == MAIL_RESET) { m_DSPHLE->SetUCode(UCODE_ROM); } else if (mail == MAIL_CONTINUE) { // We don't have to do anything here - the CPU does not wait for a ACK // and sends a cmdlist mail just after. } else if ((mail & MAIL_CMDLIST_MASK) == MAIL_CMDLIST) { // A command list address is going to be sent next. set_next_is_cmdlist = true; cmdlist_size = (u16)(mail & ~MAIL_CMDLIST_MASK); } else { ERROR_LOG(DSPHLE, "Unknown mail sent to AX::HandleMail: %08x", mail); } m_processing.unlock(); next_is_cmdlist = set_next_is_cmdlist; }