20 #include "JackSystemDeps.h"
21 #include "JackMidiDriver.h"
23 #include "JackError.h"
24 #include "JackEngineControl.h"
26 #include "JackGraphManager.h"
27 #include "JackException.h"
35 JackMidiDriver::JackMidiDriver(
const char* name,
const char* alias, JackLockedEngine* engine, JackSynchro* table)
36 : JackDriver(name, alias, engine, table)
39 JackMidiDriver::~JackMidiDriver()
42 int JackMidiDriver::Open(
bool capturing,
47 const char* capture_driver_name,
48 const char* playback_driver_name,
49 jack_nframes_t capture_latency,
50 jack_nframes_t playback_latency)
52 fCaptureChannels = inchannels;
53 fPlaybackChannels = outchannels;
54 return JackDriver::Open(capturing, playing, inchannels, outchannels, monitor, capture_driver_name, playback_driver_name, capture_latency, playback_latency);
57 int JackMidiDriver::Attach()
60 jack_port_id_t port_index;
61 char name[REAL_JACK_PORT_NAME_SIZE];
62 char alias[REAL_JACK_PORT_NAME_SIZE];
65 jack_log(
"JackMidiDriver::Attach fBufferSize = %ld fSampleRate = %ld", fEngineControl->fBufferSize, fEngineControl->fSampleRate);
67 for (i = 0; i < fCaptureChannels; i++) {
68 snprintf(alias,
sizeof(alias),
"%s:%s:out%d", fAliasName, fCaptureDriverName, i + 1);
69 snprintf(name,
sizeof(name),
"%s:capture_%d", fClientControl.fName, i + 1);
70 if (fEngine->PortRegister(fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, CaptureDriverFlags, fEngineControl->fBufferSize, &port_index) < 0) {
71 jack_error(
"driver: cannot register port for %s", name);
74 port = fGraphManager->GetPort(port_index);
75 port->SetAlias(alias);
76 fCapturePortList[i] = port_index;
77 jack_log(
"JackMidiDriver::Attach fCapturePortList[i] port_index = %ld", port_index);
80 for (i = 0; i < fPlaybackChannels; i++) {
81 snprintf(alias,
sizeof(alias),
"%s:%s:in%d", fAliasName, fPlaybackDriverName, i + 1);
82 snprintf(name,
sizeof(name),
"%s:playback_%d", fClientControl.fName, i + 1);
83 if (fEngine->PortRegister(fClientControl.fRefNum, name, JACK_DEFAULT_MIDI_TYPE, PlaybackDriverFlags, fEngineControl->fBufferSize, &port_index) < 0) {
84 jack_error(
"driver: cannot register port for %s", name);
87 port = fGraphManager->GetPort(port_index);
88 port->SetAlias(alias);
89 fPlaybackPortList[i] = port_index;
90 jack_log(
"JackMidiDriver::Attach fPlaybackPortList[i] port_index = %ld", port_index);
97 int JackMidiDriver::Detach()
102 for (i = 0; i < fCaptureChannels; i++) {
103 fEngine->PortUnRegister(fClientControl.fRefNum, fCapturePortList[i]);
106 for (i = 0; i < fPlaybackChannels; i++) {
107 fEngine->PortUnRegister(fClientControl.fRefNum, fPlaybackPortList[i]);
113 void JackMidiDriver::UpdateLatencies()
117 for (
int i = 0; i < fCaptureChannels; i++) {
118 range.
max = range.
min = fEngineControl->fBufferSize;
119 fGraphManager->GetPort(fCapturePortList[i])->SetLatencyRange(JackCaptureLatency, &range);
122 for (
int i = 0; i < fPlaybackChannels; i++) {
123 if (! fEngineControl->fSyncMode) {
124 range.
max = range.
min = fEngineControl->fBufferSize * 2;
126 fGraphManager->GetPort(fPlaybackPortList[i])->SetLatencyRange(JackPlaybackLatency, &range);
130 int JackMidiDriver::SetBufferSize(jack_nframes_t buffer_size)
136 int JackMidiDriver::ProcessReadSync()
142 jack_error(
"JackMidiDriver::ProcessReadSync: read error");
146 if (ResumeRefNum() < 0) {
147 jack_error(
"JackMidiDriver::ProcessReadSync: ResumeRefNum error");
154 int JackMidiDriver::ProcessWriteSync()
158 if (SuspendRefNum() < 0) {
159 jack_error(
"JackMidiDriver::ProcessWriteSync: SuspendRefNum error");
165 jack_error(
"JackMidiDriver::ProcessWriteSync: write error");
172 int JackMidiDriver::ProcessReadAsync()
178 jack_error(
"JackMidiDriver::ProcessReadAsync: read error");
184 jack_error(
"JackMidiDriver::ProcessReadAsync: write error");
188 if (ResumeRefNum() < 0) {
189 jack_error(
"JackMidiDriver::ProcessReadAsync: ResumeRefNum error");
196 int JackMidiDriver::ProcessWriteAsync()
201 JackMidiBuffer* JackMidiDriver::GetInputBuffer(
int port_index)
203 assert(fCapturePortList[port_index]);
204 return (JackMidiBuffer*)fGraphManager->GetBuffer(fCapturePortList[port_index], fEngineControl->fBufferSize);
207 JackMidiBuffer* JackMidiDriver::GetOutputBuffer(
int port_index)
209 assert(fPlaybackPortList[port_index]);
210 return (JackMidiBuffer*)fGraphManager->GetBuffer(fPlaybackPortList[port_index], fEngineControl->fBufferSize);
SERVER_EXPORT void jack_error(const char *fmt,...)
SERVER_EXPORT void jack_log(const char *fmt,...)