2018-10-07 03:36:44 +00:00
|
|
|
#pragma once
|
2016-03-24 00:01:57 +00:00
|
|
|
|
|
|
|
#include "boo/audiodev/IAudioVoiceEngine.hpp"
|
2017-09-28 03:11:40 +00:00
|
|
|
#include "LtRtProcessing.hpp"
|
|
|
|
#include "Common.hpp"
|
2016-03-24 00:01:57 +00:00
|
|
|
#include "AudioVoice.hpp"
|
2016-05-07 04:28:32 +00:00
|
|
|
#include "AudioSubmix.hpp"
|
2016-05-19 10:14:21 +00:00
|
|
|
#include <functional>
|
2017-12-03 06:05:16 +00:00
|
|
|
#include <mutex>
|
2016-03-24 00:01:57 +00:00
|
|
|
|
2018-12-08 05:17:51 +00:00
|
|
|
namespace boo {
|
2016-03-24 00:01:57 +00:00
|
|
|
|
|
|
|
/** Base class for managing mixing and sample-rate-conversion amongst active voices */
|
2018-12-08 05:17:51 +00:00
|
|
|
class BaseAudioVoiceEngine : public IAudioVoiceEngine {
|
2016-03-24 00:01:57 +00:00
|
|
|
protected:
|
2018-12-08 05:17:51 +00:00
|
|
|
friend class AudioVoice;
|
|
|
|
friend class AudioSubmix;
|
|
|
|
friend class AudioVoiceMono;
|
|
|
|
friend class AudioVoiceStereo;
|
|
|
|
float m_totalVol = 1.f;
|
|
|
|
AudioVoiceEngineMixInfo m_mixInfo;
|
|
|
|
std::recursive_mutex m_dataMutex;
|
|
|
|
AudioVoice* m_voiceHead = nullptr;
|
|
|
|
AudioSubmix* m_submixHead = nullptr;
|
|
|
|
size_t m_5msFrames = 0;
|
|
|
|
IAudioVoiceEngineCallback* m_engineCallback = nullptr;
|
|
|
|
|
|
|
|
/* Shared scratch buffers for accumulating audio data for resampling */
|
|
|
|
std::vector<int16_t> m_scratchIn;
|
|
|
|
std::vector<int16_t> m_scratch16Pre;
|
|
|
|
std::vector<int32_t> m_scratch32Pre;
|
|
|
|
std::vector<float> m_scratchFltPre;
|
|
|
|
template <typename T>
|
|
|
|
std::vector<T>& _getScratchPre();
|
|
|
|
std::vector<int16_t> m_scratch16Post;
|
|
|
|
std::vector<int32_t> m_scratch32Post;
|
|
|
|
std::vector<float> m_scratchFltPost;
|
|
|
|
template <typename T>
|
|
|
|
std::vector<T>& _getScratchPost();
|
|
|
|
|
|
|
|
/* LtRt processing if enabled */
|
|
|
|
std::unique_ptr<LtRtProcessing> m_ltRtProcessing;
|
|
|
|
std::vector<int16_t> m_ltRtIn16;
|
|
|
|
std::vector<int32_t> m_ltRtIn32;
|
|
|
|
std::vector<float> m_ltRtInFlt;
|
|
|
|
template <typename T>
|
|
|
|
std::vector<T>& _getLtRtIn();
|
|
|
|
|
|
|
|
std::unique_ptr<AudioSubmix> m_mainSubmix;
|
|
|
|
std::list<AudioSubmix*> m_linearizedSubmixes;
|
|
|
|
bool m_submixesDirty = true;
|
|
|
|
|
|
|
|
template <typename T>
|
|
|
|
void _pumpAndMixVoices(size_t frames, T* dataOut);
|
|
|
|
|
|
|
|
void _resetSampleRate();
|
2018-08-18 22:08:58 +00:00
|
|
|
|
2016-03-24 00:01:57 +00:00
|
|
|
public:
|
2018-12-08 05:17:51 +00:00
|
|
|
BaseAudioVoiceEngine() : m_mainSubmix(std::make_unique<AudioSubmix>(*this, nullptr, -1, false)) {}
|
|
|
|
~BaseAudioVoiceEngine();
|
|
|
|
ObjToken<IAudioVoice> allocateNewMonoVoice(double sampleRate, IAudioVoiceCallback* cb, bool dynamicPitch = false);
|
|
|
|
|
|
|
|
ObjToken<IAudioVoice> allocateNewStereoVoice(double sampleRate, IAudioVoiceCallback* cb, bool dynamicPitch = false);
|
2016-03-24 00:01:57 +00:00
|
|
|
|
2018-12-08 05:17:51 +00:00
|
|
|
ObjToken<IAudioSubmix> allocateNewSubmix(bool mainOut, IAudioSubmixCallback* cb, int busId);
|
2017-12-03 06:05:16 +00:00
|
|
|
|
2018-12-08 05:17:51 +00:00
|
|
|
void setCallbackInterface(IAudioVoiceEngineCallback* cb);
|
|
|
|
|
|
|
|
void setVolume(float vol);
|
|
|
|
bool enableLtRt(bool enable);
|
|
|
|
const AudioVoiceEngineMixInfo& mixInfo() const;
|
|
|
|
const AudioVoiceEngineMixInfo& clientMixInfo() const;
|
|
|
|
AudioChannelSet getAvailableSet() { return clientMixInfo().m_channels; }
|
|
|
|
void pumpAndMixVoices() {}
|
|
|
|
size_t get5MsFrames() const { return m_5msFrames; }
|
|
|
|
};
|
2017-12-03 06:05:16 +00:00
|
|
|
|
2018-12-08 05:17:51 +00:00
|
|
|
template <>
|
|
|
|
inline std::vector<int16_t>& BaseAudioVoiceEngine::_getScratchPre<int16_t>() {
|
|
|
|
return m_scratch16Pre;
|
|
|
|
}
|
|
|
|
template <>
|
|
|
|
inline std::vector<int32_t>& BaseAudioVoiceEngine::_getScratchPre<int32_t>() {
|
|
|
|
return m_scratch32Pre;
|
|
|
|
}
|
|
|
|
template <>
|
|
|
|
inline std::vector<float>& BaseAudioVoiceEngine::_getScratchPre<float>() {
|
|
|
|
return m_scratchFltPre;
|
|
|
|
}
|
2017-12-03 06:05:16 +00:00
|
|
|
|
2018-12-08 05:17:51 +00:00
|
|
|
template <>
|
|
|
|
inline std::vector<int16_t>& BaseAudioVoiceEngine::_getScratchPost<int16_t>() {
|
|
|
|
return m_scratch16Post;
|
|
|
|
}
|
|
|
|
template <>
|
|
|
|
inline std::vector<int32_t>& BaseAudioVoiceEngine::_getScratchPost<int32_t>() {
|
|
|
|
return m_scratch32Post;
|
|
|
|
}
|
|
|
|
template <>
|
|
|
|
inline std::vector<float>& BaseAudioVoiceEngine::_getScratchPost<float>() {
|
|
|
|
return m_scratchFltPost;
|
|
|
|
}
|
|
|
|
|
|
|
|
template <>
|
|
|
|
inline std::vector<int16_t>& BaseAudioVoiceEngine::_getLtRtIn<int16_t>() {
|
|
|
|
return m_ltRtIn16;
|
|
|
|
}
|
|
|
|
template <>
|
|
|
|
inline std::vector<int32_t>& BaseAudioVoiceEngine::_getLtRtIn<int32_t>() {
|
|
|
|
return m_ltRtIn32;
|
|
|
|
}
|
|
|
|
template <>
|
|
|
|
inline std::vector<float>& BaseAudioVoiceEngine::_getLtRtIn<float>() {
|
|
|
|
return m_ltRtInFlt;
|
2016-03-24 00:01:57 +00:00
|
|
|
}
|
|
|
|
|
2018-12-08 05:17:51 +00:00
|
|
|
} // namespace boo
|