[Spice-devel] [spice-html5 2/6] Add tools for debugging media source playback events.

Jeremy White jwhite at codeweavers.com
Fri Jul 1 20:03:02 UTC 2016


Signed-off-by: Jeremy White <jwhite at codeweavers.com>
---
 playback.js | 63 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 utils.js    | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 115 insertions(+), 1 deletion(-)

diff --git a/playback.js b/playback.js
index 36e6611..96efb08 100644
--- a/playback.js
+++ b/playback.js
@@ -72,6 +72,7 @@ SpicePlaybackConn.prototype.process_channel_message = function(msg)
             this.media_source.spiceconn = this;
 
             this.audio = document.createElement("audio");
+            this.audio.spiceconn = this;
             this.audio.setAttribute('autoplay', true);
             this.audio.src = window.URL.createObjectURL(this.media_source);
             document.getElementById(this.parent.screen_id).appendChild(this.audio);
@@ -240,6 +241,12 @@ function handle_source_open(e)
         p.log_err('Codec ' + SPICE_PLAYBACK_CODEC + ' not available.');
         return;
     }
+
+    if (PLAYBACK_DEBUG > 0)
+        playback_handle_event_debug.call(this, e);
+
+    listen_for_audio_events(p);
+
     p.source_buffer.spiceconn = p;
     p.source_buffer.mode = "segments";
 
@@ -263,9 +270,13 @@ function handle_source_closed(e)
     p.log_err('Audio source unexpectedly closed.');
 }
 
-function handle_append_buffer_done(b)
+function handle_append_buffer_done(e)
 {
     var p = this.spiceconn;
+
+    if (PLAYBACK_DEBUG > 1)
+        playback_handle_event_debug.call(this, e);
+
     if (p.queue.length > 0)
     {
         var mb = p.queue.shift();
@@ -294,3 +305,53 @@ function playback_append_buffer(p, b)
         p.log_err("Error invoking appendBuffer: " + e.message);
     }
 }
+
+function playback_handle_event_debug(e)
+{
+    var p = this.spiceconn;
+    if (p.audio)
+    {
+        if (PLAYBACK_DEBUG > 0 || p.audio.buffered.len > 1)
+            console.log(p.audio.currentTime + ": event " + e.type +
+                dump_media_element(p.audio));
+    }
+
+    if (PLAYBACK_DEBUG > 1 && p.media_source)
+        console.log("  media_source " + dump_media_source(p.media_source));
+
+    if (PLAYBACK_DEBUG > 1 && p.source_buffer)
+        console.log("  source_buffer " + dump_source_buffer(p.source_buffer));
+
+    if (PLAYBACK_DEBUG > 0 || p.queue.length > 1)
+        console.log('  queue len ' + p.queue.length + '; append_okay: ' + p.append_okay);
+}
+
+function playback_debug_listen_for_one_event(name)
+{
+    this.addEventListener(name, playback_handle_event_debug);
+}
+
+function listen_for_audio_events(spiceconn)
+{
+    var audio_0_events = [
+        "abort", "error"
+    ];
+
+    var audio_1_events = [
+        "loadstart", "suspend", "emptied", "stalled", "loadedmetadata", "loadeddata", "canplay",
+        "canplaythrough", "playing", "waiting", "seeking", "seeked", "ended", "durationchange",
+        "timeupdate", "play", "pause", "ratechange"
+    ];
+
+    var audio_2_events = [
+        "progress",
+        "resize",
+        "volumechange"
+    ];
+
+    audio_0_events.forEach(playback_debug_listen_for_one_event, spiceconn.audio);
+    if (PLAYBACK_DEBUG > 0)
+        audio_1_events.forEach(playback_debug_listen_for_one_event, spiceconn.audio);
+    if (PLAYBACK_DEBUG > 1)
+        audio_2_events.forEach(playback_debug_listen_for_one_event, spiceconn.audio);
+}
diff --git a/utils.js b/utils.js
index 44f9679..2583666 100644
--- a/utils.js
+++ b/utils.js
@@ -264,3 +264,56 @@ function keycode_to_end_scan(code)
         return 0x80e0 | ((scancode - 0x100) << 8);
     }
 }
+
+function dump_media_element(m)
+{
+    var ret =
+            "[networkState " + m.networkState +
+            "|readyState " + m.readyState +
+            "|error " + m.error +
+            "|seeking " + m.seeking +
+            "|duration " + m.duration +
+            "|paused " + m.paused +
+            "|ended " + m.error +
+            "|buffered " + dump_timerange(m.buffered) +
+            "]";
+    return ret;
+}
+
+function dump_media_source(ms)
+{
+    var ret =
+            "[duration " + ms.duration +
+            "|readyState " + ms.readyState + "]";
+    return ret;
+}
+
+function dump_source_buffer(sb)
+{
+    var ret =
+            "[appendWindowStart " + sb.appendWindowStart +
+            "|appendWindowEnd " + sb.appendWindowEnd +
+            "|buffered " + dump_timerange(sb.buffered) +
+            "|timeStampOffset " + sb.timeStampOffset +
+            "|updating " + sb.updating +
+            "]";
+    return ret;
+}
+
+function dump_timerange(tr)
+{
+    var ret;
+
+    if (tr)
+    {
+        var i = tr.length;
+        ret = "{len " + i;
+        if (i > 0)
+            ret += "; start " + tr.start(0) + "; end " + tr.end(i - 1);
+        ret += "}";
+    }
+    else
+        ret = "N/A";
+
+    return ret;
+}
-- 
2.1.4



More information about the Spice-devel mailing list