From dd21fff1e704d1b43332b6b22547add720a5c028 Mon Sep 17 00:00:00 2001
From: Florent Berthaut <florent.berthaut@univ-lille.fr>
Date: Mon, 3 Apr 2023 17:37:35 +0200
Subject: [PATCH] Added attribute to select audio process type

---
 src/audio/AudioManager.cpp      |  2 ++
 src/modules/ProjectorModule.cpp | 36 ++++++++++++++++++++++-----------
 src/modules/ProjectorModule.hpp | 12 +++++------
 src/shaders/render43.fs         | 11 +++++++---
 4 files changed, 40 insertions(+), 21 deletions(-)

diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index fdc4f2e..96a1c70 100644
--- a/src/audio/AudioManager.cpp
+++ b/src/audio/AudioManager.cpp
@@ -76,6 +76,8 @@ int AudioManager::rtaudio_callback(void *outbuf, void *inbuf, unsigned int nFram
 		}
 		else {
 			memset(buf, 0, nFrames*data->nChannel*sizeof(float));
+			memset(data->buffer, 0, data->bufSize*sizeof(float));
+			memset(data->mixBuffer, 0, nFrames*sizeof(float));
 //			cout<<"AudioManager : Could not read buffer"<<endl;
 		}
 	}
diff --git a/src/modules/ProjectorModule.cpp b/src/modules/ProjectorModule.cpp
index 2e29751..50c43f3 100644
--- a/src/modules/ProjectorModule.cpp
+++ b/src/modules/ProjectorModule.cpp
@@ -56,7 +56,7 @@ ProjectorModule::ProjectorModule(): Module() {
     m_posX=0;
     m_posY=0;
     m_processOutput=true;
-    m_processAudio=true;
+    m_audioProcessType=0;
     m_active=true;
     m_postFilter=0;
 	m_transparentBackground=false;
@@ -130,10 +130,17 @@ ProjectorModule::ProjectorModule(): Module() {
                                 Attribute::BOOL_ATTRIBUTE,
                                 transparentWindowCallback, this, 1,
                                 Attribute::LOCAL));
-    addAttribute(new Attribute("output_audio",
-                                Attribute::BOOL_ATTRIBUTE,
-                                outputAudioCallback, this, 1,
-                                Attribute::LOCAL));
+    addAttribute(new Attribute("audio_process", 
+                               Attribute::STRING_ATTRIBUTE,
+                               audioProcessTypeCallback, this, 1,
+							   Attribute::LOCAL));
+    m_audioProcessTypes.push_back("none");
+    m_audioProcessTypes.push_back("additiveSynthesis");
+    m_audioProcessTypes.push_back("pitchedAdditiveSynthesis");
+    m_attributesMap["audio_process"]
+            ->editStringValuesChoices().assign(1, m_audioProcessTypes);
+    m_attributesMap["audio_process"]
+            ->setStrings(vector<string>(1,m_audioProcessTypes[0]));
 
     //initialize attributes
     vector<string> labels;
@@ -344,7 +351,7 @@ void ProjectorModule::draw() {
                 m_outNbDepth);
 
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::PROCESSAUDIO], 
-			m_processAudio);
+			m_audioProcessType);
     glUniform1i(m_uniforms[Reveal::RENDERPROG][Reveal::AUDIOTEX], 1);
     glBindImageTexture(1, m_audioTex, 0, GL_FALSE, 0,
                        GL_READ_WRITE, GL_R32I);
@@ -401,7 +408,7 @@ void ProjectorModule::draw() {
     if(m_processOutput) {
         processOutput();
     }
-	if(m_processAudio) {
+	if(m_audioProcessType>0) {
 		processAudio();
 	}
 #endif
@@ -924,10 +931,6 @@ void ProjectorModule::outputRevealed(bool output) {
     m_processOutput=output;
 }
 
-void ProjectorModule::outputAudio(bool audio) {
-	m_processAudio=audio;
-}
-
 void ProjectorModule::postFilter(const int& filt) {
     m_postFilter=filt;
 }
@@ -1015,6 +1018,16 @@ void ProjectorModule::processOutput() {
     }
 }
 
+void ProjectorModule::setAudioProcessType(const std::string& type) {
+    int t=0;
+    for(auto &ptype : m_audioProcessTypes) {
+        if(ptype == type) {
+            m_audioProcessType = t;
+        }
+		++t;
+    }
+}
+
 void ProjectorModule::processAudio() {
     glBindTexture(GL_TEXTURE_2D, m_audioTex);
     glGetTexImage(GL_TEXTURE_2D, 0, GL_RED_INTEGER, 
@@ -1022,7 +1035,6 @@ void ProjectorModule::processAudio() {
                         m_audioImg);
                         
 	//FIXME mix in a compute shader
-	
     float totalGains = 0;
     for(int i = 0; i<m_nbTracks; i++) {
 		//check if the note has to be played this frame
diff --git a/src/modules/ProjectorModule.hpp b/src/modules/ProjectorModule.hpp
index 4370ae1..5b29f6c 100644
--- a/src/modules/ProjectorModule.hpp
+++ b/src/modules/ProjectorModule.hpp
@@ -111,11 +111,11 @@ class ProjectorModule : public Module, public ContextHandler {
             static_cast<ProjectorModule*>(mod)->outputRevealed(vals[0]);
         }
         void outputRevealed(bool output);
-        static void outputAudioCallback(Module* mod, 
-                                           const std::vector<bool>& vals) {
-            static_cast<ProjectorModule*>(mod)->outputAudio(vals[0]);
+        static void audioProcessTypeCallback(Module* mod, 
+									   const std::vector<std::string>& vals) {
+            static_cast<ProjectorModule*>(mod)->setAudioProcessType(vals[0]);
         }
-        void outputAudio(bool audio);
+        void setAudioProcessType(const std::string& val);
         static void mirroredCallback(Module* mod, 
                                      const std::vector<bool>& vals) {
             static_cast<ProjectorModule*>(mod)->setMirrored(vals[0]);
@@ -189,7 +189,6 @@ class ProjectorModule : public Module, public ContextHandler {
         float m_posX, m_posY;
         int m_rttWidth, m_rttHeight;
         bool m_processOutput;
-        bool m_processAudio;
         float m_postFilter;
 		bool m_transparentBackground;
 
@@ -229,7 +228,6 @@ class ProjectorModule : public Module, public ContextHandler {
         int m_outNbDepth;
 
 		//audio output
-		bool m_audioActive;
         GLuint m_audioTex;
         int* m_audioImg;
         int* m_audioImgInit;
@@ -240,6 +238,8 @@ class ProjectorModule : public Module, public ContextHandler {
 		float* m_audioBuffer;
 		float m_maxAudioValue;
 		int m_audioNextBuf;
+		std::vector<std::string> m_audioProcessTypes;
+		int m_audioProcessType;
 
 
 };
diff --git a/src/shaders/render43.fs b/src/shaders/render43.fs
index 1e2acf1..2efd3ea 100644
--- a/src/shaders/render43.fs
+++ b/src/shaders/render43.fs
@@ -560,9 +560,14 @@ void main(void) {
 
 		if((insideVisible>0 && rendered==1) || (surface>0 && rendered==2)) {
 			color = vec4(finalColor, 1.0);
-			if(processAudio>0) {
-				additiveSynth(color);
-				//pitchedAdditiveSynth(color);
+			switch(processAudio) {
+				case 1 : {
+					additiveSynth(color);
+				}break;
+				case 2 : {
+					pitchedAdditiveSynth(color);
+				}break;
+				default:break;
 			}
 		}
 		else {
-- 
GitLab