audiopipe.h 997 B

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