+ struct count_info info;
+ size_t bpos, n, total;
+ assert(s && u);
+
+ if (ioctl(u->fd, SNDCTL_DSP_GETOPTR, &info) < 0) {
+ pa_log(__FILE__": SNDCTL_DSP_GETOPTR: %s", pa_cstrerror(errno));
+ return 0;
+ }
+
+ u->out_blocks_saved += info.blocks;
+
+ total = u->out_fragments * u->out_fragment_size;
+ bpos = ((u->out_current + u->out_blocks_saved) * u->out_fragment_size) % total;
+
+ if (bpos <= (size_t) info.ptr)
+ n = total - (info.ptr - bpos);
+ else
+ n = bpos - info.ptr;
+
+/* pa_log("n = %u, bpos = %u, ptr = %u, total=%u, fragsize = %u, n_frags = %u\n", n, bpos, (unsigned) info.ptr, total, u->out_fragment_size, u->out_fragments); */
+
+ return pa_bytes_to_usec(n, &s->sample_spec);
+}
+
+static pa_usec_t source_get_latency_cb(pa_source *s) {
+ struct userdata *u = s->userdata;
+ struct count_info info;
+ size_t bpos, n, total;