codevise/pageflow

View on GitHub
package/src/frontend/mediaPlayer/volumeBinding.js

Summary

Maintainability
A
3 hrs
Test Coverage
export const volumeBinding = function(player, settings, options) {
  options = options || {};

  var originalPlay = player.play;
  var originalPause = player.pause;

  var volumeFactor = 'volumeFactor' in options ? options.volumeFactor : 1;

  player.play = function() {
    player.intendToPlay();
    player.volume(player.targetVolume());
    listenToVolumeSetting();

    return originalPlay.call(player);
  };

  player.playAndFadeIn = function(duration) {
    if (!player.paused() && !player.intendingToPause()) {
      return Promise.resolve();
    }

    player.intendToPlay();
    player.volume(0);

    return Promise.all([originalPlay.call(player)]).then(function() {
      listenToVolumeSetting();
      return player.ifIntendingToPlay().then(function() {
        return player.fadeVolume(player.targetVolume(), duration).then(null, function() {
          return Promise.resolve();
        });
      });
    });
  };

  player.pause = function() {
    stopListeningToVolumeSetting();
    originalPause.call(player);
  };

  player.fadeOutAndPause = function(duration) {
    if (player.paused() && !player.intendingToPlay()) {
      return Promise.resolve();
    }

    player.intendToPause();
    stopListeningToVolumeSetting();

    return player.fadeVolume(0, duration).then(function() {
      return player.ifIntendingToPause().then(function() {
        originalPause.call(player);
      });
    });
  };

  player.changeVolumeFactor = function(factor, duration) {
    volumeFactor = factor;
    return player.fadeVolume(player.targetVolume(), duration);
  };

  player.targetVolume = function() {
    return (options.ignoreVolumeSetting ? 1 : settings.get('volume')) * volumeFactor;
  };

  function listenToVolumeSetting() {
    player.on('dispose', stopListeningToVolumeSetting);
    settings.on('change:volume', onVolumeChange);
  }

  function stopListeningToVolumeSetting() {
    player.off('dispose', stopListeningToVolumeSetting);
    settings.off('change:volume', onVolumeChange);
  }

  function onVolumeChange(model, value) {
    player.fadeVolume(player.targetVolume(), 40);
  }
};