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 | |||
| --------------------------- | |||
| 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> | |||
| * Fix desallocation of remaining clients when server quits. | |||
| @@ -68,9 +68,9 @@ namespace Jack | |||
| #define ALL_CLIENTS -1 // for notification | |||
| #if defined(__ppc64__) || defined(__x86_64__) | |||
| #define JACK_PROTOCOL_VERSION 5 | |||
| #define JACK_PROTOCOL_VERSION 6 | |||
| #else | |||
| #define JACK_PROTOCOL_VERSION 4 | |||
| #define JACK_PROTOCOL_VERSION 5 | |||
| #endif | |||
| #define SOCKET_TIME_OUT 5 // in sec | |||
| @@ -116,13 +116,13 @@ namespace Jack | |||
| 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); | |||
| } | |||
| 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); | |||
| } | |||
| @@ -25,6 +25,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
| #include "JackFrameTimer.h" | |||
| #include "JackError.h" | |||
| #include <math.h> | |||
| #include <stdio.h> | |||
| namespace Jack | |||
| { | |||
| @@ -53,7 +54,7 @@ JackTimer::JackTimer() | |||
| jack_nframes_t JackTimer::Time2Frames(jack_time_t time, jack_nframes_t buffer_size) | |||
| { | |||
| 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 { | |||
| 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) | |||
| { | |||
| 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 { | |||
| return 0; | |||
| } | |||
| @@ -115,6 +116,8 @@ void JackFrameTimer::ReadFrameTime(JackTimer* timer) | |||
| cur_index = next_index; | |||
| memcpy(timer, ReadCurrentState(), sizeof(JackTimer)); | |||
| 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 | |||
| } | |||
| @@ -130,7 +130,8 @@ struct JackClientCheckRequest : public JackRequest | |||
| 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); | |||
| } | |||
| @@ -293,7 +294,8 @@ struct JackActivateRequest : public JackRequest | |||
| 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) | |||
| @@ -419,7 +421,8 @@ struct JackPortUnRegisterRequest : public JackRequest | |||
| 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) | |||
| @@ -451,7 +454,8 @@ struct JackPortConnectNameRequest : public JackRequest | |||
| 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(fDst, dst_name); | |||
| @@ -489,7 +493,8 @@ struct JackPortDisconnectNameRequest : public JackRequest | |||
| 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(fDst, dst_name); | |||
| @@ -526,7 +531,8 @@ struct JackPortConnectRequest : public JackRequest | |||
| 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) | |||
| @@ -561,7 +567,8 @@ struct JackPortDisconnectRequest : public JackRequest | |||
| 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) | |||
| @@ -594,7 +601,8 @@ struct JackSetBufferSizeRequest : public JackRequest | |||
| 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) | |||
| @@ -620,7 +628,8 @@ struct JackSetFreeWheelRequest : public JackRequest | |||
| JackSetFreeWheelRequest() | |||
| {} | |||
| JackSetFreeWheelRequest(int onoff): JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff) | |||
| JackSetFreeWheelRequest(int onoff) | |||
| : JackRequest(JackRequest::kSetFreeWheel), fOnOff(onoff) | |||
| {} | |||
| int Read(JackChannelTransaction* trans) | |||
| @@ -646,7 +655,8 @@ struct JackReleaseTimebaseRequest : public JackRequest | |||
| JackReleaseTimebaseRequest() | |||
| {} | |||
| JackReleaseTimebaseRequest(int refnum): JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum) | |||
| JackReleaseTimebaseRequest(int refnum) | |||
| : JackRequest(JackRequest::kReleaseTimebase), fRefNum(refnum) | |||
| {} | |||
| int Read(JackChannelTransaction* trans) | |||
| @@ -673,7 +683,8 @@ struct JackSetTimebaseCallbackRequest : public JackRequest | |||
| 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) | |||
| @@ -36,14 +36,12 @@ jack_port_t *input_port; | |||
| jack_port_t *output_port; | |||
| jack_client_t *client; | |||
| unsigned long sr; | |||
| int idle_time = 0; | |||
| jack_nframes_t idle_time = 0; | |||
| int percent_cpu = 0; | |||
| int time_to_run = 0; | |||
| int time_before_run = 0; | |||
| int time_before_exit = 1; | |||
| jack_nframes_t cur_buffer_size; | |||
| jack_nframes_t start_frame; | |||
| jack_nframes_t cur_frame; | |||
| /* a simple state machine for this client */ | |||
| 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); | |||
| 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; | |||
| } | |||
| @@ -76,30 +74,29 @@ JackBufferSizeCallback update_buffer_size() | |||
| * The process callback for this JACK application is called in a | |||
| * 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) | |||
| { | |||
| 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); | |||
| out = (jack_default_audio_sample_t *) jack_port_get_buffer (output_port, nframes); | |||
| memset(out, 0, sizeof (jack_default_audio_sample_t) * nframes); | |||
| 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 | |||
| * decides to disconnect the client. | |||
| */ | |||
| 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); | |||
| } | |||
| @@ -108,6 +105,7 @@ int main(int argc, char *argv[]) | |||
| const char **ports; | |||
| const char *client_name; | |||
| int got_time = 0; | |||
| jack_status_t status; | |||
| int option_index; | |||
| int opt; | |||
| @@ -154,12 +152,18 @@ int main(int argc, char *argv[]) | |||
| /* 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) { | |||
| fprintf(stderr, "jack_client_open() failed : is jack server running ?\n"); | |||
| 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 | |||
| there is work to be done. | |||
| @@ -174,12 +178,6 @@ int main(int argc, char *argv[]) | |||
| 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 */ | |||
| 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); | |||
| } | |||
| 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 !"); | |||
| return -1; | |||
| } | |||
| if (time_before_run == 0) | |||
| client_state = Run; | |||
| /* Tell the JACK server that we are ready to roll. Our | |||
| * process() callback will start running now. */ | |||
| @@ -2,11 +2,12 @@ | |||
| # encoding: utf-8 | |||
| test_programs = { | |||
| 'synchroClient': ['testSynchroClient.cpp'], | |||
| 'synchroServer': ['testSynchroServer.cpp'], | |||
| 'synchroServerClient': ['testSynchroServerClient.cpp'], | |||
| #'synchroClient': ['testSynchroClient.cpp'], | |||
| #'synchroServer': ['testSynchroServer.cpp'], | |||
| #'synchroServerClient': ['testSynchroServerClient.cpp'], | |||
| 'testSem': ['testSem.cpp'], | |||
| 'jack_test': ['jack_test.cpp'], | |||
| 'jack_cpu': ['jack_cpu.c'], | |||
| } | |||
| def build(bld): | |||
| @@ -23,5 +24,5 @@ def build(bld): | |||
| prog.env.append_value("LINKFLAGS", "") | |||
| prog.uselib_local = 'clientlib' | |||
| prog.target = test_program | |||
| if test_program != 'jack_test': | |||
| prog.inst_var = 0 | |||
| #if test_program != 'jack_test': | |||
| # prog.inst_var = 0 | |||