From: <tr...@ff...> - 2014-05-13 12:31:53
|
Author: jwoithe Date: 2014-05-13 05:31:43 -0700 (Tue, 13 May 2014) New Revision: 2528 Modified: trunk/libffado/src/libieee1394/IsoHandlerManager.cpp trunk/libffado/src/libieee1394/IsoHandlerManager.h Log: IsoHandler::getPacket(): when keeping tabs of the last cycle, allow for cases where the m_Client indicates that handling of the cycle should be deferred. If this is ignored and m_last_cycle is set regardless, the dropped packet logic will be triggered when the cycle is requested again at some later time because the cycle count - when compared to the stored m_last_cycle - will appear to have gone backwards. This may go some way toward addressing ticket #379, although at the time of writing this is yet to be confirmed. Modified: trunk/libffado/src/libieee1394/IsoHandlerManager.cpp =================================================================== --- trunk/libffado/src/libieee1394/IsoHandlerManager.cpp 2014-05-09 13:06:38 UTC (rev 2527) +++ trunk/libffado/src/libieee1394/IsoHandlerManager.cpp 2014-05-13 12:31:43 UTC (rev 2528) @@ -1310,6 +1310,7 @@ , m_skipped( 0 ) , m_min_ahead( 7999 ) #endif + , m_deferred_cycles( 0 ) { pthread_mutex_init(&m_disable_lock, NULL); } @@ -1684,6 +1685,9 @@ } #endif + if (m_last_cycle == -1) + m_deferred_cycles = 0; + // keep track of dropped cycles int dropped_cycles = 0; if (m_last_cycle != cycle && m_last_cycle != -1) { @@ -1692,6 +1696,12 @@ // since those are not dropped, but only delayed dropped_cycles -= skipped; + // Correct for cycles previously seen but deferred + if (dropped_cycles == 0) + m_deferred_cycles = 0; + else + dropped_cycles -= m_deferred_cycles; + #ifdef DEBUG if(skipped) { debugOutput(DEBUG_LEVEL_VERY_VERBOSE, @@ -1711,17 +1721,13 @@ } #endif } - if (cycle >= 0) { - m_last_cycle = cycle; - - #ifdef DEBUG -/* int ahead = diffCycles(cycle, now_cycles); - if (ahead < m_min_ahead) m_min_ahead = ahead; -*/ - #endif - } #ifdef DEBUG +// if (cycle >= 0) { +// int ahead = diffCycles(cycle, now_cycles); +// if (ahead < m_min_ahead) m_min_ahead = ahead; +// } + if (dropped > 0) { debugOutput(DEBUG_LEVEL_VERBOSE, "(%p) OHCI issue on cycle %u (dropped_cycles=%d, last_cycle=%u, dropped=%d, skipped: %d)\n", @@ -1738,9 +1744,18 @@ this, getTypeString(), *length, m_max_packet_size); } #endif - return retval; + if (cycle >= 0) { + if (retval!=RAW1394_ISO_DEFER && retval!=RAW1394_ISO_AGAIN) { + m_last_cycle = cycle; + } else + m_deferred_cycles++; + } + return retval; } + if (cycle >= 0) + m_last_cycle = cycle; + *tag = 0; *sy = 0; *length = 0; Modified: trunk/libffado/src/libieee1394/IsoHandlerManager.h =================================================================== --- trunk/libffado/src/libieee1394/IsoHandlerManager.h 2014-05-09 13:06:38 UTC (rev 2527) +++ trunk/libffado/src/libieee1394/IsoHandlerManager.h 2014-05-13 12:31:43 UTC (rev 2528) @@ -233,6 +233,7 @@ unsigned int m_skipped; int m_min_ahead; #endif + unsigned int m_deferred_cycles; protected: DECLARE_DEBUG_MODULE; |