diff --git a/ChangeLog b/ChangeLog index 23886f27..d0807c7e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -2,6 +2,10 @@ Jackdmp changes log --------------------------- +2007-04-23 Stephane Letz + + * Dmitry Baikov jackmp-time patch: add jack_get_time, jack_time_to_frames, jack_frames_to_time. + 2007-04-01 Stephane Letz * Merge JackGraphManager Remove and Release method in a unique Release method. diff --git a/common/JackAPI.cpp b/common/JackAPI.cpp index 5d72462f..4a29535c 100644 --- a/common/JackAPI.cpp +++ b/common/JackAPI.cpp @@ -139,6 +139,9 @@ extern "C" jack_port_id_t port_id); EXPORT int jack_engine_takeover_timebase (jack_client_t *); EXPORT jack_nframes_t jack_frames_since_cycle_start (const jack_client_t *); + EXPORT jack_time_t jack_get_time(const jack_client_t *client); + EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t *client, jack_time_t time); + EXPORT jack_time_t jack_frames_to_time(const jack_client_t *client, jack_nframes_t frames); EXPORT jack_nframes_t jack_frame_time (const jack_client_t *); EXPORT jack_nframes_t jack_last_frame_time (const jack_client_t *client); EXPORT float jack_cpu_load (jack_client_t *client); @@ -193,7 +196,7 @@ extern "C" jack_status_t *status, ...); EXPORT jack_status_t jack_internal_client_unload (jack_client_t *client, jack_intclient_t intclient); - + #ifdef __cplusplus } #endif @@ -1015,21 +1018,48 @@ EXPORT jack_nframes_t jack_frames_since_cycle_start(const jack_client_t* ext_cli return (jack_nframes_t) floor((((float)GetEngineControl()->fSampleRate) / 1000000.0f) * (GetMicroSeconds() - timer.fCurrentCallback)); } -EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client) +EXPORT jack_time_t jack_get_time(jack_client_t *client) +{ + return GetMicroSeconds(); +} + +EXPORT jack_time_t jack_frames_to_time(const jack_client_t* ext_client, jack_nframes_t frames) +{ +#ifdef __CLIENTDEBUG__ + JackLibGlobals::CheckContext(); +#endif + JackClient* client = (JackClient*)ext_client; + if (client == NULL) { + jack_error("jack_frames_to_time called with a NULL client"); + return 0; + } else { + JackTimer timer; + GetEngineControl()->ReadFrameTime(&timer); + if (timer.fInitialized) { + return timer.fCurrentWakeup + + (long) rint(((double) ((frames - timer.fFrames)) * + ((jack_time_t)(timer.fNextWakeUp - timer.fCurrentWakeup))) / GetEngineControl()->fBufferSize); + } else { + return 0; + } + } +} + +EXPORT jack_nframes_t jack_time_to_frames(const jack_client_t* ext_client, jack_time_t time) { #ifdef __CLIENTDEBUG__ JackLibGlobals::CheckContext(); #endif JackClient* client = (JackClient*)ext_client; if (client == NULL) { - jack_error("jack_frame_time called with a NULL client"); + jack_error("jack_time_to_frames called with a NULL client"); return 0; } else { JackTimer timer; GetEngineControl()->ReadFrameTime(&timer); if (timer.fInitialized) { return timer.fFrames + - (long) rint(((double) ((jack_time_t)(GetMicroSeconds() - timer.fCurrentWakeup)) / + (long) rint(((double) ((time - timer.fCurrentWakeup)) / ((jack_time_t)(timer.fNextWakeUp - timer.fCurrentWakeup))) * GetEngineControl()->fBufferSize); } else { return 0; @@ -1037,6 +1067,11 @@ EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client) } } +EXPORT jack_nframes_t jack_frame_time(const jack_client_t* ext_client) +{ + return jack_time_to_frames(ext_client, GetMicroSeconds()); +} + EXPORT jack_nframes_t jack_last_frame_time(const jack_client_t* ext_client) { #ifdef __CLIENTDEBUG__