| 
1
 | 
     1 #include <cmath>
 | 
| 
 | 
     2 #include <stdlib.h>
 | 
| 
 | 
     3 #include <iostream>
 | 
| 
 | 
     4 #include <vector>
 | 
| 
 | 
     5 #include "RtAudio.h"
 | 
| 
 | 
     6 
 | 
| 
 | 
     7 int myCallback(void *outputBuffer, void *inputBuffer, unsigned int bufferFrames, double streamTime, RtAudioStreamStatus status, void *userData) {
 | 
| 
 | 
     8   unsigned int i, j;
 | 
| 
 | 
     9   float *buffer = (float *) outputBuffer;
 | 
| 
 | 
    10 
 | 
| 
 | 
    11   if ( status )
 | 
| 
 | 
    12     std::cout << "Stream underflow detected!" << std::endl;
 | 
| 
 | 
    13 
 | 
| 
 | 
    14   if (!buffer)
 | 
| 
 | 
    15     return 0;
 | 
| 
 | 
    16 
 | 
| 
 | 
    17   // Write interleaved audio data.
 | 
| 
 | 
    18   static int t = 0;
 | 
| 
 | 
    19   for ( i=0; i<bufferFrames/2; i++ ) {
 | 
| 
 | 
    20     for ( j=0; j<2; j++ ) {
 | 
| 
 | 
    21       *buffer++ = 0; // 0.25*cosf((t/(float)1000)); 
 | 
| 
 | 
    22 
 | 
| 
 | 
    23     }
 | 
| 
 | 
    24     if (++t > 1000) t = 0;
 | 
| 
 | 
    25   }
 | 
| 
 | 
    26     
 | 
| 
 | 
    27   return 0;
 | 
| 
 | 
    28 }
 | 
| 
 | 
    29 
 | 
| 
 | 
    30 int main() {
 | 
| 
 | 
    31   RtAudio audio;
 | 
| 
 | 
    32 
 | 
| 
 | 
    33   // Determine the number of devices available
 | 
| 
 | 
    34   unsigned int devices = audio.getDeviceCount();
 | 
| 
 | 
    35   std::cout << devices << " devices found\n";
 | 
| 
 | 
    36 
 | 
| 
 | 
    37   // Scan through devices for various capabilities
 | 
| 
 | 
    38   RtAudio::DeviceInfo info;
 | 
| 
 | 
    39   for ( unsigned int i=0; i<devices; i++ ) {
 | 
| 
 | 
    40 
 | 
| 
 | 
    41     info = audio.getDeviceInfo( i );
 | 
| 
 | 
    42 
 | 
| 
 | 
    43     if ( info.probed == true ) {
 | 
| 
 | 
    44       // Print, for example, the maximum number of output channels for each device
 | 
| 
 | 
    45       std::cout << "device: #" << i << " - " << info.name << "\n";
 | 
| 
 | 
    46       std::cout << "  output channels: " << info.outputChannels << "\n";
 | 
| 
 | 
    47       std::cout << "  input channels: " << info.inputChannels << "\n";
 | 
| 
 | 
    48       std::cout << "  duplex channels: " << info.duplexChannels << "\n";
 | 
| 
 | 
    49       std::cout << "  default input/output: " << info.isDefaultInput << " / " << info.isDefaultOutput << "\n";
 | 
| 
 | 
    50       
 | 
| 
 | 
    51       std::cout << "  sample rates:\n";
 | 
| 
 | 
    52       for (std::vector<unsigned int>::iterator i = info.sampleRates.begin(); i != info.sampleRates.end(); i++) {
 | 
| 
 | 
    53           std::cout << "    " << *i << "\n";
 | 
| 
 | 
    54       }
 | 
| 
 | 
    55       std::cout << "  data formats:\n";      
 | 
| 
 | 
    56       if (info.nativeFormats & RTAUDIO_SINT8) std::cout << "    signed 8-bit\n";
 | 
| 
 | 
    57       if (info.nativeFormats & RTAUDIO_SINT16) std::cout << "    signed 16-bit\n";
 | 
| 
 | 
    58       if (info.nativeFormats & RTAUDIO_SINT24) std::cout << "    signed 24-bit\n";
 | 
| 
 | 
    59       if (info.nativeFormats & RTAUDIO_SINT32) std::cout << "    signed 32-bit\n";
 | 
| 
 | 
    60       if (info.nativeFormats & RTAUDIO_FLOAT32) std::cout << "    32-bit float [-1,1]\n";
 | 
| 
 | 
    61       if (info.nativeFormats & RTAUDIO_FLOAT64) std::cout << "    64-bit float [-1,1]\n";
 | 
| 
 | 
    62     }
 | 
| 
 | 
    63     else
 | 
| 
 | 
    64       std::cout << "device: #" << i << " - not probed\n";
 | 
| 
 | 
    65   }
 | 
| 
 | 
    66 
 | 
| 
 | 
    67   RtAudio::StreamParameters oparam;
 | 
| 
 | 
    68   oparam.deviceId = audio.getDefaultOutputDevice();
 | 
| 
 | 
    69   oparam.nChannels = 1;
 | 
| 
 | 
    70   oparam.firstChannel = 0;
 | 
| 
 | 
    71 
 | 
| 
 | 
    72   RtAudio::StreamParameters iparam;
 | 
| 
 | 
    73   iparam.deviceId = audio.getDefaultInputDevice();
 | 
| 
 | 
    74   iparam.nChannels = 1;
 | 
| 
 | 
    75   iparam.firstChannel = 0;
 | 
| 
 | 
    76 
 | 
| 
 | 
    77     
 | 
| 
 | 
    78   unsigned int sampleRate = 44100;
 | 
| 
 | 
    79   unsigned int bufferFrames = 256; // 256 sample frames
 | 
| 
 | 
    80 
 | 
| 
 | 
    81   RtAudio::StreamOptions options;
 | 
| 
 | 
    82   options.flags = 0;
 | 
| 
 | 
    83   options.numberOfBuffers = 2;
 | 
| 
 | 
    84   options.streamName = "test";
 | 
| 
 | 
    85 
 | 
| 
 | 
    86     
 | 
| 
 | 
    87   try {
 | 
| 
 | 
    88     audio.openStream( &oparam, &iparam, RTAUDIO_FLOAT32,
 | 
| 
 | 
    89                     sampleRate, &bufferFrames, &myCallback, (void*) 0, &options );
 | 
| 
 | 
    90     audio.startStream();
 | 
| 
 | 
    91   }
 | 
| 
 | 
    92   catch ( RtError& e ) {
 | 
| 
 | 
    93     std::cout << '\n' << e.getMessage() << '\n' << std::endl;
 | 
| 
 | 
    94     exit( EXIT_FAILURE );
 | 
| 
 | 
    95   }
 | 
| 
 | 
    96 
 | 
| 
 | 
    97   char input;
 | 
| 
 | 
    98   std::cout << "\nPlaying ... press <enter> to quit.\n";
 | 
| 
 | 
    99   std::cin.get( input );
 | 
| 
 | 
   100 
 | 
| 
 | 
   101   try {
 | 
| 
 | 
   102     // Stop the stream
 | 
| 
 | 
   103     audio.stopStream();
 | 
| 
 | 
   104   }
 | 
| 
 | 
   105   catch (RtError& e) {
 | 
| 
 | 
   106     e.printMessage();
 | 
| 
 | 
   107   }
 | 
| 
 | 
   108 
 | 
| 
 | 
   109   if ( audio.isStreamOpen() ) 
 | 
| 
 | 
   110     audio.closeStream();
 | 
| 
 | 
   111 
 | 
| 
 | 
   112   return EXIT_SUCCESS;
 | 
| 
 | 
   113 }
 |