git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@3508 0c269be4-1314-0410-8aa9-9f06e86f4224tags/v1.9.3
@@ -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> | ||||
@@ -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) | ||||
{ | { | ||||
@@ -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() | ||||
@@ -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; | ||||
@@ -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: | ||||
@@ -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); | ||||
@@ -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(); | ||||
@@ -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(); | ||||
}; | }; | ||||
@@ -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 |
@@ -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; | ||||
@@ -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 ""; | |||||
} |
@@ -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 ""; | |||||
} |
@@ -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; | ||||
} | } | ||||
@@ -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 ""; | |||||
} |
@@ -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 ""; | |||||
} |