From d7cbec1058977781df760fceaf2129efa48946e1 Mon Sep 17 00:00:00 2001 From: casey langen Date: Sat, 3 Jun 2017 01:31:14 -0700 Subject: [PATCH] Added notification from server -> client if playback time is changed by the user. --- src/core/audio/PlaybackService.cpp | 4 ++++ src/core/sdk/IPlaybackRemote.h | 1 + src/plugins/websocket_remote/Constants.h | 1 + .../websocket_remote/WebSocketServer.cpp | 18 +++++++++++++++ .../websocket_remote/WebSocketServer.h | 22 +++++++++++-------- src/plugins/websocket_remote/main.cpp | 4 ++++ .../win32globalhotkeys_plugin.cpp | 4 ++++ 7 files changed, 45 insertions(+), 9 deletions(-) diff --git a/src/core/audio/PlaybackService.cpp b/src/core/audio/PlaybackService.cpp index 48b2a53d9..45a81dbd1 100755 --- a/src/core/audio/PlaybackService.cpp +++ b/src/core/audio/PlaybackService.cpp @@ -353,6 +353,10 @@ void PlaybackService::ProcessMessage(IMessage &message) { } else if (type == MESSAGE_TIME_CHANGED) { this->TimeChanged(transport.Position()); + double volume = transport.Volume(); + for (auto remote : this->remotes) { + remote->OnPlaybackTimeChanged(transport.Position()); + } } else if (type == MESSAGE_NOTIFY_EDITED || type == MESSAGE_NOTIFY_RESET) diff --git a/src/core/sdk/IPlaybackRemote.h b/src/core/sdk/IPlaybackRemote.h index ff8b6fa05..e29e91589 100644 --- a/src/core/sdk/IPlaybackRemote.h +++ b/src/core/sdk/IPlaybackRemote.h @@ -45,6 +45,7 @@ namespace musik { namespace core { namespace sdk { virtual void SetPlaybackService(IPlaybackService* playback) = 0; virtual void OnTrackChanged(ITrack* track) = 0; virtual void OnPlaybackStateChanged(PlaybackState state) = 0; + virtual void OnPlaybackTimeChanged(double time) = 0; virtual void OnVolumeChanged(double volume) = 0; virtual void OnModeChanged(RepeatMode repeatMode, bool shuffled) = 0; virtual void OnPlayQueueChanged() = 0; diff --git a/src/plugins/websocket_remote/Constants.h b/src/plugins/websocket_remote/Constants.h index 36b29cc37..ded7787e7 100644 --- a/src/plugins/websocket_remote/Constants.h +++ b/src/plugins/websocket_remote/Constants.h @@ -137,6 +137,7 @@ namespace request { static const std::string seek_relative = "seek_relative"; static const std::string toggle_mute = "toggle_mute"; static const std::string get_playback_overview = "get_playback_overview"; + static const std::string get_current_time = "get_current_time"; static const std::string query_category = "query_category"; static const std::string query_tracks = "query_tracks"; static const std::string query_albums = "query_albums"; diff --git a/src/plugins/websocket_remote/WebSocketServer.cpp b/src/plugins/websocket_remote/WebSocketServer.cpp index 1a6aa7a19..d389fab4f 100644 --- a/src/plugins/websocket_remote/WebSocketServer.cpp +++ b/src/plugins/websocket_remote/WebSocketServer.cpp @@ -142,6 +142,10 @@ void WebSocketServer::OnPlaybackStateChanged(PlaybackState state) { this->BroadcastPlaybackOverview(); } +void WebSocketServer::OnPlaybackTimeChanged(double time) { + this->BroadcastPlaybackOverview(); +} + void WebSocketServer::OnVolumeChanged(double volume) { this->BroadcastPlaybackOverview(); } @@ -320,6 +324,11 @@ void WebSocketServer::HandleRequest(connection_hdl connection, json& request) { } else if (name == request::get_environment) { this->RespondWithEnvironment(connection, request); + return; + } + else if (name == request::get_current_time) { + this->RespondWithCurrentTime(connection, request); + return; } } @@ -752,6 +761,15 @@ void WebSocketServer::RespondWithEnvironment(connection_hdl connection, json& re }); } +void WebSocketServer::RespondWithCurrentTime(connection_hdl connection, json& request) { + auto track = context.playback->GetPlayingTrack(); + + this->RespondWithOptions(connection, request, { + { key::playing_current_time, context.playback->GetPosition() }, + { key::id, track ? track->GetId() : -1 } + }); +} + void WebSocketServer::BroadcastPlaybackOverview() { { auto rl = connectionLock.Read(); diff --git a/src/plugins/websocket_remote/WebSocketServer.h b/src/plugins/websocket_remote/WebSocketServer.h index 46a7efeb9..1aea003b9 100644 --- a/src/plugins/websocket_remote/WebSocketServer.h +++ b/src/plugins/websocket_remote/WebSocketServer.h @@ -58,6 +58,7 @@ class WebSocketServer { void OnTrackChanged(musik::core::sdk::ITrack* track); void OnPlaybackStateChanged(musik::core::sdk::PlaybackState state); + void OnPlaybackTimeChanged(double time); void OnVolumeChanged(double volume); void OnModeChanged(musik::core::sdk::RepeatMode repeatMode, bool shuffled); void OnPlayQueueChanged(); @@ -123,30 +124,33 @@ class WebSocketServer { void ThreadProc(); void HandleAuthentication(connection_hdl connection, json& request); void HandleRequest(connection_hdl connection, json& request); + void Broadcast(const std::string& name, json& options); void RespondWithOptions(connection_hdl connection, json& request, json& options); void RespondWithOptions(connection_hdl connection, json& request, json&& options = json({})); - void RespondWithSetVolume(connection_hdl connection, json& request); - void RespondWithPlaybackOverview(connection_hdl connection, json& reuest); - bool RespondWithTracks(connection_hdl connection, json& request, ITrackList* tracks, int limit, int offset); - void GetLimitAndOffset(json& options, int& limit, int& offset); - void RespondWithQueryTracks(connection_hdl connection, json& request); - void RespondWithPlayQueueTracks(connection_hdl connection, json& request); - void RespondWithQueryAlbums(connection_hdl connection, json& request); - void RespondWithPlayTracks(connection_hdl connection, json& request); - void RespondWithInvalidRequest(connection_hdl connection, const std::string& name, const std::string& id); void RespondWithSuccess(connection_hdl connection, json& request); void RespondWithFailure(connection_hdl connection, json& request); void RespondWithSuccess(connection_hdl connection, const std::string& name, const std::string& id); + void RespondWithSetVolume(connection_hdl connection, json& request); + void RespondWithPlaybackOverview(connection_hdl connection, json& reuest); + bool RespondWithTracks(connection_hdl connection, json& request, ITrackList* tracks, int limit, int offset); + void RespondWithQueryTracks(connection_hdl connection, json& request); + void RespondWithPlayQueueTracks(connection_hdl connection, json& request); + void RespondWithQueryAlbums(connection_hdl connection, json& request); + void RespondWithPlayTracks(connection_hdl connection, json& request); void RespondWithQueryTracksByCategory(connection_hdl connection, json& request); void RespondWithQueryCategory(connection_hdl connection, json& request); void RespondWithPlayAllTracks(connection_hdl connection, json& request); void RespondWithPlayTracksByCategory(connection_hdl connection, json& request); void RespondWithEnvironment(connection_hdl connection, json& request); + void RespondWithCurrentTime(connection_hdl connection, json& request); + void BroadcastPlaybackOverview(); void BroadcastPlayQueueChanged(); + + void GetLimitAndOffset(json& options, int& limit, int& offset); ITrackList* QueryTracksByCategory(json& request, int& limit, int& offset); json ReadTrackMetadata(IRetainedTrack* track); void BuildPlaybackOverview(json& options); diff --git a/src/plugins/websocket_remote/main.cpp b/src/plugins/websocket_remote/main.cpp index b20838d18..2ffb4e90d 100644 --- a/src/plugins/websocket_remote/main.cpp +++ b/src/plugins/websocket_remote/main.cpp @@ -104,6 +104,10 @@ static class PlaybackRemote : public IPlaybackRemote { webSocketServer.OnVolumeChanged(volume); } + virtual void OnPlaybackTimeChanged(double time) { + webSocketServer.OnPlaybackTimeChanged(time); + } + virtual void OnModeChanged(RepeatMode repeatMode, bool shuffled) { webSocketServer.OnModeChanged(repeatMode, shuffled); } diff --git a/src/plugins/win32globalhotkeys/win32globalhotkeys_plugin.cpp b/src/plugins/win32globalhotkeys/win32globalhotkeys_plugin.cpp index ab3b4f9e0..d89899582 100644 --- a/src/plugins/win32globalhotkeys/win32globalhotkeys_plugin.cpp +++ b/src/plugins/win32globalhotkeys/win32globalhotkeys_plugin.cpp @@ -208,6 +208,10 @@ class MMShellHook: } + virtual void OnPlaybackTimeChanged(double time) { + + } + virtual void OnVolumeChanged(double volume) { }