network_beforepoll() has been called. Guaranteeing that assumption be
met would contradict it always being safe to call speaker_play().
/* We transmit using RTP (RFC3550) and attempt to conform to the internet
* AVT profile (RFC3551). */
/* We transmit using RTP (RFC3550) and attempt to conform to the internet
* AVT profile (RFC3551). */
+ /* If we're starting then initialize the base time */
+ if(!rtp_time)
+ xgettimeofday(&rtp_time_0, 0);
if(idled) {
/* There may have been a gap. Fix up the RTP time accordingly. */
struct timeval now;
if(idled) {
/* There may have been a gap. Fix up the RTP time accordingly. */
struct timeval now;
xgettimeofday(&now, 0);
/* Find the number of microseconds elapsed since rtp_time=0 */
delta = tvsub_us(now, rtp_time_0);
xgettimeofday(&now, 0);
/* Find the number of microseconds elapsed since rtp_time=0 */
delta = tvsub_us(now, rtp_time_0);
- assert(delta <= UINT64_MAX / 88200);
+ if(delta > UINT64_MAX / 88200)
+ fatal(0, "rtp_time=%llu now=%ld.%06ld rtp_time_0=%ld.%06ld delta=%llu (%lld)",
+ rtp_time,
+ (long)now.tv_sec, (long)now.tv_usec,
+ (long)rtp_time_0.tv_sec, (long)rtp_time_0.tv_usec,
+ delta, delta);
target_rtp_time = (delta * config->sample_format.rate
* config->sample_format.channels) / 1000000;
/* Overflows at ~6 years uptime with 44100Hz stereo */
target_rtp_time = (delta * config->sample_format.rate
* config->sample_format.channels) / 1000000;
/* Overflows at ~6 years uptime with 44100Hz stereo */
/* We send audio data whenever we would otherwise get behind */
xgettimeofday(&now, 0);
target_us = tvsub_us(now, rtp_time_0);
/* We send audio data whenever we would otherwise get behind */
xgettimeofday(&now, 0);
target_us = tvsub_us(now, rtp_time_0);
- assert(target_us <= UINT64_MAX / 88200);
+ if(target_us > UINT64_MAX / 88200)
+ fatal(0, "rtp_time=%llu rtp_time_0=%ld.%06ld now=%ld.%06ld target_us=%llu (%lld)\n",
+ rtp_time,
+ (long)rtp_time_0.tv_sec, (long)rtp_time_0.tv_usec,
+ (long)now.tv_sec, (long)now.tv_usec,
+ target_us, target_us);
target_rtp_time = (target_us * config->sample_format.rate
* config->sample_format.channels)
/ 1000000;
target_rtp_time = (target_us * config->sample_format.rate
* config->sample_format.channels)
/ 1000000;
*
* @p timeoutp points to the poll timeout value in milliseconds. It may be
* reduced, but never increased.
*
* @p timeoutp points to the poll timeout value in milliseconds. It may be
* reduced, but never increased.
+ *
+ * NB you can NOT assume that @c beforepoll is always called before @c play.
*/
void (*beforepoll)(int *timeoutp);
*/
void (*beforepoll)(int *timeoutp);