From 0876bbd0bad22677b23342c828bc36c3babbed4e Mon Sep 17 00:00:00 2001 From: Gary Scavone Date: Fri, 11 Oct 2013 01:46:50 +0200 Subject: Release 4.0.0 tarball --- doc/html/playback.html | 91 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 doc/html/playback.html (limited to 'doc/html/playback.html') diff --git a/doc/html/playback.html b/doc/html/playback.html new file mode 100644 index 0000000..9a7e918 --- /dev/null +++ b/doc/html/playback.html @@ -0,0 +1,91 @@ + + +The RtAudio Home Page + + + + +
+Home   Class/Enum List   File List   Compound Members  
+
+ +

Playback

In this example, we provide a complete program that demonstrates the use of RtAudio for audio playback. Our program produces a two-channel sawtooth waveform for output.

+

#include "RtAudio.h"
+#include <iostream>
+
+// Two-channel sawtooth wave generator.
+int saw( void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames,
+         double streamTime, RtAudioStreamStatus status, void *userData )
+{
+  unsigned int i, j;
+  double *buffer = (double *) outputBuffer;
+  double *lastValues = (double *) userData;
+
+  if ( status )
+    std::cout << "Stream underflow detected!" << std::endl;
+
+  // Write interleaved audio data.
+  for ( i=0; i<nBufferFrames; i++ ) {
+    for ( j=0; j<2; j++ ) {
+      *buffer++ = lastValues[j];
+
+      lastValues[j] += 0.005 * (j+1+(j*0.1));
+      if ( lastValues[j] >= 1.0 ) lastValues[j] -= 2.0;
+    }
+  }
+
+  return 0;
+}
+
+int main()
+{
+  RtAudio dac;
+  if ( dac.getDeviceCount() < 1 ) {
+    std::cout << "\nNo audio devices found!\n";
+    exit( 0 );
+  }
+
+  RtAudio::StreamParameters parameters;
+  parameters.deviceId = dac.getDefaultOutputDevice();
+  parameters.nChannels = 2;
+  parameters.firstChannel = 0;
+  unsigned int sampleRate = 44100;
+  unsigned int bufferFrames = 256; // 256 sample frames
+  double data[2];
+
+  try {
+    dac.openStream( &parameters, NULL, RTAUDIO_FLOAT64,
+                    sampleRate, &bufferFrames, &saw, (void *)&data );
+    dac.startStream();
+  }
+  catch ( RtError& e ) {
+    e.printMessage();
+    exit( 0 );
+  }
+  
+  char input;
+  std::cout << "\nPlaying ... press <enter> to quit.\n";
+  std::cin.get( input );
+
+  try {
+    // Stop the stream
+    dac.stopStream();
+  }
+  catch (RtError& e) {
+    e.printMessage();
+  }
+
+  if ( dac.isStreamOpen() ) dac.closeStream();
+
+  return 0;
+}
+

+We open the stream in exactly the same way as the previous example (except with a data format change) and specify the address of our callback function "saw()". The callback function will automatically be invoked when the underlying audio system needs data for output. Note that the callback function is called only when the stream is "running" (between calls to the RtAudio::startStream() and RtAudio::stopStream() functions). We can also pass a pointer value to the RtAudio::openStream() function that is made available in the callback function. In this way, it is possible to gain access to arbitrary data created in our main() function from within the globally defined callback function.

+In this example, we stop the stream with an explicit call to RtAudio::stopStream(). It is also possible to stop a stream by returning a non-zero value from the callback function. A return value of 1 will cause the stream to finish draining its internal buffers and then halt (equivalent to calling the RtAudio::stopStream() function). A return value of 2 will cause the stream to stop immediately (equivalent to calling the RtAudio::abortStream() function).


+ + + +
©2001-2007 Gary P. Scavone, McGill University. All Rights Reserved.
Maintained by Gary P. Scavone.
+ + + -- cgit v1.2.3