diff --git a/src/audio/AudioManager.cpp b/src/audio/AudioManager.cpp
index fdc4f2e54742a328cc83ab80bf28dde28eff7642..96a1c706c3920e01c7887c84f767fcc343fe8825 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 2e2975153f3ff641c867beea7f4a7ab6f6241439..50c43f3cf54be28b05222079a3b1505f681c1548 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 4370ae1cc50a8fdf4e3082cba091626e2cd9430c..5b29f6c5b5923b0544dd8867e8f86d106b09c592 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 1e2acf1e08fa4096b960115dc02880bb432f48d8..2efd3ea30f90d0ac951bd66e35f499e6a39fb472 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 {