From e53a18747fdeb04a2a5ee79c2a4a246f407cebb0 Mon Sep 17 00:00:00 2001 From: Christoph Kuhr Date: Sat, 13 Oct 2018 11:08:31 +0200 Subject: [PATCH] adjusted ipg time --- linux/avb/JackAVBDriver.cpp | 15 +-- linux/avb/JackAVBDriver/JackAVBDriver.layout | 36 +++---- linux/avb/listener_mediaclock.c | 108 ++++++++++++++----- 3 files changed, 110 insertions(+), 49 deletions(-) diff --git a/linux/avb/JackAVBDriver.cpp b/linux/avb/JackAVBDriver.cpp index 2e5bfa74..2cdaa1cc 100644 --- a/linux/avb/JackAVBDriver.cpp +++ b/linux/avb/JackAVBDriver.cpp @@ -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= 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(); diff --git a/linux/avb/JackAVBDriver/JackAVBDriver.layout b/linux/avb/JackAVBDriver/JackAVBDriver.layout index ca4811bf..4ba67c5b 100644 --- a/linux/avb/JackAVBDriver/JackAVBDriver.layout +++ b/linux/avb/JackAVBDriver/JackAVBDriver.layout @@ -2,49 +2,49 @@ - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + - + diff --git a/linux/avb/listener_mediaclock.c b/linux/avb/listener_mediaclock.c index ef32c741..024218c7 100644 --- a/linux/avb/listener_mediaclock.c +++ b/linux/avb/listener_mediaclock.c @@ -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; } } }