Index: /rat/trunk/source.c
===================================================================
--- /rat/trunk/source.c (revision 2231)
+++ /rat/trunk/source.c (revision 2240)
@@ -616,7 +616,17 @@
 source_get_audio_buffered (source *src)
 {
-        /* To be written */
-        UNUSED(src);
-        return (ts_map32(8000,0));
+        ts_t start, end;
+
+        /* Total audio buffered is start of media buffer
+         * to end of channel buffer.
+         */
+
+        if (pb_get_start_ts(src->media, &start) &&
+            pb_get_end_ts(src->channel, &end)) {
+                assert(ts_gt(end, start));
+                return ts_sub(end, start);
+        }
+
+        return ts_map32(8000,0);
 }
 
@@ -624,7 +634,17 @@
 source_get_playout_delay (source *src)
 {
-        /* To be written */
-        UNUSED(src);
-        return (ts_map32(8000,0));
+        ts_t start, end;
+
+        /* Current playout is pretty close to src->media_pos point,
+         * delay is diff between this and last packet received.
+         */
+
+        if (pb_get_start_ts(src->channel,  &start) &&
+            pb_get_end_ts(src->channel, &end)) {
+                assert(ts_gt(end, start));
+                return ts_sub(end, start);
+        }
+
+        return ts_map32(8000,0);
 }
 
Index: /rat/trunk/playout.c
===================================================================
--- /rat/trunk/playout.c (revision 2230)
+++ /rat/trunk/playout.c (revision 2240)
@@ -447,2 +447,42 @@
         return TRUE;
 }
+
+/* Timestamp info functions **************************************************/
+
+__inline int
+pb_get_start_ts(pb_t *pb, ts_t *ts)
+{
+        assert(pb);
+        assert(ts);
+
+        if (pb->sentinel.next != pb->psentinel) {
+                *ts = pb->sentinel.next->playout;
+                return TRUE;
+        }
+        return FALSE;
+}
+
+__inline int
+pb_get_end_ts(pb_t *pb, ts_t *ts)
+{
+        assert(pb);
+        assert(ts);
+
+        if (pb->sentinel.prev != pb->psentinel) {
+                *ts = pb->sentinel.prev->playout;
+                return TRUE;
+        }
+        return FALSE;
+}
+
+__inline int
+pb_iterator_get_ts(pb_iterator_t *pbi, ts_t *ts)
+{
+        assert(pbi);
+        assert(ts);
+        if (pbi->node != pbi->buffer->psentinel) {
+                *ts = pbi->node->playout;
+                return TRUE;
+        }
+        return FALSE;
+}
Index: /rat/trunk/playout.h
===================================================================
--- /rat/trunk/playout.h (revision 2216)
+++ /rat/trunk/playout.h (revision 2240)
@@ -126,7 +126,10 @@
              ts_t         now);
 
-/* Return the times of interest for playout buffer */
-ts_t pb_iterator_get_ts (struct s_pb *pb);
-ts_t pb_get_end_ts      (struct s_pb *pb);
+/* Return the times of interest for playout buffer in ts, returns
+ * TRUE or FALSE depending on whether request successful
+ */
+__inline int pb_get_start_ts     (struct s_pb *pb, ts_t *ts);
+__inline int pb_get_end_ts       (struct s_pb *pb, ts_t *ts);
+__inline int pb_iterator_get_ts  (struct s_pb_iterator *pbi, ts_t *ts);
 
 #endif /* __UCLMM_PLAYOUT_BUFFER_H__ */
