Browse Source

Improve timebase master setting in netjack2

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2803 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
moret 16 years ago
parent
commit
9ae4e6c198
4 changed files with 56 additions and 38 deletions
  1. +19
    -8
      common/JackNetDriver.cpp
  2. +32
    -26
      common/JackNetManager.cpp
  3. +1
    -1
      common/JackNetManager.h
  4. +4
    -3
      common/JackNetTool.h

+ 19
- 8
common/JackNetDriver.cpp View File

@@ -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 );


+ 32
- 26
common/JackNetManager.cpp View File

@@ -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;


+ 1
- 1
common/JackNetManager.h View File

@@ -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 );


+ 4
- 3
common/JackNetTool.h View File

@@ -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;


Loading…
Cancel
Save