1+ #include " StressTest.h"
2+
3+ #include " cinder/app/App.h"
4+ #include " cinder/Rand.h"
5+ #include " cinder/CinderAssert.h"
6+ #include " cinder/Log.h"
7+ #include " cinder/CinderImGui.h"
8+
9+ #include " cinder/audio/Utilities.h"
10+
11+ using namespace ci ;
12+ using namespace std ;
13+ namespace im = ImGui;
14+
15+ StressTest::StressTest ()
16+ {
17+ mSubTests = {
18+ " sine" ,
19+ " triangle" ,
20+ " osc sine" ,
21+ " osc sawtooth" ,
22+ " osc square" ,
23+ " osc triangle" ,
24+ };
25+
26+ auto ctx = audio::master ();
27+ mGain = ctx->makeNode ( new audio::GainNode );
28+ mGain ->setValue ( 0 .1f );
29+
30+ mMonitor = audio::master ()->makeNode ( new audio::MonitorSpectralNode ( audio::MonitorSpectralNode::Format ().fftSize ( 1024 ).windowSize ( 2048 ) ) );
31+ mMonitor ->setSmoothingFactor ( 0 .4f );
32+
33+ mGain >> mMonitor >> ctx->getOutput ();
34+
35+ addGens ();
36+ }
37+
38+ void StressTest::setupSubTest ( const string &testName )
39+ {
40+ if ( testName == " sine" )
41+ mSelectedGenType = SINE;
42+ else if ( testName == " triangle" )
43+ mSelectedGenType = TRIANGLE;
44+ else if ( testName == " osc sine" ) {
45+ mSelectedGenType = OSC_SINE;
46+ mWaveTable .reset ();
47+ }
48+ else if ( testName == " osc sawtooth" ) {
49+ mSelectedGenType = OSC_SAW;
50+ mWaveTable .reset ();
51+ }
52+ else if ( testName == " osc square" ) {
53+ mSelectedGenType = OSC_SQUARE;
54+ mWaveTable .reset ();
55+ }
56+ else if ( testName == " osc triangle" ) {
57+ mSelectedGenType = OSC_TRIANGLE;
58+ mWaveTable .reset ();
59+ }
60+ }
61+
62+ void StressTest::addGens ()
63+ {
64+ auto ctx = audio::master ();
65+
66+ for ( size_t i = 0 ; i < mAddIncr ; i++ ) {
67+ auto gen = makeSelectedGenType ();
68+ gen->setFreq ( audio::midiToFreq ( randInt ( 40 , 60 ) ) );
69+
70+ gen->connect ( mGain );
71+ gen->enable ();
72+
73+ mGenBank .push_back ( gen );
74+ }
75+ }
76+
77+ void StressTest::removeGens ()
78+ {
79+ for ( size_t i = 0 ; i < mAddIncr ; i++ ) {
80+ mGenBank .back ()->disconnectAll ();
81+ mGenBank .pop_back ();
82+ }
83+ }
84+
85+ void StressTest::clearGens ()
86+ {
87+ while ( ! mGenBank .empty () ) {
88+ mGenBank .back ()->disconnectAll ();
89+ mGenBank .pop_back ();
90+ }
91+ }
92+
93+ audio::GenNodeRef StressTest::makeSelectedGenType ()
94+ {
95+ switch ( mSelectedGenType ) {
96+ case SINE: return audio::master ()->makeNode ( new audio::GenSineNode );
97+ case TRIANGLE: return audio::master ()->makeNode ( new audio::GenTriangleNode );
98+ case OSC_SINE: return makeOsc ( audio::WaveformType::SINE );
99+ case OSC_SAW: return makeOsc ( audio::WaveformType::SAWTOOTH );
100+ case OSC_SQUARE: return makeOsc ( audio::WaveformType::SQUARE );
101+ case OSC_TRIANGLE: return makeOsc ( audio::WaveformType::TRIANGLE );
102+ default : CI_ASSERT_NOT_REACHABLE ();
103+ }
104+
105+ return {};
106+ }
107+
108+ audio::GenNodeRef StressTest::makeOsc ( audio::WaveformType type )
109+ {
110+ auto ctx = audio::master ();
111+ auto result = ctx->makeNode ( new audio::GenOscNode ( type ) );
112+
113+ if ( mWaveTable )
114+ result->setWaveTable ( mWaveTable );
115+ else {
116+ ctx->initializeNode ( result );
117+
118+ mWaveTable = result->getWaveTable ();
119+ }
120+
121+ return result;
122+ }
123+
124+ void StressTest::draw ()
125+ {
126+ if ( ! mDrawingEnabled ) {
127+ return ;
128+ }
129+
130+ const float padding = 10 ;
131+ const float scopeHeight = ( app::getWindowHeight () - padding * 3 ) / 2 ;
132+
133+ Rectf rect ( padding, padding, app::getWindowWidth () - padding - 200 , scopeHeight + padding );
134+
135+ drawAudioBuffer ( mMonitor ->getBuffer (), rect, true );
136+
137+ rect += vec2 ( 0 , scopeHeight + padding );
138+ mSpectrumPlot .setBounds ( rect );
139+ mSpectrumPlot .draw ( mMonitor ->getMagSpectrum () );
140+
141+ }
142+
143+ // -----------------------------------------------------------------------
144+ // UI
145+ // -----------------------------------------------------------------------
146+
147+ void StressTest::updateUI ()
148+ {
149+ im::Text ( " Gen count: %d" , mGenBank .size () );
150+
151+ float gain = mGain ->getValue ();
152+ if ( im::SliderFloat ( " gain" , &gain, 0 , 1 ) ) {
153+ mGain ->setValue ( gain );
154+ }
155+ im::InputInt ( " add incr" , &mAddIncr , 1 , 10 );
156+ if ( im::Button ( " add gens" ) ) {
157+ addGens ();
158+ }
159+ im::SameLine ();
160+ if ( im::Button ( " remove gens" ) ) {
161+ removeGens ();
162+ }
163+ im::SameLine ();
164+ if ( im::Button ( " clear" ) ) {
165+ clearGens ();
166+ }
167+
168+ im::Checkbox ( " draw waveforms" , &mDrawingEnabled );
169+
170+ if ( im::ListBox ( " sub-tests" , &mCurrentSubTest , mSubTests , mSubTests .size () ) ) {
171+ setupSubTest ( mSubTests [mCurrentSubTest ] );
172+ }
173+ }
0 commit comments