From b41183d837e2a139370e41b5b71e48a3fadbfda6 Mon Sep 17 00:00:00 2001
From: jsiegle <jsiegle@mit.edu>
Date: Sun, 8 Apr 2012 17:52:03 -0400
Subject: [PATCH] AudioComponent closes device when not in use. Closes #10.

The AudioComponent now closes the audio device when it's not in use,
saving CPU cycles. Previously, background CPU levels would be between
8 and 10%. Now, when acquisition is not active (and audio device settings
are not being actively edited), background CPU levels drop to 2%. More
optimization will be necessary to get it down to zero, but 2% is still
a big improvement over what we had previously.
---
 Source/Audio/AudioComponent.cpp               | 21 +++++++++++++++-
 Source/Audio/AudioComponent.h                 |  3 +++
 Source/Processors/Editors/AudioEditor.cpp     | 16 +++++++++---
 Source/Processors/Editors/AudioEditor.h       |  3 ++-
 Source/Processors/Editors/GenericEditor.cpp   |  4 +--
 .../Processors/Visualization/OpenGLCanvas.cpp |  2 +-
 Source/UI/EditorViewport.cpp                  | 25 ++++++++++++++-----
 7 files changed, 59 insertions(+), 15 deletions(-)

diff --git a/Source/Audio/AudioComponent.cpp b/Source/Audio/AudioComponent.cpp
index f393750c1..9942ff147 100644
--- a/Source/Audio/AudioComponent.cpp
+++ b/Source/Audio/AudioComponent.cpp
@@ -68,7 +68,10 @@ AudioComponent::AudioComponent() : isPlaying(false)
 	std::cout << "Audio device sample rate: " <<  sr << std::endl;
 	std::cout << "Audio device buffer size: " << buffSize << std::endl << std::endl;
 
-	 graphPlayer = new AudioProcessorPlayer();
+	graphPlayer = new AudioProcessorPlayer();
+
+	stopDevice(); // reduces the amount of background processing when
+				  // device is not in use
 
 }
 
@@ -99,8 +102,22 @@ bool AudioComponent::callbacksAreActive() {
 	return isPlaying;
 }
 
+void AudioComponent::restartDevice()
+{
+	deviceManager.restartLastAudioDevice();
+
+}
+
+void AudioComponent::stopDevice()
+{
+
+	deviceManager.closeAudioDevice();
+}
+
 void AudioComponent::beginCallbacks() {
 	
+	restartDevice();
+
 	std::cout << std::endl << "Adding audio callback." << std::endl;
 	deviceManager.addAudioCallback(graphPlayer);
 	isPlaying = true;
@@ -113,5 +130,7 @@ void AudioComponent::endCallbacks() {
 	deviceManager.removeAudioCallback(graphPlayer);
 	isPlaying = false;
 
+	stopDevice();
+
 }
 
diff --git a/Source/Audio/AudioComponent.h b/Source/Audio/AudioComponent.h
index 45a804c4b..e129564e6 100644
--- a/Source/Audio/AudioComponent.h
+++ b/Source/Audio/AudioComponent.h
@@ -56,6 +56,9 @@ public:
 
 	bool callbacksAreActive();
 
+  void restartDevice();
+  void stopDevice();
+
   AudioDeviceManager deviceManager;
 
 private:
diff --git a/Source/Processors/Editors/AudioEditor.cpp b/Source/Processors/Editors/AudioEditor.cpp
index 50f659177..808226e56 100644
--- a/Source/Processors/Editors/AudioEditor.cpp
+++ b/Source/Processors/Editors/AudioEditor.cpp
@@ -136,16 +136,23 @@ void AudioEditor::buttonClicked(Button* button)
 		{
 			if (acw == 0) {
 				
-				AudioComponent* ac = getAudioComponent();
-
-				if (ac != 0)
-					acw = new AudioConfigurationWindow(ac->deviceManager, (Button*) audioWindowButton);
+				// AudioComponent* audioComponent = getAudioComponent();
+				// audioComponent->restartDevice();
 
+				// if (audioComponent != 0) {
+					acw = new AudioConfigurationWindow(getAudioComponent()->deviceManager, (Button*) audioWindowButton);
+					acw->setUIComponent(getUIComponent());
+				//}
 			}
 
+			getAudioComponent()->restartDevice();
 			acw->setVisible(true);
+
 		} else {
+
 			acw->setVisible(false);
+			//deleteAndZero(acw);
+			getAudioComponent()->stopDevice();
 		}
 	}
 
@@ -205,6 +212,7 @@ AudioConfigurationWindow::~AudioConfigurationWindow()
 void AudioConfigurationWindow::closeButtonPressed()
 {
 	controlButton->setToggleState(false,false);
+	getAudioComponent()->stopDevice();
 	setVisible(false);
 }
 
diff --git a/Source/Processors/Editors/AudioEditor.h b/Source/Processors/Editors/AudioEditor.h
index fcdad65b5..5389a25d8 100644
--- a/Source/Processors/Editors/AudioEditor.h
+++ b/Source/Processors/Editors/AudioEditor.h
@@ -48,7 +48,8 @@ class AudioWindowButton : public Button
 		Font font;
 };
 
-class AudioConfigurationWindow : public DocumentWindow
+class AudioConfigurationWindow : public DocumentWindow,
+								 public AccessClass
 {
 public:
 	AudioConfigurationWindow(AudioDeviceManager& adm, Button* b);
diff --git a/Source/Processors/Editors/GenericEditor.cpp b/Source/Processors/Editors/GenericEditor.cpp
index 9600c196b..b44d1a867 100644
--- a/Source/Processors/Editors/GenericEditor.cpp
+++ b/Source/Processors/Editors/GenericEditor.cpp
@@ -79,8 +79,8 @@ GenericEditor::GenericEditor (GenericProcessor* owner)//, FilterViewport* vp)
 	audioChannels.clear();
 	recordChannels.clear();
 
-	backgroundGradient = ColourGradient(Colour(190, 190, 190), 0.0f, 0.0f, 
-										 Colour(145, 145, 145), 0.0f, 150.0f, false);
+	backgroundGradient = ColourGradient(Colour(190, 190, 190), 0.0f, 150.0f, 
+										 Colour(145, 145, 145), 0.0f, 0.0f, false);
 
 	//grad.addColour(0.5f, Colour(170, 170, 170));
 	//grad.addColour(0.5, Colours::lightgrey);
diff --git a/Source/Processors/Visualization/OpenGLCanvas.cpp b/Source/Processors/Visualization/OpenGLCanvas.cpp
index 1d8b33856..a51104ccb 100644
--- a/Source/Processors/Visualization/OpenGLCanvas.cpp
+++ b/Source/Processors/Visualization/OpenGLCanvas.cpp
@@ -28,7 +28,7 @@
 OpenGLCanvas::OpenGLCanvas() : //OpenGLComponent(OpenGLComponent::OpenGLType::openGLDefault, true),
 	scrollPix(0), scrollTime(0), scrollDiff(0), originalScrollPix(0), 
 	scrollBarWidth(15), PI(3.1415926), showScrollTrack(true),
-	animationIsActive(false), refreshMs(100)
+	animationIsActive(false), refreshMs(50)
 {
 
 	loadFonts();
diff --git a/Source/UI/EditorViewport.cpp b/Source/UI/EditorViewport.cpp
index b4752b7f4..0652adc75 100644
--- a/Source/UI/EditorViewport.cpp
+++ b/Source/UI/EditorViewport.cpp
@@ -687,13 +687,26 @@ void SignalChainTabButton::paintButton(Graphics &g, bool isMouseOver, bool isBut
     }
 
     if (isMouseOver) {
-         grad1 = ColourGradient(Colour(255, 255, 255), 0.0f, 20.0f, 
-                                Colour(180, 180, 180), 0.0f, 0.0f,
-                               false);
+        
+        grad1.multiplyOpacity(0.7f);
+        grad2.multiplyOpacity(0.7f);
+        //  grad1 = ColourGradient(Colour(255, 255, 255), 0.0f, 20.0f, 
+        //                         Colour(180, 180, 180), 0.0f, 0.0f,
+        //                        false);
+
+        // grad2 = ColourGradient(Colour(255, 255, 255), 0.0f, 0.0f, 
+        //                         Colour(180, 180, 180), 0.0f, 20.0f,
+        //                        false);
+    }
+
+    if (isButtonDown) {
+
+        // ColourGradient grad3 = grad1;
+        // grad1 = grad2;
+        // grad2 = grad3;
+        // grad1.multiplyOpacity(0.7f);
+        // grad2.multiplyOpacity(0.7f);
 
-        grad2 = ColourGradient(Colour(255, 255, 255), 0.0f, 0.0f, 
-                                Colour(180, 180, 180), 0.0f, 20.0f,
-                               false);
     }
 
     g.setGradientFill(grad2);
-- 
GitLab