diff --git a/Core/HLE/AtracCtx.h b/Core/HLE/AtracCtx.h index 0f5245c259..8f2bf38fda 100644 --- a/Core/HLE/AtracCtx.h +++ b/Core/HLE/AtracCtx.h @@ -216,6 +216,10 @@ public: int GetOutputChannels() const { return outputChannels_; } + void SetOutputChannels(int channels) { + // Only used for sceSas audio. To be refactored away in the future. + outputChannels_ = channels; + } int atracID_ = -1; diff --git a/Core/HLE/sceAtrac.cpp b/Core/HLE/sceAtrac.cpp index 278002c196..75fd75a430 100644 --- a/Core/HLE/sceAtrac.cpp +++ b/Core/HLE/sceAtrac.cpp @@ -1007,6 +1007,11 @@ u32 AtracSasDecodeData(int atracID, u8* outbuf, u32 outbufPtr, u32 *SamplesNum, int AtracSasGetIDByContext(u32 contextAddr) { int atracID = (int)Memory::Read_U32(contextAddr + 0xfc); + // Restored old hack here that forces outputChannels_ to 1, since sceSas expects mono output, unlike normal usage. + // This is for savestate compatibility. + // I think it would be better to simply pass in a 1 as a parameter to atrac->DecodeData in AtracSasDecodeData above. + AtracBase *atrac = getAtrac(atracID); + atrac->SetOutputChannels(1); return atracID; }