     {
         // TODO.. maybe just redispatch
         log.warning("player error: " + event.value);
+    }
+
+    protected function adjustSeek (trackX :Number) :void
+    {
+        // see if we can seek to a position
+        const dur :Number = _player.getDuration();
+        if (isNaN(dur)) {
+            log.debug("Duration is NaN, not seeking.");
+            return;
+        }
+        if (trackX == _lastKnobX) {
+            return;
+        }
+        _lastKnobX = trackX;
+        var perc :Number = trackX / TRACK_WIDTH;
+        perc = Math.max(0, Math.min(1, perc));
+        log.debug("Seek", "x", trackX, "perc", perc, "pos", (perc * dur));
+        _player.seek(perc * dur);
     }
 
     protected function showHUD (show :Boolean) :void


    protected function handlePlayerPosition (event :ValueEvent) :void
    {
        const pos :Number = Number(event.value);
        _knob.x = (pos / _player.getDuration()) * TRACK_WIDTH;
        if (_knob.parent == null) {


        _track.addEventListener(MouseEvent.CLICK, handleTrackClick);
        _knob.addEventListener(MouseEvent.MOUSE_DOWN, handleKnobDown);
    }

    /**
