diff --git a/src/gdpd.cpp b/src/gdpd.cpp index ddabb747dc6f9ae4ddfe007a8846bf30a16d8f36..549be868381c6891e2c03e6b8f92afcff60e6089 100644 --- a/src/gdpd.cpp +++ b/src/gdpd.cpp @@ -12,17 +12,21 @@ void Gdpd::_register_methods() { register_method("add_symbol", &Gdpd::add_symbol); register_method("add_float", &Gdpd::add_float); register_method("finish_list", &Gdpd::finish_list); + register_method("set_volume", &Gdpd::set_volume); } int Gdpd::audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData){ - // pass audio samples to/from libpd - int ticks = nBufferFrames / 64; - libpd_process_float(ticks, (float*)inputBuffer, (float*)outputBuffer); - return 0; + Gdpd* gdpd = static_cast<Gdpd*>(userData); + int ticks = nBufferFrames / 64; + gdpd->m_pd.processFloat(ticks, (float*)inputBuffer, (float*)outputBuffer); + gdpd->m_pd.receiveMessages(); + for(int b=0; b<nBufferFrames; ++b) { + ((float*)outputBuffer)[b]*=gdpd->get_volume(); + } + return 0; } - -Gdpd::Gdpd() { +Gdpd::Gdpd(): m_vol(1) { } void Gdpd::_init() { @@ -30,22 +34,16 @@ void Gdpd::_init() { } Gdpd::~Gdpd() { - // add your cleanup here } int Gdpd::init(int nbInputs, int nbOutputs, int sampleRate) { - if(!m_pd.init(nbInputs, nbOutputs, sampleRate, true)) { Godot::print("GDPD : Error starting libpd"); return 1; } - /* - int bufsize = 128; - m_inBuf = new float[bufsize * nbInputs]; - m_outBuf = new float[bufsize * nbOutputs]; - */ + libpd_set_verbose(1); //create message array m_messages = new Array(); @@ -79,7 +77,7 @@ int Gdpd::init(int nbInputs, int nbOutputs, int sampleRate) { try { m_audio.openStream(&outParams, &inParams, RTAUDIO_FLOAT32, sr, &m_bufferFrames, &audioCallback, - &m_pd, &options); + this, &options); m_audio.startStream(); } catch(RtAudioError& e) { @@ -87,7 +85,7 @@ int Gdpd::init(int nbInputs, int nbOutputs, int sampleRate) { } - Godot::print("GDPD : Initialized"); + print("Initialized"); return 0; } @@ -100,7 +98,7 @@ void Gdpd::openfile(godot::String baseStr, godot::String dirStr) { libpd_openfile(baseS.c_str(), dirS.c_str()); - Godot::print("GDPD : Opened patch"); + print("Opened patch"); } void Gdpd::closefile() { @@ -150,7 +148,7 @@ int Gdpd::finish_list(String destStr) { void Gdpd::print(const std::string& message) { - Godot::print(message.c_str()); + Godot::print((std::string("GDPD : ")+message).c_str()); } void Gdpd::receiveList(const std::string& dest, const pd::List& list) { @@ -168,3 +166,8 @@ void Gdpd::receiveList(const std::string& dest, const pd::List& list) { m_messages->push_back(gdlist); } + +void Gdpd::set_volume(float vol) { + m_vol=vol; +} + diff --git a/src/gdpd.hpp b/src/gdpd.hpp index 51c6edfc0be4715a9f453cafd44a906d30f388e9..5e34ab846d2c5080b6dccdcc178eb433eb949a25 100644 --- a/src/gdpd.hpp +++ b/src/gdpd.hpp @@ -25,6 +25,7 @@ private: pd::Patch m_patch; RtAudio m_audio; unsigned int m_bufferFrames; + float m_vol; public: static void _register_methods(); @@ -47,9 +48,15 @@ public: int finish_list(String destStr); //libpd hooks - void print(const std::string& message); + virtual void print(const std::string& message); void receiveList(const std::string& dest, const pd::List& list); + //godot functions + void set_volume(float vol); + inline const float& get_volume(){return m_vol;} + + + //rtaudio static int audioCallback(void *outputBuffer, void *inputBuffer, unsigned int nBufferFrames, double streamTime, RtAudioStreamStatus status, void *userData); }; diff --git a/src/rtaudio/RtAudio.os b/src/rtaudio/RtAudio.os index 82494c53fc326b37589644c4dab3e3e13e4cdc6d..0375183822ba8f282b98a749a539fe43f2a7b4c7 100644 Binary files a/src/rtaudio/RtAudio.os and b/src/rtaudio/RtAudio.os differ