From 883d60fad3d4349fb3a2bd6e7e158ff3cec6a23e Mon Sep 17 00:00:00 2001 From: oioitff Date: Sun, 9 Jun 2013 01:58:06 +0800 Subject: [PATCH] Use a pointer for sampleQueue in SasAtrac3. --- Core/HW/SasAudio.cpp | 13 +++++++++---- Core/HW/SasAudio.h | 5 +++-- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/Core/HW/SasAudio.cpp b/Core/HW/SasAudio.cpp index c4ad931237..88f6181acf 100644 --- a/Core/HW/SasAudio.cpp +++ b/Core/HW/SasAudio.cpp @@ -156,7 +156,9 @@ void VagDecoder::DoState(PointerWrap &p) int SasAtrac3::setContext(u32 context) { contextAddr = context; atracID = _AtracGetIDByContext(context); - sampleQueue.clear(); + if (!sampleQueue) + sampleQueue = new Atrac3plus_Decoder::BufferQueue; + sampleQueue->clear(); return 0; } @@ -165,23 +167,26 @@ int SasAtrac3::getNextSamples(s16* outbuf, int wantedSamples) { return -1; u32 finish = 0; int wantedbytes = wantedSamples * sizeof(s16); - while (!finish && sampleQueue.getQueueSize() < wantedbytes) { + while (!finish && sampleQueue->getQueueSize() < wantedbytes) { u32 numSamples = 0; int remains = 0; static s16 buf[0x800]; _AtracDecodeData(atracID, (u8*)buf, &numSamples, &finish, &remains); if (numSamples > 0) - sampleQueue.push((u8*)buf, numSamples * sizeof(s16)); + sampleQueue->push((u8*)buf, numSamples * sizeof(s16)); else finish = 1; } - sampleQueue.pop_front((u8*)outbuf, wantedbytes); + sampleQueue->pop_front((u8*)outbuf, wantedbytes); return finish; } void SasAtrac3::DoState(PointerWrap &p) { p.Do(contextAddr); p.Do(atracID); + if (p.mode == p.MODE_READ && atracID >= 0 && !sampleQueue) { + sampleQueue = new Atrac3plus_Decoder::BufferQueue; + } } // http://code.google.com/p/jpcsp/source/browse/trunk/src/jpcsp/HLE/modules150/sceSasCore.java diff --git a/Core/HW/SasAudio.h b/Core/HW/SasAudio.h index 5e6916e263..0026053d87 100644 --- a/Core/HW/SasAudio.h +++ b/Core/HW/SasAudio.h @@ -110,14 +110,15 @@ private: class SasAtrac3 { public: - SasAtrac3() : contextAddr(0), atracID(-1){} + SasAtrac3() : contextAddr(0), atracID(-1), sampleQueue(0){} + ~SasAtrac3() { if (sampleQueue) delete sampleQueue; } int setContext(u32 context); int getNextSamples(s16* outbuf, int wantedSamples); void DoState(PointerWrap &p); private: u32 contextAddr; int atracID; - Atrac3plus_Decoder::BufferQueue sampleQueue; + Atrac3plus_Decoder::BufferQueue *sampleQueue; }; // Max height: 0x40000000 I think