Extract filtering to new file

This commit is contained in:
Matt Nadareski
2021-08-25 21:45:59 -07:00
parent 22b00b1bd5
commit 0251dae981
2 changed files with 68 additions and 48 deletions

View File

@@ -0,0 +1,58 @@
using NWaves.Audio;
using NWaves.Filters.BiQuad;
namespace RedBookPlayer.Models.Hardware
{
/// <summary>
/// Output stage that represents all filters on the audio
/// </summary>
public class FilterStage
{
/// <summary>
/// Left channel de-emphasis filter
/// </summary>
private BiQuadFilter _deEmphasisFilterLeft;
/// <summary>
/// Right channel de-emphasis filter
/// </summary>
private BiQuadFilter _deEmphasisFilterRight;
/// <summary>
/// Process audio data with internal filters
/// </summary>
/// <param name="audioData">Audio data to process</param>
public void ProcessAudioData(byte[] audioData)
{
float[][] floatAudioData = new float[2][];
floatAudioData[0] = new float[audioData.Length / 4];
floatAudioData[1] = new float[audioData.Length / 4];
ByteConverter.ToFloats16Bit(audioData, floatAudioData);
for(int i = 0; i < floatAudioData[0].Length; i++)
{
floatAudioData[0][i] = _deEmphasisFilterLeft.Process(floatAudioData[0][i]);
floatAudioData[1][i] = _deEmphasisFilterRight.Process(floatAudioData[1][i]);
}
ByteConverter.FromFloats16Bit(floatAudioData, audioData);
}
/// <summary>
/// Sets or resets the output filters
/// </summary>
public void SetupFilters()
{
if(_deEmphasisFilterLeft == null)
{
_deEmphasisFilterLeft = new DeEmphasisFilter();
_deEmphasisFilterRight = new DeEmphasisFilter();
}
else
{
_deEmphasisFilterLeft.Reset();
_deEmphasisFilterRight.Reset();
}
}
}
}

View File

@@ -3,7 +3,6 @@ using System.Linq;
using System.Threading.Tasks;
using CSCore.SoundOut;
using NWaves.Audio;
using NWaves.Filters.BiQuad;
using ReactiveUI;
using RedBookPlayer.Models.Discs;
@@ -96,14 +95,9 @@ namespace RedBookPlayer.Models.Hardware
private ALSoundOut _soundOut;
/// <summary>
/// Left channel de-emphasis filter
/// Filtering stage for audio output
/// </summary>
private BiQuadFilter _deEmphasisFilterLeft;
/// <summary>
/// Right channel de-emphasis filter
/// </summary>
private BiQuadFilter _deEmphasisFilterRight;
private FilterStage _filterStage;
/// <summary>
/// Current position in the sector
@@ -121,7 +115,12 @@ namespace RedBookPlayer.Models.Hardware
/// Constructor
/// </summary>
/// <param name="defaultVolume">Default volume between 0 and 100 to use when starting playback</param>
public SoundOutput(int defaultVolume = 100) => Volume = defaultVolume;
public SoundOutput(int defaultVolume = 100)
{
Volume = defaultVolume;
_filterStage = new FilterStage();
}
/// <summary>
/// Initialize the output with a given image
@@ -143,7 +142,7 @@ namespace RedBookPlayer.Models.Hardware
ApplyDeEmphasis = compactDisc.TrackHasEmphasis;
// Setup de-emphasis filters
SetupFilters();
_filterStage.SetupFilters();
// Setup the audio output
SetupAudio();
@@ -309,26 +308,6 @@ namespace RedBookPlayer.Models.Hardware
}
}
/// <summary>
/// Process de-emphasis of audio data
/// </summary>
/// <param name="audioData">Audio data to process</param>
private void ProcessDeEmphasis(byte[] audioData)
{
float[][] floatAudioData = new float[2][];
floatAudioData[0] = new float[audioData.Length / 4];
floatAudioData[1] = new float[audioData.Length / 4];
ByteConverter.ToFloats16Bit(audioData, floatAudioData);
for(int i = 0; i < floatAudioData[0].Length; i++)
{
floatAudioData[0][i] = _deEmphasisFilterLeft.Process(floatAudioData[0][i]);
floatAudioData[1][i] = _deEmphasisFilterRight.Process(floatAudioData[1][i]);
}
ByteConverter.FromFloats16Bit(floatAudioData, audioData);
}
/// <summary>
/// Read the requested amount of data from an input
/// </summary>
@@ -376,28 +355,11 @@ namespace RedBookPlayer.Models.Hardware
// Apply de-emphasis filtering, only if enabled
if(ApplyDeEmphasis)
ProcessDeEmphasis(audioDataSegment);
_filterStage.ProcessAudioData(audioDataSegment);
return audioDataSegment;
}
/// <summary>
/// Sets or resets the de-emphasis filters
/// </summary>
private void SetupFilters()
{
if(_deEmphasisFilterLeft == null)
{
_deEmphasisFilterLeft = new DeEmphasisFilter();
_deEmphasisFilterRight = new DeEmphasisFilter();
}
else
{
_deEmphasisFilterLeft.Reset();
_deEmphasisFilterRight.Reset();
}
}
/// <summary>
/// Sets or resets the audio playback objects
/// </summary>