+(defface squeeze-mixer-face
+ '((t :weight bold))
+ "Face for displaying mixer information"
+ :group 'squeeze)
+(defface squeeze-mixer-muted-face
+ '((t :weight light :inherit squeeze-mixer-face))
+ "Face for displaying mixer information when muted"
+ :group 'squeeze)
+(defface squeeze-mixer-quiet-face
+ '((t :foreground "green3" :inherit squeeze-mixer-face))
+ "Face for quiet volume"
+ :group 'squeeze)
+(defface squeeze-mixer-medium-face
+ '((t :foreground "gold" :inherit squeeze-mixer-face))
+ "Face for medium volume"
+ :group 'squeeze)
+(defface squeeze-mixer-loud-face
+ '((t :foreground "OrangeRed1" :inherit squeeze-mixer-face))
+ "Face for loud volume"
+ :group 'squeeze)
+(defface squeeze-mixer-muted-quiet-face
+ '((t :inherit (squeeze-mixer-muted-face squeeze-mixer-quiet-face)))
+ "Face for quiet volume when muted")
+
+(defun squeeze-mixer-compute-bar (vol width)
+ (let* ((exact (* width (/ vol 100.0)))
+ (nfull (floor exact))
+ (frac (- exact nfull))
+ (nblank (floor (- width exact))))
+ (format "%s%s%s"
+ (make-string nfull ?█)
+ (cond ((= width (+ nfull nblank)) "")
+ ((< frac 0.0625) " ")
+ ((< frac 0.1875) "▏")
+ ((< frac 0.3125) "▎")
+ ((< frac 0.4375) "▍")
+ ((< frac 0.5625) "▌")
+ ((< frac 0.6875) "▋")
+ ((< frac 0.8125) "▊")
+ ((< frac 0.9375) "▉")
+ (t "█"))
+ (make-string nblank ? ))))
+
+(defun squeeze-mixer-insert-bar (vol width)
+ (let ((bar (squeeze-mixer-compute-bar vol width))
+ (lo (floor (* 0.65 width)))
+ (hi (floor (* 0.9 width))))
+ (insert ?▕
+ (propertize (substring bar 0 lo) 'face 'squeeze-mixer-quiet-face)
+ (propertize (substring bar lo hi) 'face 'squeeze-mixer-medium-face)
+ (propertize (substring bar hi) 'face 'squeeze-mixer-loud-face)
+ ?▏
+ )))
+