diff --git a/src/channels/chan_voicemngr.c b/src/channels/chan_voicemngr.c index 052d3fec4b921de79a27548661012da11ff53b8a..16bbfdb1d23c4d1d8aeb8c5a4f06bcafbc34c5c7 100644 --- a/src/channels/chan_voicemngr.c +++ b/src/channels/chan_voicemngr.c @@ -77,7 +77,7 @@ #define LOGFILE "/tmp/chan_voicemngr.log" #define BUFLEN 6000000 -#define LOGRATE 100 +#define LOGRATE 1024 // Unit is byte static void chan_voicemngr_dialtone_set(struct chan_voicemngr_pvt *p, dialtone_state state); static int chan_voicemngr_signal_dialtone(struct chan_voicemngr_pvt *p); @@ -3287,14 +3287,12 @@ static void audio_packet_handler(pe_packet_t *p) { struct chan_voicemngr_pvt *pvt; int sip_client_id = -1; unsigned int* packet_buf32 = (unsigned int*)ap->rtp; - unsigned short seqnum_start,seqnum_end; static struct logbuf_t buff; - struct timeval difference; - static struct timeval earlier = {0,0}; - static struct timeval later = {0,0}; - float d_usec; + static struct timeval earlier = { 0, }; + struct timeval later, difference; - logbuf_init (&buff, LOGFILE, BUFLEN, LOGRATE); + if (buff.inited != INITED) + logbuf_init(&buff, LOGFILE, BUFLEN, LOGRATE); // Clear the RTP marker bit if ((payload_type & RTP_MARKER_BIT) && (payload_type < RTCP_SR || payload_type > RTCP_XR)) @@ -3373,34 +3371,26 @@ static void audio_packet_handler(pe_packet_t *p) { //ast_mutex_unlock(&sub->parent->lock); //pvt_unlock(sub->parent); - //Get packet sequence number - seqnum_start = ap->rtp[2]; - seqnum_end = ap->rtp[3]; - - //Get time and time difference - if(later.tv_usec == 0 && later.tv_sec == 0) { - time_delta(&later, &earlier, &difference); - gettimeofday(&later, NULL); - earlier = later; - } else { - gettimeofday(&later, NULL); - time_delta(&later, &earlier, &difference); - earlier = later; - } - - //Write debug data into logbuf - if(payload_type < 200) { - if( difference.tv_usec < 1000) { - d_usec = difference.tv_usec; - logbuf (&buff, "%d:%d:%f\n", payload_type,((seqnum_start << 8) + seqnum_end), ((difference.tv_sec * 1000) + (d_usec / 1000))); - } else { - logbuf (&buff, "%d:%d:%d\n", payload_type,((seqnum_start << 8) + seqnum_end), ((difference.tv_sec * 1000) + (difference.tv_usec / 1000))); - } - } - if (owner) { if (!drop_frame && (ast_channel_state(owner) == AST_STATE_UP || ast_channel_state(owner) == AST_STATE_RING)) { ast_queue_frame(owner, &frame); + + // Calculate the interval of two adjacent RTP packets with payload G711 + if (frame.frametype == AST_FRAME_VOICE && (payload_type == RTP_PT_PCMU || payload_type == RTP_PT_PCMA)) { + // Get time difference (interval). Skip the first packet since there is no way to compare with + gettimeofday(&later, NULL); + if (earlier.tv_sec != 0) { + time_delta(&later, &earlier, &difference); + // Write debug data into logbuf + if (difference.tv_usec < 1000) { + float d_usec = difference.tv_usec; + logbuf (&buff, "%d:%d:%f\n", payload_type, frame.seqno, ((difference.tv_sec * 1000) + (d_usec / 1000))); + } else { + logbuf (&buff, "%d:%d:%d\n", payload_type, frame.seqno, ((difference.tv_sec * 1000) + (difference.tv_usec / 1000))); + } + } + earlier = later; + } } ast_channel_unref(owner); }