MX Foundation 4
Transmission with Record Timing

Transmission with record timing means the records are scheduled on the time tag set for each record.

Each time tag specifies a clock value defining when the record must be transmitted.

The option MXF_TXAPERIODIC_FLAG_USE_RECORD_ABSOLUTE_TIME must be used for this type of transmission.

In the example below, the records are sent based on the absolute clock timing specified in the time tag field for each record.

csdb_aperiodic.c

#define BUFFER_SIZE 4096 // 4KB
#define MAX_TX_RECORDS_TO_TRANSMIT 8
#define BLOCKCOUNT 6
HMXF_SERVER server;
HMXF_DEVICE device;
HMXF_CHANNEL txChannel;
HMXF_BUFFER txBuffer=0;
HMXF_CSDB_DATAREC *recCsdb=NULL;
HMXF_CSDB_DATAREC *rec;
uint32 record;
uint64 delay100ms = 100000;
uint32 rc;
uint64 currentTime;
...
// Set timebase to 64-bit microseconds
if (!rc)
rc = mxfSystemTimeBaseSet(server, MXF_TIMEBASE_DEVICE_USEC);
// Allocate Aperiodic TX static buffer for HIGH priority queue
if (!rc)
rc = mxfTxAperiodicBufferAlloc(txChannel, MXF_TXAPERIODIC_PRIORITY_HIGH, BUFFER_SIZE, &txBuffer, NULL);
// Allocate host buffer
if (!rc)
{
recCsdb = (MXF_CSDB_DATAREC*)malloc(BUFFER_SIZE);
if (!recCsdb)
rc = MAXT_ERROR_MEM;
}
// Get the current time
if(!rc)
rc = mxfDeviceTimerGet(device, &currentTime);
currentTime+=100000;
// Set the record
rec = recCsdb;
for (record=0; record < MAX_TX_RECORDS_TO_TRANSMIT && !rc; record++)
{
if(record == 0)
{
// Set sync block
rec->timeTag = currentTime+((record+1)*10000LL);
rec->control = 0;
rec->repeatCount = 1;
rec->reserved = 0;
for(dataIdx=0; dataIdx<BLOCKCOUNT; dataIdx++)
rec->data[dataIdx] = 0xA5;
}
else
{
// Set each record: LABEL=7, SI=1
rec->timeTag = currentTime+((record+1)*10000LL);
rec->control = 0;
rec->repeatCount = 1;
rec->reserved = 0;
rec->data[0] = 7;
rec->data[1] = 1;
for(dataIdx=2; dataIdx<BLOCKCOUNT; dataIdx++)
rec->data[dataIdx] = (uint8)(2*record);
}
}
// Transmit the array of records
if (!rc)
rc = mxfCSDBTxAperiodicWrite(txBuffer, MXF_TXAPERIODIC_FLAG_USE_RECORD_ABSOLUTE_TIME, 0, MAX_TX_RECORDS_TO_TRANSMIT, recCsdb);
if (recCsdb)
free(recCsdb);
...
Updated 10/23/2023