rpcsx/rpcs3/Emu/Audio/AudioBackend.h

101 lines
2.3 KiB
C
Raw Normal View History

2020-12-05 13:08:24 +01:00
#pragma once
2018-12-20 23:35:49 +01:00
2020-12-12 13:01:29 +01:00
#include "util/types.hpp"
#include "Utilities/StrFmt.h"
2018-12-20 23:35:49 +01:00
enum : u32
{
DEFAULT_AUDIO_SAMPLING_RATE = 48000,
MAX_AUDIO_BUFFERS = 64,
AUDIO_BUFFER_SAMPLES = 256,
AUDIO_MAX_CHANNELS = 8,
};
enum class AudioFreq : u32
{
FREQ_32K = 32000,
FREQ_44K = 44100,
FREQ_48K = 48000,
FREQ_88K = 88200,
FREQ_96K = 96000,
FREQ_176K = 176400,
FREQ_192K = 192000,
};
enum class AudioSampleSize : u32
{
FLOAT = sizeof(float),
S16 = sizeof(s16),
};
enum class AudioChannelCnt : u32
{
STEREO = 2,
SURROUND_5_1 = 6,
SURROUND_7_1 = 8,
2018-12-20 23:35:49 +01:00
};
class AudioBackend
{
public:
2020-06-20 02:44:32 +02:00
AudioBackend();
virtual ~AudioBackend() = default;
/*
* Pure virtual methods
*/
2021-11-29 12:52:02 +01:00
virtual std::string_view GetName() const = 0;
virtual void Open(AudioFreq freq, AudioSampleSize sample_size, AudioChannelCnt ch_cnt) = 0;
virtual void Close() = 0;
2018-12-20 23:35:49 +01:00
// Sets write callback. It's called when backend requests new data to be sent
// Callback should return number of submitted bytes. Calling other backend functions from callback is unsafe
virtual void SetWriteCallback(std::function<u32(u32 /* byte_cnt */, void * /* buffer */)> cb) = 0;
// Returns length of one callback frame in seconds.
virtual f64 GetCallbackFrameLen() = 0;
// Returns true if audio is currently being played, false otherwise
virtual bool IsPlaying() = 0;
// Start playing enqueued data
virtual void Play() = 0;
// Pause playing enqueued data
virtual void Pause() = 0;
/*
* This virtual method should be reimplemented if backend can fail to be initialized under non-error conditions
* eg. when there is no audio devices attached
*/
virtual bool Initialized() { return true; }
/*
* This virtual method should be reimplemented if backend can fail during normal operation
*/
virtual bool Operational() { return true; }
/*
* Helper methods
*/
2020-06-20 02:44:32 +02:00
u32 get_sampling_rate() const;
2018-12-20 23:35:49 +01:00
2020-06-20 02:44:32 +02:00
u32 get_sample_size() const;
2018-12-20 23:35:49 +01:00
2020-06-20 02:44:32 +02:00
u32 get_channels() const;
2020-12-12 13:01:29 +01:00
bool get_convert_to_s16() const;
2022-01-05 09:26:12 +01:00
/*
* Convert float buffer to s16 one. src and dst could be the same. cnt is number of buffer elements.
*/
static void convert_to_s16(u32 cnt, const f32* src, void* dst);
2020-06-20 02:44:32 +02:00
protected:
AudioSampleSize m_sample_size = AudioSampleSize::FLOAT;
AudioFreq m_sampling_rate = AudioFreq::FREQ_48K;
AudioChannelCnt m_channels = AudioChannelCnt::STEREO;
};