annotate src/portaudio_20161030_catalina_patch/bindings/cpp/example/sine.cxx @ 83:ae30d91d2ffe

Replace these with versions built using an older toolset (so as to avoid ABI compatibilities when linking on Ubuntu 14.04 for packaging purposes)
author Chris Cannam
date Fri, 07 Feb 2020 11:51:13 +0000
parents 4edcd14160a5
children
rev   line source
Chris@55 1 // ---------------------------------------------------------------------------------------
Chris@55 2
Chris@55 3 #include <iostream>
Chris@55 4 #include <cmath>
Chris@55 5 #include <cassert>
Chris@55 6 #include <cstddef>
Chris@55 7 #include "portaudiocpp/PortAudioCpp.hxx"
Chris@55 8
Chris@55 9 // ---------------------------------------------------------------------------------------
Chris@55 10
Chris@55 11 // Some constants:
Chris@55 12 const int NUM_SECONDS = 5;
Chris@55 13 const double SAMPLE_RATE = 44100.0;
Chris@55 14 const int FRAMES_PER_BUFFER = 64;
Chris@55 15 const int TABLE_SIZE = 200;
Chris@55 16
Chris@55 17 // ---------------------------------------------------------------------------------------
Chris@55 18
Chris@55 19 // SineGenerator class:
Chris@55 20 class SineGenerator
Chris@55 21 {
Chris@55 22 public:
Chris@55 23 SineGenerator(int tableSize) : tableSize_(tableSize), leftPhase_(0), rightPhase_(0)
Chris@55 24 {
Chris@55 25 const double PI = 3.14159265;
Chris@55 26 table_ = new float[tableSize];
Chris@55 27 for (int i = 0; i < tableSize; ++i)
Chris@55 28 {
Chris@55 29 table_[i] = 0.125f * (float)sin(((double)i/(double)tableSize)*PI*2.);
Chris@55 30 }
Chris@55 31 }
Chris@55 32
Chris@55 33 ~SineGenerator()
Chris@55 34 {
Chris@55 35 delete[] table_;
Chris@55 36 }
Chris@55 37
Chris@55 38 int generate(const void *inputBuffer, void *outputBuffer, unsigned long framesPerBuffer,
Chris@55 39 const PaStreamCallbackTimeInfo *timeInfo, PaStreamCallbackFlags statusFlags)
Chris@55 40 {
Chris@55 41 assert(outputBuffer != NULL);
Chris@55 42
Chris@55 43 float **out = static_cast<float **>(outputBuffer);
Chris@55 44
Chris@55 45 for (unsigned int i = 0; i < framesPerBuffer; ++i)
Chris@55 46 {
Chris@55 47 out[0][i] = table_[leftPhase_];
Chris@55 48 out[1][i] = table_[rightPhase_];
Chris@55 49
Chris@55 50 leftPhase_ += 1;
Chris@55 51 if (leftPhase_ >= tableSize_)
Chris@55 52 leftPhase_ -= tableSize_;
Chris@55 53
Chris@55 54 rightPhase_ += 3;
Chris@55 55 if (rightPhase_ >= tableSize_)
Chris@55 56 rightPhase_ -= tableSize_;
Chris@55 57 }
Chris@55 58
Chris@55 59 return paContinue;
Chris@55 60 }
Chris@55 61
Chris@55 62 private:
Chris@55 63 float *table_;
Chris@55 64 int tableSize_;
Chris@55 65 int leftPhase_;
Chris@55 66 int rightPhase_;
Chris@55 67 };
Chris@55 68
Chris@55 69 // ---------------------------------------------------------------------------------------
Chris@55 70
Chris@55 71 // main:
Chris@55 72 int main(int, char *[]);
Chris@55 73 int main(int, char *[])
Chris@55 74 {
Chris@55 75 try
Chris@55 76 {
Chris@55 77 // Create a SineGenerator object:
Chris@55 78 SineGenerator sineGenerator(TABLE_SIZE);
Chris@55 79
Chris@55 80 std::cout << "Setting up PortAudio..." << std::endl;
Chris@55 81
Chris@55 82 // Set up the System:
Chris@55 83 portaudio::AutoSystem autoSys;
Chris@55 84 portaudio::System &sys = portaudio::System::instance();
Chris@55 85
Chris@55 86 // Set up the parameters required to open a (Callback)Stream:
Chris@55 87 portaudio::DirectionSpecificStreamParameters outParams(sys.defaultOutputDevice(), 2, portaudio::FLOAT32, false, sys.defaultOutputDevice().defaultLowOutputLatency(), NULL);
Chris@55 88 portaudio::StreamParameters params(portaudio::DirectionSpecificStreamParameters::null(), outParams, SAMPLE_RATE, FRAMES_PER_BUFFER, paClipOff);
Chris@55 89
Chris@55 90 std::cout << "Opening stereo output stream..." << std::endl;
Chris@55 91
Chris@55 92 // Create (and open) a new Stream, using the SineGenerator::generate function as a callback:
Chris@55 93 portaudio::MemFunCallbackStream<SineGenerator> stream(params, sineGenerator, &SineGenerator::generate);
Chris@55 94
Chris@55 95 std::cout << "Starting playback for " << NUM_SECONDS << " seconds." << std::endl;
Chris@55 96
Chris@55 97 // Start the Stream (audio playback starts):
Chris@55 98 stream.start();
Chris@55 99
Chris@55 100 // Wait for 5 seconds:
Chris@55 101 sys.sleep(NUM_SECONDS * 1000);
Chris@55 102
Chris@55 103 std::cout << "Closing stream..." <<std::endl;
Chris@55 104
Chris@55 105 // Stop the Stream (not strictly needed as termintating the System will also stop all open Streams):
Chris@55 106 stream.stop();
Chris@55 107
Chris@55 108 // Close the Stream (not strictly needed as terminating the System will also close all open Streams):
Chris@55 109 stream.close();
Chris@55 110
Chris@55 111 // Terminate the System (not strictly needed as the AutoSystem will also take care of this when it
Chris@55 112 // goes out of scope):
Chris@55 113 sys.terminate();
Chris@55 114
Chris@55 115 std::cout << "Test finished." << std::endl;
Chris@55 116 }
Chris@55 117 catch (const portaudio::PaException &e)
Chris@55 118 {
Chris@55 119 std::cout << "A PortAudio error occured: " << e.paErrorText() << std::endl;
Chris@55 120 }
Chris@55 121 catch (const portaudio::PaCppException &e)
Chris@55 122 {
Chris@55 123 std::cout << "A PortAudioCpp error occured: " << e.what() << std::endl;
Chris@55 124 }
Chris@55 125 catch (const std::exception &e)
Chris@55 126 {
Chris@55 127 std::cout << "A generic exception occured: " << e.what() << std::endl;
Chris@55 128 }
Chris@55 129 catch (...)
Chris@55 130 {
Chris@55 131 std::cout << "An unknown exception occured." << std::endl;
Chris@55 132 }
Chris@55 133
Chris@55 134 return 0;
Chris@55 135 }
Chris@55 136
Chris@55 137