AudioIOCallback.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  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. #include "AudioIOCallback.h"
  7. #include "../VoIPController.h"
  8. #include "../logging.h"
  9. using namespace tgvoip;
  10. using namespace tgvoip::audio;
  11. #pragma mark - IO
  12. AudioIOCallback::AudioIOCallback(){
  13. input=new AudioInputCallback();
  14. output=new AudioOutputCallback();
  15. }
  16. AudioIOCallback::~AudioIOCallback(){
  17. delete input;
  18. delete output;
  19. }
  20. AudioInput* AudioIOCallback::GetInput(){
  21. return input;
  22. }
  23. AudioOutput* AudioIOCallback::GetOutput(){
  24. return output;
  25. }
  26. #pragma mark - Input
  27. AudioInputCallback::AudioInputCallback(){
  28. thread=new Thread(std::bind(&AudioInputCallback::RunThread, this));
  29. thread->SetName("AudioInputCallback");
  30. }
  31. AudioInputCallback::~AudioInputCallback(){
  32. running=false;
  33. thread->Join();
  34. delete thread;
  35. }
  36. void AudioInputCallback::Start(){
  37. if(!running){
  38. running=true;
  39. thread->Start();
  40. }
  41. recording=true;
  42. }
  43. void AudioInputCallback::Stop(){
  44. recording=false;
  45. }
  46. void AudioInputCallback::SetDataCallback(std::function<void(int16_t*, size_t)> c){
  47. dataCallback=c;
  48. }
  49. void AudioInputCallback::RunThread(){
  50. int16_t buf[960];
  51. while(running){
  52. double t=VoIPController::GetCurrentTime();
  53. memset(buf, 0, sizeof(buf));
  54. dataCallback(buf, 960);
  55. InvokeCallback(reinterpret_cast<unsigned char*>(buf), 960*2);
  56. double sl=0.02-(VoIPController::GetCurrentTime()-t);
  57. if(sl>0)
  58. Thread::Sleep(sl);
  59. }
  60. }
  61. #pragma mark - Output
  62. AudioOutputCallback::AudioOutputCallback(){
  63. thread=new Thread(std::bind(&AudioOutputCallback::RunThread, this));
  64. thread->SetName("AudioOutputCallback");
  65. }
  66. AudioOutputCallback::~AudioOutputCallback(){
  67. running=false;
  68. thread->Join();
  69. delete thread;
  70. }
  71. void AudioOutputCallback::Start(){
  72. if(!running){
  73. running=true;
  74. thread->Start();
  75. }
  76. playing=true;
  77. }
  78. void AudioOutputCallback::Stop(){
  79. playing=false;
  80. }
  81. bool AudioOutputCallback::IsPlaying(){
  82. return playing;
  83. }
  84. void AudioOutputCallback::SetDataCallback(std::function<void(int16_t*, size_t)> c){
  85. dataCallback=c;
  86. }
  87. void AudioOutputCallback::RunThread(){
  88. int16_t buf[960];
  89. while(running){
  90. double t=VoIPController::GetCurrentTime();
  91. InvokeCallback(reinterpret_cast<unsigned char*>(buf), 960*2);
  92. dataCallback(buf, 960);
  93. double sl=0.02-(VoIPController::GetCurrentTime()-t);
  94. if(sl>0)
  95. Thread::Sleep(sl);
  96. }
  97. }