// // libtgvoip is free and unencumbered public domain software. // For more information, see http://unlicense.org or the UNLICENSE file // you should have received with this source code distribution. // #ifndef LIBTGVOIP_MEDIASTREAMINPUT_H #define LIBTGVOIP_MEDIASTREAMINPUT_H #include #include #include #include #include #include "threading.h" #include "BlockingQueue.h" #include "Buffers.h" namespace tgvoip{ class EchoCanceller; class MediaStreamItf { public: virtual void Start() = 0; virtual void Stop() = 0; void SetCallback(size_t (*f)(unsigned char*, size_t, void*), void* param); //protected: size_t InvokeCallback(unsigned char* data, size_t length); virtual ~MediaStreamItf() = default; private: size_t (*callback)(unsigned char*, size_t, void*) = NULL; std::mutex m_callback; void* callbackParam; }; class AudioMixer : public MediaStreamItf{ public: AudioMixer(); virtual ~AudioMixer(); void SetOutput(MediaStreamItf* output); virtual void Start(); virtual void Stop(); void AddInput(std::shared_ptr input); void RemoveInput(std::shared_ptr input); void SetInputVolume(std::shared_ptr input, float volumeDB); void SetEchoCanceller(EchoCanceller* aec); private: void RunThread(); struct MixerInput{ std::shared_ptr source; float multiplier; }; Mutex inputsMutex; void DoCallback(unsigned char* data, size_t length); static size_t OutputCallback(unsigned char* data, size_t length, void* arg); std::vector inputs; Thread* thread; BufferPool<960*2, 16> bufferPool; BlockingQueue processedQueue; Semaphore semaphore; EchoCanceller* echoCanceller; bool running; }; class CallbackWrapper : public MediaStreamItf{ public: CallbackWrapper(){}; virtual ~CallbackWrapper(){}; virtual void Start(){}; virtual void Stop(){}; }; class AudioLevelMeter{ public: AudioLevelMeter(); float GetLevel(); void Update(int16_t* samples, size_t count); private: int16_t absMax; int16_t count; int8_t currentLevel; int16_t currentLevelFullRange; }; }; #endif //LIBTGVOIP_MEDIASTREAMINPUT_H