diff --git a/include/jackaudioio.hpp b/include/jackaudioio.hpp
index 38f5a59..99823ed 100644
--- a/include/jackaudioio.hpp
+++ b/include/jackaudioio.hpp
@@ -204,6 +204,23 @@ In that method you can get audio in from jack and write it out to jack.
virtual unsigned int addOutPort(std::string name)
throw(std::runtime_error);
+ /**
+ @brief Remove a jack input port from our client.
+ This method cannot be called while the client is running.
+ \param name string the name of the port to remove
+ \return the number of total input ports
+ */
+ virtual unsigned int removeInPort(std::string name)
+ throw(std::runtime_error);
+ /**
+ @brief Remove a jack output port from our client.
+ This method cannot be called while the client is running.
+ \param name string the name of the port to remove
+ \return the number of total output ports
+ */
+ virtual unsigned int removeOutPort(std::string name)
+ throw(std::runtime_error);
+
/**
@brief Connect our output to a jack client's source port.
\param index the index of our output port to connect from.
diff --git a/src/jackaudioio.cpp b/src/jackaudioio.cpp
index abd8cef..e17f761 100644
--- a/src/jackaudioio.cpp
+++ b/src/jackaudioio.cpp
@@ -277,6 +277,66 @@ unsigned int JackCpp::AudioIO::addOutPort(std::string name)
return mOutputPorts.size() - 1;
}
+unsigned int JackCpp::AudioIO::removeInPort(std::string name)
+ throw(std::runtime_error)
+{
+ // if the client is active this presents all sorts of issues
+ if (mJackState == active)
+ throw std::runtime_error("removing ports while the client is active is not supported");
+
+ std::vector<std::string>::iterator name_iter;
+ name_iter = std::find(mPortNames.begin(), mPortNames.end(), name);
+ if (name_iter == mPortNames.end())
+ throw std::runtime_error("cannot remove non-existent port: " + name);
+
+ std::vector<jack_port_t *>::iterator port_iter = mInputPorts.begin();
+ for (; port_iter != mInputPorts.end(); ++port_iter) {
+ if (std::string(jack_port_short_name(*port_iter)) == name)
+ break;
+ }
+ if (port_iter == mInputPorts.end())
+ throw std::runtime_error("could not find port in port list!");
+
+ if (jack_port_unregister(mJackClient, *port_iter))
+ throw std::runtime_error("could not unregister port!");
+
+ mInputPorts.erase(port_iter);
+ mPortNames.erase(name_iter);
+ mJackInBuf.pop_back();
+
+ return mInputPorts.size();
+}
+
+unsigned int JackCpp::AudioIO::removeOutPort(std::string name)
+ throw(std::runtime_error)
+{
+ // if the client is active this presents all sorts of issues
+ if (mJackState == active)
+ throw std::runtime_error("removing ports while the client is active is not supported");
+
+ std::vector<std::string>::iterator name_iter;
+ name_iter = std::find(mPortNames.begin(), mPortNames.end(), name);
+ if (name_iter == mPortNames.end())
+ throw std::runtime_error("cannot remove non-existent port: " + name);
+
+ std::vector<jack_port_t *>::iterator port_iter = mOutputPorts.begin();
+ for (; port_iter != mOutputPorts.end(); ++port_iter) {
+ if (std::string(jack_port_short_name(*port_iter)) == name)
+ break;
+ }
+ if (port_iter == mOutputPorts.end())
+ throw std::runtime_error("could not find port in port list!");
+
+ if (jack_port_unregister(mJackClient, *port_iter))
+ throw std::runtime_error("could not unregister port!");
+
+ mOutputPorts.erase(port_iter);
+ mPortNames.erase(name_iter);
+ mJackOutBuf.pop_back();
+
+ return mOutputPorts.size();
+}
+
void JackCpp::AudioIO::connectTo(unsigned int index, std::string destPortName)
throw(std::range_error, std::runtime_error)
{