X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=libs%2Fardour%2Fsession_feedback.cc;h=e6d10861265d1f7380bd87ce20c7590b7a0246a4;hb=a75e811edb7aa1da6359f5e2a104e582e2848e47;hp=d3025cef502b555fe4b300d1415aa6ffe79be8be;hpb=8af0757b61990767f2a85e68f535a5af9976fd79;p=ardour.git diff --git a/libs/ardour/session_feedback.cc b/libs/ardour/session_feedback.cc index d3025cef50..e6d1086126 100644 --- a/libs/ardour/session_feedback.cc +++ b/libs/ardour/session_feedback.cc @@ -15,7 +15,6 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include @@ -25,18 +24,20 @@ #include #include -#include -#include -#include -#include -#include -#include +#include "midi++/types.h" +#include "midi++/port.h" +#include "midi++/manager.h" -#include -#include -#include -#include -#include +#include + +#include "pbd/pthread_utils.h" + +#include "ardour/configuration.h" +#include "ardour/audioengine.h" +#include "ardour/session.h" +#include "ardour/audio_track.h" +#include "ardour/audio_diskstream.h" +#include "control_protocol/control_protocol.h" #include "i18n.h" @@ -44,202 +45,5 @@ using namespace std; using namespace ARDOUR; //using namespace sigc; -int -Session::init_feedback () -{ - if (pipe (feedback_request_pipe) != 0) { - error << compose (_("cannot create feedback request pipe (%1)"), - strerror (errno)) - << endmsg; - return -1; - } - - if (fcntl (feedback_request_pipe[0], F_SETFL, O_NONBLOCK)) { - error << compose(_("UI: cannot set O_NONBLOCK on " "signal read pipe (%1)"), strerror (errno)) << endmsg; - return -1; - } - - if (fcntl (feedback_request_pipe[1], F_SETFL, O_NONBLOCK)) { - error << compose(_("UI: cannot set O_NONBLOCK on " "signal write pipe (%1)"), strerror (errno)) << endmsg; - return -1; - } - - active_feedback = 0; - midi_feedback = false; - - /* add possible feedback functions here */ - - feedback_functions.push_back (mem_fun (*this, &Session::feedback_generic_midi_function)); - - if (pthread_create_and_store ("feedback", &feedback_thread, 0, _feedback_thread_work, this)) { - error << _("Session: could not create feedback thread") << endmsg; - return -1; - } - - return 0; -} - -int -Session::poke_feedback (FeedbackRequest::Type why) -{ - char c = (char) why; - return !(write (feedback_request_pipe[1], &c, 1) == 1); -} - -int -Session::start_feedback () -{ - return poke_feedback (FeedbackRequest::Start); -} - -int -Session::stop_feedback () -{ - return poke_feedback (FeedbackRequest::Stop); -} - -void -Session::terminate_feedback () -{ - void* status; - poke_feedback (FeedbackRequest::Quit); - pthread_join (feedback_thread, &status); -} - -void* -Session::_feedback_thread_work (void* arg) -{ - return static_cast (arg)->feedback_thread_work (); -} - -void* -Session::feedback_thread_work () -{ - PBD::ThreadCreated (pthread_self(), X_("Feedback")); - struct pollfd pfd[1]; - int timeout; - - pthread_setcancelstate (PTHREAD_CANCEL_ENABLE, 0); - pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0); - - if (active_feedback) { - /* XXX use Config->feedback_interval_usecs()*/; - timeout = 250; - } else { - timeout = -1; - } - - while (1) { - - pfd[0].fd = feedback_request_pipe[0]; - pfd[0].events = POLLIN|POLLHUP|POLLERR; - - if (poll (pfd, 1, timeout) < 0) { - if (errno == EINTR) { - continue; - } - error << compose (_("Feedback thread poll failed (%1)"), - strerror (errno)) - << endmsg; - break; - } - - if (pfd[0].revents & ~POLLIN) { - error << _("Error on feedback thread request pipe") << endmsg; - break; - } - - if (pfd[0].revents & POLLIN) { - - char req; - - /* empty the pipe of all current requests */ - - while (1) { - size_t nread = read (feedback_request_pipe[0], &req, sizeof (req)); - - if (nread == 1) { - switch ((FeedbackRequest::Type) req) { - - case FeedbackRequest::Start: - timeout = 250; - active_feedback++; - break; - - case FeedbackRequest::Stop: - timeout = -1; - if (active_feedback) { - active_feedback--; - } - break; - - case FeedbackRequest::Quit: - pthread_exit_pbd (0); - /*NOTREACHED*/ - break; - - default: - break; - } - - } else if (nread == 0) { - break; - } else if (errno == EAGAIN) { - break; - } else { - fatal << _("Error reading from feedback request pipe") << endmsg; - /*NOTREACHED*/ - } - } - } - - if (!active_feedback) { - continue; - } - - for (list::iterator i = feedback_functions.begin(); i != feedback_functions.end(); ) { - - list::iterator tmp; - - tmp = i; - ++tmp; - - if ((*i)) { - feedback_functions.erase (i); - } - - i = tmp; - } - } - - return 0; -} - -int -Session::feedback_generic_midi_function () -{ - const int32_t bufsize = 16 * 1024; - int32_t bsize = bufsize; - MIDI::byte* buf = new MIDI::byte[bufsize]; - MIDI::byte* end = buf; - - { - LockMonitor lm (route_lock, __LINE__, __FILE__); - - for (RouteList::iterator i = routes.begin(); i != routes.end(); ++i) { - end = (*i)->write_midi_feedback (end, bsize); - } - } - - if (end == buf) { - delete [] buf; - return 0; - } - - // cerr << "MIDI feedback: write " << (int32_t) (end - buf) << " of " << buf << " to midi port\n"; - - deliver_midi (_midi_port, buf, (int32_t) (end - buf)); - return 0; -}