add volume management

This commit is contained in:
grunjol
2016-03-22 19:44:44 -03:00
parent 9518670c7b
commit fc6d8e7b7d
4 changed files with 46 additions and 0 deletions

View File

@@ -18,4 +18,8 @@ function init () {
// Electron does not support multiple accelerators for a single menu item, so this // Electron does not support multiple accelerators for a single menu item, so this
// is registered separately here. // is registered separately here.
localShortcut.register('CmdOrCtrl+Shift+F', menu.toggleFullScreen) localShortcut.register('CmdOrCtrl+Shift+F', menu.toggleFullScreen)
// Control Volume
globalShortcut.register('CmdOrCtrl+Up', () => windows.main.send('dispatch', 'changeVolume', 0.1))
globalShortcut.register('CmdOrCtrl+Down', () => windows.main.send('dispatch', 'changeVolume', -0.1))
} }

View File

@@ -236,6 +236,9 @@ function dispatch (action, ...args) {
if (action === 'playbackJump') { if (action === 'playbackJump') {
jumpToTime(args[0] /* seconds */) jumpToTime(args[0] /* seconds */)
} }
if (action === 'changeVolume') {
changeVolume(args[0] /* increase */)
}
if (action === 'mediaPlaying') { if (action === 'mediaPlaying') {
state.playing.isPaused = false state.playing.isPaused = false
ipcRenderer.send('blockPowerSave') ipcRenderer.send('blockPowerSave')
@@ -280,6 +283,22 @@ function jumpToTime (time) {
} }
} }
function changeVolume (delta) {
// change volume with delta value
setVolume(state.playing.volume + delta)
}
function setVolume (volume) {
// check if its in [0.0 - 1.0] range
volume = Math.max(0, Math.min(1, volume))
if (Cast.isCasting()) {
Cast.setVolume(volume)
} else {
state.playing.setVolume = volume
update()
}
}
function setupIpc () { function setupIpc () {
ipcRenderer.send('ipcReady') ipcRenderer.send('ipcReady')

View File

@@ -14,6 +14,7 @@ module.exports = {
stopCasting, stopCasting,
playPause, playPause,
seek, seek,
setVolume,
isCasting isCasting
} }
@@ -59,12 +60,16 @@ function pollCastStatus (state) {
if (err) return console.log('Error getting %s status: %o', state.playing.location, err) if (err) return console.log('Error getting %s status: %o', state.playing.location, err)
state.playing.isPaused = status.playerState === 'PAUSED' state.playing.isPaused = status.playerState === 'PAUSED'
state.playing.currentTime = status.currentTime state.playing.currentTime = status.currentTime
state.playing.volume = status.volume.muted ? 0 : status.volume.level
update() update()
}) })
} else if (state.playing.location === 'airplay') { } else if (state.playing.location === 'airplay') {
state.devices.airplay.status(function (status) { state.devices.airplay.status(function (status) {
state.playing.isPaused = status.rate === 0 state.playing.isPaused = status.rate === 0
state.playing.currentTime = status.position state.playing.currentTime = status.position
// TODO: get airplay volume, implementation needed. meanwhile set value in setVolume
// According to docs is in [-30 - 0] (db) range
// should be converted to [0 - 1] using (val / 30 + 1)
update() update()
}) })
} }
@@ -154,6 +159,17 @@ function seek (time) {
} }
} }
function setVolume (volume) {
if (state.playing.location === 'chromecast') {
state.devices.chromecast.volume(volume, castCallback)
} else if (state.playing.location === 'airplay') {
// TODO remove line below once we can fetch the information in status update
state.playing.volume = volume
volume = (volume - 1) * 30
state.devices.airplay.volume(volume, castCallback)
}
}
function castCallback () { function castCallback () {
console.log(state.playing.location + ' callback: %o', arguments) console.log(state.playing.location + ' callback: %o', arguments)
} }

View File

@@ -38,8 +38,15 @@ function renderMedia (state, dispatch) {
mediaElement.currentTime = state.playing.jumpToTime mediaElement.currentTime = state.playing.jumpToTime
state.playing.jumpToTime = null state.playing.jumpToTime = null
} }
// set volume
if (state.playing.setVolume !== null && isFinite(state.playing.setVolume)) {
mediaElement.volume = state.playing.setVolume
state.playing.setVolume = null
}
state.playing.currentTime = mediaElement.currentTime state.playing.currentTime = mediaElement.currentTime
state.playing.duration = mediaElement.duration state.playing.duration = mediaElement.duration
state.playing.volume = mediaElement.volume
} }
// Create the <audio> or <video> tag // Create the <audio> or <video> tag