rpcsx/rpcs3/Emu/Audio/AudioDumper.h

91 lines
2.1 KiB
C
Raw Normal View History

#pragma once
2020-12-12 13:01:29 +01:00
#include "util/types.hpp"
#include "Utilities/File.h"
#include "Emu/Audio/AudioBackend.h"
struct WAVHeader
{
struct RIFFHeader
{
u8 ID[4] = { 'R', 'I', 'F', 'F' };
le_t<u32> Size{}; // FileSize - 8
u8 WAVE[4] = { 'W', 'A', 'V', 'E' };
2016-02-01 22:51:35 +01:00
RIFFHeader() = default;
RIFFHeader(u32 size)
: Size(size)
{
}
} RIFF;
2016-02-01 22:51:35 +01:00
struct FMTHeader
{
u8 ID[4] = { 'f', 'm', 't', ' ' };
le_t<u32> Size = 16;
le_t<u16> AudioFormat{}; // 1 for PCM, 3 for IEEE Floating Point
le_t<u16> NumChannels{}; // 1, 2, 6, 8
le_t<u32> SampleRate{}; // 44100-192000
le_t<u32> ByteRate{}; // SampleRate * NumChannels * BitsPerSample/8
le_t<u16> BlockAlign{}; // NumChannels * BitsPerSample/8
le_t<u16> BitsPerSample{}; // SampleSize * 8
2016-02-01 22:51:35 +01:00
FMTHeader() = default;
FMTHeader(AudioChannelCnt ch, AudioFreq sample_rate, AudioSampleSize sample_size)
: AudioFormat(sample_size == AudioSampleSize::FLOAT ? 3 : 1)
, NumChannels(static_cast<u16>(ch))
, SampleRate(static_cast<u32>(sample_rate))
, ByteRate(SampleRate * NumChannels * static_cast<u32>(sample_size))
, BlockAlign(NumChannels * static_cast<u32>(sample_size))
, BitsPerSample(static_cast<u32>(sample_size) * 8)
{
}
} FMT;
2016-02-01 22:51:35 +01:00
struct FACTChunk
{
u8 ID[4] = { 'f', 'a', 'c', 't' };
le_t<u32> ChunkLength = 4;
le_t<u32> SampleLength = 0; // total samples per channel
FACTChunk() = default;
FACTChunk(u32 sample_len)
: SampleLength(sample_len)
{
}
} FACT;
u8 ID[4] = { 'd', 'a', 't', 'a' };
le_t<u32> Size{}; // size of data (256 * NumChannels * sizeof(f32))
2016-02-01 22:51:35 +01:00
WAVHeader() = default;
WAVHeader(AudioChannelCnt ch, AudioFreq sample_rate, AudioSampleSize sample_size)
: RIFF(sizeof(RIFFHeader) + sizeof(FMTHeader))
, FMT(ch, sample_rate, sample_size)
, FACT(0)
, Size(0)
{
}
};
class AudioDumper
{
2021-04-03 18:38:02 +02:00
WAVHeader m_header{};
fs::file m_output{};
2019-11-29 23:28:06 +01:00
public:
2022-01-05 09:26:12 +01:00
AudioDumper();
~AudioDumper();
void Open(AudioChannelCnt ch, AudioFreq sample_rate, AudioSampleSize sample_size);
2022-01-05 09:26:12 +01:00
void Close();
2016-02-01 22:51:35 +01:00
void WriteData(const void* buffer, u32 size);
u16 GetCh() const { return m_header.FMT.NumChannels; }
u16 GetSampleSize() const { return m_header.FMT.BitsPerSample / 8; }
};