diff --git a/CMakeLists.txt b/CMakeLists.txt index 78a68aa8..048f4d64 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -290,7 +290,7 @@ endif() if (WITH_JACK) find_package(PkgConfig REQUIRED) pkg_check_modules(JACK REQUIRED jack) - list(APPEND AUDIO_SOURCES src/audio/jack.cpp) + list(APPEND AUDIO_SOURCES src/audio/jack.cpp src/audio/jackmidi.cpp) list(APPEND DEPENDENCIES_INCLUDE_DIRS ${JACK_INCLUDE_DIRS}) list(APPEND DEPENDENCIES_DEFINES HAVE_JACK) list(APPEND DEPENDENCIES_COMPILE_OPTIONS ${JACK_CFLAGS_OTHER}) diff --git a/src/audio/abstract.cpp b/src/audio/abstract.cpp index e360d1cb..cc803056 100644 --- a/src/audio/abstract.cpp +++ b/src/audio/abstract.cpp @@ -55,6 +55,10 @@ bool TAAudio::init(TAAudioDesc& request, TAAudioDesc& response) { return true; } +unsigned char TAAudio::getID() { + return 0; +} + TAAudio::~TAAudio() { } diff --git a/src/audio/jack.cpp b/src/audio/jack.cpp index 2ffe19b6..3fe5ba48 100644 --- a/src/audio/jack.cpp +++ b/src/audio/jack.cpp @@ -255,3 +255,8 @@ bool TAAudioJACK::init(TAAudioDesc& request, TAAudioDesc& response) { initialized=true; return true; } + + +unsigned char TAAudioJACK::getID() { + return 'J'; +} \ No newline at end of file diff --git a/src/audio/jack.h b/src/audio/jack.h index 8018d6c2..c758c7ed 100644 --- a/src/audio/jack.h +++ b/src/audio/jack.h @@ -21,6 +21,42 @@ #include #include +class TAMidiInJACK: public TAMidiIn { + jack_client_t* ac; + jack_port_t* port; + bool isOpen; + public: + bool gather(); + bool isDeviceOpen(); + bool openDevice(String name); + bool closeDevice(); + std::vector listDevices(); + bool quit(); + bool init(); + TAMidiInJACK(jack_client_t* client): + ac(client), + port(NULL), + isOpen(false) {} +}; + +class TAMidiOutJACK: public TAMidiOut { + jack_client_t* ac; + jack_port_t* port; + bool isOpen; + public: + bool send(const TAMidiMessage& what); + bool isDeviceOpen(); + bool openDevice(String name); + bool closeDevice(); + std::vector listDevices(); + bool quit(); + bool init(); + TAMidiOutJACK(jack_client_t* client): + ac(client), + port(NULL), + isOpen(false) {} +}; + class TAAudioJACK: public TAAudio { jack_client_t* ac; jack_port_t** ai; @@ -40,6 +76,7 @@ class TAAudioJACK: public TAAudio { bool quit(); bool setRun(bool run); bool init(TAAudioDesc& request, TAAudioDesc& response); + unsigned char getID(); TAAudioJACK(): ac(NULL), diff --git a/src/audio/jackmidi.cpp b/src/audio/jackmidi.cpp new file mode 100644 index 00000000..e42ffbb6 --- /dev/null +++ b/src/audio/jackmidi.cpp @@ -0,0 +1,21 @@ +/** + * Furnace Tracker - multi-system chiptune tracker + * Copyright (C) 2021-2023 tildearrow and contributors + * + * 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., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +#include "taAudio.h" +#include "jack.h" \ No newline at end of file diff --git a/src/audio/midi.cpp b/src/audio/midi.cpp index fa3faf1f..6afca954 100644 --- a/src/audio/midi.cpp +++ b/src/audio/midi.cpp @@ -21,30 +21,62 @@ #ifdef HAVE_RTMIDI #include "rtmidi.h" #endif +#ifdef HAVE_JACK +#include "jack.h" +#endif bool TAAudio::initMidi(bool jack) { -#ifndef HAVE_RTMIDI - return false; + if (jack) { +#ifndef HAVE_JACK + return false; #else - midiIn=new TAMidiInRtMidi; - midiOut=new TAMidiOutRtMidi; + if (getID()!='J') { + return false; + } + + midiIn=new TAMidiInJACK((jack_client_t*)getContext()); + midiOut=new TAMidiOutJACK((jack_client_t*)getContext()); - if (!midiIn->init()) { - delete midiIn; - midiIn=NULL; - return false; - } + if (!midiIn->init()) { + delete midiIn; + midiIn=NULL; + return false; + } - if (!midiOut->init()) { - midiIn->quit(); - delete midiOut; - delete midiIn; - midiOut=NULL; - midiIn=NULL; - return false; - } - return true; + if (!midiOut->init()) { + midiIn->quit(); + delete midiOut; + delete midiIn; + midiOut=NULL; + midiIn=NULL; + return false; + } + return true; #endif + } else { +#ifndef HAVE_RTMIDI + return false; +#else + midiIn=new TAMidiInRtMidi; + midiOut=new TAMidiOutRtMidi; + + if (!midiIn->init()) { + delete midiIn; + midiIn=NULL; + return false; + } + + if (!midiOut->init()) { + midiIn->quit(); + delete midiOut; + delete midiIn; + midiOut=NULL; + midiIn=NULL; + return false; + } + return true; +#endif + } } void TAAudio::quitMidi() { diff --git a/src/audio/sdlAudio.cpp b/src/audio/sdlAudio.cpp index 6d0ceff0..b7ba38b2 100644 --- a/src/audio/sdlAudio.cpp +++ b/src/audio/sdlAudio.cpp @@ -152,3 +152,7 @@ bool TAAudioSDL::init(TAAudioDesc& request, TAAudioDesc& response) { initialized=true; return true; } + +unsigned char TAAudioSDL::getID() { + return 'S'; +} \ No newline at end of file diff --git a/src/audio/sdlAudio.h b/src/audio/sdlAudio.h index a827b059..7b1cda8f 100644 --- a/src/audio/sdlAudio.h +++ b/src/audio/sdlAudio.h @@ -33,6 +33,7 @@ class TAAudioSDL: public TAAudio { bool setRun(bool run); std::vector listAudioDevices(); bool init(TAAudioDesc& request, TAAudioDesc& response); + unsigned char getID(); TAAudioSDL(): audioSysStarted(false) {} }; diff --git a/src/audio/taAudio.h b/src/audio/taAudio.h index dd0d7674..c24f9874 100644 --- a/src/audio/taAudio.h +++ b/src/audio/taAudio.h @@ -176,6 +176,7 @@ class TAAudio { bool initMidi(bool jack); void quitMidi(); virtual bool init(TAAudioDesc& request, TAAudioDesc& response); + virtual unsigned char getID(); TAAudio(): outFormat(TA_AUDIO_FORMAT_F32),