git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2768 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -22,6 +22,10 @@ Florian Faber | |||||
Jackdmp changes log | Jackdmp changes log | ||||
--------------------------- | --------------------------- | ||||
2008-08-03 Stephane Letz <letz@grame.fr> | |||||
* Fix JackFrameTimer::Time2Frames and JackTimer::Frames2Time, jack_cpu compiled again. | |||||
2008-08-01 Stephane Letz <letz@grame.fr> | 2008-08-01 Stephane Letz <letz@grame.fr> | ||||
* Fix desallocation of remaining clients when server quits. | * Fix desallocation of remaining clients when server quits. | ||||
@@ -68,9 +68,9 @@ namespace Jack | |||||
#define ALL_CLIENTS -1 // for notification | #define ALL_CLIENTS -1 // for notification | ||||
#if defined(__ppc64__) || defined(__x86_64__) | #if defined(__ppc64__) || defined(__x86_64__) | ||||
#define JACK_PROTOCOL_VERSION 5 | |||||
#define JACK_PROTOCOL_VERSION 6 | |||||
#else | #else | ||||
#define JACK_PROTOCOL_VERSION 4 | |||||
#define JACK_PROTOCOL_VERSION 5 | |||||
#endif | #endif | ||||
#define SOCKET_TIME_OUT 5 // in sec | #define SOCKET_TIME_OUT 5 // in sec | ||||
@@ -116,13 +116,13 @@ namespace Jack | |||||
jack_nframes_t Time2Frames(jack_time_t time) | jack_nframes_t Time2Frames(jack_time_t time) | ||||
{ | { | ||||
long delta = (long) rint(((double) (long(time - fCurrentWakeup)) / ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) * fBufferSize); | |||||
long delta = (long) rint(((double) ((long long)(time - fCurrentWakeup)) / ((long long)(fNextWakeUp - fCurrentWakeup))) * fBufferSize); | |||||
return (delta < 0) ? ((fFrames > 0) ? fFrames : 1) : (fFrames + delta); | return (delta < 0) ? ((fFrames > 0) ? fFrames : 1) : (fFrames + delta); | ||||
} | } | ||||
jack_time_t Frames2Time(jack_nframes_t frames) | jack_time_t Frames2Time(jack_nframes_t frames) | ||||
{ | { | ||||
long delta = (long) rint(((double) (long(frames - fFrames)) * ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) / fBufferSize); | |||||
long delta = (long) rint(((double) ((long long)(frames - fFrames)) * ((long long)(fNextWakeUp - fCurrentWakeup))) / fBufferSize); | |||||
return (delta < 0) ? ((fCurrentWakeup > 0) ? fCurrentWakeup : 1) : (fCurrentWakeup + delta); | return (delta < 0) ? ((fCurrentWakeup > 0) ? fCurrentWakeup : 1) : (fCurrentWakeup + delta); | ||||
} | } | ||||
@@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||||
#include "JackFrameTimer.h" | #include "JackFrameTimer.h" | ||||
#include "JackError.h" | #include "JackError.h" | ||||
#include <math.h> | #include <math.h> | ||||
#include <stdio.h> | |||||
namespace Jack | namespace Jack | ||||
{ | { | ||||
@@ -53,7 +54,7 @@ JackTimer::JackTimer() | |||||
jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_size) | jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_size) | ||||
{ | { | ||||
if (fInitialized) { | if (fInitialized) { | ||||
return fFrames + (long)rint(((double) ((time - fCurrentWakeup)) / ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) * buffer_size); | |||||
return fFrames + (long)rint(((double) ((long long)(time - fCurrentWakeup)) / ((long long)(fNextWakeUp - fCurrentWakeup))) * buffer_size); | |||||
} else { | } else { | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -62,7 +63,7 @@ jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_si | |||||
jack_time_t JackTimer::Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size) | jack_time_t JackTimer::Frames2Time(jack_nframes_t frames, jack_nframes_t buffer_size) | ||||
{ | { | ||||
if (fInitialized) { | if (fInitialized) { | ||||
return fCurrentWakeup + (long)rint(((double) ((frames - fFrames)) * ((jack_time_t)(fNextWakeUp - fCurrentWakeup))) / buffer_size); | |||||
return fCurrentWakeup + (long)rint(((double) ((long long)(frames - fFrames)) * ((long long)(fNextWakeUp - fCurrentWakeup))) / buffer_size); | |||||
} else { | } else { | ||||
return 0; | return 0; | ||||
} | } | ||||
@@ -115,6 +116,8 @@ void JackFrameTimer::ReadFrameTime(JackTimer* timer) | |||||
cur_index = next_index; | cur_index = next_index; | ||||
memcpy(timer, ReadCurrentState(), sizeof(JackTimer)); | memcpy(timer, ReadCurrentState(), sizeof(JackTimer)); | ||||
next_index = GetCurrentIndex(); | next_index = GetCurrentIndex(); | ||||
if (cur_index != next_index) | |||||
printf("JackFrameTimer::ReadFrameTime loop\n"); | |||||
} while (cur_index != next_index); // Until a coherent state has been read | } while (cur_index != next_index); // Until a coherent state has been read | ||||
} | } | ||||
@@ -130,7 +130,8 @@ struct JackClientCheckRequest : public JackRequest | |||||
JackClientCheckRequest() | JackClientCheckRequest() | ||||
{} | {} | ||||
JackClientCheckRequest(const char* name, int protocol, int options): JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options) | |||||
JackClientCheckRequest(const char* name, int protocol, int options) | |||||
: JackRequest(JackRequest::kClientCheck), fProtocol(protocol), fOptions(options) | |||||
{ | { | ||||
snprintf(fName, sizeof(fName), "%s", name); | snprintf(fName, sizeof(fName), "%s", name); | ||||
} | } | ||||
@@ -293,7 +294,8 @@ struct JackActivateRequest : public JackRequest | |||||
JackActivateRequest() | JackActivateRequest() | ||||
{} | {} | ||||
JackActivateRequest(int refnum, int state): JackRequest(JackRequest::kActivateClient), fRefNum(refnum), fState(state) | |||||
JackActivateRequest(int refnum, int state) | |||||
: JackRequest(JackRequest::kActivateClient), fRefNum(refnum), fState(state) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -419,7 +421,8 @@ struct JackPortUnRegisterRequest : public JackRequest | |||||
JackPortUnRegisterRequest() | JackPortUnRegisterRequest() | ||||
{} | {} | ||||
JackPortUnRegisterRequest(int refnum, int index): JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index) | |||||
JackPortUnRegisterRequest(int refnum, int index) | |||||
: JackRequest(JackRequest::kUnRegisterPort), fRefNum(refnum), fPortIndex(index) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -451,7 +454,8 @@ struct JackPortConnectNameRequest : public JackRequest | |||||
JackPortConnectNameRequest() | JackPortConnectNameRequest() | ||||
{} | {} | ||||
JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name): JackRequest(JackRequest::kConnectNamePorts), fRefNum(refnum) | |||||
JackPortConnectNameRequest(int refnum, const char* src_name, const char* dst_name) | |||||
: JackRequest(JackRequest::kConnectNamePorts), fRefNum(refnum) | |||||
{ | { | ||||
strcpy(fSrc, src_name); | strcpy(fSrc, src_name); | ||||
strcpy(fDst, dst_name); | strcpy(fDst, dst_name); | ||||
@@ -489,7 +493,8 @@ struct JackPortDisconnectNameRequest : public JackRequest | |||||
JackPortDisconnectNameRequest() | JackPortDisconnectNameRequest() | ||||
{} | {} | ||||
JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name): JackRequest(JackRequest::kDisconnectNamePorts), fRefNum(refnum) | |||||
JackPortDisconnectNameRequest(int refnum, const char* src_name, const char* dst_name) | |||||
: JackRequest(JackRequest::kDisconnectNamePorts), fRefNum(refnum) | |||||
{ | { | ||||
strcpy(fSrc, src_name); | strcpy(fSrc, src_name); | ||||
strcpy(fDst, dst_name); | strcpy(fDst, dst_name); | ||||
@@ -526,7 +531,8 @@ struct JackPortConnectRequest : public JackRequest | |||||
JackPortConnectRequest() | JackPortConnectRequest() | ||||
{} | {} | ||||
JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst): JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst) | |||||
JackPortConnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst) | |||||
: JackRequest(JackRequest::kConnectPorts), fRefNum(refnum), fSrc(src), fDst(dst) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -561,7 +567,8 @@ struct JackPortDisconnectRequest : public JackRequest | |||||
JackPortDisconnectRequest() | JackPortDisconnectRequest() | ||||
{} | {} | ||||
JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst): JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst) | |||||
JackPortDisconnectRequest(int refnum, jack_port_id_t src, jack_port_id_t dst) | |||||
: JackRequest(JackRequest::kDisconnectPorts), fRefNum(refnum), fSrc(src), fDst(dst) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -594,7 +601,8 @@ struct JackSetBufferSizeRequest : public JackRequest | |||||
JackSetBufferSizeRequest() | JackSetBufferSizeRequest() | ||||
{} | {} | ||||
JackSetBufferSizeRequest(jack_nframes_t buffer_size): JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size) | |||||
JackSetBufferSizeRequest(jack_nframes_t buffer_size) | |||||
: JackRequest(JackRequest::kSetBufferSize), fBufferSize(buffer_size) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -620,7 +628,8 @@ struct JackSetFreeWheelRequest : public JackRequest | |||||
JackSetFreeWheelRequest() | JackSetFreeWheelRequest() | ||||
{} | {} | ||||
JackSetFreeWheelRequest(int onoff): JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff) | |||||
JackSetFreeWheelRequest(int onoff) | |||||
: JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -646,7 +655,8 @@ struct JackReleaseTimebaseRequest : public JackRequest | |||||
JackReleaseTimebaseRequest() | JackReleaseTimebaseRequest() | ||||
{} | {} | ||||
JackReleaseTimebaseRequest(int refnum): JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum) | |||||
JackReleaseTimebaseRequest(int refnum) | |||||
: JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -673,7 +683,8 @@ struct JackSetTimebaseCallbackRequest : public JackRequest | |||||
JackSetTimebaseCallbackRequest() | JackSetTimebaseCallbackRequest() | ||||
{} | {} | ||||
JackSetTimebaseCallbackRequest(int refnum, int conditional): JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional) | |||||
JackSetTimebaseCallbackRequest(int refnum, int conditional) | |||||
: JackRequest(JackRequest::kSetTimebaseCallback), fRefNum(refnum), fConditionnal(conditional) | |||||
{} | {} | ||||
int Read(JackChannelTransaction* trans) | int Read(JackChannelTransaction* trans) | ||||
@@ -36,14 +36,12 @@ jack_port_t *input_port; | |||||
jack_port_t *output_port; | jack_port_t *output_port; | ||||
jack_client_t *client; | jack_client_t *client; | ||||
unsigned long sr; | unsigned long sr; | ||||
int idle_time = 0; | |||||
jack_nframes_t idle_time = 0; | |||||
int percent_cpu = 0; | int percent_cpu = 0; | ||||
int time_to_run = 0; | int time_to_run = 0; | ||||
int time_before_run = 0; | int time_before_run = 0; | ||||
int time_before_exit = 1; | int time_before_exit = 1; | ||||
jack_nframes_t cur_buffer_size; | jack_nframes_t cur_buffer_size; | ||||
jack_nframes_t start_frame; | |||||
jack_nframes_t cur_frame; | |||||
/* a simple state machine for this client */ | /* a simple state machine for this client */ | ||||
volatile enum { | volatile enum { | ||||
@@ -63,12 +61,12 @@ void usage() | |||||
); | ); | ||||
} | } | ||||
JackBufferSizeCallback update_buffer_size() | |||||
int update_buffer_size(jack_nframes_t nframes, void *arg) | |||||
{ | { | ||||
cur_buffer_size = jack_get_buffer_size(client); | |||||
cur_buffer_size = nframes; | |||||
printf("Buffer size = %d \n", cur_buffer_size); | printf("Buffer size = %d \n", cur_buffer_size); | ||||
idle_time = (int) (cur_buffer_size * percent_cpu / 100); | |||||
printf("CPU load applies as %d sample delay.\n",idle_time); | |||||
idle_time = (jack_nframes_t) (cur_buffer_size * percent_cpu / 100); | |||||
printf("CPU load applies as %d sample delay.\n", idle_time); | |||||
return 0; | return 0; | ||||
} | } | ||||
@@ -76,30 +74,29 @@ JackBufferSizeCallback update_buffer_size() | |||||
* The process callback for this JACK application is called in a | * The process callback for this JACK application is called in a | ||||
* special realtime thread once for each audio cycle. | * special realtime thread once for each audio cycle. | ||||
* | * | ||||
* This client follows a simple rule: when the JACK transport is | |||||
* running, copy the input port to the output. When it stops, exit. | |||||
*/ | */ | ||||
int process(jack_nframes_t nframes, void *arg) | int process(jack_nframes_t nframes, void *arg) | ||||
{ | { | ||||
jack_default_audio_sample_t *in, *out; | jack_default_audio_sample_t *in, *out; | ||||
start_frame = jack_frame_time(client); | |||||
jack_nframes_t start_frame = jack_frame_time(client); | |||||
in = (jack_default_audio_sample_t *) jack_port_get_buffer (input_port, nframes); | in = (jack_default_audio_sample_t *) jack_port_get_buffer (input_port, nframes); | ||||
out = (jack_default_audio_sample_t *) jack_port_get_buffer (output_port, nframes); | out = (jack_default_audio_sample_t *) jack_port_get_buffer (output_port, nframes); | ||||
memset(out, 0, sizeof (jack_default_audio_sample_t) * nframes); | memset(out, 0, sizeof (jack_default_audio_sample_t) * nframes); | ||||
while ((client_state == Run) && (jack_frame_time(client) < (start_frame + idle_time))) {} | while ((client_state == Run) && (jack_frame_time(client) < (start_frame + idle_time))) {} | ||||
return 0; | |||||
return 0; | |||||
} | } | ||||
/** | /** | ||||
* JACK calls this shutdown_callback if the server ever shuts down or | * JACK calls this shutdown_callback if the server ever shuts down or | ||||
* decides to disconnect the client. | * decides to disconnect the client. | ||||
*/ | */ | ||||
void jack_shutdown(void *arg) | void jack_shutdown(void *arg) | ||||
{ | { | ||||
printf("Jack_cpu has been kicked out by jackd !"); | |||||
printf("Jack_cpu has been kicked out by jackd !\n"); | |||||
exit (1); | exit (1); | ||||
} | } | ||||
@@ -108,6 +105,7 @@ int main(int argc, char *argv[]) | |||||
const char **ports; | const char **ports; | ||||
const char *client_name; | const char *client_name; | ||||
int got_time = 0; | int got_time = 0; | ||||
jack_status_t status; | |||||
int option_index; | int option_index; | ||||
int opt; | int opt; | ||||
@@ -154,12 +152,18 @@ int main(int argc, char *argv[]) | |||||
/* open a client connection to the JACK server */ | /* open a client connection to the JACK server */ | ||||
client = jack_client_new(client_name); | |||||
client = jack_client_open (client_name, JackNoStartServer, &status); | |||||
if (client == NULL) { | if (client == NULL) { | ||||
fprintf(stderr, "jack_client_open() failed : is jack server running ?\n"); | fprintf(stderr, "jack_client_open() failed : is jack server running ?\n"); | ||||
exit(1); | exit(1); | ||||
} | } | ||||
cur_buffer_size = jack_get_buffer_size(client); | |||||
printf("engine buffer size = %d \n", cur_buffer_size); | |||||
printf("engine sample rate: %d Hz\n", jack_get_sample_rate(client)); | |||||
idle_time = (jack_nframes_t) (cur_buffer_size * percent_cpu / 100); | |||||
printf("CPU load applies as %d sample delay.\n", idle_time); | |||||
/* tell the JACK server to call `process()' whenever | /* tell the JACK server to call `process()' whenever | ||||
there is work to be done. | there is work to be done. | ||||
@@ -174,12 +178,6 @@ int main(int argc, char *argv[]) | |||||
jack_on_shutdown(client, jack_shutdown, 0); | jack_on_shutdown(client, jack_shutdown, 0); | ||||
/* display the current sample rate. | |||||
*/ | |||||
printf("engine sample rate: %d Hz\n", jack_get_sample_rate(client)); | |||||
printf("computing time in samples : %d \n", idle_time); | |||||
/* create two ports */ | /* create two ports */ | ||||
input_port = jack_port_register (client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | input_port = jack_port_register (client, "input", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); | ||||
@@ -191,13 +189,11 @@ int main(int argc, char *argv[]) | |||||
exit(1); | exit(1); | ||||
} | } | ||||
if (jack_set_buffer_size_callback(client, update_buffer_size(), 0) != 0) { | |||||
if (jack_set_buffer_size_callback(client, update_buffer_size, 0) != 0) { | |||||
printf("Error when calling buffer_size_callback !"); | printf("Error when calling buffer_size_callback !"); | ||||
return -1; | return -1; | ||||
} | } | ||||
if (time_before_run == 0) | |||||
client_state = Run; | |||||
/* Tell the JACK server that we are ready to roll. Our | /* Tell the JACK server that we are ready to roll. Our | ||||
* process() callback will start running now. */ | * process() callback will start running now. */ | ||||
@@ -2,11 +2,12 @@ | |||||
# encoding: utf-8 | # encoding: utf-8 | ||||
test_programs = { | test_programs = { | ||||
'synchroClient': ['testSynchroClient.cpp'], | |||||
'synchroServer': ['testSynchroServer.cpp'], | |||||
'synchroServerClient': ['testSynchroServerClient.cpp'], | |||||
#'synchroClient': ['testSynchroClient.cpp'], | |||||
#'synchroServer': ['testSynchroServer.cpp'], | |||||
#'synchroServerClient': ['testSynchroServerClient.cpp'], | |||||
'testSem': ['testSem.cpp'], | 'testSem': ['testSem.cpp'], | ||||
'jack_test': ['jack_test.cpp'], | 'jack_test': ['jack_test.cpp'], | ||||
'jack_cpu': ['jack_cpu.c'], | |||||
} | } | ||||
def build(bld): | def build(bld): | ||||
@@ -23,5 +24,5 @@ def build(bld): | |||||
prog.env.append_value("LINKFLAGS", "") | prog.env.append_value("LINKFLAGS", "") | ||||
prog.uselib_local = 'clientlib' | prog.uselib_local = 'clientlib' | ||||
prog.target = test_program | prog.target = test_program | ||||
if test_program != 'jack_test': | |||||
prog.inst_var = 0 | |||||
#if test_program != 'jack_test': | |||||
# prog.inst_var = 0 |