diff --git a/data/clementine_remote_qr.png b/data/clementine_remote_qr.png
new file mode 100644
index 000000000..ef9124711
Binary files /dev/null and b/data/clementine_remote_qr.png differ
diff --git a/data/data.qrc b/data/data.qrc
index b3cc9f408..56191eb88 100644
--- a/data/data.qrc
+++ b/data/data.qrc
@@ -358,5 +358,6 @@
volumeslider-handle_glow.png
volumeslider-handle.png
volumeslider-inset.png
+ clementine_remote_qr.png
diff --git a/ext/libclementine-remote/remotecontrolmessages.proto b/ext/libclementine-remote/remotecontrolmessages.proto
index 4f70178d5..eaa43574e 100644
--- a/ext/libclementine-remote/remotecontrolmessages.proto
+++ b/ext/libclementine-remote/remotecontrolmessages.proto
@@ -31,6 +31,7 @@ enum MsgType {
PLAYLIST_SONGS = 43;
ENGINE_STATE_CHANGED = 44;
KEEP_ALIVE = 45;
+ UPDATE_TRACK_POSITION = 46;
}
// Valid Engine states
@@ -56,6 +57,7 @@ message SongMetadata {
optional int32 playcount = 11;
optional string pretty_length = 12;
optional bytes art = 13;
+ optional int32 length = 14;
}
// Playlist informations
@@ -139,9 +141,14 @@ message ResponseEngineStateChanged {
optional EngineState state = 1;
}
+// Sends the current position of the track
+message ResponseUpdateTrackPosition {
+ optional int32 position = 1;
+}
+
// The message itself
message Message {
- optional int32 version = 1 [default=1];
+ optional int32 version = 1 [default=2];
optional MsgType type = 2 [default=UNKNOWN]; // What data is in the message?
optional RequestPlaylistSongs request_playlist_songs = 10;
@@ -154,4 +161,5 @@ message Message {
optional ResponsePlaylists response_playlists = 17;
optional ResponsePlaylistSongs response_playlist_songs = 18;
optional ResponseEngineStateChanged response_engine_state_changed = 19;
+ optional ResponseUpdateTrackPosition response_update_track_position = 20;
}
diff --git a/src/networkremote/networkremote.cpp b/src/networkremote/networkremote.cpp
index 606e97747..bdc31c677 100644
--- a/src/networkremote/networkremote.cpp
+++ b/src/networkremote/networkremote.cpp
@@ -28,7 +28,6 @@
const char* NetworkRemote::kSettingsGroup = "NetworkRemote";
const quint16 NetworkRemote::kDefaultServerPort = 5500;
-const int NetworkRemote::kProtocolBufferVersion = 1;
NetworkRemote::NetworkRemote(Application* app, QObject* parent)
: QObject(parent),
diff --git a/src/networkremote/networkremote.h b/src/networkremote/networkremote.h
index 3ce90810c..60b85e8d1 100644
--- a/src/networkremote/networkremote.h
+++ b/src/networkremote/networkremote.h
@@ -17,7 +17,6 @@ class NetworkRemote : public QObject {
public:
static const char* kSettingsGroup;
static const quint16 kDefaultServerPort;
- static const int kProtocolBufferVersion;
explicit NetworkRemote(Application* app, QObject* parent = 0);
~NetworkRemote();
diff --git a/src/networkremote/outgoingdatacreator.cpp b/src/networkremote/outgoingdatacreator.cpp
index 74df744a5..351244fda 100644
--- a/src/networkremote/outgoingdatacreator.cpp
+++ b/src/networkremote/outgoingdatacreator.cpp
@@ -18,6 +18,7 @@
#include "outgoingdatacreator.h"
#include "networkremote.h"
#include "core/logging.h"
+#include "core/timeconstants.h"
OutgoingDataCreator::OutgoingDataCreator(Application* app)
: app_(app)
@@ -26,6 +27,10 @@ OutgoingDataCreator::OutgoingDataCreator(Application* app)
keep_alive_timer_ = new QTimer(this);
connect(keep_alive_timer_, SIGNAL(timeout()), this, SLOT(SendKeepAlive()));
keep_alive_timeout_ = 10000;
+
+ // Create the song position timer
+ track_position_timer_ = new QTimer(this);
+ connect(track_position_timer_, SIGNAL(timeout()), this, SLOT(UpdateTrackPosition()));
}
OutgoingDataCreator::~OutgoingDataCreator() {
@@ -44,9 +49,6 @@ void OutgoingDataCreator::SendDataToClients(pb::remote::Message* msg) {
return;
}
- // Add the Version number
- msg->set_version(NetworkRemote::kProtocolBufferVersion);
-
RemoteClient* client;
foreach(client, *clients_) {
// Check if the client is still active
@@ -166,6 +168,7 @@ void OutgoingDataCreator::CreateSong(
song_metadata->set_artist(DataCommaSizeFromQString(song.artist()));
song_metadata->set_album(DataCommaSizeFromQString(song.album()));
song_metadata->set_albumartist(DataCommaSizeFromQString(song.albumartist()));
+ song_metadata->set_length(song.length_nanosec() / kNsecPerSec);
song_metadata->set_pretty_length(DataCommaSizeFromQString(song.PrettyLength()));
song_metadata->set_genre(DataCommaSizeFromQString(song.genre()));
song_metadata->set_pretty_year(DataCommaSizeFromQString(song.PrettyYear()));
@@ -257,12 +260,16 @@ void OutgoingDataCreator::StateChanged(Engine::State state) {
switch (state) {
case Engine::Playing: msg.set_type(pb::remote::PLAY);
+ track_position_timer_->start(1000);
break;
case Engine::Paused: msg.set_type(pb::remote::PAUSE);
+ track_position_timer_->stop();
break;
case Engine::Empty: msg.set_type(pb::remote::STOP); // Empty is called when player stopped
+ track_position_timer_->stop();
break;
default: msg.set_type(pb::remote::STOP);
+ track_position_timer_->stop();
break;
};
@@ -318,3 +325,15 @@ void OutgoingDataCreator::SendKeepAlive() {
msg.set_type(pb::remote::KEEP_ALIVE);
SendDataToClients(&msg);
}
+
+void OutgoingDataCreator::UpdateTrackPosition() {
+ pb::remote::Message msg;
+ msg.set_type(pb::remote::UPDATE_TRACK_POSITION);
+
+ const int position = std::floor(
+ float(app_->player()->engine()->position_nanosec()) / kNsecPerSec + 0.5);
+
+ msg.mutable_response_update_track_position()->set_position(position);
+
+ SendDataToClients(&msg);
+}
diff --git a/src/networkremote/outgoingdatacreator.h b/src/networkremote/outgoingdatacreator.h
index db5206711..21f604033 100644
--- a/src/networkremote/outgoingdatacreator.h
+++ b/src/networkremote/outgoingdatacreator.h
@@ -36,6 +36,7 @@ public slots:
void SendKeepAlive();
void SendRepeatMode(PlaylistSequence::RepeatMode mode);
void SendShuffleMode(PlaylistSequence::ShuffleMode mode);
+ void UpdateTrackPosition();
private:
Application* app_;
@@ -45,6 +46,7 @@ private:
QImage current_image_;
Engine::State last_state_;
QTimer* keep_alive_timer_;
+ QTimer* track_position_timer_;
int keep_alive_timeout_;
void SendDataToClients(pb::remote::Message* msg);
diff --git a/src/ui/networkremotesettingspage.cpp b/src/ui/networkremotesettingspage.cpp
index d67ad2e25..cd2c870d1 100644
--- a/src/ui/networkremotesettingspage.cpp
+++ b/src/ui/networkremotesettingspage.cpp
@@ -60,6 +60,9 @@ void NetworkRemoteSettingsPage::Load() {
}
s.endGroup();
+
+ QPixmap android_qr_code(":clementine_remote_qr.png");
+ ui_->android_app_qr->setPixmap(android_qr_code);
}
void NetworkRemoteSettingsPage::Save() {
diff --git a/src/ui/networkremotesettingspage.ui b/src/ui/networkremotesettingspage.ui
index 2e605de03..b56284626 100644
--- a/src/ui/networkremotesettingspage.ui
+++ b/src/ui/networkremotesettingspage.ui
@@ -86,6 +86,33 @@
+ -
+
+
+
+ 15
+ 75
+ true
+
+
+
+ Get the Android App now!
+
+
+ Qt::AlignCenter
+
+
+
+ -
+
+
+
+
+
+ Qt::AlignCenter
+
+
+
-