git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@1647 0c269be4-1314-0410-8aa9-9f06e86f4224tags/0.68
@@ -13,6 +13,10 @@ Tom Szilagyi | |||||
Jackdmp changes log | Jackdmp changes log | ||||
--------------------------- | --------------------------- | ||||
2007-10-25 Stephane Letz <letz@grame.fr> | |||||
* Merge of Dmitry Baikov MIDI branch. | |||||
2007-10-24 Stephane Letz <letz@grame.fr> | 2007-10-24 Stephane Letz <letz@grame.fr> | ||||
* Implementation of server_name setting (-n). | * Implementation of server_name setting (-n). | ||||
@@ -130,6 +134,10 @@ Tom Szilagyi | |||||
2007-05-29 Stephane Letz <letz@grame.fr> | 2007-05-29 Stephane Letz <letz@grame.fr> | ||||
* Add "callback exiting" and "jack_frame_time" tests in jack_test. | * Add "callback exiting" and "jack_frame_time" tests in jack_test. | ||||
2007-05-09 Stephane Letz <letz@grame.fr> | |||||
* Add a mutex in JackGraphManager AllocatePort/ReleasePort methods. | |||||
2007-05-05 Stephane Letz <letz@grame.fr> | 2007-05-05 Stephane Letz <letz@grame.fr> | ||||
@@ -154,14 +162,39 @@ Tom Szilagyi | |||||
2007-04-23 Stephane Letz <letz@grame.fr> | 2007-04-23 Stephane Letz <letz@grame.fr> | ||||
* Dmitry Baikov jackmp-time patch: add jack_get_time, jack_time_to_frames, jack_frames_to_time. | * Dmitry Baikov jackmp-time patch: add jack_get_time, jack_time_to_frames, jack_frames_to_time. | ||||
2007-04-03 Stephane Letz <letz@grame.fr> | |||||
* Dmitry Baikov remove-nframes patch. | |||||
2007-04-02 Stephane Letz <letz@grame.fr> | |||||
* Dmitry Baikov lost-event patch. | |||||
2007-04-01 Stephane Letz <letz@grame.fr> | 2007-04-01 Stephane Letz <letz@grame.fr> | ||||
* Merge JackGraphManager Remove and Release method in a unique Release method. | * Merge JackGraphManager Remove and Release method in a unique Release method. | ||||
2007-03-12 Stephane Letz <letz@grame.fr> | |||||
* Bug fix in JackMidiBuffer::MaxEventSize(). | |||||
2007-03-09 Stephane Letz <letz@grame.fr> | |||||
* Dmitry Baikov MIDI patch phase 2. | |||||
2007-03-08 Stephane Letz <letz@grame.fr> | |||||
* Dmitry Baikov jackmp-port-clear patch. | |||||
2007-03-06 Stephane Letz <letz@grame.fr> | |||||
* Dmitry Baikov MIDI patch phase 1. | |||||
2007-03-04 Stephane Letz <letz@grame.fr> | 2007-03-04 Stephane Letz <letz@grame.fr> | ||||
* Dmitry Baikov patch for JackGraphManager.cpp. | |||||
* Dmitry Baikov patch for JackGraphManager.cpp. | |||||
* Dmitry Baikov MIDI patch phase 0. | |||||
2007-02-19 Stephane Letz <letz@grame.fr> | 2007-02-19 Stephane Letz <letz@grame.fr> | ||||
@@ -220,7 +220,7 @@ class JackAtomicState | |||||
UInt16 cur_index; | UInt16 cur_index; | ||||
UInt16 next_index = GetCurrentIndex(); | UInt16 next_index = GetCurrentIndex(); | ||||
do { | do { | ||||
cur_index = next_index; | |||||
cur_index = next_index; | |||||
state = ReadCurrentState(); | state = ReadCurrentState(); | ||||
...... | ...... | ||||
@@ -53,6 +53,7 @@ int JackAudioDriver::SetBufferSize(jack_nframes_t buffer_size) | |||||
{ | { | ||||
fEngineControl->fBufferSize = buffer_size; | fEngineControl->fBufferSize = buffer_size; | ||||
fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec | fEngineControl->fPeriodUsecs = jack_time_t(1000000.f / fEngineControl->fSampleRate * fEngineControl->fBufferSize); // in microsec | ||||
fGraphManager->SetBufferSize(buffer_size); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -86,7 +87,7 @@ int JackAudioDriver::Attach() | |||||
for (i = 0; i < fCaptureChannels; i++) { | for (i = 0; i < fCaptureChannels; i++) { | ||||
snprintf(buf, sizeof(buf) - 1, "%s:%s:out%d", fClientControl->fName, fCaptureDriverName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:%s:out%d", fClientControl->fName, fCaptureDriverName, i + 1); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -101,7 +102,7 @@ int JackAudioDriver::Attach() | |||||
for (i = 0; i < fPlaybackChannels; i++) { | for (i = 0; i < fPlaybackChannels; i++) { | ||||
snprintf(buf, sizeof(buf) - 1, "%s:%s:in%d", fClientControl->fName, fPlaybackDriverName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:%s:in%d", fClientControl->fName, fPlaybackDriverName, i + 1); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -115,7 +116,7 @@ int JackAudioDriver::Attach() | |||||
if (fWithMonitorPorts) { | if (fWithMonitorPorts) { | ||||
JackLog("Create monitor port \n"); | JackLog("Create monitor port \n"); | ||||
snprintf(buf, sizeof(buf) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JackPortIsOutput)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput)) == NO_PORT) { | |||||
jack_error("Cannot register monitor port for %s", buf); | jack_error("Cannot register monitor port for %s", buf); | ||||
return -1; | return -1; | ||||
} else { | } else { | ||||
@@ -0,0 +1,95 @@ | |||||
/* | |||||
Copyright (C) 2001-2003 Paul Davis | |||||
Copyright (C) 2004-2006 Grame | |||||
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 "JackPortType.h" | |||||
#include <string.h> | |||||
namespace Jack | |||||
{ | |||||
static void AudioBufferInit(void* buffer, size_t buffer_size, jack_nframes_t) | |||||
{ | |||||
memset(buffer, 0, buffer_size); | |||||
} | |||||
static inline void MixAudioBuffer(float* mixbuffer, float* buffer, jack_nframes_t frames) | |||||
{ | |||||
jack_nframes_t frames_group = frames / 4; | |||||
frames = frames % 4; | |||||
while (frames_group > 0) { | |||||
register float mixFloat1 = *mixbuffer; | |||||
register float sourceFloat1 = *buffer; | |||||
register float mixFloat2 = *(mixbuffer + 1); | |||||
register float sourceFloat2 = *(buffer + 1); | |||||
register float mixFloat3 = *(mixbuffer + 2); | |||||
register float sourceFloat3 = *(buffer + 2); | |||||
register float mixFloat4 = *(mixbuffer + 3); | |||||
register float sourceFloat4 = *(buffer + 3); | |||||
buffer += 4; | |||||
frames_group--; | |||||
mixFloat1 += sourceFloat1; | |||||
mixFloat2 += sourceFloat2; | |||||
mixFloat3 += sourceFloat3; | |||||
mixFloat4 += sourceFloat4; | |||||
*mixbuffer = mixFloat1; | |||||
*(mixbuffer + 1) = mixFloat2; | |||||
*(mixbuffer + 2) = mixFloat3; | |||||
*(mixbuffer + 3) = mixFloat4; | |||||
mixbuffer += 4; | |||||
} | |||||
while (frames > 0) { | |||||
register float mixFloat1 = *mixbuffer; | |||||
register float sourceFloat1 = *buffer; | |||||
buffer++; | |||||
frames--; | |||||
mixFloat1 += sourceFloat1; | |||||
*mixbuffer = mixFloat1; | |||||
mixbuffer++; | |||||
} | |||||
} | |||||
static void AudioBufferMixdown(void* mixbuffer, void** src_buffers, int src_count, jack_nframes_t nframes) | |||||
{ | |||||
void* buffer; | |||||
// Copy first buffer | |||||
memcpy(mixbuffer, src_buffers[0], nframes * sizeof(float)); | |||||
// Mix remaining buffers | |||||
for (int i = 1; i < src_count; ++i) { | |||||
buffer = src_buffers[i]; | |||||
MixAudioBuffer((float*)mixbuffer, (float*)buffer, nframes); | |||||
} | |||||
} | |||||
const JackPortType gAudioPortType = { | |||||
JACK_DEFAULT_AUDIO_TYPE, | |||||
AudioBufferInit, | |||||
AudioBufferMixdown | |||||
}; | |||||
} // namespace Jack | |||||
@@ -86,7 +86,7 @@ class JackClientChannelInterface | |||||
virtual void ClientDeactivate(int refnum, int* result) | virtual void ClientDeactivate(int refnum, int* result) | ||||
{} | {} | ||||
virtual void PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
virtual void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
{} | {} | ||||
virtual void PortUnRegister(int refnum, jack_port_id_t port_index, int* result) | virtual void PortUnRegister(int refnum, jack_port_id_t port_index, int* result) | ||||
{} | {} | ||||
@@ -414,11 +414,11 @@ int JackClient::PortRegister(const char* port_name, const char* port_type, unsig | |||||
return 0; // Means failure here... | return 0; // Means failure here... | ||||
} | } | ||||
JackLog("JackClient::PortRegister ref = %ld name = %s \n", GetClientControl()->fRefNum, name.c_str()); | |||||
JackLog("JackClient::PortRegister ref = %ld name = %s type = %s\n", GetClientControl()->fRefNum, name.c_str(), port_type); | |||||
int result = -1; | int result = -1; | ||||
jack_port_id_t port_index = NO_PORT; | jack_port_id_t port_index = NO_PORT; | ||||
fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), flags, buffer_size, &port_index, &result); | |||||
fChannel->PortRegister(GetClientControl()->fRefNum, name.c_str(), port_type, flags, buffer_size, &port_index, &result); | |||||
JackLog("JackClient::PortRegister port_index = %ld \n", port_index); | JackLog("JackClient::PortRegister port_index = %ld \n", port_index); | ||||
if (result == 0) { | if (result == 0) { | ||||
@@ -129,6 +129,7 @@ int JackDriver::Open(jack_nframes_t nframes, | |||||
if (fEngineControl->fTimeOutUsecs == 0) /* usecs; if zero, use 2 period size. */ | if (fEngineControl->fTimeOutUsecs == 0) /* usecs; if zero, use 2 period size. */ | ||||
fEngineControl->fTimeOutUsecs = (jack_time_t)(2.f * fEngineControl->fPeriodUsecs); | fEngineControl->fTimeOutUsecs = (jack_time_t)(2.f * fEngineControl->fPeriodUsecs); | ||||
fGraphManager->SetBufferSize(nframes); | |||||
fGraphManager->DirectConnect(fClientControl->fRefNum, fClientControl->fRefNum); // Connect driver to itself for sync | fGraphManager->DirectConnect(fClientControl->fRefNum, fClientControl->fRefNum); // Connect driver to itself for sync | ||||
/* | /* | ||||
@@ -59,6 +59,7 @@ class JackDummyDriver : public JackAudioDriver | |||||
jack_nframes_t playback_latency); | jack_nframes_t playback_latency); | ||||
int Process(); | int Process(); | ||||
}; | }; | ||||
} // end of namespace | } // end of namespace | ||||
@@ -680,12 +680,12 @@ int JackEngine::ClientDeactivate(int refnum) | |||||
// Port management | // Port management | ||||
//----------------- | //----------------- | ||||
int JackEngine::PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index) | |||||
int JackEngine::PortRegister(int refnum, const char* name, const char *type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index) | |||||
{ | { | ||||
JackLog("JackEngine::PortRegister ref = %ld name = %s flags = %d buffer_size = %d\n", refnum, name, flags, buffer_size); | |||||
JackLog("JackEngine::PortRegister ref = %ld name = %s type = %s flags = %d buffer_size = %d\n", refnum, name, type, flags, buffer_size); | |||||
assert(fClientTable[refnum]); | assert(fClientTable[refnum]); | ||||
*port_index = fGraphManager->AllocatePort(refnum, name, (JackPortFlags)flags); | |||||
*port_index = fGraphManager->AllocatePort(refnum, name, type, (JackPortFlags)flags); | |||||
if (*port_index != NO_PORT) { | if (*port_index != NO_PORT) { | ||||
NotifyPortRegistation(*port_index, true); | NotifyPortRegistation(*port_index, true); | ||||
return 0; | return 0; | ||||
@@ -96,7 +96,7 @@ class JackEngine | |||||
int InternalClientUnload(int refnum, int* status); | int InternalClientUnload(int refnum, int* status); | ||||
// Port management | // Port management | ||||
int PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index); | |||||
int PortRegister(int refnum, const char* name, const char *type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index); | |||||
int PortUnRegister(int refnum, jack_port_id_t port); | int PortUnRegister(int refnum, jack_port_id_t port); | ||||
int PortConnect(int refnum, const char* src, const char* dst); | int PortConnect(int refnum, const char* src, const char* dst); | ||||
@@ -165,31 +165,26 @@ void* JackGraphManager::GetBuffer(jack_port_id_t port_index, jack_nframes_t buff | |||||
jack_int_t len = manager->Connections(port_index); | jack_int_t len = manager->Connections(port_index); | ||||
if (len == 0) { // No connections: return a zero-filled buffer | if (len == 0) { // No connections: return a zero-filled buffer | ||||
float* buffer = GetBuffer(port_index); | |||||
memset(buffer, 0, buffer_size * sizeof(float)); // Clear buffer | |||||
return buffer; | |||||
port->ClearBuffer(buffer_size); | |||||
return port->GetBuffer(); | |||||
} else if (len == 1) { // One connection: use zero-copy mode - just pass the buffer of the connected (output) port. | } else if (len == 1) { // One connection: use zero-copy mode - just pass the buffer of the connected (output) port. | ||||
assert(manager->GetPort(port_index, 0) != port_index); // Check recursion | assert(manager->GetPort(port_index, 0) != port_index); // Check recursion | ||||
return GetBuffer(manager->GetPort(port_index, 0), buffer_size); | return GetBuffer(manager->GetPort(port_index, 0), buffer_size); | ||||
} else { // Multiple connections | } else { // Multiple connections | ||||
const jack_int_t* connections = manager->GetConnections(port_index); | const jack_int_t* connections = manager->GetConnections(port_index); | ||||
float* mixbuffer = GetBuffer(port_index); | |||||
jack_port_id_t src_index; | |||||
float* buffer; | |||||
// Copy first buffer | |||||
src_index = connections[0]; | |||||
AssertPort(src_index); | |||||
buffer = (float*)GetBuffer(src_index, buffer_size); | |||||
memcpy(mixbuffer, buffer, buffer_size * sizeof(float)); | |||||
// Mix remaining buffers | |||||
for (int i = 1; (i < CONNECTION_NUM) && ((src_index = connections[i]) != EMPTY); i++) { | |||||
void* buffers[CONNECTION_NUM]; | |||||
jack_port_id_t src_index; | |||||
int i; | |||||
for (i = 0; (i < CONNECTION_NUM) && ((src_index = connections[i]) != EMPTY); i++) { | |||||
AssertPort(src_index); | AssertPort(src_index); | ||||
buffer = (float*)GetBuffer(src_index, buffer_size); | |||||
JackPort::MixBuffer(mixbuffer, buffer, buffer_size); | |||||
buffers[i] = GetBuffer(src_index, buffer_size); | |||||
} | } | ||||
return mixbuffer; | |||||
JackPort* port = GetPort(port_index); | |||||
port->MixBuffers(buffers, i, buffer_size); | |||||
return port->GetBuffer(); | |||||
} | } | ||||
} | } | ||||
@@ -202,7 +197,7 @@ int JackGraphManager::RequestMonitor(jack_port_id_t port_index, bool onoff) // C | |||||
/** | /** | ||||
jackd.h | jackd.h | ||||
* If @ref JackPortCanMonitor is set for this @a port, turn input | * If @ref JackPortCanMonitor is set for this @a port, turn input | ||||
* monitoring on or off. Otherwise, do nothing. | |||||
* monitoring on or off. Otherwise, do nothing. | |||||
if (!(fFlags & JackPortCanMonitor)) | if (!(fFlags & JackPortCanMonitor)) | ||||
return -1; | return -1; | ||||
@@ -266,7 +261,7 @@ jack_nframes_t JackGraphManager::GetTotalLatency(jack_port_id_t port_index) | |||||
} | } | ||||
// Server | // Server | ||||
jack_port_id_t JackGraphManager::AllocatePortAux(int refnum, const char* port_name, JackPortFlags flags) | |||||
jack_port_id_t JackGraphManager::AllocatePortAux(int refnum, const char* port_name, const char* port_type, JackPortFlags flags) | |||||
{ | { | ||||
jack_port_id_t port_index; | jack_port_id_t port_index; | ||||
@@ -274,8 +269,9 @@ jack_port_id_t JackGraphManager::AllocatePortAux(int refnum, const char* port_na | |||||
for (port_index = FIRST_AVAILABLE_PORT; port_index < PORT_NUM; port_index++) { | for (port_index = FIRST_AVAILABLE_PORT; port_index < PORT_NUM; port_index++) { | ||||
JackPort* port = GetPort(port_index); | JackPort* port = GetPort(port_index); | ||||
if (!port->IsUsed()) { | if (!port->IsUsed()) { | ||||
JackLog("JackGraphManager::AllocatePortAux port_index = %ld name = %s\n", port_index, port_name); | |||||
port->Allocate(refnum, port_name, flags); | |||||
JackLog("JackGraphManager::AllocatePortAux port_index = %ld name = %s type = %s\n", port_index, port_name, port_type); | |||||
if (!port->Allocate(refnum, port_name, port_type, flags)) | |||||
return NO_PORT; | |||||
break; | break; | ||||
} | } | ||||
} | } | ||||
@@ -284,12 +280,19 @@ jack_port_id_t JackGraphManager::AllocatePortAux(int refnum, const char* port_na | |||||
} | } | ||||
// Server | // Server | ||||
jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, JackPortFlags flags) | |||||
jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, const char* port_type, JackPortFlags flags) | |||||
{ | { | ||||
JackLock lock(this); | |||||
JackConnectionManager* manager = WriteNextStateStart(); | JackConnectionManager* manager = WriteNextStateStart(); | ||||
jack_port_id_t port_index = AllocatePortAux(refnum, port_name, flags); | |||||
jack_port_id_t port_index = AllocatePortAux(refnum, port_name, port_type, flags); | |||||
assert(fBufferSize != 0); | |||||
if (port_index != NO_PORT) { | if (port_index != NO_PORT) { | ||||
JackPort* port = GetPort(port_index); | |||||
assert(port); | |||||
port->ClearBuffer(fBufferSize); | |||||
int res; | int res; | ||||
if (flags & JackPortIsOutput) { | if (flags & JackPortIsOutput) { | ||||
res = manager->AddOutputPort(refnum, port_index); | res = manager->AddOutputPort(refnum, port_index); | ||||
@@ -298,8 +301,6 @@ jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, | |||||
} | } | ||||
// Insertion failure | // Insertion failure | ||||
if (res < 0) { | if (res < 0) { | ||||
JackPort* port = GetPort(port_index); | |||||
assert(port); | |||||
port->Release(); | port->Release(); | ||||
port_index = NO_PORT; | port_index = NO_PORT; | ||||
} | } | ||||
@@ -309,9 +310,26 @@ jack_port_id_t JackGraphManager::AllocatePort(int refnum, const char* port_name, | |||||
return port_index; | return port_index; | ||||
} | } | ||||
// Server | |||||
void JackGraphManager::SetBufferSize(jack_nframes_t buffer_size) | |||||
{ | |||||
JackLock lock(this); | |||||
JackLog("JackGraphManager::SetBufferSize size = %ld\n", (long int)buffer_size); | |||||
jack_port_id_t port_index; | |||||
fBufferSize = buffer_size; | |||||
for (port_index = FIRST_AVAILABLE_PORT; port_index < PORT_NUM; port_index++) { | |||||
JackPort* port = GetPort(port_index); | |||||
if (port->IsUsed()) | |||||
port->ClearBuffer(fBufferSize); | |||||
} | |||||
} | |||||
// Server | // Server | ||||
int JackGraphManager::ReleasePort(int refnum, jack_port_id_t port_index) | int JackGraphManager::ReleasePort(int refnum, jack_port_id_t port_index) | ||||
{ | { | ||||
JackLock lock(this); | |||||
JackConnectionManager* manager = WriteNextStateStart(); | JackConnectionManager* manager = WriteNextStateStart(); | ||||
JackPort* port = GetPort(port_index); | JackPort* port = GetPort(port_index); | ||||
int res; | int res; | ||||
@@ -469,18 +487,23 @@ int JackGraphManager::Connect(jack_port_id_t port_src, jack_port_id_t port_dst) | |||||
{ | { | ||||
JackConnectionManager* manager = WriteNextStateStart(); | JackConnectionManager* manager = WriteNextStateStart(); | ||||
JackLog("JackGraphManager::Connect port_src = %ld port_dst = %ld\n", port_src, port_dst); | JackLog("JackGraphManager::Connect port_src = %ld port_dst = %ld\n", port_src, port_dst); | ||||
bool in_use_src = GetPort(port_src)->fInUse; | |||||
bool in_use_dst = GetPort(port_dst)->fInUse; | |||||
JackPort* src = GetPort(port_src); | |||||
JackPort* dst = GetPort(port_dst); | |||||
int res = 0; | int res = 0; | ||||
if (!in_use_src || !in_use_dst) { | |||||
if (!in_use_src) | |||||
if (!src->fInUse || !dst->fInUse) { | |||||
if (!src->fInUse) | |||||
jack_error("JackGraphManager::Connect: port_src = %ld not used name = %s", port_src, GetPort(port_src)->fName); | jack_error("JackGraphManager::Connect: port_src = %ld not used name = %s", port_src, GetPort(port_src)->fName); | ||||
if (!in_use_dst) | |||||
if (!dst->fInUse) | |||||
jack_error("JackGraphManager::Connect: port_dst = %ld not used name = %s", port_dst, GetPort(port_dst)->fName); | jack_error("JackGraphManager::Connect: port_dst = %ld not used name = %s", port_dst, GetPort(port_dst)->fName); | ||||
res = -1; | res = -1; | ||||
goto end; | goto end; | ||||
} | } | ||||
if (src->fTypeId != dst->fTypeId) { | |||||
jack_error("JackGraphManager::Connect: different port types: port_src = %ld port_dst = %ld", port_src, port_dst); | |||||
res = -1; | |||||
goto end; | |||||
} | |||||
if (manager->IsConnected(port_src, port_dst)) { | if (manager->IsConnected(port_src, port_dst)) { | ||||
jack_error("JackGraphManager::Connect already connected port_src = %ld port_dst = %ld", port_src, port_dst); | jack_error("JackGraphManager::Connect already connected port_src = %ld port_dst = %ld", port_src, port_dst); | ||||
res = EEXIST; | res = EEXIST; | ||||
@@ -26,6 +26,7 @@ This program is free software; you can redistribute it and/or modify | |||||
#include "JackConstants.h" | #include "JackConstants.h" | ||||
#include "JackConnectionManager.h" | #include "JackConnectionManager.h" | ||||
#include "JackAtomicState.h" | #include "JackAtomicState.h" | ||||
#include "JackMutex.h" | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -34,15 +35,16 @@ namespace Jack | |||||
\brief Graph manager: contains the connection manager and the port array. | \brief Graph manager: contains the connection manager and the port array. | ||||
*/ | */ | ||||
class JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectionManager> | |||||
class JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectionManager>, public JackLockAble | |||||
{ | { | ||||
private: | private: | ||||
JackPort fPortArray[PORT_NUM]; | JackPort fPortArray[PORT_NUM]; | ||||
JackClientTiming fClientTiming[CLIENT_NUM]; | JackClientTiming fClientTiming[CLIENT_NUM]; | ||||
jack_nframes_t fBufferSize; | |||||
jack_port_id_t AllocatePortAux(int refnum, const char* port_name, JackPortFlags flags); | |||||
jack_port_id_t AllocatePortAux(int refnum, const char* port_name, const char* port_type, JackPortFlags flags); | |||||
void GetConnectionsAux(JackConnectionManager* manager, const char** res, jack_port_id_t port_index); | void GetConnectionsAux(JackConnectionManager* manager, const char** res, jack_port_id_t port_index); | ||||
const char** GetPortsAux(const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); | const char** GetPortsAux(const char* port_name_pattern, const char* type_name_pattern, unsigned long flags); | ||||
float* GetBuffer(jack_port_id_t port_index); | float* GetBuffer(jack_port_id_t port_index); | ||||
@@ -51,13 +53,15 @@ class JackGraphManager : public JackShmMem, public JackAtomicState<JackConnectio | |||||
public: | public: | ||||
JackGraphManager() | |||||
JackGraphManager() : fBufferSize(0) | |||||
{} | {} | ||||
virtual ~JackGraphManager() | virtual ~JackGraphManager() | ||||
{} | {} | ||||
void SetBufferSize(jack_nframes_t buffer_size); | |||||
// Ports management | // Ports management | ||||
jack_port_id_t AllocatePort(int refnum, const char* port_name, JackPortFlags flags); | |||||
jack_port_id_t AllocatePort(int refnum, const char* port_name, const char* port_type, JackPortFlags flags); | |||||
int ReleasePort(int refnum, jack_port_id_t port_index); | int ReleasePort(int refnum, jack_port_id_t port_index); | ||||
void RemoveAllPorts(int refnum); | void RemoveAllPorts(int refnum); | ||||
void DisconnectAllPorts(int refnum); | void DisconnectAllPorts(int refnum); | ||||
@@ -72,9 +72,9 @@ class JackInternalClientChannel : public JackClientChannelInterface | |||||
*result = fEngine->ClientDeactivate(refnum); | *result = fEngine->ClientDeactivate(refnum); | ||||
} | } | ||||
void PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
{ | { | ||||
*result = fEngine->PortRegister(refnum, name, flags, buffer_size, port_index); | |||||
*result = fEngine->PortRegister(refnum, name, type, flags, buffer_size, port_index); | |||||
} | } | ||||
void PortUnRegister(int refnum, jack_port_id_t port_index, int* result) | void PortUnRegister(int refnum, jack_port_id_t port_index, int* result) | ||||
{ | { | ||||
@@ -0,0 +1,133 @@ | |||||
/* | |||||
Copyright (C) 2007 Dmitry Baikov | |||||
Original JACK MIDI implementation Copyright (C) 2004 Ian Esten | |||||
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 "JackError.h" | |||||
#include "JackMidiPort.h" | |||||
#include "JackExports.h" | |||||
#include <errno.h> | |||||
#include <string.h> | |||||
#ifdef WIN32 | |||||
#define ENOBUFS 55 | |||||
#endif | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
EXPORT jack_nframes_t jack_midi_get_event_count(void* port_buffer); | |||||
EXPORT int jack_midi_event_get(jack_midi_event_t* event, | |||||
void* port_buffer, jack_nframes_t event_index); | |||||
EXPORT void jack_midi_clear_buffer(void* port_buffer); | |||||
EXPORT size_t jack_midi_max_event_size(void* port_buffer); | |||||
EXPORT jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, | |||||
jack_nframes_t time, size_t data_size); | |||||
EXPORT int jack_midi_event_write(void* port_buffer, | |||||
jack_nframes_t time, const jack_midi_data_t* data, size_t data_size); | |||||
EXPORT jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
using namespace Jack; | |||||
EXPORT | |||||
jack_nframes_t jack_midi_get_event_count(void* port_buffer) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (!buf || !buf->IsValid()) | |||||
return 0; | |||||
return buf->event_count; | |||||
} | |||||
EXPORT | |||||
int jack_midi_event_get(jack_midi_event_t *event, void* port_buffer, jack_nframes_t event_index) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (!buf || !buf->IsValid()) | |||||
return -EINVAL; | |||||
if (event_index < 0 || event_index >= buf->event_count) | |||||
return -ENOBUFS; | |||||
JackMidiEvent* ev = &buf->events[event_index]; | |||||
event->time = ev->time; | |||||
event->size = ev->size; | |||||
event->buffer = ev->GetData(buf); | |||||
return 0; | |||||
} | |||||
EXPORT | |||||
void jack_midi_clear_buffer(void* port_buffer) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (buf && buf->IsValid()) | |||||
buf->Reset(buf->nframes); | |||||
} | |||||
EXPORT | |||||
size_t jack_midi_max_event_size(void* port_buffer) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (buf && buf->IsValid()) | |||||
return buf->MaxEventSize(); | |||||
return 0; | |||||
} | |||||
EXPORT | |||||
jack_midi_data_t* jack_midi_event_reserve(void* port_buffer, jack_nframes_t time, size_t data_size) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (!buf && !buf->IsValid()) | |||||
return 0; | |||||
if (time < 0 || time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time)) | |||||
return 0; | |||||
return buf->ReserveEvent(time, data_size); | |||||
} | |||||
EXPORT | |||||
int jack_midi_event_write(void* port_buffer, | |||||
jack_nframes_t time, const jack_midi_data_t* data, size_t data_size) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (!buf && !buf->IsValid()) | |||||
return -EINVAL; | |||||
if (time < 0 || time >= buf->nframes || (buf->event_count && buf->events[buf->event_count - 1].time > time)) | |||||
return -EINVAL; | |||||
jack_midi_data_t* dest = buf->ReserveEvent(time, data_size); | |||||
if (!dest) | |||||
return -ENOBUFS; | |||||
memcpy(dest, data, data_size); | |||||
return 0; | |||||
} | |||||
EXPORT | |||||
jack_nframes_t jack_midi_get_lost_event_count(void* port_buffer) | |||||
{ | |||||
JackMidiBuffer *buf = (JackMidiBuffer*)port_buffer; | |||||
if (buf && buf->IsValid()) | |||||
return buf->lost_events; | |||||
return 0; | |||||
} |
@@ -0,0 +1,140 @@ | |||||
/* | |||||
Copyright (C) 2007 Dmitry Baikov | |||||
Original JACK MIDI implementation Copyright (C) 2004 Ian Esten | |||||
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 "JackError.h" | |||||
#include "JackPortType.h" | |||||
#include "JackMidiPort.h" | |||||
#include <assert.h> | |||||
#include <string.h> | |||||
namespace Jack | |||||
{ | |||||
void JackMidiBuffer::Reset(jack_nframes_t nframes) | |||||
{ | |||||
/* This line ate 1 hour of my life... dsbaikov */ | |||||
this->nframes = nframes; | |||||
write_pos = 0; | |||||
event_count = 0; | |||||
lost_events = 0; | |||||
mix_index = 0; | |||||
} | |||||
jack_shmsize_t JackMidiBuffer::MaxEventSize() const | |||||
{ | |||||
assert (((jack_shmsize_t) - 1) < 0); // jack_shmsize_t should be signed | |||||
jack_shmsize_t left = buffer_size - (sizeof(JackMidiBuffer) + sizeof(JackMidiEvent) * (event_count + 1) + write_pos); | |||||
if (left < 0) | |||||
return 0; | |||||
if (left <= JackMidiEvent::INLINE_SIZE_MAX) | |||||
return JackMidiEvent::INLINE_SIZE_MAX; | |||||
return left; | |||||
} | |||||
jack_midi_data_t* JackMidiBuffer::ReserveEvent(jack_nframes_t time, jack_shmsize_t size) | |||||
{ | |||||
jack_shmsize_t space = MaxEventSize(); | |||||
if (space == 0 || size > space) { | |||||
lost_events++; | |||||
return 0; | |||||
} | |||||
JackMidiEvent* event = &events[event_count++]; | |||||
event->time = time; | |||||
event->size = size; | |||||
if (size <= JackMidiEvent::INLINE_SIZE_MAX) | |||||
return event->data; | |||||
write_pos += size; | |||||
event->offset = buffer_size - write_pos; | |||||
return (jack_midi_data_t*)this + event->offset; | |||||
} | |||||
static void MidiBufferInit(void* buffer, size_t buffer_size, jack_nframes_t nframes) | |||||
{ | |||||
JackMidiBuffer* midi = (JackMidiBuffer*)buffer; | |||||
midi->magic = JackMidiBuffer::MAGIC; | |||||
midi->buffer_size = buffer_size; | |||||
midi->Reset(nframes); | |||||
} | |||||
/* | |||||
* The mixdown function below, is a simplest (read slowest) implementation possible. | |||||
* But, since it is unlikely that it will mix many buffers with many events, | |||||
* it should perform quite good. | |||||
* More efficient (and possibly, fastest possible) implementation (it exists), | |||||
* using calendar queue algorithm is about 3 times bigger, and uses alloca(). | |||||
* So, let's listen to D.Knuth about premature optimisation, a leave the current | |||||
* implementation as is, until it is proved to be a bottleneck. | |||||
* Dmitry Baikov. | |||||
*/ | |||||
static void MidiBufferMixdown(void* mixbuffer, void** src_buffers, int src_count, jack_nframes_t nframes) | |||||
{ | |||||
JackMidiBuffer* mix = (JackMidiBuffer*)mixbuffer; | |||||
if (!mix->IsValid()) { | |||||
jack_error("MIDI: invalid mix buffer"); | |||||
return; | |||||
} | |||||
mix->Reset(nframes); | |||||
int event_count = 0; | |||||
for (int i = 0; i < src_count; ++i) { | |||||
JackMidiBuffer* buf = (JackMidiBuffer*)src_buffers[i]; | |||||
if (!buf->IsValid()) | |||||
return; | |||||
buf->mix_index = 0; | |||||
event_count += buf->event_count; | |||||
mix->lost_events += buf->lost_events; | |||||
} | |||||
int events_done; | |||||
for (events_done = 0; events_done < event_count; ++events_done) { | |||||
JackMidiBuffer* next_buf = 0; | |||||
JackMidiEvent* next_event = 0; | |||||
// find the earliest event | |||||
for (int i = 0; i < src_count; ++i) { | |||||
JackMidiBuffer* buf = (JackMidiBuffer*)src_buffers[i]; | |||||
if (buf->mix_index >= buf->event_count) | |||||
continue; | |||||
JackMidiEvent* e = &buf->events[buf->mix_index]; | |||||
if (!next_event || e->time < next_event->time) { | |||||
next_event = e; | |||||
next_buf = buf; | |||||
} | |||||
} | |||||
assert (next_event != 0); | |||||
// write the event | |||||
jack_midi_data_t* dest = mix->ReserveEvent(next_event->time, next_event->size); | |||||
if (!dest) | |||||
break; | |||||
memcpy(dest, next_event->GetData(next_buf), next_event->size); | |||||
next_buf->mix_index++; | |||||
} | |||||
mix->lost_events += event_count - events_done; | |||||
} | |||||
const JackPortType gMidiPortType = { | |||||
JACK_DEFAULT_MIDI_TYPE, | |||||
MidiBufferInit, | |||||
MidiBufferMixdown | |||||
}; | |||||
} // namespace Jack |
@@ -0,0 +1,97 @@ | |||||
/* | |||||
Copyright (C) 2007 Dmitry Baikov | |||||
Original JACK MIDI API implementation Copyright (C) 2004 Ian Esten | |||||
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. | |||||
*/ | |||||
#ifndef __JackMidiPort__ | |||||
#define __JackMidiPort__ | |||||
#include "types.h" | |||||
#include "JackConstants.h" | |||||
#include <stddef.h> | |||||
/** Type for raw event data contained in @ref jack_midi_event_t. */ | |||||
typedef unsigned char jack_midi_data_t; | |||||
/** A Jack MIDI event. */ | |||||
struct jack_midi_event_t | |||||
{ | |||||
jack_nframes_t time; /**< Sample index at which event is valid */ | |||||
size_t size; /**< Number of bytes of data in \a buffer */ | |||||
jack_midi_data_t *buffer; /**< Raw MIDI data */ | |||||
}; | |||||
/** A Jack MIDI port type. */ | |||||
#define JACK_DEFAULT_MIDI_TYPE "8 bit raw midi" | |||||
namespace Jack | |||||
{ | |||||
struct JackMidiEvent | |||||
{ | |||||
// Most MIDI events are < 4 bytes in size, so we can save a lot, storing them inplace. | |||||
enum { INLINE_SIZE_MAX = sizeof(jack_shmsize_t) }; | |||||
uint32_t time; | |||||
jack_shmsize_t size; | |||||
union { | |||||
jack_shmsize_t offset; | |||||
jack_midi_data_t data[INLINE_SIZE_MAX]; | |||||
}; | |||||
jack_midi_data_t* GetData(void* buffer) | |||||
{ | |||||
if (size <= INLINE_SIZE_MAX) | |||||
return data; | |||||
else | |||||
return (jack_midi_data_t*)buffer + offset; | |||||
} | |||||
}; | |||||
/* | |||||
* To store events with arbitrarily sized payload, but still have O(1) indexed access | |||||
* we use a trick here: | |||||
* Events are stored in an linear array from the beginning of the buffer, | |||||
* but their data (if not inlined) is stored from the end of the same buffer. | |||||
*/ | |||||
struct JackMidiBuffer | |||||
{ | |||||
enum { MAGIC = 0x900df00d }; | |||||
uint32_t magic; | |||||
jack_shmsize_t buffer_size; | |||||
jack_nframes_t nframes; | |||||
jack_shmsize_t write_pos; //!< data write position from the end of the buffer. | |||||
uint32_t event_count; | |||||
uint32_t lost_events; | |||||
uint32_t mix_index; | |||||
JackMidiEvent events[0]; | |||||
int IsValid() const { return magic == MAGIC; } | |||||
void Reset(jack_nframes_t nframes); | |||||
jack_shmsize_t MaxEventSize() const; | |||||
// checks only size constraints. | |||||
jack_midi_data_t* ReserveEvent(jack_nframes_t time, jack_shmsize_t size); | |||||
}; | |||||
} // namespace Jack | |||||
#endif |
@@ -0,0 +1,151 @@ | |||||
/* | |||||
Copyright (C) 2006 Grame | |||||
This library is free software; you can redistribute it and/or | |||||
modify it under the terms of the GNU Lesser General Public | |||||
License as published by the Free Software Foundation; either | |||||
version 2.1 of the License, or (at your option) any later version. | |||||
This library 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 | |||||
Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public | |||||
License along with this library; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | |||||
Grame Research Laboratory, 9 rue du Garet, 69001 Lyon - France | |||||
grame@grame.fr | |||||
*/ | |||||
#ifndef __JackMutex__ | |||||
#define __JackMutex__ | |||||
#ifdef WIN32 | |||||
#include <windows.h> | |||||
#else | |||||
#include <pthread.h> | |||||
#endif | |||||
#include<assert.h> | |||||
namespace Jack | |||||
{ | |||||
class JackMutex | |||||
{ | |||||
private: | |||||
#ifdef WIN32 | |||||
HANDLE fMutex; | |||||
#else | |||||
pthread_mutex_t fMutex; | |||||
#endif | |||||
public: | |||||
#ifdef WIN32 | |||||
JackMutex() | |||||
{ | |||||
fMutex = CreateMutex(0, FALSE, 0); | |||||
} | |||||
virtual ~JackMutex() | |||||
{ | |||||
CloseHandle(fMutex); | |||||
} | |||||
void Lock() | |||||
{ | |||||
DWORD dwWaitResult = WaitForSingleObject(fMutex, INFINITE); | |||||
} | |||||
void Unlock() | |||||
{ | |||||
ReleaseMutex(fMutex); | |||||
} | |||||
#else | |||||
JackMutex() | |||||
{ | |||||
// Use recursive mutex | |||||
pthread_mutexattr_t mutex_attr; | |||||
assert(pthread_mutexattr_init(&mutex_attr) == 0); | |||||
assert(pthread_mutexattr_settype(&mutex_attr, PTHREAD_MUTEX_RECURSIVE) == 0); | |||||
assert(pthread_mutex_init(&fMutex, &mutex_attr) == 0); | |||||
} | |||||
virtual ~JackMutex() | |||||
{ | |||||
pthread_mutex_destroy(&fMutex); | |||||
} | |||||
void Lock() | |||||
{ | |||||
pthread_mutex_lock(&fMutex); | |||||
} | |||||
void Unlock() | |||||
{ | |||||
pthread_mutex_unlock(&fMutex); | |||||
} | |||||
#endif | |||||
}; | |||||
class JackLockAble | |||||
{ | |||||
private: | |||||
JackMutex fMutex; | |||||
public: | |||||
JackLockAble() {} | |||||
virtual ~JackLockAble() {} | |||||
void Lock() | |||||
{ | |||||
fMutex.Lock(); | |||||
} | |||||
void Unlock() | |||||
{ | |||||
fMutex.Unlock(); | |||||
} | |||||
}; | |||||
class JackLock | |||||
{ | |||||
private: | |||||
JackLockAble* fObj; | |||||
public: | |||||
JackLock(JackLockAble* obj):fObj(obj) | |||||
{ | |||||
fObj->Lock(); | |||||
} | |||||
JackLock(const JackLockAble* obj):fObj((JackLockAble*)obj) | |||||
{ | |||||
fObj->Lock(); | |||||
} | |||||
virtual ~JackLock() | |||||
{ | |||||
fObj->Unlock(); | |||||
} | |||||
}; | |||||
} // namespace | |||||
#endif |
@@ -20,9 +20,11 @@ This program is free software; you can redistribute it and/or modify | |||||
#include "JackPort.h" | #include "JackPort.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include "JackPortType.h" | |||||
#include <stdio.h> | #include <stdio.h> | ||||
#include <assert.h> | #include <assert.h> | ||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -33,26 +35,37 @@ JackPort::JackPort() | |||||
JackPort::~JackPort() | JackPort::~JackPort() | ||||
{} | {} | ||||
void JackPort::Allocate(int refnum, const char* port_name, JackPortFlags flags) | |||||
bool JackPort::Allocate(int refnum, const char* port_name, const char* port_type, JackPortFlags flags) | |||||
{ | { | ||||
int id = GetPortTypeId(port_type); | |||||
if (id < 0) | |||||
return false; | |||||
fTypeId = id; | |||||
fFlags = flags; | fFlags = flags; | ||||
fRefNum = refnum; | fRefNum = refnum; | ||||
strcpy(fName, port_name); | strcpy(fName, port_name); | ||||
memset(fBuffer, 0, BUFFER_SIZE_MAX * sizeof(float)); | |||||
fInUse = true; | fInUse = true; | ||||
fLocked = false; | fLocked = false; | ||||
fLatency = 0; | fLatency = 0; | ||||
fTied = NO_PORT; | fTied = NO_PORT; | ||||
// DB: At this point we do not know current buffer size in frames, | |||||
// but every time buffer will be returned to any user, | |||||
// it will be called with either ClearBuffer or MixBuffers | |||||
// with correct current buffer size. | |||||
// So it is safe to init with 0 here. | |||||
ClearBuffer(0); | |||||
return true; | |||||
} | } | ||||
void JackPort::Release() | void JackPort::Release() | ||||
{ | { | ||||
fTypeId = 0; | |||||
fFlags = JackPortIsInput; | fFlags = JackPortIsInput; | ||||
fRefNum = -1; | fRefNum = -1; | ||||
fInUse = false; | fInUse = false; | ||||
fLocked = false; | fLocked = false; | ||||
fLatency = 0; | fLatency = 0; | ||||
fTied = NO_PORT; | |||||
fTied = NO_PORT; | |||||
fAlias1[0] = '\0'; | fAlias1[0] = '\0'; | ||||
fAlias2[0] = '\0'; | fAlias2[0] = '\0'; | ||||
} | } | ||||
@@ -175,8 +188,8 @@ int JackPort::Flags() const | |||||
const char* JackPort::Type() const | const char* JackPort::Type() const | ||||
{ | { | ||||
// TO IMPROVE | |||||
return JACK_DEFAULT_AUDIO_TYPE; | |||||
const JackPortType* type = GetPortType(fTypeId); | |||||
return type->name; | |||||
} | } | ||||
int JackPort::SetName(const char* new_name) | int JackPort::SetName(const char* new_name) | ||||
@@ -243,46 +256,16 @@ int JackPort::UnsetAlias(const char* alias) | |||||
return 0; | return 0; | ||||
} | } | ||||
void JackPort::MixBuffer(float* mixbuffer, float* buffer, jack_nframes_t frames) | |||||
void JackPort::ClearBuffer(jack_nframes_t frames) | |||||
{ | { | ||||
jack_nframes_t frames_group = frames / 4; | |||||
frames = frames % 4; | |||||
while (frames_group > 0) { | |||||
register float mixFloat1 = *mixbuffer; | |||||
register float sourceFloat1 = *buffer; | |||||
register float mixFloat2 = *(mixbuffer + 1); | |||||
register float sourceFloat2 = *(buffer + 1); | |||||
register float mixFloat3 = *(mixbuffer + 2); | |||||
register float sourceFloat3 = *(buffer + 2); | |||||
register float mixFloat4 = *(mixbuffer + 3); | |||||
register float sourceFloat4 = *(buffer + 3); | |||||
buffer += 4; | |||||
frames_group--; | |||||
mixFloat1 += sourceFloat1; | |||||
mixFloat2 += sourceFloat2; | |||||
mixFloat3 += sourceFloat3; | |||||
mixFloat4 += sourceFloat4; | |||||
*mixbuffer = mixFloat1; | |||||
*(mixbuffer + 1) = mixFloat2; | |||||
*(mixbuffer + 2) = mixFloat3; | |||||
*(mixbuffer + 3) = mixFloat4; | |||||
mixbuffer += 4; | |||||
} | |||||
const JackPortType* type = GetPortType(fTypeId); | |||||
(type->init)(fBuffer, BUFFER_SIZE_MAX * sizeof(float), frames); | |||||
} | |||||
while (frames > 0) { | |||||
register float mixFloat1 = *mixbuffer; | |||||
register float sourceFloat1 = *buffer; | |||||
buffer++; | |||||
frames--; | |||||
mixFloat1 += sourceFloat1; | |||||
*mixbuffer = mixFloat1; | |||||
mixbuffer++; | |||||
} | |||||
void JackPort::MixBuffers(void** src_buffers, int src_count, jack_nframes_t buffer_size) | |||||
{ | |||||
const JackPortType* type = GetPortType(fTypeId); | |||||
(type->mixdown)(fBuffer, src_buffers, src_count, buffer_size); | |||||
} | } | ||||
} // end of namespace | } // end of namespace |
@@ -41,6 +41,7 @@ class JackPort | |||||
private: | private: | ||||
int fTypeId; | |||||
enum JackPortFlags fFlags; | enum JackPortFlags fFlags; | ||||
char fName[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | char fName[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | ||||
char fAlias1[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | char fAlias1[JACK_CLIENT_NAME_SIZE + JACK_PORT_NAME_SIZE]; | ||||
@@ -66,14 +67,16 @@ class JackPort | |||||
bool IsUsed() const; | bool IsUsed() const; | ||||
static void MixBuffer(float* mixbuffer, float* buffer, jack_nframes_t frames); | |||||
// RT | |||||
void ClearBuffer(jack_nframes_t frames); | |||||
void MixBuffers(void** src_buffers, int src_count, jack_nframes_t frames); | |||||
public: | public: | ||||
JackPort(); | JackPort(); | ||||
virtual ~JackPort(); | virtual ~JackPort(); | ||||
void Allocate(int refnum, const char* port_name, JackPortFlags flags); | |||||
bool Allocate(int refnum, const char* port_name, const char* port_type, JackPortFlags flags); | |||||
void Release(); | void Release(); | ||||
const char* GetName() const; | const char* GetName() const; | ||||
const char* GetShortName() const; | const char* GetShortName() const; | ||||
@@ -0,0 +1,53 @@ | |||||
/* | |||||
Copyright (C) 2007 Dmitry Baikov | |||||
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 "JackPortType.h" | |||||
#include <string.h> | |||||
#include <assert.h> | |||||
namespace Jack | |||||
{ | |||||
static const JackPortType* port_types[] = { | |||||
&gAudioPortType, | |||||
&gMidiPortType, | |||||
}; | |||||
enum { PORT_TYPES_MAX = sizeof(port_types)/sizeof(port_types[0]) }; | |||||
int GetPortTypeId(const char* port_type) | |||||
{ | |||||
for (int i = 0; i < PORT_TYPES_MAX; ++i) { | |||||
const JackPortType* type = port_types[i]; | |||||
assert(type != 0); | |||||
if (strcmp(port_type, type->name) == 0) | |||||
return i; | |||||
} | |||||
return -1; | |||||
} | |||||
const JackPortType* GetPortType(int type_id) | |||||
{ | |||||
assert(type_id >= 0 && type_id <= PORT_TYPES_MAX); | |||||
const JackPortType* type = port_types[type_id]; | |||||
assert(type != 0); | |||||
return type; | |||||
} | |||||
} // namespace Jack |
@@ -0,0 +1,44 @@ | |||||
/* | |||||
Copyright (C) 2007 Dmitry Baikov | |||||
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. | |||||
*/ | |||||
#ifndef __JackPortType__ | |||||
#define __JackPortType__ | |||||
#include "types.h" | |||||
#include "JackConstants.h" | |||||
#include <stddef.h> | |||||
namespace Jack | |||||
{ | |||||
struct JackPortType { | |||||
const char* name; | |||||
void (*init)(void* buffer, size_t buffer_size, jack_nframes_t nframes); | |||||
void (*mixdown)(void *mixbuffer, void** src_buffers, int src_count, jack_nframes_t nframes); | |||||
}; | |||||
extern int GetPortTypeId(const char* port_type); | |||||
extern const JackPortType* GetPortType(int port_type_id); | |||||
extern const JackPortType gAudioPortType; | |||||
extern const JackPortType gMidiPortType; | |||||
} // namespace Jack | |||||
#endif |
@@ -179,9 +179,9 @@ void JackSocketClientChannel::ClientDeactivate(int refnum, int* result) | |||||
ServerSyncCall(&req, &res, result); | ServerSyncCall(&req, &res, result); | ||||
} | } | ||||
void JackSocketClientChannel::PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
void JackSocketClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
{ | { | ||||
JackPortRegisterRequest req(refnum, name, "audio", flags, buffer_size); | |||||
JackPortRegisterRequest req(refnum, name, type, flags, buffer_size); | |||||
JackPortRegisterResult res; | JackPortRegisterResult res; | ||||
ServerSyncCall(&req, &res, result); | ServerSyncCall(&req, &res, result); | ||||
*port_index = res.fPortIndex; | *port_index = res.fPortIndex; | ||||
@@ -66,7 +66,7 @@ class JackSocketClientChannel : public JackClientChannelInterface, public JackRu | |||||
void ClientActivate(int refnum, int* result); | void ClientActivate(int refnum, int* result); | ||||
void ClientDeactivate(int refnum, int* result); | void ClientDeactivate(int refnum, int* result); | ||||
void PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); | |||||
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); | |||||
void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); | void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); | ||||
void PortConnect(int refnum, const char* src, const char* dst, int* result); | void PortConnect(int refnum, const char* src, const char* dst, int* result); | ||||
@@ -207,7 +207,7 @@ int JackSocketServerChannel::HandleRequest(int fd) | |||||
JackPortRegisterRequest req; | JackPortRegisterRequest req; | ||||
JackPortRegisterResult res; | JackPortRegisterResult res; | ||||
if (req.Read(socket) == 0) | if (req.Read(socket) == 0) | ||||
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
res.Write(socket); | res.Write(socket); | ||||
break; | break; | ||||
} | } | ||||
@@ -0,0 +1,153 @@ | |||||
/* | |||||
Copyright (C) 2004 Ian Esten | |||||
This program is free software; you can redistribute it and/or modify | |||||
it under the terms of the GNU Lesser General Public License as published by | |||||
the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details. | |||||
You should have received a copy of the GNU Lesser General Public License | |||||
along with this program; if not, write to the Free Software | |||||
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
*/ | |||||
#ifndef __JACK_MIDIPORT_H | |||||
#define __JACK_MIDIPORT_H | |||||
#ifdef __cplusplus | |||||
extern "C" { | |||||
#endif | |||||
#include <jack/types.h> | |||||
#include <stdlib.h> | |||||
/** Type for raw event data contained in @ref jack_midi_event_t. */ | |||||
typedef unsigned char jack_midi_data_t; | |||||
/** A Jack MIDI event. */ | |||||
typedef struct _jack_midi_event | |||||
{ | |||||
jack_nframes_t time; /**< Sample index at which event is valid */ | |||||
size_t size; /**< Number of bytes of data in \a buffer */ | |||||
jack_midi_data_t *buffer; /**< Raw MIDI data */ | |||||
} jack_midi_event_t; | |||||
/* Get number of events in a port buffer. | |||||
* | |||||
* @param port_buffer Port buffer from which to retrieve event. | |||||
* @return number of events inside @a port_buffer | |||||
*/ | |||||
jack_nframes_t | |||||
jack_midi_get_event_count(void* port_buffer); | |||||
/** Get a MIDI event from an event port buffer. | |||||
* | |||||
* Jack MIDI is normalised, the MIDI event returned by this function is | |||||
* guaranteed to be a complete MIDI event (the status byte will always be | |||||
* present, and no realtime events will interspered with the event). | |||||
* | |||||
* @param event Event structure to store retrieved event in. | |||||
* @param port_buffer Port buffer from which to retrieve event. | |||||
* @param event_index Index of event to retrieve. | |||||
* @return 0 on success, ENODATA if buffer is empty. | |||||
*/ | |||||
int | |||||
jack_midi_event_get(jack_midi_event_t *event, | |||||
void *port_buffer, | |||||
jack_nframes_t event_index); | |||||
/** Clear an event buffer. | |||||
* | |||||
* This should be called at the beginning of each process cycle before calling | |||||
* @ref jack_midi_event_reserve or @ref jack_midi_event_write. This | |||||
* function may not be called on an input port's buffer. | |||||
* | |||||
* @param port_buffer Port buffer to clear (must be an output port buffer). | |||||
*/ | |||||
void | |||||
jack_midi_clear_buffer(void *port_buffer); | |||||
/** Get the size of the largest event that can be stored by the port. | |||||
* | |||||
* This function returns the current space available, taking into account | |||||
* events already stored in the port. | |||||
* | |||||
* @param port_buffer Port buffer to check size of. | |||||
*/ | |||||
size_t | |||||
jack_midi_max_event_size(void* port_buffer); | |||||
/** Allocate space for an event to be written to an event port buffer. | |||||
* | |||||
* Clients are to write the actual event data to be written starting at the | |||||
* pointer returned by this function. Clients must not write more than | |||||
* @a data_size bytes into this buffer. Clients must write normalised | |||||
* MIDI data to the port - no running status and no (1-byte) realtime | |||||
* messages interspersed with other messages (realtime messages are fine | |||||
* when they occur on their own, like other messages). | |||||
* | |||||
* @param port_buffer Buffer to write event to. | |||||
* @param time Sample offset of event. | |||||
* @param data_size Length of event's raw data in bytes. | |||||
* @return Pointer to the beginning of the reserved event's data buffer, or | |||||
* NULL on error (ie not enough space). | |||||
*/ | |||||
jack_midi_data_t* | |||||
jack_midi_event_reserve(void *port_buffer, | |||||
jack_nframes_t time, | |||||
size_t data_size); | |||||
/** Write an event into an event port buffer. | |||||
* | |||||
* This function is simply a wrapper for @ref jack_midi_event_reserve | |||||
* which writes the event data into the space reserved in the buffer. | |||||
* The same restrictions on the MIDI data apply. | |||||
* | |||||
* @param port_buffer Buffer to write event to. | |||||
* @param time Sample offset of event. | |||||
* @param data Message data to be written. | |||||
* @param data_size Length of @a data in bytes. | |||||
* @return 0 on success, ENOBUFS if there's not enough space in buffer for event. | |||||
*/ | |||||
int | |||||
jack_midi_event_write(void *port_buffer, | |||||
jack_nframes_t time, | |||||
const jack_midi_data_t *data, | |||||
size_t data_size); | |||||
/** Get the number of events that could not be written to @a port_buffer. | |||||
* | |||||
* This function returning a non-zero value implies @a port_buffer is full. | |||||
* Currently the only way this can happen is if events are lost on port mixdown. | |||||
* | |||||
* @param port_buffer Port to receive count for. | |||||
* @returns Number of events that could not be written to @a port_buffer. | |||||
*/ | |||||
jack_nframes_t | |||||
jack_midi_get_lost_event_count(void *port_buffer); | |||||
#ifdef __cplusplus | |||||
} | |||||
#endif | |||||
#endif /* __JACK_MIDIPORT_H */ | |||||
@@ -30,12 +30,14 @@ LIB_LINUX := -lpthread -lrt -lasound | |||||
objects_common_server_lib := JackActivationCount.o JackAPI.o JackAudioDriver.o JackClient.o JackConnectionManager.o \ | objects_common_server_lib := JackActivationCount.o JackAPI.o JackAudioDriver.o JackClient.o JackConnectionManager.o \ | ||||
JackDriver.o JackEngine.o JackEngineTiming.o JackError.o JackExternalClient.o JackFrameTimer.o \ | JackDriver.o JackEngine.o JackEngineTiming.o JackError.o JackExternalClient.o JackFrameTimer.o \ | ||||
JackFreewheelDriver.o JackGlobalsServer.o JackGraphManager.o JackInternalClient.o JackPort.o JackPosixSemaphore.o JackPosixThread.o JackFifo.o JackLoopbackDriver.o\ | JackFreewheelDriver.o JackGlobalsServer.o JackGraphManager.o JackInternalClient.o JackPort.o JackPosixSemaphore.o JackPosixThread.o JackFifo.o JackLoopbackDriver.o\ | ||||
JackPortType.o JackAudioPort.o JackMidiPort.o \ | |||||
JackServer.o JackShmMem.o JackThreadedDriver.o shm.o JackSocket.o JackSocketServerChannel.o JackSocketNotifyChannel.o \ | JackServer.o JackShmMem.o JackThreadedDriver.o shm.o JackSocket.o JackSocketServerChannel.o JackSocketNotifyChannel.o \ | ||||
JackSocketServerNotifyChannel.o JackTime.o JackServerAPI.o JackGlobals.o JackDriverLoader.o internal_metro.o JackDebugClient.o \ | JackSocketServerNotifyChannel.o JackTime.o JackServerAPI.o JackGlobals.o JackDriverLoader.o internal_metro.o JackDebugClient.o \ | ||||
JackTransportEngine.o JackServerGlobals.o JackServerLaunch.o timestamps.o | JackTransportEngine.o JackServerGlobals.o JackServerLaunch.o timestamps.o | ||||
objects_common_client_lib := JackActivationCount.o JackAPI.o JackClient.o JackConnectionManager.o ringbuffer.o JackServerLaunch.o\ | objects_common_client_lib := JackActivationCount.o JackAPI.o JackClient.o JackConnectionManager.o ringbuffer.o JackServerLaunch.o\ | ||||
JackError.o JackFrameTimer.o JackGlobalsClient.o JackGraphManager.o JackLibClient.o JackLibAPI.o JackPort.o JackPosixSemaphore.o JackFifo.o \ | JackError.o JackFrameTimer.o JackGlobalsClient.o JackGraphManager.o JackLibClient.o JackLibAPI.o JackPort.o JackPosixSemaphore.o JackFifo.o \ | ||||
JackPortType.o JackAudioPort.o JackMidiPort.o JackMidiAPI.o \ | |||||
JackPosixThread.o JackShmMem.o shm.o JackSocket.o JackSocketClientChannel.o JackTime.o JackGlobals.o JackDebugClient.o JackTransportEngine.o timestamps.o | JackPosixThread.o JackShmMem.o shm.o JackSocket.o JackSocketClientChannel.o JackTime.o JackGlobals.o JackDebugClient.o JackTransportEngine.o timestamps.o | ||||
@@ -1504,20 +1504,21 @@ JackAlsaDriver::alsa_driver_wait (alsa_driver_t *driver, int extra_fd, int *stat | |||||
return avail - (avail % driver->frames_per_cycle); | return avail - (avail % driver->frames_per_cycle); | ||||
} | } | ||||
int JackAlsaDriver::SetBufferSize(jack_nframes_t nframes) | |||||
int JackAlsaDriver::SetBufferSize(jack_nframes_t buffer_size) | |||||
{ | { | ||||
JackLog("JackAlsaDriver::SetBufferSize %ld\n", nframes); | JackLog("JackAlsaDriver::SetBufferSize %ld\n", nframes); | ||||
int res = alsa_driver_reset_parameters((alsa_driver_t *)fDriver, nframes, | int res = alsa_driver_reset_parameters((alsa_driver_t *)fDriver, nframes, | ||||
((alsa_driver_t *)fDriver)->user_nperiods, | ((alsa_driver_t *)fDriver)->user_nperiods, | ||||
((alsa_driver_t *)fDriver)->frame_rate); | ((alsa_driver_t *)fDriver)->frame_rate); | ||||
if (res == 0) // update fEngineControl and fGraphManager | |||||
JackAudioDriver::SetBufferSize(nframes); // never fails | |||||
else | |||||
if (res == 0) { // update fEngineControl and fGraphManager | |||||
JackAudioDriver::SetBufferSize(buffer_size); // never fails | |||||
} else { | |||||
alsa_driver_reset_parameters((alsa_driver_t *)fDriver, fEngineControl->fBufferSize, | alsa_driver_reset_parameters((alsa_driver_t *)fDriver, fEngineControl->fBufferSize, | ||||
((alsa_driver_t *)fDriver)->user_nperiods, | ((alsa_driver_t *)fDriver)->user_nperiods, | ||||
((alsa_driver_t *)fDriver)->frame_rate); | ((alsa_driver_t *)fDriver)->frame_rate); | ||||
} | |||||
return res; | return res; | ||||
} | } | ||||
@@ -2087,7 +2088,7 @@ int JackAlsaDriver::Attach() | |||||
for (int i = 0; i < fCaptureChannels; i++) { | for (int i = 0; i < fCaptureChannels; i++) { | ||||
snprintf(buf, sizeof(buf) - 1, "%s:capture_%u", fClientControl->fName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:capture_%u", fClientControl->fName, i + 1); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -2102,7 +2103,7 @@ int JackAlsaDriver::Attach() | |||||
for (int i = 0; i < fPlaybackChannels; i++) { | for (int i = 0; i < fPlaybackChannels; i++) { | ||||
snprintf(buf, sizeof(buf) - 1, "%s:playback_%u", fClientControl->fName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:playback_%u", fClientControl->fName, i + 1); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("driver: cannot register port for %s", buf); | jack_error("driver: cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -2112,19 +2113,19 @@ int JackAlsaDriver::Attach() | |||||
fPlaybackPortList[i] = port_index; | fPlaybackPortList[i] = port_index; | ||||
JackLog("JackAudioDriver::Attach fPlaybackPortList[i] %ld \n", port_index); | JackLog("JackAudioDriver::Attach fPlaybackPortList[i] %ld \n", port_index); | ||||
// Monitor ports | |||||
if (fWithMonitorPorts) { | |||||
JackLog("Create monitor port \n"); | |||||
snprintf(buf, sizeof(buf) - 1, "%s:monitor_%lu",fClientControl->fName, i + 1); | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JackPortIsOutput)) == NO_PORT) { | |||||
jack_error ("ALSA: cannot register monitor port for %s", buf); | |||||
} else { | |||||
port = fGraphManager->GetPort(port_index); | |||||
port->SetLatency(alsa_driver->frames_per_cycle); | |||||
fMonitorPortList[i] = port_index; | |||||
// Monitor ports | |||||
if (fWithMonitorPorts) { | |||||
JackLog("Create monitor port \n"); | |||||
snprintf(buf, sizeof(buf) - 1, "%s:monitor_%lu",fClientControl->fName, i + 1); | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput)) == NO_PORT) { | |||||
jack_error ("ALSA: cannot register monitor port for %s", buf); | |||||
} else { | |||||
port = fGraphManager->GetPort(port_index); | |||||
port->SetLatency(alsa_driver->frames_per_cycle); | |||||
fMonitorPortList[i] = port_index; | |||||
} | |||||
} | } | ||||
} | } | ||||
} | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -816,7 +816,7 @@ int JackCoreAudioDriver::Attach() | |||||
snprintf(buf, sizeof(buf) - 1, "%s:%s:out%u", fClientControl->fName, fCaptureDriverName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:%s:out%u", fClientControl->fName, fCaptureDriverName, i + 1); | ||||
} | } | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("Cannot register port for %s", buf); | jack_error("Cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -853,7 +853,7 @@ int JackCoreAudioDriver::Attach() | |||||
snprintf(buf, sizeof(buf) - 1, "%s:%s:in%u", fClientControl->fName, fPlaybackDriverName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:%s:in%u", fClientControl->fName, fPlaybackDriverName, i + 1); | ||||
} | } | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, (JackPortFlags)port_flags)) == NO_PORT) { | |||||
jack_error("Cannot register port for %s", buf); | jack_error("Cannot register port for %s", buf); | ||||
return -1; | return -1; | ||||
} | } | ||||
@@ -877,7 +877,7 @@ int JackCoreAudioDriver::Attach() | |||||
if (fWithMonitorPorts) { | if (fWithMonitorPorts) { | ||||
JackLog("Create monitor port \n"); | JackLog("Create monitor port \n"); | ||||
snprintf(buf, sizeof(buf) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); | snprintf(buf, sizeof(buf) - 1, "%s:%s:monitor_%u", fClientControl->fName, fPlaybackDriverName, i + 1); | ||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JackPortIsOutput)) == NO_PORT) { | |||||
if ((port_index = fGraphManager->AllocatePort(fClientControl->fRefNum, buf, JACK_DEFAULT_AUDIO_TYPE, JackPortIsOutput)) == NO_PORT) { | |||||
jack_error("Cannot register monitor port for %s", buf); | jack_error("Cannot register monitor port for %s", buf); | ||||
return -1; | return -1; | ||||
} else { | } else { | ||||
@@ -937,7 +937,7 @@ int JackCoreAudioDriver::SetBufferSize(jack_nframes_t buffer_size) | |||||
printError(err); | printError(err); | ||||
return -1; | return -1; | ||||
} | } | ||||
JackAudioDriver::SetBufferSize(buffer_size); // never fails | JackAudioDriver::SetBufferSize(buffer_size); // never fails | ||||
// Input buffers do no change : prepare them only once | // Input buffers do no change : prepare them only once | ||||
@@ -81,12 +81,12 @@ rpc_type server_rpc_jack_client_deactivate(mach_port_t private_port, int refnum, | |||||
// Port management | // Port management | ||||
//----------------- | //----------------- | ||||
rpc_type server_rpc_jack_port_register(mach_port_t private_port, int refnum, client_port_name_t name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
rpc_type server_rpc_jack_port_register(mach_port_t private_port, int refnum, client_port_name_t name, client_port_type_t type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
{ | { | ||||
JackLog("rpc_jack_port_register %ld %s\n", refnum, name); | JackLog("rpc_jack_port_register %ld %s\n", refnum, name); | ||||
JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port]; | JackMachServerChannel* channel = JackMachServerChannel::fPortTable[private_port]; | ||||
assert(channel); | assert(channel); | ||||
*result = channel->GetEngine()->PortRegister(refnum, name, flags, buffer_size, port_index); | |||||
*result = channel->GetEngine()->PortRegister(refnum, name, type, flags, buffer_size, port_index); | |||||
return KERN_SUCCESS; | return KERN_SUCCESS; | ||||
} | } | ||||
@@ -169,9 +169,9 @@ void JackMachClientChannel::ClientDeactivate(int refnum, int* result) | |||||
} | } | ||||
} | } | ||||
void JackMachClientChannel::PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
void JackMachClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
{ | { | ||||
kern_return_t res = rpc_jack_port_register(fPrivatePort, refnum, (char*)name, flags, buffer_size, port_index, result); | |||||
kern_return_t res = rpc_jack_port_register(fPrivatePort, refnum, (char*)name, (char*)type, flags, buffer_size, port_index, result); | |||||
if (res != KERN_SUCCESS) { | if (res != KERN_SUCCESS) { | ||||
*result = -1; | *result = -1; | ||||
jack_error("JackMachClientChannel::PortRegister err = %s", mach_error_string(res)); | jack_error("JackMachClientChannel::PortRegister err = %s", mach_error_string(res)); | ||||
@@ -63,7 +63,7 @@ class JackMachClientChannel : public JackClientChannelInterface, public JackRunn | |||||
void ClientActivate(int refnum, int* result); | void ClientActivate(int refnum, int* result); | ||||
void ClientDeactivate(int refnum, int* result); | void ClientDeactivate(int refnum, int* result); | ||||
void PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); | |||||
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); | |||||
void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); | void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); | ||||
void PortConnect(int refnum, const char* src, const char* dst, int* result); | void PortConnect(int refnum, const char* src, const char* dst, int* result); | ||||
@@ -247,6 +247,8 @@ | |||||
4B699D9B097D421700A18468 /* JackCoreAudioDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B395C9606AEF53800923527 /* JackCoreAudioDriver.cpp */; }; | 4B699D9B097D421700A18468 /* JackCoreAudioDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B395C9606AEF53800923527 /* JackCoreAudioDriver.cpp */; }; | ||||
4B699DA8097D421700A18468 /* JackDummyDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3988A08B3CF6C00B6F371 /* JackDummyDriver.h */; }; | 4B699DA8097D421700A18468 /* JackDummyDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC3988A08B3CF6C00B6F371 /* JackDummyDriver.h */; }; | ||||
4B699DAA097D421700A18468 /* JackDummyDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3988908B3CF6C00B6F371 /* JackDummyDriver.cpp */; }; | 4B699DAA097D421700A18468 /* JackDummyDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC3988908B3CF6C00B6F371 /* JackDummyDriver.cpp */; }; | ||||
4B6B9EF60CD095930051EE5A /* midiport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6B9EF50CD0958B0051EE5A /* midiport.h */; settings = {ATTRIBUTES = (Public, ); }; }; | |||||
4B6B9EF70CD095970051EE5A /* midiport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6B9EF50CD0958B0051EE5A /* midiport.h */; settings = {ATTRIBUTES = (Public, ); }; }; | |||||
4B6C73800CC60A7F001AFFD4 /* intclient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C73790CC60A6D001AFFD4 /* intclient.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4B6C73800CC60A7F001AFFD4 /* intclient.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C73790CC60A6D001AFFD4 /* intclient.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4B6C73810CC60A7F001AFFD4 /* jack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737A0CC60A6D001AFFD4 /* jack.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4B6C73810CC60A7F001AFFD4 /* jack.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737A0CC60A6D001AFFD4 /* jack.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4B6C73820CC60A7F001AFFD4 /* ringbuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737B0CC60A6D001AFFD4 /* ringbuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4B6C73820CC60A7F001AFFD4 /* ringbuffer.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737B0CC60A6D001AFFD4 /* ringbuffer.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
@@ -259,10 +261,22 @@ | |||||
4B6C73890CC60A85001AFFD4 /* statistics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737C0CC60A6D001AFFD4 /* statistics.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4B6C73890CC60A85001AFFD4 /* statistics.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737C0CC60A6D001AFFD4 /* statistics.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737D0CC60A6D001AFFD4 /* thread.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737D0CC60A6D001AFFD4 /* thread.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737E0CC60A6D001AFFD4 /* transport.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B6C737E0CC60A6D001AFFD4 /* transport.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4B80D7E80BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; }; | |||||
4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; }; | |||||
4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; }; | |||||
4B80D7EB0BA0D17400F035BB /* JackMidiPort.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B80D7E50BA0D17400F035BB /* JackMidiPort.h */; }; | |||||
4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */; }; | |||||
4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */; }; | |||||
4B978DED0A31D099009E2DD1 /* JackPortAudioDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B978DEB0A31D099009E2DD1 /* JackPortAudioDriver.h */; }; | 4B978DED0A31D099009E2DD1 /* JackPortAudioDriver.h in Headers */ = {isa = PBXBuildFile; fileRef = 4B978DEB0A31D099009E2DD1 /* JackPortAudioDriver.h */; }; | ||||
4B978DEE0A31D099009E2DD1 /* JackPortAudioDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B978DEC0A31D099009E2DD1 /* JackPortAudioDriver.cpp */; }; | 4B978DEE0A31D099009E2DD1 /* JackPortAudioDriver.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4B978DEC0A31D099009E2DD1 /* JackPortAudioDriver.cpp */; }; | ||||
4BA692B30CBE4C2D00EAD520 /* ipload.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA692B20CBE4C2D00EAD520 /* ipload.c */; }; | 4BA692B30CBE4C2D00EAD520 /* ipload.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA692B20CBE4C2D00EAD520 /* ipload.c */; }; | ||||
4BA692D70CBE4CC600EAD520 /* ipunload.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA692D60CBE4CC600EAD520 /* ipunload.c */; }; | 4BA692D70CBE4CC600EAD520 /* ipunload.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BA692D60CBE4CC600EAD520 /* ipunload.c */; }; | ||||
4BAB95B80B9E20B800A0C723 /* JackPortType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */; }; | |||||
4BAB95B90B9E20B800A0C723 /* JackPortType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAB95B70B9E20B800A0C723 /* JackPortType.h */; }; | |||||
4BAB95BA0B9E20B800A0C723 /* JackPortType.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */; }; | |||||
4BAB95BB0B9E20B800A0C723 /* JackPortType.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BAB95B70B9E20B800A0C723 /* JackPortType.h */; }; | |||||
4BAB95ED0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */; }; | |||||
4BAB95EE0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */; }; | |||||
4BC216850A444BAD00BDA09F /* JackServerAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1F50834EFB000C94B91 /* JackServerAPI.cpp */; }; | 4BC216850A444BAD00BDA09F /* JackServerAPI.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BF8D1F50834EFB000C94B91 /* JackServerAPI.cpp */; }; | ||||
4BC216890A444BDE00BDA09F /* JackServerGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */; }; | 4BC216890A444BDE00BDA09F /* JackServerGlobals.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */; }; | ||||
4BC2168E0A444BED00BDA09F /* JackServerGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC2168D0A444BED00BDA09F /* JackServerGlobals.h */; }; | 4BC2168E0A444BED00BDA09F /* JackServerGlobals.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BC2168D0A444BED00BDA09F /* JackServerGlobals.h */; }; | ||||
@@ -279,7 +293,6 @@ | |||||
4BF520540CB8D0E80037470E /* timestamps.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF520520CB8D0E80037470E /* timestamps.c */; }; | 4BF520540CB8D0E80037470E /* timestamps.c in Sources */ = {isa = PBXBuildFile; fileRef = 4BF520520CB8D0E80037470E /* timestamps.c */; }; | ||||
4BF520590CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4BF520590CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4BF5205A0CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (Public, ); }; }; | 4BF5205A0CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; settings = {ATTRIBUTES = (Public, ); }; }; | ||||
4BF5205B0CB8D1010037470E /* timestamps.h in Headers */ = {isa = PBXBuildFile; fileRef = 4BF520580CB8D1010037470E /* timestamps.h */; }; | |||||
4BFA99AA0AAAF40C009E916C /* jdelay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFA99A90AAAF40C009E916C /* jdelay.cpp */; }; | 4BFA99AA0AAAF40C009E916C /* jdelay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4BFA99A90AAAF40C009E916C /* jdelay.cpp */; }; | ||||
/* End PBXBuildFile section */ | /* End PBXBuildFile section */ | ||||
@@ -504,6 +517,7 @@ | |||||
4B699D91097D421700A18468 /* synchroServerClient */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = synchroServerClient; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B699D91097D421700A18468 /* synchroServerClient */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = synchroServerClient; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B699DA1097D421700A18468 /* jack_coreaudio.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_coreaudio.so; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B699DA1097D421700A18468 /* jack_coreaudio.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_coreaudio.so; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B699DB0097D421700A18468 /* jack_dummy.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_dummy.so; sourceTree = BUILT_PRODUCTS_DIR; }; | 4B699DB0097D421700A18468 /* jack_dummy.so */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = jack_dummy.so; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4B6B9EF50CD0958B0051EE5A /* midiport.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = midiport.h; path = ../common/jack/midiport.h; sourceTree = SOURCE_ROOT; }; | |||||
4B6C73790CC60A6D001AFFD4 /* intclient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = intclient.h; path = ../common/jack/intclient.h; sourceTree = SOURCE_ROOT; }; | 4B6C73790CC60A6D001AFFD4 /* intclient.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = intclient.h; path = ../common/jack/intclient.h; sourceTree = SOURCE_ROOT; }; | ||||
4B6C737A0CC60A6D001AFFD4 /* jack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jack.h; path = ../common/jack/jack.h; sourceTree = SOURCE_ROOT; }; | 4B6C737A0CC60A6D001AFFD4 /* jack.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = jack.h; path = ../common/jack/jack.h; sourceTree = SOURCE_ROOT; }; | ||||
4B6C737B0CC60A6D001AFFD4 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ringbuffer.h; path = ../common/jack/ringbuffer.h; sourceTree = SOURCE_ROOT; }; | 4B6C737B0CC60A6D001AFFD4 /* ringbuffer.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = ringbuffer.h; path = ../common/jack/ringbuffer.h; sourceTree = SOURCE_ROOT; }; | ||||
@@ -513,6 +527,9 @@ | |||||
4B6C737F0CC60A6D001AFFD4 /* types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../common/jack/types.h; sourceTree = SOURCE_ROOT; }; | 4B6C737F0CC60A6D001AFFD4 /* types.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = types.h; path = ../common/jack/types.h; sourceTree = SOURCE_ROOT; }; | ||||
4B799AD607899652003F3F15 /* JackMachPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMachPort.cpp; sourceTree = "<group>"; }; | 4B799AD607899652003F3F15 /* JackMachPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; path = JackMachPort.cpp; sourceTree = "<group>"; }; | ||||
4B799AD707899652003F3F15 /* JackMachPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JackMachPort.h; sourceTree = "<group>"; }; | 4B799AD707899652003F3F15 /* JackMachPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; path = JackMachPort.h; sourceTree = "<group>"; }; | ||||
4B80D7E50BA0D17400F035BB /* JackMidiPort.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackMidiPort.h; path = ../common/JackMidiPort.h; sourceTree = SOURCE_ROOT; }; | |||||
4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackMidiPort.cpp; path = ../common/JackMidiPort.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackMidiAPI.cpp; path = ../common/JackMidiAPI.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4B869B3D08C8D21C001CF041 /* driver_interface.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = driver_interface.h; path = ../common/driver_interface.h; sourceTree = SOURCE_ROOT; }; | 4B869B3D08C8D21C001CF041 /* driver_interface.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = driver_interface.h; path = ../common/driver_interface.h; sourceTree = SOURCE_ROOT; }; | ||||
4B869B3E08C8D21C001CF041 /* driver_parse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = driver_parse.h; path = ../common/driver_parse.h; sourceTree = SOURCE_ROOT; }; | 4B869B3E08C8D21C001CF041 /* driver_parse.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = driver_parse.h; path = ../common/driver_parse.h; sourceTree = SOURCE_ROOT; }; | ||||
4B869B4208C8D22F001CF041 /* JackDriverLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackDriverLoader.h; path = ../common/JackDriverLoader.h; sourceTree = SOURCE_ROOT; }; | 4B869B4208C8D22F001CF041 /* JackDriverLoader.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackDriverLoader.h; path = ../common/JackDriverLoader.h; sourceTree = SOURCE_ROOT; }; | ||||
@@ -543,6 +560,9 @@ | |||||
4BA692B20CBE4C2D00EAD520 /* ipload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipload.c; path = "../example-clients/ipload.c"; sourceTree = SOURCE_ROOT; }; | 4BA692B20CBE4C2D00EAD520 /* ipload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipload.c; path = "../example-clients/ipload.c"; sourceTree = SOURCE_ROOT; }; | ||||
4BA692D40CBE4C9000EAD520 /* jack_unload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_unload; sourceTree = BUILT_PRODUCTS_DIR; }; | 4BA692D40CBE4C9000EAD520 /* jack_unload */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = jack_unload; sourceTree = BUILT_PRODUCTS_DIR; }; | ||||
4BA692D60CBE4CC600EAD520 /* ipunload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipunload.c; path = "../example-clients/ipunload.c"; sourceTree = SOURCE_ROOT; }; | 4BA692D60CBE4CC600EAD520 /* ipunload.c */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.c; name = ipunload.c; path = "../example-clients/ipunload.c"; sourceTree = SOURCE_ROOT; }; | ||||
4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackPortType.cpp; path = ../common/JackPortType.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4BAB95B70B9E20B800A0C723 /* JackPortType.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackPortType.h; path = ../common/JackPortType.h; sourceTree = SOURCE_ROOT; }; | |||||
4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackAudioPort.cpp; path = ../common/JackAudioPort.cpp; sourceTree = SOURCE_ROOT; }; | |||||
4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; | 4BB371D40C1AD85A0050C1E4 /* JackNotification.h */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.c.h; name = JackNotification.h; path = ../common/JackNotification.h; sourceTree = SOURCE_ROOT; }; | ||||
4BBD13CC08C71EB40079F7FF /* testSynchroServerClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSynchroServerClient.cpp; path = ../tests/testSynchroServerClient.cpp; sourceTree = SOURCE_ROOT; }; | 4BBD13CC08C71EB40079F7FF /* testSynchroServerClient.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = testSynchroServerClient.cpp; path = ../tests/testSynchroServerClient.cpp; sourceTree = SOURCE_ROOT; }; | ||||
4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackServerGlobals.cpp; path = ../common/JackServerGlobals.cpp; sourceTree = SOURCE_ROOT; }; | 4BC216880A444BDE00BDA09F /* JackServerGlobals.cpp */ = {isa = PBXFileReference; fileEncoding = 30; lastKnownFileType = sourcecode.cpp.cpp; name = JackServerGlobals.cpp; path = ../common/JackServerGlobals.cpp; sourceTree = SOURCE_ROOT; }; | ||||
@@ -962,6 +982,7 @@ | |||||
4B6C73780CC60A6D001AFFD4 /* jack */ = { | 4B6C73780CC60A6D001AFFD4 /* jack */ = { | ||||
isa = PBXGroup; | isa = PBXGroup; | ||||
children = ( | children = ( | ||||
4B6B9EF50CD0958B0051EE5A /* midiport.h */, | |||||
4B6C73790CC60A6D001AFFD4 /* intclient.h */, | 4B6C73790CC60A6D001AFFD4 /* intclient.h */, | ||||
4B6C737A0CC60A6D001AFFD4 /* jack.h */, | 4B6C737A0CC60A6D001AFFD4 /* jack.h */, | ||||
4B6C737B0CC60A6D001AFFD4 /* ringbuffer.h */, | 4B6C737B0CC60A6D001AFFD4 /* ringbuffer.h */, | ||||
@@ -1083,6 +1104,11 @@ | |||||
4BA550FA05E241F200569492 /* Ports */ = { | 4BA550FA05E241F200569492 /* Ports */ = { | ||||
isa = PBXGroup; | isa = PBXGroup; | ||||
children = ( | children = ( | ||||
4B80D7E60BA0D17400F035BB /* JackMidiPort.cpp */, | |||||
4B80D7E50BA0D17400F035BB /* JackMidiPort.h */, | |||||
4BAB95EC0B9E21A500A0C723 /* JackAudioPort.cpp */, | |||||
4BAB95B70B9E20B800A0C723 /* JackPortType.h */, | |||||
4BAB95B60B9E20B800A0C723 /* JackPortType.cpp */, | |||||
4BF8D1CF0834EF2F00C94B91 /* JackPort.h */, | 4BF8D1CF0834EF2F00C94B91 /* JackPort.h */, | ||||
4BF8D1D00834EF2F00C94B91 /* JackPort.cpp */, | 4BF8D1D00834EF2F00C94B91 /* JackPort.cpp */, | ||||
); | ); | ||||
@@ -1145,6 +1171,7 @@ | |||||
4B98AE010931D30C0091932A /* JackDebugClient.h */, | 4B98AE010931D30C0091932A /* JackDebugClient.h */, | ||||
4B98AE000931D30C0091932A /* JackDebugClient.cpp */, | 4B98AE000931D30C0091932A /* JackDebugClient.cpp */, | ||||
4BF8D1E90834EF7500C94B91 /* JackAPI.cpp */, | 4BF8D1E90834EF7500C94B91 /* JackAPI.cpp */, | ||||
4B80D7E70BA0D17400F035BB /* JackMidiAPI.cpp */, | |||||
4BE50F650B01E96200C05E63 /* JackAPIWrapper.cpp */, | 4BE50F650B01E96200C05E63 /* JackAPIWrapper.cpp */, | ||||
4B44FAE50C7598370033A72C /* JackServerLaunch.cpp */, | 4B44FAE50C7598370033A72C /* JackServerLaunch.cpp */, | ||||
4BF520580CB8D1010037470E /* timestamps.h */, | 4BF520580CB8D1010037470E /* timestamps.h */, | ||||
@@ -1289,6 +1316,9 @@ | |||||
4B6C73840CC60A80001AFFD4 /* thread.h in Headers */, | 4B6C73840CC60A80001AFFD4 /* thread.h in Headers */, | ||||
4B6C73850CC60A81001AFFD4 /* transport.h in Headers */, | 4B6C73850CC60A81001AFFD4 /* transport.h in Headers */, | ||||
4BE3225A0CC611EF00AFA640 /* types.h in Headers */, | 4BE3225A0CC611EF00AFA640 /* types.h in Headers */, | ||||
4BAB95B90B9E20B800A0C723 /* JackPortType.h in Headers */, | |||||
4B80D7E80BA0D17400F035BB /* JackMidiPort.h in Headers */, | |||||
4B6B9EF60CD095930051EE5A /* midiport.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1351,6 +1381,9 @@ | |||||
4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */, | 4B6C738A0CC60A85001AFFD4 /* thread.h in Headers */, | ||||
4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */, | 4B6C738B0CC60A86001AFFD4 /* transport.h in Headers */, | ||||
4BE3225B0CC611F500AFA640 /* types.h in Headers */, | 4BE3225B0CC611F500AFA640 /* types.h in Headers */, | ||||
4BAB95BB0B9E20B800A0C723 /* JackPortType.h in Headers */, | |||||
4B80D7EB0BA0D17400F035BB /* JackMidiPort.h in Headers */, | |||||
4B6B9EF70CD095970051EE5A /* midiport.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1497,7 +1530,6 @@ | |||||
isa = PBXHeadersBuildPhase; | isa = PBXHeadersBuildPhase; | ||||
buildActionMask = 2147483647; | buildActionMask = 2147483647; | ||||
files = ( | files = ( | ||||
4BF5205B0CB8D1010037470E /* timestamps.h in Headers */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -2244,6 +2276,10 @@ | |||||
4BD4B4E409BACEF300750C0F /* JackTransportEngine.cpp in Sources */, | 4BD4B4E409BACEF300750C0F /* JackTransportEngine.cpp in Sources */, | ||||
4B44FAE70C7598370033A72C /* JackServerLaunch.cpp in Sources */, | 4B44FAE70C7598370033A72C /* JackServerLaunch.cpp in Sources */, | ||||
4BF520530CB8D0E80037470E /* timestamps.c in Sources */, | 4BF520530CB8D0E80037470E /* timestamps.c in Sources */, | ||||
4BAB95B80B9E20B800A0C723 /* JackPortType.cpp in Sources */, | |||||
4BAB95ED0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */, | |||||
4B80D7E90BA0D17400F035BB /* JackMidiPort.cpp in Sources */, | |||||
4B80D7EA0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -2296,6 +2332,10 @@ | |||||
4BC216890A444BDE00BDA09F /* JackServerGlobals.cpp in Sources */, | 4BC216890A444BDE00BDA09F /* JackServerGlobals.cpp in Sources */, | ||||
4B44FAE80C7598370033A72C /* JackServerLaunch.cpp in Sources */, | 4B44FAE80C7598370033A72C /* JackServerLaunch.cpp in Sources */, | ||||
4BF520540CB8D0E80037470E /* timestamps.c in Sources */, | 4BF520540CB8D0E80037470E /* timestamps.c in Sources */, | ||||
4BAB95BA0B9E20B800A0C723 /* JackPortType.cpp in Sources */, | |||||
4BAB95EE0B9E21A500A0C723 /* JackAudioPort.cpp in Sources */, | |||||
4B80D7EC0BA0D17400F035BB /* JackMidiPort.cpp in Sources */, | |||||
4B80D7ED0BA0D17400F035BB /* JackMidiAPI.cpp in Sources */, | |||||
); | ); | ||||
runOnlyForDeploymentPostprocessing = 0; | runOnlyForDeploymentPostprocessing = 0; | ||||
}; | }; | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* IDENTIFICATION: | * IDENTIFICATION: | ||||
* stub generated Thu Oct 11 16:40:18 2007 | |||||
* stub generated Thu Oct 25 10:49:38 2007 | |||||
* with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | * with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | ||||
* OPTIONS: | * OPTIONS: | ||||
*/ | */ | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* IDENTIFICATION: | * IDENTIFICATION: | ||||
* stub generated Thu Oct 11 16:40:18 2007 | |||||
* stub generated Thu Oct 25 10:49:38 2007 | |||||
* with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | * with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | ||||
* OPTIONS: | * OPTIONS: | ||||
*/ | */ | ||||
@@ -27,6 +27,7 @@ ServerPrefix server_; | |||||
type client_name_t = c_string[128]; | type client_name_t = c_string[128]; | ||||
type client_port_name_t = c_string[128]; | type client_port_name_t = c_string[128]; | ||||
type client_port_type_t = c_string[128]; | |||||
type so_name_t = c_string[1024]; | type so_name_t = c_string[1024]; | ||||
type objet_data_t = c_string[1024]; | type objet_data_t = c_string[1024]; | ||||
@@ -67,6 +68,7 @@ routine rpc_jack_port_register( | |||||
server_port : mach_port_t; | server_port : mach_port_t; | ||||
refnum : int; | refnum : int; | ||||
name : client_port_name_t; | name : client_port_name_t; | ||||
port_type : client_port_type_t; | |||||
flags : unsigned; | flags : unsigned; | ||||
buffer_size : unsigned; | buffer_size : unsigned; | ||||
out port_index : unsigned; | out port_index : unsigned; | ||||
@@ -167,4 +169,4 @@ simpleroutine rpc_jack_client_rt_notify( | |||||
value : int; | value : int; | ||||
waittime timeout : int); | waittime timeout : int); | ||||
@@ -127,6 +127,7 @@ kern_return_t rpc_jack_port_register | |||||
mach_port_t server_port, | mach_port_t server_port, | ||||
int refnum, | int refnum, | ||||
client_port_name_t name, | client_port_name_t name, | ||||
client_port_type_t port_type, | |||||
unsigned flags, | unsigned flags, | ||||
unsigned buffer_size, | unsigned buffer_size, | ||||
unsigned *port_index, | unsigned *port_index, | ||||
@@ -428,6 +429,7 @@ __END_DECLS | |||||
NDR_record_t NDR; | NDR_record_t NDR; | ||||
int refnum; | int refnum; | ||||
client_port_name_t name; | client_port_name_t name; | ||||
client_port_type_t port_type; | |||||
unsigned flags; | unsigned flags; | ||||
unsigned buffer_size; | unsigned buffer_size; | ||||
} __Request__rpc_jack_port_register_t; | } __Request__rpc_jack_port_register_t; | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* IDENTIFICATION: | * IDENTIFICATION: | ||||
* stub generated Thu Oct 11 16:40:18 2007 | |||||
* stub generated Thu Oct 25 10:49:38 2007 | |||||
* with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | * with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | ||||
* OPTIONS: | * OPTIONS: | ||||
*/ | */ | ||||
@@ -174,6 +174,7 @@ | |||||
NDR_record_t NDR; | NDR_record_t NDR; | ||||
int refnum; | int refnum; | ||||
client_port_name_t name; | client_port_name_t name; | ||||
client_port_type_t port_type; | |||||
unsigned flags; | unsigned flags; | ||||
unsigned buffer_size; | unsigned buffer_size; | ||||
} __Request__rpc_jack_port_register_t; | } __Request__rpc_jack_port_register_t; | ||||
@@ -1830,6 +1831,26 @@ mig_internal novalue _Xrpc_jack_client_deactivate | |||||
#endif /* defined(__NDR_convert__*__defined) */ | #endif /* defined(__NDR_convert__*__defined) */ | ||||
#endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined */ | #endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined */ | ||||
#ifndef __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#if defined(__NDR_convert__int_rep__JackRPCEngine__client_port_type_t__defined) | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__int_rep__JackRPCEngine__client_port_type_t((client_port_type_t *)(a), f) | |||||
#elif defined(__NDR_convert__int_rep__client_port_type_t__defined) | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__int_rep__client_port_type_t((client_port_type_t *)(a), f) | |||||
#elif defined(__NDR_convert__int_rep__JackRPCEngine__string__defined) | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__int_rep__JackRPCEngine__string(a, f, 128) | |||||
#elif defined(__NDR_convert__int_rep__string__defined) | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__int_rep__string(a, f, 128) | |||||
#endif /* defined(__NDR_convert__*__defined) */ | |||||
#endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined */ | |||||
#ifndef __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined | #ifndef __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined | ||||
#if defined(__NDR_convert__int_rep__JackRPCEngine__unsigned__defined) | #if defined(__NDR_convert__int_rep__JackRPCEngine__unsigned__defined) | ||||
#define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined | #define __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined | ||||
@@ -1910,6 +1931,26 @@ mig_internal novalue _Xrpc_jack_client_deactivate | |||||
#endif /* defined(__NDR_convert__*__defined) */ | #endif /* defined(__NDR_convert__*__defined) */ | ||||
#endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined */ | #endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined */ | ||||
#ifndef __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#if defined(__NDR_convert__char_rep__JackRPCEngine__client_port_type_t__defined) | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__char_rep__JackRPCEngine__client_port_type_t((client_port_type_t *)(a), f) | |||||
#elif defined(__NDR_convert__char_rep__client_port_type_t__defined) | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__char_rep__client_port_type_t((client_port_type_t *)(a), f) | |||||
#elif defined(__NDR_convert__char_rep__JackRPCEngine__string__defined) | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__char_rep__JackRPCEngine__string(a, f, 128) | |||||
#elif defined(__NDR_convert__char_rep__string__defined) | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__char_rep__string(a, f, 128) | |||||
#endif /* defined(__NDR_convert__*__defined) */ | |||||
#endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined */ | |||||
#ifndef __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined | #ifndef __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined | ||||
#if defined(__NDR_convert__char_rep__JackRPCEngine__unsigned__defined) | #if defined(__NDR_convert__char_rep__JackRPCEngine__unsigned__defined) | ||||
#define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined | #define __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined | ||||
@@ -1990,6 +2031,26 @@ mig_internal novalue _Xrpc_jack_client_deactivate | |||||
#endif /* defined(__NDR_convert__*__defined) */ | #endif /* defined(__NDR_convert__*__defined) */ | ||||
#endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined */ | #endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined */ | ||||
#ifndef __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#if defined(__NDR_convert__float_rep__JackRPCEngine__client_port_type_t__defined) | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__float_rep__JackRPCEngine__client_port_type_t((client_port_type_t *)(a), f) | |||||
#elif defined(__NDR_convert__float_rep__client_port_type_t__defined) | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__float_rep__client_port_type_t((client_port_type_t *)(a), f) | |||||
#elif defined(__NDR_convert__float_rep__JackRPCEngine__string__defined) | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__float_rep__JackRPCEngine__string(a, f, 128) | |||||
#elif defined(__NDR_convert__float_rep__string__defined) | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined | |||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type(a, f) \ | |||||
__NDR_convert__float_rep__string(a, f, 128) | |||||
#endif /* defined(__NDR_convert__*__defined) */ | |||||
#endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined */ | |||||
#ifndef __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined | #ifndef __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined | ||||
#if defined(__NDR_convert__float_rep__JackRPCEngine__unsigned__defined) | #if defined(__NDR_convert__float_rep__JackRPCEngine__unsigned__defined) | ||||
#define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined | #define __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined | ||||
@@ -2043,6 +2104,7 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_port_register_t(__Requ | |||||
#if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__refnum__defined) || \ | #if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__refnum__defined) || \ | ||||
defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined) || \ | defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined) || \ | ||||
defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined) || \ | |||||
defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined) || \ | defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined) || \ | ||||
defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__buffer_size__defined) | defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__buffer_size__defined) | ||||
if (In0P->NDR.int_rep != NDR_record.int_rep) { | if (In0P->NDR.int_rep != NDR_record.int_rep) { | ||||
@@ -2052,6 +2114,9 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_port_register_t(__Requ | |||||
#if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined) | #if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined) | ||||
__NDR_convert__int_rep__Request__rpc_jack_port_register_t__name(&In0P->name, In0P->NDR.int_rep); | __NDR_convert__int_rep__Request__rpc_jack_port_register_t__name(&In0P->name, In0P->NDR.int_rep); | ||||
#endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined */ | #endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__name__defined */ | ||||
#if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined) | |||||
__NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type(&In0P->port_type, In0P->NDR.int_rep); | |||||
#endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__port_type__defined */ | |||||
#if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined) | #if defined(__NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined) | ||||
__NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags(&In0P->flags, In0P->NDR.int_rep); | __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags(&In0P->flags, In0P->NDR.int_rep); | ||||
#endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined */ | #endif /* __NDR_convert__int_rep__Request__rpc_jack_port_register_t__flags__defined */ | ||||
@@ -2063,6 +2128,7 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_port_register_t(__Requ | |||||
#if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__refnum__defined) || \ | #if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__refnum__defined) || \ | ||||
defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined) || \ | defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined) || \ | ||||
defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined) || \ | |||||
defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined) || \ | defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined) || \ | ||||
defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__buffer_size__defined) | defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__buffer_size__defined) | ||||
if (In0P->NDR.char_rep != NDR_record.char_rep) { | if (In0P->NDR.char_rep != NDR_record.char_rep) { | ||||
@@ -2072,6 +2138,9 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_port_register_t(__Requ | |||||
#if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined) | #if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined) | ||||
__NDR_convert__char_rep__Request__rpc_jack_port_register_t__name(&In0P->name, In0P->NDR.char_rep); | __NDR_convert__char_rep__Request__rpc_jack_port_register_t__name(&In0P->name, In0P->NDR.char_rep); | ||||
#endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined */ | #endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__name__defined */ | ||||
#if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined) | |||||
__NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type(&In0P->port_type, In0P->NDR.char_rep); | |||||
#endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__port_type__defined */ | |||||
#if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined) | #if defined(__NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined) | ||||
__NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags(&In0P->flags, In0P->NDR.char_rep); | __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags(&In0P->flags, In0P->NDR.char_rep); | ||||
#endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined */ | #endif /* __NDR_convert__char_rep__Request__rpc_jack_port_register_t__flags__defined */ | ||||
@@ -2083,6 +2152,7 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_port_register_t(__Requ | |||||
#if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__refnum__defined) || \ | #if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__refnum__defined) || \ | ||||
defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined) || \ | defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined) || \ | ||||
defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined) || \ | |||||
defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined) || \ | defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined) || \ | ||||
defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__buffer_size__defined) | defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__buffer_size__defined) | ||||
if (In0P->NDR.float_rep != NDR_record.float_rep) { | if (In0P->NDR.float_rep != NDR_record.float_rep) { | ||||
@@ -2092,6 +2162,9 @@ mig_internal kern_return_t __MIG_check__Request__rpc_jack_port_register_t(__Requ | |||||
#if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined) | #if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined) | ||||
__NDR_convert__float_rep__Request__rpc_jack_port_register_t__name(&In0P->name, In0P->NDR.float_rep); | __NDR_convert__float_rep__Request__rpc_jack_port_register_t__name(&In0P->name, In0P->NDR.float_rep); | ||||
#endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined */ | #endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__name__defined */ | ||||
#if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined) | |||||
__NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type(&In0P->port_type, In0P->NDR.float_rep); | |||||
#endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__port_type__defined */ | |||||
#if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined) | #if defined(__NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined) | ||||
__NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags(&In0P->flags, In0P->NDR.float_rep); | __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags(&In0P->flags, In0P->NDR.float_rep); | ||||
#endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined */ | #endif /* __NDR_convert__float_rep__Request__rpc_jack_port_register_t__flags__defined */ | ||||
@@ -2119,6 +2192,7 @@ kern_return_t server_rpc_jack_port_register | |||||
mach_port_t server_port, | mach_port_t server_port, | ||||
int refnum, | int refnum, | ||||
client_port_name_t name, | client_port_name_t name, | ||||
client_port_type_t port_type, | |||||
unsigned flags, | unsigned flags, | ||||
unsigned buffer_size, | unsigned buffer_size, | ||||
unsigned *port_index, | unsigned *port_index, | ||||
@@ -2138,6 +2212,7 @@ mig_internal novalue _Xrpc_jack_port_register | |||||
NDR_record_t NDR; | NDR_record_t NDR; | ||||
int refnum; | int refnum; | ||||
client_port_name_t name; | client_port_name_t name; | ||||
client_port_type_t port_type; | |||||
unsigned flags; | unsigned flags; | ||||
unsigned buffer_size; | unsigned buffer_size; | ||||
mach_msg_trailer_t trailer; | mach_msg_trailer_t trailer; | ||||
@@ -2171,7 +2246,7 @@ mig_internal novalue _Xrpc_jack_port_register | |||||
{ MIG_RETURN_ERROR(OutP, check_result); } | { MIG_RETURN_ERROR(OutP, check_result); } | ||||
#endif /* defined(__MIG_check__Request__rpc_jack_port_register_t__defined) */ | #endif /* defined(__MIG_check__Request__rpc_jack_port_register_t__defined) */ | ||||
OutP->RetCode = server_rpc_jack_port_register(In0P->Head.msgh_request_port, In0P->refnum, In0P->name, In0P->flags, In0P->buffer_size, &OutP->port_index, &OutP->result); | |||||
OutP->RetCode = server_rpc_jack_port_register(In0P->Head.msgh_request_port, In0P->refnum, In0P->name, In0P->port_type, In0P->flags, In0P->buffer_size, &OutP->port_index, &OutP->result); | |||||
if (OutP->RetCode != KERN_SUCCESS) { | if (OutP->RetCode != KERN_SUCCESS) { | ||||
MIG_RETURN_ERROR(OutP, OutP->RetCode); | MIG_RETURN_ERROR(OutP, OutP->RetCode); | ||||
} | } | ||||
@@ -6058,7 +6133,7 @@ const struct server_JackRPCEngine_subsystem { | |||||
{ (mig_impl_routine_t) 0, | { (mig_impl_routine_t) 0, | ||||
(mig_stub_routine_t) _Xrpc_jack_client_deactivate, 3, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_client_deactivate_t)}, | (mig_stub_routine_t) _Xrpc_jack_client_deactivate, 3, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_client_deactivate_t)}, | ||||
{ (mig_impl_routine_t) 0, | { (mig_impl_routine_t) 0, | ||||
(mig_stub_routine_t) _Xrpc_jack_port_register, 7, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_port_register_t)}, | |||||
(mig_stub_routine_t) _Xrpc_jack_port_register, 8, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_port_register_t)}, | |||||
{ (mig_impl_routine_t) 0, | { (mig_impl_routine_t) 0, | ||||
(mig_stub_routine_t) _Xrpc_jack_port_unregister, 4, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_port_unregister_t)}, | (mig_stub_routine_t) _Xrpc_jack_port_unregister, 4, 0, (routine_arg_descriptor_t)0, (mach_msg_size_t)sizeof(__Reply__rpc_jack_port_unregister_t)}, | ||||
{ (mig_impl_routine_t) 0, | { (mig_impl_routine_t) 0, | ||||
@@ -1,6 +1,6 @@ | |||||
/* | /* | ||||
* IDENTIFICATION: | * IDENTIFICATION: | ||||
* stub generated Thu Oct 11 16:40:18 2007 | |||||
* stub generated Thu Oct 25 10:49:38 2007 | |||||
* with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | * with a MiG generated Mon Sep 11 19:11:05 PDT 2006 by root@b09.apple.com | ||||
* OPTIONS: | * OPTIONS: | ||||
*/ | */ | ||||
@@ -2017,6 +2017,7 @@ mig_external kern_return_t rpc_jack_port_register | |||||
mach_port_t server_port, | mach_port_t server_port, | ||||
int refnum, | int refnum, | ||||
client_port_name_t name, | client_port_name_t name, | ||||
client_port_type_t port_type, | |||||
unsigned flags, | unsigned flags, | ||||
unsigned buffer_size, | unsigned buffer_size, | ||||
unsigned *port_index, | unsigned *port_index, | ||||
@@ -2033,6 +2034,7 @@ mig_external kern_return_t rpc_jack_port_register | |||||
NDR_record_t NDR; | NDR_record_t NDR; | ||||
int refnum; | int refnum; | ||||
client_port_name_t name; | client_port_name_t name; | ||||
client_port_type_t port_type; | |||||
unsigned flags; | unsigned flags; | ||||
unsigned buffer_size; | unsigned buffer_size; | ||||
} Request; | } Request; | ||||
@@ -2098,6 +2100,8 @@ mig_external kern_return_t rpc_jack_port_register | |||||
(void) mig_strncpy(InP->name, name, 128); | (void) mig_strncpy(InP->name, name, 128); | ||||
(void) mig_strncpy(InP->port_type, port_type, 128); | |||||
InP->flags = flags; | InP->flags = flags; | ||||
InP->buffer_size = buffer_size; | InP->buffer_size = buffer_size; | ||||
@@ -1,6 +1,24 @@ | |||||
/* | |||||
Copyright (C) 2004-2006 Grame | |||||
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. | |||||
*/ | |||||
typedef char client_name_t[64]; | typedef char client_name_t[64]; | ||||
typedef char client_port_name_t[256]; | typedef char client_port_name_t[256]; | ||||
typedef char client_port_type_t[128]; | |||||
typedef char so_name_t[256]; | typedef char so_name_t[256]; | ||||
typedef char objet_data_t[256]; | |||||
typedef char objet_data_t[256]; |
@@ -436,12 +436,14 @@ int JackPortAudioDriver::SetBufferSize(jack_nframes_t buffer_size) | |||||
paNoFlag, // Clipping is on... | paNoFlag, // Clipping is on... | ||||
Render, | Render, | ||||
this); | this); | ||||
if (err != paNoError) { | if (err != paNoError) { | ||||
jack_error("Pa_OpenStream error = %s\n", Pa_GetErrorText(err)); | jack_error("Pa_OpenStream error = %s\n", Pa_GetErrorText(err)); | ||||
return -1; | return -1; | ||||
} else { | } else { | ||||
return JackAudioDriver::SetBufferSize(buffer_size); // never fails; | |||||
} | |||||
// Only done when success | |||||
return JackAudioDriver::SetBufferSize(buffer_size); // never fails | |||||
} | |||||
} | } | ||||
} // end of namespace | } // end of namespace | ||||
@@ -182,9 +182,9 @@ void JackWinNamedPipeClientChannel::ClientDeactivate(int refnum, int* result) | |||||
ServerSyncCall(&req, &res, result); | ServerSyncCall(&req, &res, result); | ||||
} | } | ||||
void JackWinNamedPipeClientChannel::PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
void JackWinNamedPipeClientChannel::PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result) | |||||
{ | { | ||||
JackPortRegisterRequest req(refnum, name, "audio", flags, buffer_size); | |||||
JackPortRegisterRequest req(refnum, name, type, flags, buffer_size); | |||||
JackPortRegisterResult res; | JackPortRegisterResult res; | ||||
ServerSyncCall(&req, &res, result); | ServerSyncCall(&req, &res, result); | ||||
*port_index = res.fPortIndex; | *port_index = res.fPortIndex; | ||||
@@ -65,7 +65,7 @@ class JackWinNamedPipeClientChannel : public JackClientChannelInterface, public | |||||
void ClientActivate(int refnum, int* result); | void ClientActivate(int refnum, int* result); | ||||
void ClientDeactivate(int refnum, int* result); | void ClientDeactivate(int refnum, int* result); | ||||
void PortRegister(int refnum, const char* name, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); | |||||
void PortRegister(int refnum, const char* name, const char* type, unsigned int flags, unsigned int buffer_size, jack_port_id_t* port_index, int* result); | |||||
void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); | void PortUnRegister(int refnum, jack_port_id_t port_index, int* result); | ||||
void PortConnect(int refnum, const char* src, const char* dst, int* result); | void PortConnect(int refnum, const char* src, const char* dst, int* result); | ||||
@@ -164,7 +164,7 @@ int JackClientPipeThread::HandleRequest() | |||||
JackPortRegisterRequest req; | JackPortRegisterRequest req; | ||||
JackPortRegisterResult res; | JackPortRegisterResult res; | ||||
if (req.Read(fPipe) == 0) | if (req.Read(fPipe) == 0) | ||||
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
res.fResult = fServer->GetEngine()->PortRegister(req.fRefNum, req.fName, req.fPortType, req.fFlags, req.fBufferSize, &res.fPortIndex); | |||||
res.Write(fPipe); | res.Write(fPipe); | ||||
break; | break; | ||||
} | } | ||||
@@ -111,6 +111,10 @@ SOURCE=..\common\JackAudioDriver.cpp | |||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
SOURCE=..\common\JackAudioPort.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackClient.cpp | SOURCE=..\common\JackClient.cpp | ||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
@@ -171,10 +175,22 @@ SOURCE=..\common\JackLoopbackDriver.cpp | |||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
SOURCE=..\common\JackMidiAPI.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackMidiPort.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackPort.cpp | SOURCE=..\common\JackPort.cpp | ||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
SOURCE=..\common\JackPortType.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackServer.cpp | SOURCE=..\common\JackServer.cpp | ||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
@@ -245,6 +261,10 @@ SOURCE=..\common\shm.c | |||||
# Begin Group "Header Files" | # Begin Group "Header Files" | ||||
# PROP Default_Filter "h;hpp;hxx;hm;inl" | # PROP Default_Filter "h;hpp;hxx;hm;inl" | ||||
# Begin Source File | |||||
SOURCE=..\common\JackMidiPort.h | |||||
# End Source File | |||||
# End Group | # End Group | ||||
# Begin Group "Resource Files" | # Begin Group "Resource Files" | ||||
@@ -99,6 +99,10 @@ SOURCE=..\common\JackAPI.cpp | |||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
SOURCE=..\common\JackAudioPort.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackClient.cpp | SOURCE=..\common\JackClient.cpp | ||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
@@ -135,10 +139,22 @@ SOURCE=..\common\JackLibClient.cpp | |||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
SOURCE=..\common\JackMidiAPI.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackMidiPort.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackPort.cpp | SOURCE=..\common\JackPort.cpp | ||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||
SOURCE=..\common\JackPortType.cpp | |||||
# End Source File | |||||
# Begin Source File | |||||
SOURCE=..\common\JackShmMem.cpp | SOURCE=..\common\JackShmMem.cpp | ||||
# End Source File | # End Source File | ||||
# Begin Source File | # Begin Source File | ||||