diff --git a/src/gdpd.cpp b/src/gdpd.cpp
index 4ce1a91029694fc743aaec8c639ad5ce1b7fead5..4cc88e3e61ee50aba6a39eac115df6cf63d32dfb 100644
--- a/src/gdpd.cpp
+++ b/src/gdpd.cpp
@@ -3,6 +3,11 @@
 using namespace godot;
 
 void Gdpd::_register_methods() {
+    register_method("get_available_input_devices", 
+					&Gdpd::get_available_input_devices);
+    register_method("get_available_output_devices", 
+					&Gdpd::get_available_output_devices);
+    register_method("init_devices", &Gdpd::init_devices);
     register_method("init", &Gdpd::init);
     register_method("openfile", &Gdpd::openfile);
     register_method("closefile", &Gdpd::closefile);
@@ -35,9 +40,75 @@ void Gdpd::_init() {
 Gdpd::~Gdpd() {
 }
 
+Array Gdpd::get_available_input_devices() {
+	Array gdlist;
+	for(int d=0; d<m_audio.getDeviceCount(); d++) {
+		if(m_audio.getDeviceInfo(d).inputChannels>0) {
+			gdlist.push_back(m_audio.getDeviceInfo(d).name.c_str());
+		}
+	}
+	return gdlist;
+}
+
+Array Gdpd::get_available_output_devices() {
+	Array gdlist;
+	for(int d=0; d<m_audio.getDeviceCount(); d++) {
+		if(m_audio.getDeviceInfo(d).outputChannels>0) {
+			gdlist.push_back(m_audio.getDeviceInfo(d).name.c_str());
+		}
+	}
+	return gdlist;
+}
+
+
+int Gdpd::init_devices(String inputDevice, String outputDevice) {
+	std::wstring inpWs = inputDevice.unicode_str();
+	std::string inpStr(inpWs.begin(), inpWs.end());
+	std::wstring outWs = outputDevice.unicode_str();
+	std::string outStr(outWs.begin(), outWs.end());
+
+	for(int d=0; d<m_audio.getDeviceCount(); d++) {
+		std::string n = m_audio.getDeviceInfo(d).name;
+		if(n.compare(inpStr)==0) {
+			m_inputDevice = d;
+		}
+		if(n.compare(outStr)==0) {
+			m_outputDevice = d;
+		}
+	}
+
+	RtAudio::DeviceInfo inpInfo = m_audio.getDeviceInfo(m_inputDevice);
+	RtAudio::DeviceInfo outInfo = m_audio.getDeviceInfo(m_outputDevice);
+	m_nbInputs = inpInfo.inputChannels;
+	m_nbOutputs = outInfo.outputChannels;
+	m_sampleRate = outInfo.preferredSampleRate;
+	m_bufferFrames = 128;
+	return start();
+}
+
 int Gdpd::init(int nbInputs, int nbOutputs, int sampleRate, int bufferSize) {
+	m_inputDevice = m_audio.getDefaultInputDevice();
+	m_outputDevice = m_audio.getDefaultOutputDevice();
+	RtAudio::DeviceInfo inpInfo = m_audio.getDeviceInfo(m_inputDevice);
+	RtAudio::DeviceInfo outInfo = m_audio.getDeviceInfo(m_outputDevice);
+	m_nbInputs 	= std::min<int>(nbInputs, inpInfo.inputChannels);
+	m_nbOutputs = std::min<int>(nbOutputs, outInfo.outputChannels);
+	m_sampleRate = sampleRate;
+	m_bufferFrames = std::max<int>(64, bufferSize);
+	return start();
+}
+
+int Gdpd::start() {
+	RtAudio::StreamParameters outParams, inpParams;
+	inpParams.deviceId = m_inputDevice;
+	inpParams.nChannels = m_nbInputs;
+	outParams.deviceId = m_outputDevice;
+	outParams.nChannels = m_nbOutputs;
+	print("Output channels = "+std::to_string(outParams.nChannels));
+	print("Input channels = "+std::to_string(inpParams.nChannels));
 
-	if(!m_pd.init(nbInputs, nbOutputs, sampleRate, true)) {
+
+	if(!m_pd.init(m_nbInputs, m_nbOutputs, m_sampleRate, true)) {
 		Godot::print("GDPD : Error starting libpd");
 		return 1;
 	}
@@ -59,20 +130,6 @@ int Gdpd::init(int nbInputs, int nbOutputs, int sampleRate, int bufferSize) {
 		Godot::print("There are no available sound devices.");
 	}
 
-	RtAudio::StreamParameters outParams, inpParams;
-	inpParams.deviceId = m_audio.getDefaultInputDevice();
-	outParams.deviceId = m_audio.getDefaultOutputDevice();
-	RtAudio::DeviceInfo inpInfo = m_audio.getDeviceInfo(inpParams.deviceId);
-	RtAudio::DeviceInfo outInfo = m_audio.getDeviceInfo(outParams.deviceId);
-
-	unsigned int sr = outInfo.preferredSampleRate;
-	inpParams.nChannels = m_nbInputs 
-						= std::min<int>(nbInputs, inpInfo.inputChannels);
-	outParams.nChannels = m_nbOutputs
-						= std::min<int>(nbOutputs, outInfo.outputChannels);
-	print("Output channels = "+std::to_string(outParams.nChannels));
-	print("Input channels = "+std::to_string(inpParams.nChannels));
-	m_bufferFrames = std::max<int>(64, bufferSize);
 
 
 	RtAudio::StreamOptions options;
@@ -83,7 +140,7 @@ int Gdpd::init(int nbInputs, int nbOutputs, int sampleRate, int bufferSize) {
 	}
 	try {
 		m_audio.openStream(&outParams, &inpParams, RTAUDIO_FLOAT32, 
-						   sr, &m_bufferFrames, &audioCallback, 
+						   m_sampleRate, &m_bufferFrames, &audioCallback, 
 						   this, &options);
 		m_audio.startStream();
 	}
diff --git a/src/gdpd.hpp b/src/gdpd.hpp
index 972d4056a346c00b122ec37e6fbde413c5b08e81..e16f9d44c29aa2c221698bda6eea7352085cb85d 100644
--- a/src/gdpd.hpp
+++ b/src/gdpd.hpp
@@ -28,6 +28,9 @@ private:
 	float m_vol;
 	int m_nbInputs;
 	int m_nbOutputs;
+	int m_sampleRate;
+	int m_inputDevice;
+	int m_outputDevice;
 
 public:
     static void _register_methods();
@@ -38,7 +41,11 @@ public:
 	void _init();
 
 	//libpd functions
+	Array get_available_input_devices();
+	Array get_available_output_devices();
+	int init_devices(String inputDevice, String outputDevice);
 	int init(int nbInputs, int nbOutputs, int sampleRate, int bufferSize);
+	int start();
 	void openfile(String basename, String dirname);
 	void closefile();
 	bool has_message();