Browse Source

Fix unwanted network transport state and position feedback

git-svn-id: http://subversion.jackaudio.org/jack/jack2/trunk/jackmp@2804 0c269be4-1314-0410-8aa9-9f06e86f4224
tags/1.90
moret 17 years ago
parent
commit
e9a01a0a37
4 changed files with 43 additions and 39 deletions
  1. +16
    -15
      common/JackNetDriver.cpp
  2. +2
    -1
      common/JackNetDriver.h
  3. +23
    -22
      common/JackNetManager.cpp
  4. +2
    -1
      common/JackNetManager.h

+ 16
- 15
common/JackNetDriver.cpp View File

@@ -333,7 +333,7 @@ namespace Jack
// - conditional request : don't change anything too, the master will know if this slave is actually the timebase master
int refnum;
bool conditional;
if ( fTransportData.fTimebaseMaster == TIMEBASEMASTER )
if ( fSendTransportData.fTimebaseMaster == TIMEBASEMASTER )
{
fEngineControl->fTransport.GetTimebaseMaster ( refnum, conditional );
if ( refnum != -1 )
@@ -342,16 +342,16 @@ namespace Jack
}

//is there a tranport state change to handle ?
if ( fTransportData.fNewState && ( fTransportData.fState != ( uint ) fEngineControl->fTransport.GetState() ) )
if ( fSendTransportData.fNewState && ( fSendTransportData.fState != ( uint ) fEngineControl->fTransport.GetState() ) )
{
switch ( fTransportData.fState )
switch ( fSendTransportData.fState )
{
case JackTransportStopped :
fEngineControl->fTransport.SetCommand ( TransportCommandStop );
jack_info ( "NetMaster : transport stops." );
break;
case JackTransportStarting :
fEngineControl->fTransport.RequestNewPos ( &fTransportData.fPosition );
fEngineControl->fTransport.RequestNewPos ( &fSendTransportData.fPosition );
fEngineControl->fTransport.SetCommand ( TransportCommandStart );
jack_info ( "NetMaster : transport starts." );
break;
@@ -376,28 +376,29 @@ namespace Jack
//timebase master has released its function
if ( refnum == -1 )
{
fTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER;
fReturnTransportData.fTimebaseMaster = RELEASE_TIMEBASEMASTER;
jack_info ( "Sending a timebase master release request." );
}
//there is a new timebase master
else
{
fTransportData.fTimebaseMaster = ( conditional ) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER;
fReturnTransportData.fTimebaseMaster = ( conditional ) ? CONDITIONAL_TIMEBASEMASTER : TIMEBASEMASTER;
jack_info ( "Sending a %s timebase master request.", ( conditional ) ? "conditional" : "non-conditional" );
}
fLastTimebaseMaster = refnum;
}
else
fTransportData.fTimebaseMaster = NO_CHANGE;
fReturnTransportData.fTimebaseMaster = NO_CHANGE;

//update transport state and position
fTransportData.fState = fEngineControl->fTransport.Query ( &fTransportData.fPosition );
fReturnTransportData.fState = fEngineControl->fTransport.Query ( &fReturnTransportData.fPosition );

//is it a new state ?
fTransportData.fNewState = ( fTransportData.fState != fLastTransportState );
if ( fTransportData.fNewState )
jack_info ( "Sending transport state '%s'.", GetTransportState ( fTransportData.fState ) );
fLastTransportState = fTransportData.fState;
//is it a new state (that the master need to know...) ?
fReturnTransportData.fNewState = ( ( fReturnTransportData.fState != fLastTransportState ) &&
( fReturnTransportData.fState != fSendTransportData.fState ) );
if ( fReturnTransportData.fNewState )
jack_info ( "Sending transport state '%s'.", GetTransportState ( fReturnTransportData.fState ) );
fLastTransportState = fReturnTransportData.fState;

return 0;
}
@@ -410,7 +411,7 @@ namespace Jack
if ( fParams.fTransportSync )
{
//copy received transport data to transport data structure
memcpy ( &fTransportData, fRxData, sizeof ( net_transport_data_t ) );
memcpy ( &fSendTransportData, fRxData, sizeof ( net_transport_data_t ) );
if ( DecodeTransportData() < 0 )
return -1;
}
@@ -430,7 +431,7 @@ namespace Jack
if ( EncodeTransportData() < 0 )
return -1;
//copy to TxBuffer
memcpy ( fTxData, &fTransportData, sizeof ( net_transport_data_t ) );
memcpy ( fTxData, &fReturnTransportData, sizeof ( net_transport_data_t ) );
}
//then others
//...


+ 2
- 1
common/JackNetDriver.h View File

@@ -44,7 +44,8 @@ namespace Jack
//transport
uint fLastTransportState;
int fLastTimebaseMaster;
net_transport_data_t fTransportData;
net_transport_data_t fSendTransportData;
net_transport_data_t fReturnTransportData;

//monitoring
#ifdef JACK_MONITOR


+ 23
- 22
common/JackNetManager.cpp View File

@@ -229,16 +229,17 @@ namespace Jack
{
//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...
fTransportData.fTimebaseMaster = NO_CHANGE;
fSendTransportData.fTimebaseMaster = NO_CHANGE;

//update state and position
fTransportData.fState = static_cast<uint> ( jack_transport_query ( fJackClient, &fTransportData.fPosition ) );
fSendTransportData.fState = static_cast<uint> ( jack_transport_query ( fJackClient, &fSendTransportData.fPosition ) );

//is it a new state ?
fTransportData.fNewState = ( fTransportData.fState != fLastTransportState );
if ( fTransportData.fNewState )
jack_info ( "'%s' : sending transport state '%s'.", fParams.fName, GetTransportState ( fTransportData.fState ) );
fLastTransportState = fTransportData.fState;
fSendTransportData.fNewState = ( ( fSendTransportData.fState != fLastTransportState ) &&
( fSendTransportData.fState != fReturnTransportData.fState ) );
if ( fSendTransportData.fNewState )
jack_info ( "'%s' : sending transport state '%s'.", fParams.fName, GetTransportState ( fSendTransportData.fState ) );
fLastTransportState = fSendTransportData.fState;

return 0;
}
@@ -246,10 +247,10 @@ namespace Jack
int JackNetMaster::DecodeTransportData()
{
//is there timebase master change ?
if ( fTransportData.fTimebaseMaster != NO_CHANGE )
if ( fReturnTransportData.fTimebaseMaster != NO_CHANGE )
{
int timebase = 0;
switch ( fTransportData.fTimebaseMaster )
switch ( fReturnTransportData.fTimebaseMaster )
{
case RELEASE_TIMEBASEMASTER :
timebase = jack_release_timebase ( fJackClient );
@@ -279,16 +280,16 @@ namespace Jack
}

//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 ( fReturnTransportData.fNewState && ( fReturnTransportData.fState != ( uint ) jack_transport_query ( fJackClient, NULL ) ) )
{
switch ( fTransportData.fState )
switch ( fReturnTransportData.fState )
{
case JackTransportStopped :
jack_transport_stop ( fJackClient );
jack_info ( "'%s' : transport stops.", fParams.fName );
break;
case JackTransportStarting :
if ( jack_transport_reposition ( fJackClient, &fTransportData.fPosition ) < 0 )
if ( jack_transport_reposition ( fJackClient, &fReturnTransportData.fPosition ) < 0 )
jack_error ( "Can't set new position." );
jack_transport_start ( fJackClient );
jack_info ( "'%s' : transport starts.", fParams.fName );
@@ -310,14 +311,14 @@ namespace Jack

void JackNetMaster::TimebaseCallback ( jack_position_t* pos )
{
pos->bar = fTransportData.fPosition.bar;
pos->beat = fTransportData.fPosition.beat;
pos->tick = fTransportData.fPosition.tick;
pos->bar_start_tick = fTransportData.fPosition.bar_start_tick;
pos->beats_per_bar = fTransportData.fPosition.beats_per_bar;
pos->beat_type = fTransportData.fPosition.beat_type;
pos->ticks_per_beat = fTransportData.fPosition.ticks_per_beat;
pos->beats_per_minute = fTransportData.fPosition.beats_per_minute;
pos->bar = fReturnTransportData.fPosition.bar;
pos->beat = fReturnTransportData.fPosition.beat;
pos->tick = fReturnTransportData.fPosition.tick;
pos->bar_start_tick = fReturnTransportData.fPosition.bar_start_tick;
pos->beats_per_bar = fReturnTransportData.fPosition.beats_per_bar;
pos->beat_type = fReturnTransportData.fPosition.beat_type;
pos->ticks_per_beat = fReturnTransportData.fPosition.ticks_per_beat;
pos->beats_per_minute = fReturnTransportData.fPosition.beats_per_minute;
}

//sync--------------------------------------------------------------------------------
@@ -333,7 +334,7 @@ namespace Jack
if ( EncodeTransportData() < 0 )
return -1;
//copy to TxBuffer
memcpy ( fTxData, &fTransportData, sizeof ( net_transport_data_t ) );
memcpy ( fTxData, &fSendTransportData, sizeof ( net_transport_data_t ) );
}
//then others
//...
@@ -347,7 +348,7 @@ namespace Jack
if ( fParams.fTransportSync )
{
//copy received transport data to transport data structure
memcpy ( &fTransportData, fRxData, sizeof ( net_transport_data_t ) );
memcpy ( &fReturnTransportData, fRxData, sizeof ( net_transport_data_t ) );
if ( DecodeTransportData() < 0 )
return -1;
}
@@ -358,7 +359,7 @@ namespace Jack

bool JackNetMaster::IsSlaveReadyToRoll()
{
return ( fTransportData.fState == JackTransportNetStarting );
return ( fReturnTransportData.fState == JackTransportNetStarting );
}

//process-----------------------------------------------------------------------------


+ 2
- 1
common/JackNetManager.h View File

@@ -53,7 +53,8 @@ namespace Jack

//sync and transport
uint32_t fLastTransportState;
net_transport_data_t fTransportData;
net_transport_data_t fSendTransportData;
net_transport_data_t fReturnTransportData;

//monitoring
#ifdef JACK_MONITOR


Loading…
Cancel
Save