comparison src/portaudio_20161030_catalina_patch/bindings/cpp/example/sine.cxx @ 77:4edcd14160a5 pa_catalina

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