mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-03-10 01:14:22 +00:00
Fix DTK audio not working after loading a savestate
The main problem was that the volume of the mixer wasn't savestated. The volume is typically 0 at the beginning of a game, so loading a savestate at the beginning of a game would lead to silent DTK audio. I also added savestating to StreamADPCM.cpp.
This commit is contained in:
parent
5e70af1ce5
commit
b00ef39c1c
@ -8,6 +8,7 @@
|
|||||||
#include <cstring>
|
#include <cstring>
|
||||||
|
|
||||||
#include "AudioCommon/DPL2Decoder.h"
|
#include "AudioCommon/DPL2Decoder.h"
|
||||||
|
#include "Common/ChunkFile.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/Logging/Log.h"
|
#include "Common/Logging/Log.h"
|
||||||
#include "Common/MathUtil.h"
|
#include "Common/MathUtil.h"
|
||||||
@ -25,6 +26,13 @@ Mixer::~Mixer()
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mixer::DoState(PointerWrap& p)
|
||||||
|
{
|
||||||
|
m_dma_mixer.DoState(p);
|
||||||
|
m_streaming_mixer.DoState(p);
|
||||||
|
m_wiimote_speaker_mixer.DoState(p);
|
||||||
|
}
|
||||||
|
|
||||||
// Executed from sound stream thread
|
// Executed from sound stream thread
|
||||||
unsigned int Mixer::MixerFifo::Mix(short* samples, unsigned int numSamples,
|
unsigned int Mixer::MixerFifo::Mix(short* samples, unsigned int numSamples,
|
||||||
bool consider_framelimit)
|
bool consider_framelimit)
|
||||||
@ -333,6 +341,13 @@ void Mixer::StopLogDSPAudio()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Mixer::MixerFifo::DoState(PointerWrap& p)
|
||||||
|
{
|
||||||
|
p.Do(m_input_sample_rate);
|
||||||
|
p.Do(m_LVolume);
|
||||||
|
p.Do(m_RVolume);
|
||||||
|
}
|
||||||
|
|
||||||
void Mixer::MixerFifo::SetInputSampleRate(unsigned int rate)
|
void Mixer::MixerFifo::SetInputSampleRate(unsigned int rate)
|
||||||
{
|
{
|
||||||
m_input_sample_rate = rate;
|
m_input_sample_rate = rate;
|
||||||
|
@ -11,12 +11,16 @@
|
|||||||
#include "AudioCommon/WaveFile.h"
|
#include "AudioCommon/WaveFile.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
class PointerWrap;
|
||||||
|
|
||||||
class Mixer final
|
class Mixer final
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
explicit Mixer(unsigned int BackendSampleRate);
|
explicit Mixer(unsigned int BackendSampleRate);
|
||||||
~Mixer();
|
~Mixer();
|
||||||
|
|
||||||
|
void DoState(PointerWrap& p);
|
||||||
|
|
||||||
// Called from audio threads
|
// Called from audio threads
|
||||||
unsigned int Mix(short* samples, unsigned int numSamples);
|
unsigned int Mix(short* samples, unsigned int numSamples);
|
||||||
unsigned int MixSurround(float* samples, unsigned int num_samples);
|
unsigned int MixSurround(float* samples, unsigned int num_samples);
|
||||||
@ -53,6 +57,7 @@ private:
|
|||||||
MixerFifo(Mixer* mixer, unsigned sample_rate) : m_mixer(mixer), m_input_sample_rate(sample_rate)
|
MixerFifo(Mixer* mixer, unsigned sample_rate) : m_mixer(mixer), m_input_sample_rate(sample_rate)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
void DoState(PointerWrap& p);
|
||||||
void PushSamples(const short* samples, unsigned int num_samples);
|
void PushSamples(const short* samples, unsigned int num_samples);
|
||||||
unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true);
|
unsigned int Mix(short* samples, unsigned int numSamples, bool consider_framelimit = true);
|
||||||
void SetInputSampleRate(unsigned int rate);
|
void SetInputSampleRate(unsigned int rate);
|
||||||
|
@ -127,6 +127,8 @@ void DoState(PointerWrap& p)
|
|||||||
p.Do(g_AISSampleRate);
|
p.Do(g_AISSampleRate);
|
||||||
p.Do(g_AIDSampleRate);
|
p.Do(g_AIDSampleRate);
|
||||||
p.Do(g_CPUCyclesPerSample);
|
p.Do(g_CPUCyclesPerSample);
|
||||||
|
|
||||||
|
g_sound_stream->GetMixer()->DoState(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void GenerateAudioInterrupt();
|
static void GenerateAudioInterrupt();
|
||||||
|
@ -285,6 +285,8 @@ void DoState(PointerWrap& p)
|
|||||||
p.Do(s_disc_path_to_insert);
|
p.Do(s_disc_path_to_insert);
|
||||||
|
|
||||||
DVDThread::DoState(p);
|
DVDThread::DoState(p);
|
||||||
|
|
||||||
|
StreamADPCM::DoState(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static size_t ProcessDTKSamples(std::vector<s16>* temp_pcm, const std::vector<u8>& audio_data)
|
static size_t ProcessDTKSamples(std::vector<s16>* temp_pcm, const std::vector<u8>& audio_data)
|
||||||
|
@ -6,12 +6,13 @@
|
|||||||
|
|
||||||
#include "Core/HW/StreamADPCM.h"
|
#include "Core/HW/StreamADPCM.h"
|
||||||
|
|
||||||
|
#include "Common/ChunkFile.h"
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
#include "Common/MathUtil.h"
|
#include "Common/MathUtil.h"
|
||||||
|
|
||||||
namespace StreamADPCM
|
namespace StreamADPCM
|
||||||
{
|
{
|
||||||
// STATE_TO_SAVE (not saved yet!)
|
// STATE_TO_SAVE
|
||||||
static s32 histl1;
|
static s32 histl1;
|
||||||
static s32 histl2;
|
static s32 histl2;
|
||||||
static s32 histr1;
|
static s32 histr1;
|
||||||
@ -56,6 +57,14 @@ void InitFilter()
|
|||||||
histr2 = 0;
|
histr2 = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DoState(PointerWrap& p)
|
||||||
|
{
|
||||||
|
p.Do(histl1);
|
||||||
|
p.Do(histl2);
|
||||||
|
p.Do(histr1);
|
||||||
|
p.Do(histr2);
|
||||||
|
}
|
||||||
|
|
||||||
void DecodeBlock(s16* pcm, const u8* adpcm)
|
void DecodeBlock(s16* pcm, const u8* adpcm)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < SAMPLES_PER_BLOCK; i++)
|
for (int i = 0; i < SAMPLES_PER_BLOCK; i++)
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
|
|
||||||
#include "Common/CommonTypes.h"
|
#include "Common/CommonTypes.h"
|
||||||
|
|
||||||
|
class PointerWrap;
|
||||||
|
|
||||||
namespace StreamADPCM
|
namespace StreamADPCM
|
||||||
{
|
{
|
||||||
enum
|
enum
|
||||||
@ -17,5 +19,6 @@ enum
|
|||||||
};
|
};
|
||||||
|
|
||||||
void InitFilter();
|
void InitFilter();
|
||||||
|
void DoState(PointerWrap& p);
|
||||||
void DecodeBlock(s16* pcm, const u8* adpcm);
|
void DecodeBlock(s16* pcm, const u8* adpcm);
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ static Common::Event g_compressAndDumpStateSyncEvent;
|
|||||||
static std::thread g_save_thread;
|
static std::thread g_save_thread;
|
||||||
|
|
||||||
// Don't forget to increase this after doing changes on the savestate system
|
// Don't forget to increase this after doing changes on the savestate system
|
||||||
static const u32 STATE_VERSION = 91; // Last changed in PR 6094
|
static const u32 STATE_VERSION = 92; // Last changed in PR 6173
|
||||||
|
|
||||||
// Maps savestate versions to Dolphin versions.
|
// Maps savestate versions to Dolphin versions.
|
||||||
// Versions after 42 don't need to be added to this list,
|
// Versions after 42 don't need to be added to this list,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user