PortAudioSink.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #include "PortAudioSink.h"
  2. PortAudioSink::PortAudioSink()
  3. {
  4. Pa_Initialize();
  5. this->setParams(44100, 2, 16);
  6. }
  7. bool PortAudioSink::setParams(uint32_t sampleRate, uint8_t channelCount, uint8_t bitDepth) {
  8. if (stream) {
  9. Pa_StopStream(stream);
  10. }
  11. PaStreamParameters outputParameters;
  12. outputParameters.device = Pa_GetDefaultOutputDevice();
  13. if (outputParameters.device == paNoDevice) {
  14. printf("PortAudio: Default audio device not found!\n");
  15. // exit(0);
  16. }
  17. printf("PortAudio: Default audio device not found!\n");
  18. outputParameters.channelCount = channelCount;
  19. switch (bitDepth) {
  20. case 32:
  21. outputParameters.sampleFormat = paInt32;
  22. break;
  23. case 24:
  24. outputParameters.sampleFormat = paInt24;
  25. break;
  26. case 16:
  27. outputParameters.sampleFormat = paInt16;
  28. break;
  29. case 8:
  30. outputParameters.sampleFormat = paInt8;
  31. break;
  32. default:
  33. outputParameters.sampleFormat = paInt16;
  34. break;
  35. }
  36. outputParameters.suggestedLatency = 0.050;
  37. outputParameters.hostApiSpecificStreamInfo = NULL;
  38. PaError err = Pa_OpenStream(
  39. &stream,
  40. NULL,
  41. &outputParameters,
  42. sampleRate,
  43. 4096 / (channelCount * bitDepth / 8),
  44. paClipOff,
  45. NULL, // blocking api
  46. NULL
  47. );
  48. Pa_StartStream(stream);
  49. return !err;
  50. }
  51. PortAudioSink::~PortAudioSink()
  52. {
  53. Pa_StopStream(stream);
  54. Pa_Terminate();
  55. }
  56. void PortAudioSink::feedPCMFrames(const uint8_t *buffer, size_t bytes)
  57. {
  58. Pa_WriteStream(stream, buffer, bytes / 4);
  59. }