Browse Source

adjusted ipg time

pull/450/head
Christoph Kuhr 7 years ago
parent
commit
e53a18747f
3 changed files with 110 additions and 49 deletions
  1. +8
    -7
      linux/avb/JackAVBDriver.cpp
  2. +18
    -18
      linux/avb/JackAVBDriver/JackAVBDriver.layout
  3. +84
    -24
      linux/avb/listener_mediaclock.c

+ 8
- 7
linux/avb/JackAVBDriver.cpp View File

@@ -185,18 +185,19 @@ int JackAVBPDriver::Read()
int num_packets = (int)( ieee1722mc->period_size / 6 ) + 1; // + num_packets_even_odd;


uint64_t cumulative_delay_ns = 0;
uint64_t cumulative_ipg_ns = 0;

for(int n=0; n<num_packets; n++){
cumulative_delay_ns += wait_recv_1722_mediaclockstream( &ieee1722mc );
cumulative_ipg_ns += wait_recv_1722_mediaclockstream( &ieee1722mc );
}


float cumulative_delay_us = cumulative_delay_ns / 1000;
jack_log("netxruns... duration: %fus", cumulative_delay_us);
if ( cumulative_delay_us >= ieee1722mc->period_usecs) {
jack_log("netxruns... duration: %lld ns", cumulative_ipg_ns );
if ( cumulative_ipg_us >= ieee1722mc->period_usecs) {
ret = 1;
NotifyXRun(fBeginDateUst, cumulative_delay_us);
jack_error("netxruns... duration: %fms", cumulative_delay_us / 1000);
float cumulative_ipg_us = cumulative_ipg_ns / 1000;
NotifyXRun(fBeginDateUst, cumulative_ipg_us);
jack_error("netxruns... duration: %fms", cumulative_ipg_us / 1000);
}

JackDriver::CycleTakeBeginTime();


+ 18
- 18
linux/avb/JackAVBDriver/JackAVBDriver.layout View File

@@ -2,49 +2,49 @@
<CodeBlocks_layout_file>
<FileVersion major="1" minor="0" />
<ActiveTarget name="Debug" />
<File name="../global_definitions.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../mrpClient_interface.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="3575" topLine="132" />
<Cursor1 position="920" topLine="0" />
</Cursor>
</File>
<File name="../mrpClient_interface.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../avb_1722avtp.c" open="1" top="0" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="7246" topLine="141" />
<Cursor1 position="18158" topLine="442" />
</Cursor>
</File>
<File name="../avb_1722avtp.c" open="1" top="1" tabpos="3" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../listener_mediaclock.h" open="1" top="0" tabpos="5" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="17563" topLine="483" />
<Cursor1 position="1056" topLine="0" />
</Cursor>
</File>
<File name="../JackAVBDriver.h" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../avb_1722avtp.h" open="1" top="0" tabpos="6" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="981" topLine="0" />
<Cursor1 position="1174" topLine="0" />
</Cursor>
</File>
<File name="../listener_mediaclock.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../JackAVBDriver.cpp" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1569" topLine="0" />
<Cursor1 position="7154" topLine="144" />
</Cursor>
</File>
<File name="../mrpClient_interface.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../JackAVBDriver.h" open="1" top="0" tabpos="2" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="920" topLine="0" />
<Cursor1 position="883" topLine="0" />
</Cursor>
</File>
<File name="../avb_1722avtp.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../global_definitions.h" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="1466" topLine="0" />
<Cursor1 position="3575" topLine="132" />
</Cursor>
</File>
<File name="../listener_mediaclock.c" open="1" top="0" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../mrpClient_interface.c" open="0" top="0" tabpos="0" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="11097" topLine="198" />
<Cursor1 position="7246" topLine="141" />
</Cursor>
</File>
<File name="../JackAVBDriver.cpp" open="1" top="0" tabpos="1" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<File name="../listener_mediaclock.c" open="1" top="1" tabpos="4" split="0" active="1" splitpos="0" zoom_1="0" zoom_2="0">
<Cursor>
<Cursor1 position="5651" topLine="118" />
<Cursor1 position="10754" topLine="189" />
</Cursor>
</File>
</CodeBlocks_layout_file>

+ 84
- 24
linux/avb/listener_mediaclock.c View File

@@ -1,6 +1,9 @@
#include "listener_mediaclock.h"
extern int errno;

static uint64_t last_packet_time_ns = 0;


int create_avb_Mediaclock_Listener( FILE* filepointer, ieee1722_avtp_driver_state_t **ieee1722mc, char* avb_dev_name,
char* stream_id, char* destination_mac,
struct sockaddr_in **si_other_avb, struct pollfd **avtp_transport_socket_fds)
@@ -101,18 +104,28 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv
((*ieee1722mc)->streamid8[7] == (uint8_t) stream_packet[25])
){


/*
*
* 6 or less samples per packet? =>
*
*/
int samples_in_packet = 0;
uint64_t adjust_packet_time_ns = 0;
uint64_t packet_arrival_time_ns = 0;
uint64_t ipg_to_last_packet_ns = 0;

int bytes_per_stereo_channel = 12 /*CHANNEL_COUNT_STEREO * AVTP_SAMPLES_PER_CHANNEL_PER_PACKET = 2*6 */ * sizeof(uint32_t);
int avtp_hdr_len = ETHERNET_HDR_LENGTH + 32 /*AVB_HEADER_LENGTH*/;

struct timeval sys_time;

if (clock_gettime(CLOCK_REALTIME, &sys_time)) {
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}
packet_arrival_time_ns = (sys_time.tv_sec*1000000000LL + sys_time.tv_usec*1000);
ipg_to_last_packet_ns = packet_arrival_time_ns - last_packet_time_ns;
last_packet_time_ns = packet_arrival_time_ns;

/*
*
* 6 or less samples per packet? =>
*
*/
for( int s = avtp_hdr_len; s < avtp_hdr_len + bytes_per_stereo_channel; s += sizeof(uint32_t) ){

if(stream_packet[ s ] != 0x00){
@@ -124,10 +137,7 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv
}
}




if( samples_in_packet < 6 ){
if( samples_in_packet < 6){
adjust_packet_time_ns = samples_in_packet / ieee1722mc->sample_rate * 1000000000;
}

@@ -154,14 +164,9 @@ uint64_t mediaclock_listener_wait_recv_ts( FILE* filepointer, ieee1722_avtp_driv
// }
// }

/* inaccurate */
struct timeval sys_time;

if (clock_gettime(CLOCK_REALTIME, &sys_time)) {
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}

return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns;
return ipg_to_last_packet_ns - adjust_packet_time_ns;
}
return -1;

@@ -188,12 +193,6 @@ uint64_t mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_
((*ieee1722mc)->streamid8[6] == (uint8_t) stream_packet[24]) &&
((*ieee1722mc)->streamid8[7] == (uint8_t) stream_packet[25])
){
/* inaccurate */
struct timeval sys_time;

if (clock_gettime(CLOCK_REALTIME, &sys_time)) {
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}


/*
@@ -201,9 +200,40 @@ uint64_t mediaclock_listener_wait_recv( FILE* filepointer, ieee1722_avtp_driver_
* 6 or less samples per packet? =>
*
*/
int samples_in_packet = 0;
uint64_t adjust_packet_time_ns = 0;

int bytes_per_stereo_channel = 12 /*CHANNEL_COUNT_STEREO * AVTP_SAMPLES_PER_CHANNEL_PER_PACKET = 2*6 */ * sizeof(uint32_t);
int avtp_hdr_len = ETHERNET_HDR_LENGTH + 32 /*AVB_HEADER_LENGTH*/;

for( int s = avtp_hdr_len; s < avtp_hdr_len + bytes_per_stereo_channel; s += sizeof(uint32_t) ){

if(stream_packet[ s ] != 0x00){
// fprintf(filepointer, "avb sample %d %x %x %x %x \n", s, avb_packet[ s ],
// avb_packet[ s + 1 ],
// avb_packet[ s + 2 ],
// avb_packet[ s + 3 ] );fflush(filepointer);
samples_in_packet++;
}
}


return (uint64_t)(sys_time.tv_usec * 1000);


if( samples_in_packet < 6 ){
adjust_packet_time_ns = samples_in_packet / ieee1722mc->sample_rate * 1000000000;
}


/* inaccurate */
struct timeval sys_time;

if (clock_gettime(CLOCK_REALTIME, &sys_time)) {
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}


return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns;
}
}
return -1;
@@ -233,6 +263,36 @@ uint64_t mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_
((*ieee1722mc)->streamid8[6] == (uint8_t) stream_packet[24]) &&
((*ieee1722mc)->streamid8[7] == (uint8_t) stream_packet[25])
){
/*
*
* 6 or less samples per packet? =>
*
*/
int samples_in_packet = 0;
uint64_t adjust_packet_time_ns = 0;

int bytes_per_stereo_channel = 12 /*CHANNEL_COUNT_STEREO * AVTP_SAMPLES_PER_CHANNEL_PER_PACKET = 2*6 */ * sizeof(uint32_t);
int avtp_hdr_len = ETHERNET_HDR_LENGTH + 32 /*AVB_HEADER_LENGTH*/;

for( int s = avtp_hdr_len; s < avtp_hdr_len + bytes_per_stereo_channel; s += sizeof(uint32_t) ){

if(stream_packet[ s ] != 0x00){
// fprintf(filepointer, "avb sample %d %x %x %x %x \n", s, avb_packet[ s ],
// avb_packet[ s + 1 ],
// avb_packet[ s + 2 ],
// avb_packet[ s + 3 ] );fflush(filepointer);
samples_in_packet++;
}
}




if( samples_in_packet < 6 ){
adjust_packet_time_ns = samples_in_packet / ieee1722mc->sample_rate * 1000000000;
}


/* inaccurate */
struct timeval sys_time;

@@ -240,7 +300,7 @@ uint64_t mediaclock_listener_poll_recv( FILE* filepointer, ieee1722_avtp_driver_
fprintf(filepointer, " Clockrealtime Error\n");fflush(filepointer);
}

return (uint64_t)(sys_time.tv_usec * 1000);
return (uint64_t)(sys_time.tv_usec * 1000) - adjust_packet_time_ns;
}
}
}


Loading…
Cancel
Save