From 13f1ecdbe397ada7e50b823711c4417b3cd6f4f5 Mon Sep 17 00:00:00 2001 From: Thomas Watson Steen Date: Sat, 28 May 2016 19:50:30 +0200 Subject: [PATCH] Use airplayer (#452) * Use airplayer * Mock AirPlay volume support * Add AirPlay event support --- package.json | 2 +- renderer/lib/cast.js | 61 ++++++++++++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 20 deletions(-) diff --git a/package.json b/package.json index f6ca4430..c81096dc 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,7 @@ "url": "https://github.com/feross/webtorrent-desktop/issues" }, "dependencies": { - "airplay-js": "guerrerocarlos/node-airplay-js", + "airplayer": "^2.0.0", "application-config": "^0.2.1", "bitfield": "^1.0.2", "chromecasts": "^1.8.0", diff --git a/renderer/lib/cast.js b/renderer/lib/cast.js index 147f1250..14721e59 100644 --- a/renderer/lib/cast.js +++ b/renderer/lib/cast.js @@ -12,7 +12,7 @@ module.exports = { setRate } -var airplay = require('airplay-js') +var airplayer = require('airplayer')() var chromecasts = require('chromecasts')() var dlnacasts = require('dlnacasts')() @@ -41,10 +41,9 @@ function init (appState, callback) { state.devices.dlna = dlnaPlayer(player) }) - var browser = airplay.createBrowser() - browser.on('deviceOn', function (player) { + airplayer.on('update', function (player) { state.devices.airplay = airplayPlayer(player) - }).start() + }) } // chromecast player implementation @@ -129,13 +128,31 @@ function chromecastPlayer (player) { // airplay player implementation function airplayPlayer (player) { + function addEvents () { + player.on('event', function (event) { + switch (event.state) { + case 'loading': + break + case 'playing': + state.playing.isPaused = false + break + case 'paused': + state.playing.isPaused = true + break + case 'stopped': + break + } + update() + }) + } + function open () { - player.play(state.server.networkURL, 0, function (res) { - if (res.statusCode !== 200) { + player.play(state.server.networkURL, function (err, res) { + if (err) { state.playing.location = 'local' state.errors.push({ time: new Date().getTime(), - message: 'Could not connect to AirPlay.' + message: 'Could not connect to AirPlay. ' + err.message }) } else { state.playing.location = 'airplay' @@ -145,11 +162,11 @@ function airplayPlayer (player) { } function play (callback) { - player.rate(1, callback) + player.resume(callback) } function pause (callback) { - player.rate(0, callback) + player.pause(callback) } function stop (callback) { @@ -157,13 +174,18 @@ function airplayPlayer (player) { } function status () { - player.status(function (status) { - state.playing.isPaused = status.rate === 0 - 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() + player.playbackInfo(function (err, res, status) { + if (err) { + state.playing.location = 'local' + state.errors.push({ + time: new Date().getTime(), + message: 'Could not connect to AirPlay. ' + err.message + }) + } else { + state.playing.isPaused = status.rate === 0 + state.playing.currentTime = status.position + update() + } }) } @@ -172,12 +194,13 @@ function airplayPlayer (player) { } function volume (volume, callback) { - // TODO remove line below once we can fetch the information in status update + // AirPlay doesn't support volume + // TODO: We should just disable the volume slider state.playing.volume = volume - volume = (volume - 1) * 30 - player.volume(volume, callback) } + addEvents() + return { player: player, open: open,