/* Copyright (C) 2011 Devin Anderson This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include "JackALSARawMidiSendQueue.h" #include "JackMidiUtil.h" #include "JackError.h" using Jack::JackALSARawMidiSendQueue; JackALSARawMidiSendQueue::JackALSARawMidiSendQueue(snd_rawmidi_t *rawmidi, size_t bytes_per_poll) { assert(bytes_per_poll > 0); this->bytes_per_poll = bytes_per_poll; this->rawmidi = rawmidi; blocked = false; bytes_available = bytes_per_poll; } Jack::JackMidiWriteQueue::EnqueueResult JackALSARawMidiSendQueue::EnqueueEvent(jack_nframes_t time, size_t size, jack_midi_data_t *buffer) { assert(size == 1); if (time > GetCurrentFrame()) { return EVENT_EARLY; } if (! bytes_available) { return BUFFER_FULL; } ssize_t result = snd_rawmidi_write(rawmidi, buffer, 1); switch (result) { case 1: blocked = false; bytes_available--; return OK; case -EWOULDBLOCK: blocked = true; return BUFFER_FULL; } jack_error("JackALSARawMidiSendQueue::EnqueueEvent - snd_rawmidi_write: " "%s", snd_strerror(result)); return EN_ERROR; } bool JackALSARawMidiSendQueue::IsBlocked() { return blocked; } void JackALSARawMidiSendQueue::ResetPollByteCount() { bytes_available = bytes_per_poll; }