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