packages feed

tianbar-0.4.2.0: scripts/volume.js

/*
 * A widget to show and control the system volume.
 *
 * Requires 'jquery' to be available through RequireJS.
 */
define(['jquery', './socket'], function ($, socket) {
  "use strict";

  var UID_RE = /Uid:\t(\d+)/;

  var VOLUME_RE = /set-sink-volume.+ ([^ \n]+)/;
  var MUTE_RE = /set-sink-mute.+ ([^ \n]+)/;

  var MAX_VOLUME = 0x10000;

  var WAVES = 5;

  function uid() {
    return $.ajax('/proc/self/status')
    .then(function (result) {
      return +UID_RE.exec(result)[1];
    });
  }

  uid().then(function (uid) {
    return socket('/var/run/user/' + uid + '/pulse/cli');
  }).done(function (pulseSocket) {
    pulseSocket.recv.add(function (dump) {
      var mute = MUTE_RE.exec(dump)[1] === "yes";
      var volume = parseInt(VOLUME_RE.exec(dump)[1], 16) / MAX_VOLUME;

      var widget = $('.widget-volume');
      widget.empty();

      var speaker = $('<div />').css({
        'float': 'left',
        'border-top': '4px solid transparent',
        'border-bottom': '4px solid transparent',
        'border-right': '5px solid black',
        'margin-top': 5,
        'margin-bottom': 5,
        'margin-right': 2
      }).append($('<div />').css({
        'background': 'black',
        'width': 4,
        'height': 5
      }));
      widget.append(speaker);

      var waves = $('<div />').css({
        'float': 'left',
        'height': '100%',
        'margin-top': 5,
        'margin-bottom': 5,
        'width': 12
      });
      if (mute) {
        waves.append('x');
      } else {
        for (var i = 0; i < volume * WAVES; i ++) {
          var waveSize = 6 + i * 2;
          var margin = 10 - waveSize / 2;
          var wave = $('<div />').css({
            'display': 'inline-block',
            'width': 1,
            'height': waveSize,
            'margin': 1,
            'background': 'black',
            'margin-bottom': margin
          });
          waves.append(wave);
        }
      }
      widget.append(waves);

      var percentage = volume.toFixed(2) * 100;
      widget.attr('title', percentage + '%');

      window.setTimeout(requestDump, 1000);
    });

    function requestDump () {
      pulseSocket.send('dump\n');
    }

    requestDump();
  });
});