Advertisement
NoHumanBeing

PortAudio passthrough with callback

Feb 11th, 2016
408
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. /* g++ -std=c++11 -l portaudio -o port-dsp-callback port-dsp-callback.cpp */
  2.  
  3. #include <cstdint>
  4. #include <cstring>
  5. #include <iostream>
  6. #include <portaudio.h>
  7.  
  8. /*
  9.  * Log a PaError to console.
  10.  */
  11. static void log_pa (PaError err) {
  12.     std::cout << "PortAudio: " << Pa_GetErrorText(err) << std::endl;
  13. }
  14.  
  15. /*
  16.  * Callback for PortAudio.
  17.  */
  18. static int callback (const void* input_buffer, void* output_buffer,
  19.             unsigned long frames_per_buffer, const PaStreamCallbackTimeInfo* time_info,
  20.             PaStreamCallbackFlags status_flags, void* user_data) {
  21.     /* Since we only use memcpy, these casts are not strictly neccessary. */
  22.     std::int32_t* out = (std::int32_t*)output_buffer;
  23.     std::int32_t* in = (std::int32_t*)input_buffer;
  24.     (void)user_data;
  25.     std::memcpy(out, in, sizeof(std::int32_t) * frames_per_buffer);
  26.     return paContinue; 
  27. }
  28.  
  29. /*
  30.  * Program entry point.
  31.  */
  32. int main (int argc, char** argv) {
  33.     /* Initialize. */
  34.     log_pa(Pa_Initialize());
  35.     PaStreamParameters input_parameters, output_parameters;
  36.    
  37.     /* Set input parameters. */
  38.     input_parameters.device = Pa_GetDefaultInputDevice();
  39.     input_parameters.channelCount = 1;
  40.     input_parameters.sampleFormat = paInt32;
  41.     const PaDeviceInfo* input_info = Pa_GetDeviceInfo(input_parameters.device);
  42.     input_parameters.suggestedLatency = input_info->defaultLowInputLatency;
  43.     input_parameters.hostApiSpecificStreamInfo = NULL;
  44.    
  45.     /* Set output parameters. */
  46.     output_parameters.device = Pa_GetDefaultOutputDevice();
  47.     output_parameters.channelCount = 1;
  48.     output_parameters.sampleFormat = paInt32;
  49.     const PaDeviceInfo* output_info = Pa_GetDeviceInfo(output_parameters.device);
  50.     output_parameters.suggestedLatency = output_info->defaultLowOutputLatency;
  51.     output_parameters.hostApiSpecificStreamInfo = NULL;
  52.    
  53.     /* Create and start stream, let it run for 5 seconds, then close it again. */
  54.     PaStream* stream = NULL;
  55.     log_pa(Pa_OpenStream(&stream, &input_parameters, &output_parameters, 96000, paFramesPerBufferUnspecified, paNoFlag, callback, NULL));
  56.     log_pa(Pa_StartStream(stream));
  57.     Pa_Sleep(5000);
  58.     log_pa(Pa_StopStream(stream));
  59.     log_pa(Pa_CloseStream(stream));
  60.     log_pa(Pa_Terminate());
  61.     return 0;
  62. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement