citra/src/audio_core/hle/filter.h
2018-02-03 15:15:17 +00:00

117 lines
3.1 KiB
C++

// Copyright 2016 Citra Emulator Project
// Licensed under GPLv2 or any later version
// Refer to the license.txt file included.
#pragma once
#include <array>
#include "audio_core/audio_types.h"
#include "audio_core/hle/shared_memory.h"
#include "common/common_types.h"
namespace AudioCore {
namespace HLE {
/// Preprocessing filters. There is an independent set of filters for each Source.
class SourceFilters final {
public:
SourceFilters() {
Reset();
}
/// Reset internal state.
void Reset();
/**
* Enable/Disable filters
* See also: SourceConfiguration::Configuration::simple_filter_enabled,
* SourceConfiguration::Configuration::biquad_filter_enabled.
* @param simple If true, enables the simple filter. If false, disables it.
* @param biquad If true, enables the biquad filter. If false, disables it.
*/
void Enable(bool simple, bool biquad);
/**
* Configure simple filter.
* @param config Configuration from DSP shared memory.
*/
void Configure(SourceConfiguration::Configuration::SimpleFilter config);
/**
* Configure biquad filter.
* @param config Configuration from DSP shared memory.
*/
void Configure(SourceConfiguration::Configuration::BiquadFilter config);
/**
* Processes a frame in-place.
* @param frame Audio samples to process. Modified in-place.
*/
void ProcessFrame(StereoFrame16& frame);
private:
bool simple_filter_enabled;
bool biquad_filter_enabled;
struct SimpleFilter {
SimpleFilter() {
Reset();
}
/// Resets internal state.
void Reset();
/**
* Configures this filter with application settings.
* @param config Configuration from DSP shared memory.
*/
void Configure(SourceConfiguration::Configuration::SimpleFilter config);
/**
* Processes a single stereo PCM16 sample.
* @param x0 Input sample
* @return Output sample
*/
std::array<s16, 2> ProcessSample(const std::array<s16, 2>& x0);
private:
// Configuration
s32 a1, b0;
// Internal state
std::array<s16, 2> y1;
} simple_filter;
struct BiquadFilter {
BiquadFilter() {
Reset();
}
/// Resets internal state.
void Reset();
/**
* Configures this filter with application settings.
* @param config Configuration from DSP shared memory.
*/
void Configure(SourceConfiguration::Configuration::BiquadFilter config);
/**
* Processes a single stereo PCM16 sample.
* @param x0 Input sample
* @return Output sample
*/
std::array<s16, 2> ProcessSample(const std::array<s16, 2>& x0);
private:
// Configuration
s32 a1, a2, b0, b1, b2;
// Internal state
std::array<s16, 2> x1;
std::array<s16, 2> x2;
std::array<s16, 2> y1;
std::array<s16, 2> y2;
} biquad_filter;
};
} // namespace HLE
} // namespace AudioCore