audiopipe.h 1018 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455
  1. #pragma once
  2. #include <deque>
  3. #include <mutex>
  4. #include <algorithm>
  5. typedef double Sample;
  6. class AudioPipe{
  7. std::mutex mutex;
  8. std::deque<Sample> buffer;
  9. public:
  10. int readPointer=0;
  11. int writePointer=0;
  12. void WriteSamples(Sample *samples,int count){
  13. mutex.lock();
  14. for(int i=0;i<count;i++){
  15. buffer.push_back(samples[i]);
  16. }
  17. writePointer+=count;
  18. mutex.unlock();
  19. }
  20. void readSamples(short *dest, int sampleCount){
  21. mutex.lock();
  22. int available=buffer.size();
  23. if (available>=sampleCount){
  24. for(int i=0;i<sampleCount;i++){
  25. Sample s=buffer.front();
  26. buffer.pop_front();
  27. dest[i]=32767*std::max(-1.0, std::min(s, 1.0));
  28. }
  29. readPointer+=sampleCount;
  30. }
  31. mutex.unlock();
  32. }
  33. static void Callback(void *a, unsigned char *b, int c){
  34. memset(b,0,c);
  35. auto pipe=(AudioPipe*)a;
  36. int sampleCount=c/2;
  37. short *dest=(short *)b;
  38. pipe->readSamples(dest,sampleCount);
  39. }
  40. void *Handle(){
  41. return (void *)this;
  42. }
  43. static AudioPipe *Create(){
  44. return new AudioPipe();
  45. }
  46. };