mirror of
https://github.com/AxioDL/boo.git
synced 2025-12-14 07:36:26 +00:00
Overhauled audio system, now with internal mixing and sample-rate-conversion
This commit is contained in:
51
lib/audiodev/AudioVoiceEngine.hpp
Normal file
51
lib/audiodev/AudioVoiceEngine.hpp
Normal file
@@ -0,0 +1,51 @@
|
||||
#ifndef BOO_AUDIOVOICEENGINE_HPP
|
||||
#define BOO_AUDIOVOICEENGINE_HPP
|
||||
|
||||
#include "boo/audiodev/IAudioVoiceEngine.hpp"
|
||||
#include "AudioVoice.hpp"
|
||||
|
||||
namespace boo
|
||||
{
|
||||
|
||||
/** Pertinent information from audio backend about optimal mixed-audio representation */
|
||||
struct AudioVoiceEngineMixInfo
|
||||
{
|
||||
double m_sampleRate;
|
||||
soxr_datatype_t m_sampleFormat;
|
||||
unsigned m_bitsPerSample;
|
||||
AudioChannelSet m_channels;
|
||||
ChannelMap m_channelMap;
|
||||
size_t m_periodFrames;
|
||||
};
|
||||
|
||||
/** Base class for managing mixing and sample-rate-conversion amongst active voices */
|
||||
class BaseAudioVoiceEngine : public IAudioVoiceEngine
|
||||
{
|
||||
protected:
|
||||
friend class AudioVoice;
|
||||
AudioVoiceEngineMixInfo m_mixInfo;
|
||||
std::list<AudioVoice*> m_activeVoices;
|
||||
|
||||
void _pumpAndMixVoices(size_t frames, int16_t* dataOut);
|
||||
void _pumpAndMixVoices(size_t frames, int32_t* dataOut);
|
||||
void _pumpAndMixVoices(size_t frames, float* dataOut);
|
||||
|
||||
public:
|
||||
BaseAudioVoiceEngine(const std::function<AudioVoiceEngineMixInfo()>& getEngineMixInfo);
|
||||
|
||||
std::unique_ptr<IAudioVoice> allocateNewMonoVoice(double sampleRate,
|
||||
IAudioVoiceCallback* cb,
|
||||
bool dynamicPitch=false);
|
||||
|
||||
std::unique_ptr<IAudioVoice> allocateNewStereoVoice(double sampleRate,
|
||||
IAudioVoiceCallback* cb,
|
||||
bool dynamicPitch=false);
|
||||
|
||||
const AudioVoiceEngineMixInfo& mixInfo() const {return m_mixInfo;}
|
||||
AudioChannelSet getAvailableSet() {return m_mixInfo.m_channels;}
|
||||
void pumpAndMixVoices() {}
|
||||
};
|
||||
|
||||
}
|
||||
|
||||
#endif // BOO_AUDIOVOICEENGINE_HPP
|
||||
Reference in New Issue
Block a user