git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2803 0c269be4-1314-0410-8aa9-9f06e86f4224tags/1.90
@@ -327,12 +327,12 @@ namespace Jack | |||||
//transport--------------------------------------------------------------------------- | //transport--------------------------------------------------------------------------- | ||||
int JackNetDriver::DecodeTransportData() | int JackNetDriver::DecodeTransportData() | ||||
{ | { | ||||
//is there a new timebase master on the master ? | |||||
//is there a new timebase master on the net master ? | |||||
// - release timebase master only if it's a non-conditional request | |||||
// - no change or no request : don't do anything | |||||
// - conditional request : don't change anything too, the master will know if this slave is actually the timebase master | |||||
int refnum; | int refnum; | ||||
bool conditional; | bool conditional; | ||||
//release timebase master only if it's a non-conditional request | |||||
//no request (NO_TIMEBASEMASTER) : don't do anything | |||||
//conditional request : don't change anything to, master will know if this slave is actually the timebase master | |||||
if ( fTransportData.fTimebaseMaster == TIMEBASEMASTER ) | if ( fTransportData.fTimebaseMaster == TIMEBASEMASTER ) | ||||
{ | { | ||||
fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | ||||
@@ -342,7 +342,7 @@ namespace Jack | |||||
} | } | ||||
//is there a tranport state change to handle ? | //is there a tranport state change to handle ? | ||||
if ( fTransportData.fNewState && ( fTransportData.fState != (uint)fEngineControl->fTransport.GetState() ) ) | |||||
if ( fTransportData.fNewState && ( fTransportData.fState != ( uint ) fEngineControl->fTransport.GetState() ) ) | |||||
{ | { | ||||
switch ( fTransportData.fState ) | switch ( fTransportData.fState ) | ||||
{ | { | ||||
@@ -367,17 +367,28 @@ namespace Jack | |||||
int JackNetDriver::EncodeTransportData() | int JackNetDriver::EncodeTransportData() | ||||
{ | { | ||||
//is there a new timebase master ? | |||||
//is there a timebase master change ? | |||||
int refnum; | int refnum; | ||||
bool conditional; | bool conditional; | ||||
fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional ); | ||||
if ( refnum != fLastTimebaseMaster ) | if ( refnum != fLastTimebaseMaster ) | ||||
{ | { | ||||
fTransportData.fTimebaseMaster = ( conditional ) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER; | |||||
//timebase master has released its function | |||||
if ( refnum == -1 ) | |||||
{ | |||||
fTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER; | |||||
jack_info ( "Sending a timebase master release request." ); | |||||
} | |||||
//there is a new timebase master | |||||
else | |||||
{ | |||||
fTransportData.fTimebaseMaster = ( conditional ) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER; | |||||
jack_info ( "Sending a %s timebase master request.", ( conditional ) ? "conditional" : "non-conditional" ); | |||||
} | |||||
fLastTimebaseMaster = refnum; | fLastTimebaseMaster = refnum; | ||||
} | } | ||||
else | else | ||||
fTransportData.fTimebaseMaster = NO_TIMEBASEMASTER; | |||||
fTransportData.fTimebaseMaster = NO_CHANGE; | |||||
//update transport state and position | //update transport state and position | ||||
fTransportData.fState = fEngineControl->fTransport.Query ( &fTransportData.fPosition ); | fTransportData.fState = fEngineControl->fTransport.Query ( &fTransportData.fPosition ); | ||||
@@ -229,10 +229,10 @@ namespace Jack | |||||
{ | { | ||||
//is there a new timebase master ? | //is there a new timebase master ? | ||||
//TODO : check if any timebase callback has been called (and if it's conditional or not) and set correct value... | //TODO : check if any timebase callback has been called (and if it's conditional or not) and set correct value... | ||||
fTransportData.fTimebaseMaster = NO_TIMEBASEMASTER; | |||||
fTransportData.fTimebaseMaster = NO_CHANGE; | |||||
//update state and position | //update state and position | ||||
fTransportData.fState = static_cast<uint32_t> ( jack_transport_query ( fJackClient, &fTransportData.fPosition ) ); | |||||
fTransportData.fState = static_cast<uint> ( jack_transport_query ( fJackClient, &fTransportData.fPosition ) ); | |||||
//is it a new state ? | //is it a new state ? | ||||
fTransportData.fNewState = ( fTransportData.fState != fLastTransportState ); | fTransportData.fNewState = ( fTransportData.fState != fLastTransportState ); | ||||
@@ -245,35 +245,41 @@ namespace Jack | |||||
int JackNetMaster::DecodeTransportData() | int JackNetMaster::DecodeTransportData() | ||||
{ | { | ||||
//is the slave a new timebase master ? | |||||
int timebase; | |||||
switch ( fTransportData.fTimebaseMaster ) | |||||
//is there timebase master change ? | |||||
if ( fTransportData.fTimebaseMaster != NO_CHANGE ) | |||||
{ | { | ||||
case NO_TIMEBASEMASTER : | |||||
break; | |||||
case TIMEBASEMASTER : | |||||
timebase = jack_set_timebase_callback ( fJackClient, 0, SetTimebaseCallback, this ); | |||||
if ( timebase < 0 ) | |||||
jack_error ( "Can't set a new timebase master." ); | |||||
else | |||||
jack_info ( "'%s' is the new timebase master.", fParams.fName ); | |||||
break; | |||||
case CONDITIONAL_TIMEBASEMASTER : | |||||
timebase = jack_set_timebase_callback ( fJackClient, 1, SetTimebaseCallback, this ); | |||||
if ( timebase < 0 ) | |||||
{ | |||||
if ( timebase == EBUSY ) | |||||
jack_error ( "'%s' is already the timebase master.", fParams.fName ); | |||||
int timebase = 0; | |||||
switch ( fTransportData.fTimebaseMaster ) | |||||
{ | |||||
case RELEASE_TIMEBASEMASTER : | |||||
timebase = jack_release_timebase ( fJackClient ); | |||||
if ( timebase < 0 ) | |||||
jack_error ( "Can't release timebase master." ); | |||||
else | else | ||||
jack_info ( "'%s' isn't the timebase master anymore.", fParams.fName ); | |||||
break; | |||||
case TIMEBASEMASTER : | |||||
timebase = jack_set_timebase_callback ( fJackClient, 0, SetTimebaseCallback, this ); | |||||
if ( timebase < 0 ) | |||||
jack_error ( "Can't set a new timebase master." ); | jack_error ( "Can't set a new timebase master." ); | ||||
} | |||||
else | |||||
jack_info ( "'%s' is the new timebase master.", fParams.fName ); | |||||
break; | |||||
else | |||||
jack_info ( "'%s' is the new timebase master.", fParams.fName ); | |||||
break; | |||||
case CONDITIONAL_TIMEBASEMASTER : | |||||
timebase = jack_set_timebase_callback ( fJackClient, 1, SetTimebaseCallback, this ); | |||||
if ( timebase != EBUSY ) | |||||
{ | |||||
if ( timebase < 0 ) | |||||
jack_error ( "Can't set a new timebase master." ); | |||||
else | |||||
jack_info ( "'%s' is the new timebase master.", fParams.fName ); | |||||
} | |||||
break; | |||||
} | |||||
} | } | ||||
//is the slave in a new transport state and is this state different from master's ? | //is the slave in a new transport state and is this state different from master's ? | ||||
if ( fTransportData.fNewState && ( fTransportData.fState != (uint)jack_transport_query ( fJackClient, NULL ) ) ) | |||||
if ( fTransportData.fNewState && ( fTransportData.fState != ( uint ) jack_transport_query ( fJackClient, NULL ) ) ) | |||||
{ | { | ||||
switch ( fTransportData.fState ) | switch ( fTransportData.fState ) | ||||
{ | { | ||||
@@ -497,7 +503,7 @@ namespace Jack | |||||
int ret = 1; | int ret = 1; | ||||
master_list_it_t it; | master_list_it_t it; | ||||
for ( it = fMasterList.begin(); it != fMasterList.end(); it++ ) | for ( it = fMasterList.begin(); it != fMasterList.end(); it++ ) | ||||
if ( !( *it )->IsSlaveReadyToRoll() ) | |||||
if ( ! ( *it )->IsSlaveReadyToRoll() ) | |||||
ret = 0; | ret = 0; | ||||
jack_log ( "JackNetMasterManager::SyncCallback returns '%s'", ( ret ) ? "true" : "false" ); | jack_log ( "JackNetMasterManager::SyncCallback returns '%s'", ( ret ) ? "true" : "false" ); | ||||
return ret; | return ret; | ||||
@@ -75,7 +75,7 @@ namespace Jack | |||||
int DecodeSyncPacket(); | int DecodeSyncPacket(); | ||||
int Process(); | int Process(); | ||||
void TimebaseCallback ( jack_position_t* pos); | |||||
void TimebaseCallback ( jack_position_t* pos ); | |||||
public: | public: | ||||
JackNetMaster ( JackNetSocket& socket, session_params_t& params, const char* multicast_ip ); | JackNetMaster ( JackNetSocket& socket, session_params_t& params, const char* multicast_ip ); | ||||
@@ -159,9 +159,10 @@ namespace Jack | |||||
enum _net_timebase_master | enum _net_timebase_master | ||||
{ | { | ||||
NO_TIMEBASEMASTER = 0, | |||||
TIMEBASEMASTER = 1, | |||||
CONDITIONAL_TIMEBASEMASTER = 2 | |||||
NO_CHANGE = 0, | |||||
RELEASE_TIMEBASEMASTER = 1, | |||||
TIMEBASEMASTER = 2, | |||||
CONDITIONAL_TIMEBASEMASTER = 3 | |||||
}; | }; | ||||
typedef enum _net_timebase_master net_timebase_master_t; | typedef enum _net_timebase_master net_timebase_master_t; | ||||