#ifndef BOO_AUDIOVOICEENGINE_HPP #define BOO_AUDIOVOICEENGINE_HPP #include "boo/audiodev/IAudioVoiceEngine.hpp" #include "AudioVoice.hpp" #include "AudioSubmix.hpp" #include "IAudioMix.hpp" #include 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, public IAudioMix { protected: friend class AudioVoice; friend class AudioSubmix; friend class AudioVoiceMono; friend class AudioVoiceStereo; AudioVoiceEngineMixInfo m_mixInfo; std::list m_activeVoices; std::list m_activeSubmixes; size_t m_5msFrames = 0; std::function m_5msCallback; /* Shared scratch buffers for accumulating audio data for resampling */ std::vector m_scratchIn; std::vector m_scratch16; std::vector m_scratch32; std::vector m_scratchFlt; void _pumpAndMixVoices(size_t frames, int16_t* dataOut); void _pumpAndMixVoices(size_t frames, int32_t* dataOut); void _pumpAndMixVoices(size_t frames, float* dataOut); void _unbindFrom(std::list::iterator it); void _unbindFrom(std::list::iterator it); public: ~BaseAudioVoiceEngine(); std::unique_ptr allocateNewMonoVoice(double sampleRate, IAudioVoiceCallback* cb, bool dynamicPitch=false); std::unique_ptr allocateNewStereoVoice(double sampleRate, IAudioVoiceCallback* cb, bool dynamicPitch=false); std::unique_ptr allocateNewSubmix(IAudioSubmixCallback* cb); void register5MsCallback(std::function&& callback); const AudioVoiceEngineMixInfo& mixInfo() const; AudioChannelSet getAvailableSet() {return m_mixInfo.m_channels;} void pumpAndMixVoices() {} }; } #endif // BOO_AUDIOVOICEENGINE_HPP