code: function () {
        if (this.state === 'playing') return;
        if ( this.loading() || this.recording.blank() ) return;
  
        this.state = 'playing';
        this.controller.connection.protocol = this.playbackProtocol;
  
        var player = this;
  
        // prevent the normal controller response while playing
        this.controller.connection.removeAllListeners('frame');
        this.controller.connection.on('frame', function (frame) {
          // resume play when hands are removed:
          if (player.autoPlay && player.state == 'idle' && frame.hands.length == 0) {
            player.play();
          }
  
          // The default LeapJS callback processes the frame, which is what we do now:
          player.controller.processFrame(frame);
        });
  
        // Kick off
        this.resetTimers();
        this.recording.readyPlay();
        this.stepFrameLoop();
  
        this.controller.emit('playback.play', this);
      }
docs: /* Plays back the provided frame data
  Params {object|boolean}:
  - frames: previously recorded frame json
  - loop: whether or not to loop playback.  Defaults to true.