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 {