anchor.diff:                                                 (parameter-revision-vendor revision)
                                                  (parameter-revision-stepping revision)))))
   
  -(defun enumerate-codec (hda cad)
  -  (let ((root-subs (command hda cad +root-nid+ (make-parameter +parameter-subordinates+)))
  -        (viddid (command hda cad +root-nid+ (make-parameter +parameter-viddid+))))
  -    (format t "ROOT ~D: ~4,'0X ~4,'0X~%" cad
  -            (parameter-viddid-vendor viddid)
  -            (parameter-viddid-device viddid))
  -    (loop for function-nid from (parameter-subordinates-starting-node root-subs)
  -       below (+ (parameter-subordinates-starting-node root-subs)
  -                (parameter-subordinates-total root-subs))
  -       do (let ((subs (command hda cad function-nid (make-parameter +parameter-subordinates+)))
  -                (type (command hda cad function-nid (make-parameter +parameter-function-group+))))
  -            (format t "  ~D ~A:~%"
  -                    function-nid
  -                    (case (parameter-function-group-node-type type)
  -                      (#.+parameter-function-group-node-type-audio+ 'audio)
  -                      (#.+parameter-function-group-node-type-vendor-defined-modem+ 'modem)
  -                      (t (parameter-function-group-node-type type))))
  -            (when (eql (parameter-function-group-node-type type) +parameter-function-group-node-type-audio+)
  -              (loop for widget-nid from (parameter-subordinates-starting-node subs)
  -                 below (+ (parameter-subordinates-starting-node subs)
  -                          (parameter-subordinates-total subs))
  -                 do (let ((caps (command hda cad widget-nid (make-parameter +parameter-audio-widget-capabilities+))))
  -                      (format t "    ~D ~A. Connected to: ~S~%" widget-nid
  -                              (case (parameter-audio-widget-capabilities-type caps)
  -                                (#.+parameter-audio-widget-capabilities-type-output+ 'output)
  -                                (#.+parameter-audio-widget-capabilities-type-input+ 'input)
  -                                (#.+parameter-audio-widget-capabilities-type-mixer+ 'mixer)
  -                                (#.+parameter-audio-widget-capabilities-type-selector+ 'selector)
  -                                (#.+parameter-audio-widget-capabilities-type-pin-complex+ 'pin-complex)
  -                                (#.+parameter-audio-widget-capabilities-type-power+ 'power)
  -                                (#.+parameter-audio-widget-capabilities-type-volume-knob+ 'volume-knob)
  -                                (#.+parameter-audio-widget-capabilities-type-beep-generator+ 'beep-generator)
  -                                (#.+parameter-audio-widget-capabilities-type-vendor-defined+ 'vendor-defined)
  -                                (t (parameter-audio-widget-capabilities-type caps)))
  -                              (get-connections hda cad widget-nid)))))))))
  -
  -(defun get-connections (hda cad nid)
  -  (let* ((len (command hda cad nid (make-parameter +parameter-connection-list-length+)))
  +
  +(defgeneric enumerate-widget (widget))
  +
  +(defmethod enumerate-widget ((widget widget)))
  +
  +(defmethod enumerate-widget :after ((widget widget-connections-mixin))
  +  (setf (slot-value widget 'connections)
  +        (loop for c in (get-connections widget)
  +           collect (find c (widgets (function-group widget)) :key #'nid))))
  +
  +(defmethod enumerate-widget :after ((widget audio-pin-complex))
  +  (let ((config (command (hda widget) (cad widget) (nid widget) #xF1C00)))
  +    (setf (slot-value widget 'pin-location) (decode-pin-location (ldb (byte 6 24) config))
  +          (slot-value widget 'pin-default-device) (aref *pin-default-device* (ldb (byte 4 20) config))
  +          (slot-value widget 'pin-connection-type) (aref *pin-connection-type* (ldb (byte 4 16) config))
  +          (slot-value widget 'pin-colour) (aref *pin-colour* (ldb (byte 4 12) config)))))
  +
  +(defun get-connections (widget)
  +  (let* ((hda (hda widget))
  +         (cad (cad widget))
  +         (nid (nid widget))
  +         (len (parameter widget +parameter-connection-list-length+))
            (n-entries (parameter-connection-list-length-length len))
            (entries (if (not (zerop (parameter-connection-list-length-long-form len)))
                         (loop for i from 0 below (ceiling n-entries 2)
  
positive.code: (defmethod function-group-class ((type (eql #.+parameter-function-group-node-type-audio+)))
    'audio-function-group)
  
  (defgeneric widget-class (function-group type))
  (defmethod widget-class (function-group type)
    'widget)
  
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-output+)))
    'audio-output-converter)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-input+)))
    'audio-input-converter)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-mixer+)))
    'audio-mixer)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-selector+)))
    'audio-selector)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-pin-complex+)))
    'audio-pin-complex)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-power+)))
    'audio-power-control)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-volume-knob+)))
    'audio-volume-knob)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-beep-generator+)))
    'audio-beep-generator)
  (defmethod widget-class ((function-group audio-widget)
                           (type (eql #.+parameter-audio-widget-capabilities-type-vendor-defined+)))
    'audio-vendor-defined)
  
  (defun pin-location (location)
    "Decode a pin location byte."
    (case location
      (#x00 "External")
  
negative.code:     "White"
      "Other"))
  
  (defun parameter (node parameter)
    (command (hda node) (cad node) (nid node) (make-parameter parameter)))
  
  (defmethod initialize-instance :after ((node root-node) &rest initargs)
    (let* ((subs (parameter node +parameter-subordinates+))
           (viddid (parameter node +parameter-viddid+))
  