Browse Source

Clock source setting on Linux (in progress).

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3508 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/v1.9.3
sletz 16 years ago
parent
commit
c284e58b88
15 changed files with 135 additions and 14 deletions
  1. +2
    -1
      ChangeLog
  2. +19
    -0
      common/JackControlAPI.cpp
  3. +3
    -1
      common/JackEngineControl.h
  4. +1
    -0
      common/JackLibClient.cpp
  5. +3
    -2
      common/JackServer.cpp
  6. +1
    -1
      common/JackServer.h
  7. +19
    -4
      common/JackServerGlobals.cpp
  8. +3
    -2
      common/JackServerGlobals.h
  9. +17
    -2
      common/JackTypes.h
  10. +34
    -0
      common/Jackdmp.cpp
  11. +8
    -0
      linux/JackLinuxTime.c
  12. +9
    -0
      macosx/JackMachTime.c
  13. +1
    -1
      macosx/coreaudio/JackCoreAudioDriver.cpp
  14. +7
    -0
      solaris/JackSolarisTime.c
  15. +8
    -0
      windows/JackWinTime.c

+ 2
- 1
ChangeLog View File

@@ -27,7 +27,8 @@ Paul Davis
2009-04-20 Stephane Letz <letz@grame.fr> 2009-04-20 Stephane Letz <letz@grame.fr>
* In ALSA audio card reservation code, tries to open the card even if reservation fails.
* In ALSA audio card reservation code, tries to open the card even if reservation fails.
* Clock source setting on Linux (in progress).
2009-04-08 Stephane Letz <letz@grame.fr> 2009-04-08 Stephane Letz <letz@grame.fr>


+ 19
- 0
common/JackControlAPI.cpp View File

@@ -81,6 +81,10 @@ struct jackctl_server
/* uint32_t, ports of the loopback driver */ /* uint32_t, ports of the loopback driver */
union jackctl_parameter_value loopback_ports; union jackctl_parameter_value loopback_ports;
union jackctl_parameter_value default_loopback_ports; union jackctl_parameter_value default_loopback_ports;
/* uint32_t, clock source type */
union jackctl_parameter_value clock_source;
union jackctl_parameter_value default_clock_source;


/* bool */ /* bool */
union jackctl_parameter_value replace_registry; union jackctl_parameter_value replace_registry;
@@ -733,6 +737,20 @@ EXPORT jackctl_server_t * jackctl_server_create()
{ {
goto fail_free_parameters; goto fail_free_parameters;
} }
value.ui = 0;
if (jackctl_add_parameter(
&server_ptr->parameters,
"clock-source",
"Clocksource type : c(ycle) | h(pet) | s(ystem)",
"",
JackParamUInt,
&server_ptr->clock_source,
&server_ptr->default_clock_source,
value) == NULL)
{
goto fail_free_parameters;
}


value.b = false; value.b = false;
if (jackctl_add_parameter( if (jackctl_add_parameter(
@@ -864,6 +882,7 @@ jackctl_server_start(
server_ptr->realtime_priority.i, server_ptr->realtime_priority.i,
server_ptr->loopback_ports.ui, server_ptr->loopback_ports.ui,
server_ptr->verbose.b, server_ptr->verbose.b,
(jack_timer_type_t)server_ptr->clock_source.ui,
server_ptr->name.str); server_ptr->name.str);
if (server_ptr->engine == NULL) if (server_ptr->engine == NULL)
{ {


+ 3
- 1
common/JackEngineControl.h View File

@@ -63,6 +63,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
int fMaxClientPriority; int fMaxClientPriority;
char fServerName[64]; char fServerName[64];
JackTransportEngine fTransport; JackTransportEngine fTransport;
jack_timer_type_t fClockSource;
bool fVerbose; bool fVerbose;


// CPU Load // CPU Load
@@ -88,7 +89,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
JackEngineProfiling fProfiler; JackEngineProfiling fProfiler;
#endif #endif


JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, const char* server_name)
JackEngineControl(bool sync, bool temporary, long timeout, bool rt, long priority, bool verbose, jack_timer_type_t clock, const char* server_name)
{ {
fBufferSize = 512; fBufferSize = 512;
fSampleRate = 48000; fSampleRate = 48000;
@@ -113,6 +114,7 @@ struct SERVER_EXPORT JackEngineControl : public JackShmMem
fConstraint = 0; fConstraint = 0;
fMaxDelayedUsecs = 0.f; fMaxDelayedUsecs = 0.f;
fXrunDelayedUsecs = 0.f; fXrunDelayedUsecs = 0.f;
fClockSource = clock;
} }
~JackEngineControl() ~JackEngineControl()


+ 1
- 0
common/JackLibClient.cpp View File

@@ -115,6 +115,7 @@ int JackLibClient::Open(const char* server_name, const char* name, jack_options_
JackGlobals::fClientTable[GetClientControl()->fRefNum] = this; JackGlobals::fClientTable[GetClientControl()->fRefNum] = this;
JackGlobals::fServerRunning = true; JackGlobals::fServerRunning = true;
SetClockSource(GetEngineControl()->fClockSource);
jack_log("JackLibClient::Open name = %s refnum = %ld", name_res, GetClientControl()->fRefNum); jack_log("JackLibClient::Open name = %s refnum = %ld", name_res, GetClientControl()->fRefNum);
return 0; return 0;




+ 3
- 2
common/JackServer.cpp View File

@@ -38,7 +38,7 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
namespace Jack namespace Jack
{ {


JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, const char* server_name)
JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, jack_timer_type_t clock, const char* server_name)
{ {
if (rt) { if (rt) {
jack_info("JACK server starting in realtime mode with priority %ld", priority); jack_info("JACK server starting in realtime mode with priority %ld", priority);
@@ -47,7 +47,7 @@ JackServer::JackServer(bool sync, bool temporary, long timeout, bool rt, long pr
} }


fGraphManager = new JackGraphManager(); fGraphManager = new JackGraphManager();
fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, server_name);
fEngineControl = new JackEngineControl(sync, temporary, timeout, rt, priority, verbose, clock, server_name);
fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl); fEngine = new JackLockedEngine(fGraphManager, GetSynchroTable(), fEngineControl);
fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, GetSynchroTable())); fFreewheelDriver = new JackThreadedDriver(new JackFreewheelDriver(fEngine, GetSynchroTable()));
fLoopbackDriver = new JackLoopbackDriver(fEngine, GetSynchroTable()); fLoopbackDriver = new JackLoopbackDriver(fEngine, GetSynchroTable());
@@ -115,6 +115,7 @@ int JackServer::Open(jack_driver_desc_t* driver_desc, JSList* driver_params)
fAudioDriver->AddSlave(fLoopbackDriver); fAudioDriver->AddSlave(fLoopbackDriver);
fAudioDriver->AddSlave(fFreewheelDriver); // After ??? fAudioDriver->AddSlave(fFreewheelDriver); // After ???
InitTime(); InitTime();
SetClockSource(fEngineControl->fClockSource);
return 0; return 0;


fail_close7: fail_close7:


+ 1
- 1
common/JackServer.h View File

@@ -64,7 +64,7 @@ class SERVER_EXPORT JackServer


public: public:


JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, const char* server_name);
JackServer(bool sync, bool temporary, long timeout, bool rt, long priority, long loopback, bool verbose, jack_timer_type_t clock, const char* server_name);
~JackServer(); ~JackServer();


int Open(jack_driver_desc_t* driver_desc, JSList* driver_params); int Open(jack_driver_desc_t* driver_desc, JSList* driver_params);


+ 19
- 4
common/JackServerGlobals.cpp View File

@@ -40,10 +40,11 @@ int JackServerGlobals::Start(const char* server_name,
int rt, int rt,
int priority, int priority,
int loopback, int loopback,
int verbose)
int verbose,
jack_timer_type_t clock)
{ {
jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose); jack_log("Jackdmp: sync = %ld timeout = %ld rt = %ld priority = %ld verbose = %ld ", sync, time_out_ms, rt, priority, verbose);
new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, server_name); // Will setup fInstance and fUserCount globals
new JackServer(sync, temporary, time_out_ms, rt, priority, loopback, verbose, clock, server_name); // Will setup fInstance and fUserCount globals
int res = fInstance->Open(driver_desc, driver_params); int res = fInstance->Open(driver_desc, driver_params);
return (res < 0) ? res : fInstance->Start(); return (res < 0) ? res : fInstance->Start();
} }
@@ -92,6 +93,7 @@ bool JackServerGlobals::Init()
char buffer[255]; char buffer[255];
int argc = 0; int argc = 0;
char* argv[32]; char* argv[32];
jack_timer_type_t clock_source = JACK_TIMER_SYSTEM_CLOCK;
// First user starts the server // First user starts the server
if (fUserCount++ == 0) { if (fUserCount++ == 0) {
@@ -99,8 +101,9 @@ bool JackServerGlobals::Init()
jack_log("JackServerGlobals Init"); jack_log("JackServerGlobals Init");


jack_driver_desc_t* driver_desc; jack_driver_desc_t* driver_desc;
const char *options = "-ad:P:uvshVRL:STFl:t:mn:p:";
const char *options = "-ad:P:uvshVRL:STFl:t:mn:p:c:";
static struct option long_options[] = { static struct option long_options[] = {
{ "clock-source", 1, 0, 'c' },
{ "driver", 1, 0, 'd' }, { "driver", 1, 0, 'd' },
{ "verbose", 0, 0, 'v' }, { "verbose", 0, 0, 'v' },
{ "help", 0, 0, 'h' }, { "help", 0, 0, 'h' },
@@ -155,6 +158,18 @@ bool JackServerGlobals::Init()
(opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) { (opt = getopt_long(argc, argv, options, long_options, &option_index)) != EOF) {


switch (opt) { switch (opt) {
case 'c':
if (tolower (optarg[0]) == 'h') {
clock_source = JACK_TIMER_HPET;
} else if (tolower (optarg[0]) == 'c') {
clock_source = JACK_TIMER_CYCLE_COUNTER;
} else if (tolower (optarg[0]) == 's') {
clock_source = JACK_TIMER_SYSTEM_CLOCK;
} else {
jack_error("unknown option character %c", optopt);
}
break;


case 'd': case 'd':
seen_driver = 1; seen_driver = 1;
@@ -281,7 +296,7 @@ bool JackServerGlobals::Init()
free(argv[i]); free(argv[i]);
} }


int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux);
int res = Start(server_name, driver_desc, driver_params, sync, temporary, client_timeout, realtime, realtime_priority, loopback, verbose_aux, clock_source);
if (res < 0) { if (res < 0) {
jack_error("Cannot start server... exit"); jack_error("Cannot start server... exit");
Delete(); Delete();


+ 3
- 2
common/JackServerGlobals.h View File

@@ -44,7 +44,7 @@ struct SERVER_EXPORT JackServerGlobals


static bool Init(); static bool Init();
static void Destroy(); static void Destroy();
static int Start(const char* server_name,
static int Start (const char* server_name,
jack_driver_desc_t* driver_desc, jack_driver_desc_t* driver_desc,
JSList* driver_params, JSList* driver_params,
int sync, int sync,
@@ -53,7 +53,8 @@ struct SERVER_EXPORT JackServerGlobals
int rt, int rt,
int priority, int priority,
int loopback, int loopback,
int verbose);
int verbose,
jack_timer_type_t clock);
static void Stop(); static void Stop();
static void Delete(); static void Delete();
}; };


+ 17
- 2
common/JackTypes.h View File

@@ -21,6 +21,8 @@
#ifndef __JackTypes__ #ifndef __JackTypes__
#define __JackTypes__ #define __JackTypes__


#include "JackCompilerDeps.h"

typedef unsigned short UInt16; typedef unsigned short UInt16;
#if __LP64__ #if __LP64__
typedef unsigned int UInt32; typedef unsigned int UInt32;
@@ -34,8 +36,11 @@ typedef signed long SInt32;


typedef uint16_t jack_int_t; // Internal type for ports and refnum typedef uint16_t jack_int_t; // Internal type for ports and refnum


namespace Jack
{
typedef enum {
JACK_TIMER_SYSTEM_CLOCK,
JACK_TIMER_CYCLE_COUNTER,
JACK_TIMER_HPET,
} jack_timer_type_t;


typedef enum { typedef enum {
NotTriggered, NotTriggered,
@@ -44,6 +49,16 @@ typedef enum {
Finished, Finished,
} jack_client_state_t; } jack_client_state_t;


#ifdef __cplusplus
extern "C"
{
#endif

SERVER_EXPORT void SetClockSource(jack_timer_type_t source);
SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source);

#ifdef __cplusplus
} }
#endif


#endif #endif

+ 34
- 0
common/Jackdmp.cpp View File

@@ -97,6 +97,9 @@ static void usage(FILE* file)
" [ --timeout OR -t client-timeout-in-msecs ]\n" " [ --timeout OR -t client-timeout-in-msecs ]\n"
" [ --midi OR -X midi-driver ]\n" " [ --midi OR -X midi-driver ]\n"
" [ --verbose OR -v ]\n" " [ --verbose OR -v ]\n"
#ifdef __linux__
" [ --clocksource OR -c [ c(ycle) | h(pet) | s(ystem) ]\n"
#endif
" [ --replace-registry OR -r ]\n" " [ --replace-registry OR -r ]\n"
" [ --silent OR -s ]\n" " [ --silent OR -s ]\n"
" [ --sync OR -S ]\n" " [ --sync OR -S ]\n"
@@ -156,8 +159,17 @@ int main(int argc, char* argv[])
const char* server_name = "default"; const char* server_name = "default";
jackctl_driver_t * audio_driver_ctl; jackctl_driver_t * audio_driver_ctl;
jackctl_driver_t * midi_driver_ctl; jackctl_driver_t * midi_driver_ctl;
#ifdef __linux__
const char *options = "-ad:X:P:uvrshVRL:STFl:t:mn:p:c:";
#else
const char *options = "-ad:X:P:uvrshVRL:STFl:t:mn:p:"; const char *options = "-ad:X:P:uvrshVRL:STFl:t:mn:p:";
#endif
struct option long_options[] = { struct option long_options[] = {
#ifdef __linux__
{ "clock-source", 1, 0, 'c' },
#endif
{ "audio-driver", 1, 0, 'd' }, { "audio-driver", 1, 0, 'd' },
{ "midi-driver", 1, 0, 'X' }, { "midi-driver", 1, 0, 'X' },
{ "verbose", 0, 0, 'v' }, { "verbose", 0, 0, 'v' },
@@ -177,6 +189,7 @@ int main(int argc, char* argv[])
{ "sync", 0, 0, 'S' }, { "sync", 0, 0, 'S' },
{ 0, 0, 0, 0 } { 0, 0, 0, 0 }
}; };

int i,opt = 0; int i,opt = 0;
int option_index = 0; int option_index = 0;
bool seen_audio_driver = false; bool seen_audio_driver = false;
@@ -211,6 +224,27 @@ int main(int argc, char* argv[])
long_options, &option_index)) != EOF) { long_options, &option_index)) != EOF) {
switch (opt) { switch (opt) {


#ifdef __linux__
case 'c':
param = jackctl_get_parameter(server_parameters, "clock-source");
if (param != NULL) {
if (tolower (optarg[0]) == 'h') {
value.ui = JACK_TIMER_HPET;
jackctl_parameter_set_value(param, &value);
} else if (tolower (optarg[0]) == 'c') {
value.ui = JACK_TIMER_CYCLE_COUNTER;
jackctl_parameter_set_value(param, &value);
} else if (tolower (optarg[0]) == 's') {
value.ui = JACK_TIMER_SYSTEM_CLOCK;
jackctl_parameter_set_value(param, &value);
} else {
usage(stdout);
goto fail_free;
}
}
break;
#endif

case 'd': case 'd':
seen_audio_driver = true; seen_audio_driver = true;
audio_driver_name = optarg; audio_driver_name = optarg;


+ 8
- 0
linux/JackLinuxTime.c View File

@@ -99,3 +99,11 @@ SERVER_EXPORT void JackSleep(long usec)
} }
#endif #endif

SERVER_EXPORT void SetClockSource(jack_timer_type_t source)
{}

SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source)
{
return "";
}

+ 9
- 0
macosx/JackMachTime.c View File

@@ -20,6 +20,7 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.


#include "JackTime.h" #include "JackTime.h"
#include "JackError.h" #include "JackError.h"
#include "JackTypes.h"
#include <mach/mach_time.h> #include <mach/mach_time.h>
#include <unistd.h> #include <unistd.h>


@@ -42,3 +43,11 @@ SERVER_EXPORT jack_time_t GetMicroSeconds(void)
{ {
return (jack_time_t) (mach_absolute_time () * __jack_time_ratio); return (jack_time_t) (mach_absolute_time () * __jack_time_ratio);
} }

SERVER_EXPORT void SetClockSource(jack_timer_type_t source)
{}

SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source)
{
return "";
}

+ 1
- 1
macosx/coreaudio/JackCoreAudioDriver.cpp View File

@@ -568,7 +568,7 @@ OSStatus JackCoreAudioDriver::CreateAggregateDevice(AudioDeviceID captureDeviceI
CFRelease(captureDeviceUID); CFRelease(captureDeviceUID);
CFRelease(playbackDeviceUID); CFRelease(playbackDeviceUID);
jack_log("New aggregate device %ld\n", *outAggregateDevice);
jack_log("New aggregate device %ld", *outAggregateDevice);
return noErr; return noErr;
} }




+ 7
- 0
solaris/JackSolarisTime.c View File

@@ -35,3 +35,10 @@ SERVER_EXPORT jack_time_t GetMicroSeconds(void)
return (jack_time_t)(gethrtime() / 1000); return (jack_time_t)(gethrtime() / 1000);
} }


SERVER_EXPORT void SetClockSource(jack_timer_type_t source)
{}

SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source)
{
return "";
}

+ 8
- 0
windows/JackWinTime.c View File

@@ -41,3 +41,11 @@ SERVER_EXPORT jack_time_t GetMicroSeconds(void)
QueryPerformanceCounter(&t1); QueryPerformanceCounter(&t1);
return (jack_time_t)(((double)t1.QuadPart) / ((double)_jack_freq.QuadPart)); return (jack_time_t)(((double)t1.QuadPart) / ((double)_jack_freq.QuadPart));
} }

SERVER_EXPORT void SetClockSource(jack_timer_type_t source)
{}

SERVER_EXPORT const char* ClockSourceName(jack_timer_type_t source)
{
return "";
}

Loading…
Cancel
Save