Mesen-X/Core/SoundMixer.h

78 lines
2 KiB
C
Raw Normal View History

#pragma once
#include "stdafx.h"
#include "EmulationSettings.h"
#include "../Utilities/LowPassFilter.h"
2016-05-22 08:14:55 -04:00
#include "../Utilities/blip_buf.h"
#include "../Utilities/SimpleLock.h"
#include "IAudioDevice.h"
#include "Snapshotable.h"
#include "StereoPanningFilter.h"
#include "StereoDelayFilter.h"
#include "ReverbFilter.h"
#include "WaveRecorder.h"
class SoundMixer : public Snapshotable
{
2016-01-30 14:57:50 -05:00
public:
static const uint32_t CycleLength = 10000;
static const uint32_t BitsPerSample = 16;
private:
static unique_ptr<WaveRecorder> _waveRecorder;
static SimpleLock _waveRecorderLock;
static IAudioDevice* AudioDevice;
static const uint32_t MaxSampleRate = 48000;
static const uint32_t MaxSamplesPerFrame = MaxSampleRate / 60;
2016-01-30 14:57:50 -05:00
static const uint32_t MaxChannelCount = 6;
static const uint32_t ExpansionAudioIndex = MaxChannelCount - 1;
2016-01-30 14:57:50 -05:00
AudioChannel _expansionAudioType;
LowPassFilter _lowPassFilter;
StereoPanningFilter _stereoPanning;
StereoDelayFilter _stereoDelay;
ReverbFilter _reverbFilter;
int16_t _previousOutput = 0;
vector<uint32_t> _timestamps;
int16_t _channelOutput[MaxChannelCount][CycleLength];
int16_t _currentOutput[MaxChannelCount];
blip_t* _blipBuf;
int16_t *_outputBuffer;
2016-01-30 14:57:50 -05:00
double _volumes[MaxChannelCount];
uint32_t _sampleRate;
uint32_t _clockRate;
double GetChannelOutput(AudioChannel channel);
int16_t GetOutputVolume();
void EndFrame(uint32_t time);
void UpdateRates();
protected:
virtual void StreamState(bool saving);
public:
SoundMixer();
~SoundMixer();
void SetNesModel(NesModel model);
void Reset();
void PlayAudioBuffer(uint32_t cycle);
void AddDelta(AudioChannel channel, uint32_t time, int16_t delta);
2016-01-30 14:57:50 -05:00
void SetExpansionAudioType(AudioChannel channel);
void AddExpansionAudioDelta(uint32_t time, int16_t delta);
static void StartRecording(string filepath);
static void StopRecording();
static bool IsRecording();
static void StopAudio(bool clearBuffer = false);
static void RegisterAudioDevice(IAudioDevice *audioDevice);
};