MediaStreamItf.h 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. //
  2. // libtgvoip is free and unencumbered public domain software.
  3. // For more information, see http://unlicense.org or the UNLICENSE file
  4. // you should have received with this source code distribution.
  5. //
  6. #ifndef LIBTGVOIP_MEDIASTREAMINPUT_H
  7. #define LIBTGVOIP_MEDIASTREAMINPUT_H
  8. #include <string.h>
  9. #include <vector>
  10. #include <memory>
  11. #include <stdint.h>
  12. #include "threading.h"
  13. #include "BlockingQueue.h"
  14. #include "Buffers.h"
  15. namespace tgvoip{
  16. class EchoCanceller;
  17. class MediaStreamItf{
  18. public:
  19. virtual void Start()=0;
  20. virtual void Stop()=0;
  21. void SetCallback(size_t (*f)(unsigned char*, size_t, void*), void* param);
  22. //protected:
  23. size_t InvokeCallback(unsigned char* data, size_t length);
  24. private:
  25. size_t (*callback)(unsigned char*, size_t, void*)=NULL;
  26. void* callbackParam;
  27. };
  28. class AudioMixer : public MediaStreamItf{
  29. public:
  30. AudioMixer();
  31. virtual ~AudioMixer();
  32. void SetOutput(MediaStreamItf* output);
  33. virtual void Start();
  34. virtual void Stop();
  35. void AddInput(std::shared_ptr<MediaStreamItf> input);
  36. void RemoveInput(std::shared_ptr<MediaStreamItf> input);
  37. void SetInputVolume(std::shared_ptr<MediaStreamItf> input, float volumeDB);
  38. void SetEchoCanceller(EchoCanceller* aec);
  39. private:
  40. void RunThread();
  41. struct MixerInput{
  42. std::shared_ptr<MediaStreamItf> source;
  43. float multiplier;
  44. };
  45. Mutex inputsMutex;
  46. void DoCallback(unsigned char* data, size_t length);
  47. static size_t OutputCallback(unsigned char* data, size_t length, void* arg);
  48. std::vector<MixerInput> inputs;
  49. Thread* thread;
  50. BufferPool bufferPool;
  51. BlockingQueue<unsigned char*> processedQueue;
  52. Semaphore semaphore;
  53. EchoCanceller* echoCanceller;
  54. bool running;
  55. };
  56. class CallbackWrapper : public MediaStreamItf{
  57. public:
  58. CallbackWrapper(){};
  59. virtual ~CallbackWrapper(){};
  60. virtual void Start(){};
  61. virtual void Stop(){};
  62. };
  63. class AudioLevelMeter{
  64. public:
  65. AudioLevelMeter();
  66. float GetLevel();
  67. void Update(int16_t* samples, size_t count);
  68. private:
  69. int16_t absMax;
  70. int16_t count;
  71. int8_t currentLevel;
  72. int16_t currentLevelFullRange;
  73. };
  74. };
  75. #endif //LIBTGVOIP_MEDIASTREAMINPUT_H