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