[player] Rename ticks to overrun and safeguard against decreasing from 0

This commit is contained in:
ejurgensen 2016-02-11 20:02:17 +01:00
parent 5f5a138c77
commit 62eb1a067d

View File

@ -76,7 +76,7 @@
// Default volume (must be from 0 - 100) // Default volume (must be from 0 - 100)
#define PLAYER_DEFAULT_VOLUME 50 #define PLAYER_DEFAULT_VOLUME 50
// Used to keep the player from getting ahead of a rate limited source (see below) // Used to keep the player from getting ahead of a rate limited source (see below)
#define PLAYER_TICKS_MAX_DELAY 2 #define PLAYER_TICKS_MAX_OVERRUN 2
// Skips ticks for about 2 secs (seems to bring us back in sync for about 20 min) // Skips ticks for about 2 secs (seems to bring us back in sync for about 20 min)
#define PLAYER_TICKS_SKIP 126 #define PLAYER_TICKS_SKIP 126
@ -1613,24 +1613,24 @@ static void
player_playback_cb(int fd, short what, void *arg) player_playback_cb(int fd, short what, void *arg)
{ {
struct timespec next_tick; struct timespec next_tick;
uint64_t ticks; uint64_t overrun;
uint32_t packet_send_count; uint32_t packet_send_count;
int ret; int ret;
// Check if we missed any timer expirations // Check if we missed any timer expirations
ticks = 0; overrun = 0;
#if defined(__linux__) #if defined(__linux__)
ret = read(fd, &ticks, sizeof(ticks)); ret = read(fd, &overrun, sizeof(overrun));
if (ret <= 0) if (ret <= 0)
DPRINTF(E_LOG, L_PLAYER, "Error reading timer\n"); DPRINTF(E_LOG, L_PLAYER, "Error reading timer\n");
else else if (overrun > 0)
ticks--; overrun--;
#else #else
ret = timer_getoverrun(pb_timer); ret = timer_getoverrun(pb_timer);
if (ret < 0) if (ret < 0)
DPRINTF(E_LOG, L_PLAYER, "Error getting timer overrun\n"); DPRINTF(E_LOG, L_PLAYER, "Error getting timer overrun\n");
else else
ticks = ret; overrun = ret;
#endif /* __linux__ */ #endif /* __linux__ */
// The reason we get behind the playback timer may be that we are playing a // The reason we get behind the playback timer may be that we are playing a
@ -1642,9 +1642,9 @@ player_playback_cb(int fd, short what, void *arg)
// the source catch up. RTP destinations should be able to handle this // the source catch up. RTP destinations should be able to handle this
// gracefully if we just give them an rtptime that lets them know that some // gracefully if we just give them an rtptime that lets them know that some
// packets were "lost". // packets were "lost".
if (ticks > PLAYER_TICKS_MAX_DELAY) if (overrun > PLAYER_TICKS_MAX_OVERRUN)
{ {
DPRINTF(E_WARN, L_PLAYER, "Behind the playback timer with %" PRIu64 " ticks, initiating catch up\n", ticks); DPRINTF(E_WARN, L_PLAYER, "Behind the playback timer with %" PRIu64 " ticks, initiating catch up\n", overrun);
ticks_skip = 2 * PLAYER_TICKS_SKIP + 1; ticks_skip = 2 * PLAYER_TICKS_SKIP + 1;
} }
else if (ticks_skip > 0) else if (ticks_skip > 0)
@ -1652,7 +1652,7 @@ player_playback_cb(int fd, short what, void *arg)
// Decide how many packets to send // Decide how many packets to send
next_tick = timespec_add(pb_timer_last, tick_interval); next_tick = timespec_add(pb_timer_last, tick_interval);
for (; ticks > 0; ticks--) for (; overrun > 0; overrun--)
next_tick = timespec_add(next_tick, tick_interval); next_tick = timespec_add(next_tick, tick_interval);
packet_send_count = 0; packet_send_count = 0;