var ServerPlaybackInfoListener = new ListenerManager(native_, '_ServerPlaybackInfoListener', function(msg, listener) {
if (msg.action === 'onplaybackstaterequest') {
- listener[msg.action](msg.state);
+ listener[msg.action](msg.state, msg.clientName);
}
if (msg.action === 'onplaybackpositionrequest') {
- listener[msg.action](msg.position);
+ listener[msg.action](msg.position, msg.clientName);
}
- if (msg.action === 'onshufflemoderequest' || msg.action === 'onrepeatmoderequest') {
- listener[msg.action](msg.mode);
+ if (msg.action === 'onshufflemoderequest') {
+ listener[msg.action](msg.mode, msg.clientName);
+ }
+ if (msg.action === 'onrepeatmoderequest') {
+ utils_.printDeprecationWarningFor('onrepeatmoderequest', 'onrepeatstaterequest');
+ listener[msg.action](msg.mode, msg.clientName);
+ }
+ if (msg.action === 'onrepeatstaterequest') {
+ listener[msg.action](msg.state, msg.clientName);
}
});
if (msg.action === 'onplaybackchanged') {
listener[msg.action](msg.state, msg.position);
}
- if (msg.action === 'onshufflemodechanged' || msg.action === 'onrepeatmodechanged') {
+ if (msg.action === 'onshufflemodechanged') {
listener[msg.action](msg.mode);
}
+ if (msg.action === 'onrepeatmodechanged') {
+ utils_.printDeprecationWarningFor('onrepeatmodechanged', 'onrepeatstatechanged');
+ listener[msg.action](msg.mode);
+ }
+ if (msg.action === 'onrepeatstatechanged') {
+ listener[msg.action](msg.state);
+ }
if (msg.action === 'onmetadatachanged') {
listener[msg.action](new MediaControllerMetadata(msg.metadata));
}
REWIND: 'REWIND'
};
+var MediaControllerRepeatState = {
+ REPEAT_OFF: "REPEAT_OFF",
+ REPEAT_ONE: "REPEAT_ONE",
+ REPEAT_ALL: "REPEAT_ALL"
+};
function MediaControllerManager() {}
var _position = 0;
var _shuffleMode = false;
var _repeatMode = false;
+ var _repeatState = MediaControllerRepeatState.REPEAT_OFF;
var _metadata = new MediaControllerMetadata();
Object.defineProperties(this, {
state: {
},
repeatMode: {
get: function() {
+ utils_.printDeprecationWarningFor('repeatMode', 'repeatState');
return _repeatMode;
},
set: function(v) {
},
enumerable: true
},
+ repeatState: {
+ get: function() {
+ return _repeatState;
+ },
+ set: function(v) {
+ _repeatState = edit_.isAllowed && v ? v : _repeatState;
+ },
+ enumerable: true
+ },
metadata: {
get: function() {
return _metadata;
};
MediaControllerServer.prototype.updateRepeatMode = function(mode) {
+ utils_.printDeprecationWarningFor('updateRepeatMode()', 'updateRepeatState()');
var args = validator_.validateArgs(arguments, [
{name: 'mode', type: types_.BOOLEAN}
]);
edit_.allow();
this.playbackInfo.repeatMode = args.mode;
+ this.playbackInfo.repeatState = args.mode ? MediaControllerRepeatState.REPEAT_ALL : MediaControllerRepeatState.REPEAT_OFF;
+ edit_.disallow();
+};
+
+MediaControllerServer.prototype.updateRepeatState = function() {
+ var args = validator_.validateArgs(arguments, [
+ {name: 'state', type: types_.ENUM, values: Object.keys(MediaControllerRepeatState)}
+ ]);
+
+ var data = {
+ state: args.state
+ };
+
+ var result = native_.callSync('MediaControllerServer_updateRepeatState', data);
+
+ if (native_.isFailure(result)) {
+ throw native_.getErrorObject(result);
+ }
+
+ edit_.allow();
+ this.playbackInfo.repeatState = args.state;
+ if (MediaControllerRepeatState.REPEAT_ONE !== args.state) {
+ this.playbackInfo.repeatMode = args.state === MediaControllerRepeatState.REPEAT_ALL;
+ }
edit_.disallow();
};
'onplaybackstaterequest',
'onplaybackpositionrequest',
'onshufflemoderequest',
- 'onrepeatmoderequest'
+ 'onrepeatmoderequest',
+ 'onrepeatstaterequest'
]
}]);
};
MediaControllerServerInfo.prototype.sendRepeatMode = function(mode, successCallback, errorCallback) {
+ utils_.printDeprecationWarningFor('sendRepeatMode()', 'sendRepeatState()');
var args = validator_.validateArgs(arguments, [
{name: 'mode', type: types_.BOOLEAN},
{name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
native_.call('MediaControllerServerInfo_sendRepeatMode', data, callback);
};
+MediaControllerServerInfo.prototype.sendRepeatState = function() {
+ var args = validator_.validateArgs(arguments, [
+ {name: 'state', type: types_.ENUM, values: Object.keys(MediaControllerRepeatState)},
+ {name: 'successCallback', type: types_.FUNCTION, optional: true, nullable: true},
+ {name: 'errorCallback', type: types_.FUNCTION, optional: true, nullable: true}
+ ]);
+
+ var callback = function(result) {
+ if (native_.isFailure(result)) {
+ native_.callIfPossible(args.errorCallback, native_.getErrorObject(result));
+ return;
+ }
+ native_.callIfPossible(args.successCallback);
+ };
+
+ var data = {
+ state: args.state,
+ name: this.name
+ };
+ native_.call('MediaControllerServerInfo_sendRepeatState', data, callback);
+};
+
MediaControllerServerInfo.prototype.sendCommand = function(command, data, successCallback, errorCallback) {
var args = validator_.validateArgs(arguments, [
{name: 'command', type: types_.STRING},
'onplaybackchanged',
'onshufflemodechanged',
'onrepeatmodechanged',
+ 'onrepeatstatechanged',
'onmetadatachanged'
]
}]);
#include "common/logger.h"
#include "common/scope_exit.h"
+#include "common/tools.h"
#include "mediacontroller/mediacontroller_types.h"
picojson::value data = picojson::value(picojson::object());
picojson::object& data_o = data.get<picojson::object>();
- data_o["action"] = picojson::value(std::string("onrepeatmodechanged"));
- data_o["mode"] = picojson::value(mode == MC_REPEAT_MODE_ON);
data_o["name"] = picojson::value(server_name);
+ if (MC_REPEAT_MODE_ONE_MEDIA != mode) {
+ // The onrepeatmodechanged event may be reported only with mode equal to true/false. The 3rd
+ // mode is not supported by this event.
+ common::tools::PrintDeprecationWarningFor("onrepeatmodechanged", "onrepeatstatechanged");
+ data_o["action"] = picojson::value(std::string("onrepeatmodechanged"));
+ data_o["mode"] = picojson::value(mode == MC_REPEAT_MODE_ON);
+ client->playback_info_listener_(&data);
+ }
+ std::string state{};
+ PlatformResult result = Types::PlatformEnumToString(Types::kMediaControllerRepeatState,
+ static_cast<int>(mode), &state);
+ if (!result) {
+ LoggerE("PlatformEnumToString failed, error: %s", result.message().c_str());
+ return;
+ }
+ data_o["action"] = picojson::value(std::string("onrepeatstatechanged"));
+ data_o["state"] = picojson::value(state);
client->playback_info_listener_(&data);
}
return PlatformResult(ErrorCode::NO_ERROR);
}
+PlatformResult MediaControllerClient::SendRepeatState(const std::string& server_name,
+ const std::string& state) {
+ ScopeLogger();
+ /* TODO: Prepare an ACR and propose use case for request_id.
+ char* request_id = nullptr;
+ SCOPE_EXIT {
+ free(request_id);
+ };*/
+ int state_e;
+ PlatformResult result =
+ Types::StringToPlatformEnum(Types::kMediaControllerRepeatState, state, &state_e);
+ if (!result) {
+ return result;
+ }
+ int ret = mc_client_send_repeat_mode_cmd(handle_, server_name.c_str(),
+ static_cast<mc_repeat_mode_e>(state_e),
+ /*&request_id*/ nullptr);
+ if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+ return LogAndCreateResult(
+ ErrorCode::UNKNOWN_ERR, "Error sending repeat state",
+ ("mc_client_send_repeat_mode_cmd() error: %d, message: %s", ret, get_error_message(ret)));
+ }
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
} // namespace mediacontroller
} // namespace extension
common::PlatformResult SendPlaybackPosition(const std::string& server_name, double position);
common::PlatformResult SendShuffleMode(const std::string& server_name, bool mode);
common::PlatformResult SendRepeatMode(const std::string& server_name, bool mode);
+ common::PlatformResult SendRepeatState(const std::string& server_name, const std::string& state);
common::PlatformResult SendCommand(const std::string& server_name, const std::string& command,
const picojson::value& data, const std::string& reply_id,
REGISTER_SYNC("MediaControllerServer_updatePlaybackPosition",
MediaControllerServerUpdatePlaybackPosition);
REGISTER_SYNC("MediaControllerServer_updateRepeatMode", MediaControllerServerUpdateRepeatMode);
+ REGISTER_SYNC("MediaControllerServer_updateRepeatState", MediaControllerServerUpdateRepeatState);
REGISTER_SYNC("MediaControllerServer_updateShuffleMode", MediaControllerServerUpdateShuffleMode);
REGISTER_SYNC("MediaControllerServer_updateMetadata", MediaControllerServerUpdateMetadata);
REGISTER_SYNC("MediaControllerServer_addChangeRequestPlaybackInfoListener",
MediaControllerServerInfoSendPlaybackPosition);
REGISTER_ASYNC("MediaControllerServerInfo_sendRepeatMode",
MediaControllerServerInfoSendRepeatMode);
+ REGISTER_ASYNC("MediaControllerServerInfo_sendRepeatState",
+ MediaControllerServerInfoSendRepeatState);
REGISTER_ASYNC("MediaControllerServerInfo_sendShuffleMode",
MediaControllerServerInfoSendShuffleMode);
REGISTER_ASYNC("MediaControllerServerInfo_sendCommand", MediaControllerServerInfoSendCommand);
void MediaControllerInstance::MediaControllerServerUpdateRepeatMode(const picojson::value& args,
picojson::object& out) {
ScopeLogger();
+ common::tools::PrintDeprecationWarningFor("updateRepeatMode()", "updateRepeatState()");
if (!server_) {
LogAndReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR, "Server not initialized."), &out,
ReportSuccess(out);
}
+void MediaControllerInstance::MediaControllerServerUpdateRepeatState(const picojson::value& args,
+ picojson::object& out) {
+ ScopeLogger();
+ CHECK_EXIST(args, "state", out)
+
+ const std::string& state = args.get("state").get<std::string>();
+
+ const PlatformResult& result = server_->SetRepeatState(state);
+ if (!result) {
+ LogAndReportError(result, &out, ("Failed: server_->SetRepeatState()"));
+ return;
+ }
+
+ ReportSuccess(out);
+}
+
void MediaControllerInstance::MediaControllerServerUpdateMetadata(const picojson::value& args,
picojson::object& out) {
ScopeLogger();
void MediaControllerInstance::MediaControllerServerInfoSendRepeatMode(const picojson::value& args,
picojson::object& out) {
ScopeLogger();
+ common::tools::PrintDeprecationWarningFor("sendRepeatMode()", "sendRepeatState()");
if (!client_) {
LogAndReportError(PlatformResult(ErrorCode::INVALID_STATE_ERR, "Client not initialized."), &out,
("Failed: client_"));
ReportSuccess(out);
}
+void MediaControllerInstance::MediaControllerServerInfoSendRepeatState(const picojson::value& args,
+ picojson::object& out) {
+ ScopeLogger();
+
+ auto send = [this, args]() {
+ picojson::value response = picojson::value(picojson::object());
+ picojson::object& response_obj = response.get<picojson::object>();
+ response_obj["callbackId"] = args.get("callbackId");
+
+ PlatformResult result = client_->SendRepeatState(args.get("name").get<std::string>(),
+ args.get("state").get<std::string>());
+
+ if (result) {
+ ReportSuccess(response_obj);
+ } else {
+ LogAndReportError(result, &response_obj, ("Failed to send repeat state."));
+ }
+
+ Instance::PostMessage(this, response.serialize().c_str());
+ };
+
+ TaskQueue::GetInstance().Async(send);
+
+ ReportSuccess(out);
+}
+
void MediaControllerInstance::MediaControllerServerInfoSendCommand(const picojson::value& args,
picojson::object& out) {
ScopeLogger();
void MediaControllerServerUpdatePlaybackPosition(const picojson::value& args,
picojson::object& out);
void MediaControllerServerUpdateRepeatMode(const picojson::value& args, picojson::object& out);
+ void MediaControllerServerUpdateRepeatState(const picojson::value& args, picojson::object& out);
void MediaControllerServerUpdateShuffleMode(const picojson::value& args, picojson::object& out);
void MediaControllerServerUpdateMetadata(const picojson::value& args, picojson::object& out);
void MediaControllerServerAddChangeRequestPlaybackInfoListener(const picojson::value& args,
void MediaControllerServerInfoSendPlaybackPosition(const picojson::value& args,
picojson::object& out);
void MediaControllerServerInfoSendRepeatMode(const picojson::value& args, picojson::object& out);
+ void MediaControllerServerInfoSendRepeatState(const picojson::value& args, picojson::object& out);
void MediaControllerServerInfoSendShuffleMode(const picojson::value& args, picojson::object& out);
void MediaControllerServerInfoSendCommand(const picojson::value& args, picojson::object& out);
void MediaControllerServerInfoAddServerStatusChangeListener(const picojson::value& args,
#include "common/logger.h"
#include "common/scope_exit.h"
+#include "common/tools.h"
#include "mediacontroller/mediacontroller_types.h"
return PlatformResult(ErrorCode::NO_ERROR);
}
+PlatformResult MediaControllerServer::SetRepeatState(const std::string& state) {
+ ScopeLogger();
+
+ int repeat_mode = MC_REPEAT_MODE_OFF;
+ PlatformResult result =
+ Types::StringToPlatformEnum(Types::kMediaControllerRepeatState, state, &repeat_mode);
+ if (!result) {
+ return result;
+ }
+
+ if ((repeat_mode == repeat_mode_) && (is_repeat_mode_set_)) {
+ LoggerD("No change in repeat mode requested, skipping");
+ return PlatformResult(ErrorCode::NO_ERROR);
+ }
+
+ int ret = mc_server_update_repeat_mode(handle_, static_cast<mc_repeat_mode_e>(repeat_mode));
+ if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
+ return LogAndCreateResult(
+ ErrorCode::UNKNOWN_ERR, "Error updating repeat mode",
+ ("mc_server_update_repeat_mode() error: %d, message: %s", ret, get_error_message(ret)));
+ }
+
+ repeat_mode_ = static_cast<mc_repeat_mode_e>(repeat_mode);
+ is_repeat_mode_set_ = true;
+
+ return PlatformResult(ErrorCode::NO_ERROR);
+}
+
PlatformResult MediaControllerServer::SetMetadata(const picojson::object& metadata) {
ScopeLogger();
int ret = mc_server_set_playback_action_cmd_received_cb(handle_, OnPlaybackActionCommand, this);
if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
return LogAndCreateResult(
- ErrorCode::UNKNOWN_ERR, "Unable to set playback state command listener",
+ ErrorCode::UNKNOWN_ERR, "Unable to set playback action command listener",
("mc_server_set_playback_action_cmd_received_cb() error: %d, message: %s", ret,
get_error_message(ret)));
}
data_o["action"] = picojson::value(std::string("onplaybackstaterequest"));
data_o["state"] = picojson::value(state);
+ data_o["clientName"] = picojson::value(client_name);
server->change_request_playback_info_listener_(&data);
}
data_o["action"] = picojson::value(std::string("onplaybackpositionrequest"));
data_o["position"] = picojson::value(static_cast<double>(position));
+ data_o["clientName"] = picojson::value(client_name);
server->change_request_playback_info_listener_(&data);
}
data_o["action"] = picojson::value(std::string("onshufflemoderequest"));
data_o["mode"] = picojson::value(mode == MC_SHUFFLE_MODE_ON);
+ data_o["clientName"] = picojson::value(client_name);
server->change_request_playback_info_listener_(&data);
}
picojson::value data = picojson::value(picojson::object());
picojson::object& data_o = data.get<picojson::object>();
+ data_o["clientName"] = picojson::value(client_name);
- data_o["action"] = picojson::value(std::string("onrepeatmoderequest"));
- data_o["mode"] = picojson::value(mode == MC_REPEAT_MODE_ON);
+ if (MC_REPEAT_MODE_ONE_MEDIA != mode) {
+ // The onrepeatmoderequest event may be reported only with mode equal to true/false. The 3rd
+ // mode is not supported by this event.
+ common::tools::PrintDeprecationWarningFor("onrepeatmoderequest", "onrepeatstaterequest");
+ data_o["action"] = picojson::value(std::string("onrepeatmoderequest"));
+ data_o["mode"] = picojson::value(mode == MC_REPEAT_MODE_ON);
+ server->change_request_playback_info_listener_(&data);
+ }
+
+ std::string state{};
+ PlatformResult result = Types::PlatformEnumToString(Types::kMediaControllerRepeatState,
+ static_cast<int>(mode), &state);
+ if (!result) {
+ LoggerE("PlatformEnumToString failed, error: %s", result.message().c_str());
+ return;
+ }
+ data_o["action"] = picojson::value(std::string("onrepeatstaterequest"));
+ data_o["state"] = picojson::value(state);
server->change_request_playback_info_listener_(&data);
}
common::PlatformResult SetPlaybackPosition(double position);
common::PlatformResult SetShuffleMode(bool mode);
common::PlatformResult SetRepeatMode(bool mode);
+ common::PlatformResult SetRepeatState(const std::string& state);
common::PlatformResult SetMetadata(const picojson::object& metadata);
common::PlatformResult SetChangeRequestPlaybackInfoListener(const JsonCallback& callback);
const std::string Types::kMediaControllerPlaybackState = "MediaControllerPlaybackState";
const std::string Types::kMediaControllerPlaybackAction = "MediaControllerPlaybackAction";
const std::string Types::kMediaControllerMetadataAttribute = "MediaControllerMetadataAttribute";
+const std::string Types::kMediaControllerRepeatState = "MediaControllerRepeatState";
const PlatformEnumMap Types::platform_enum_map_ = {{kMediaControllerServerState,
{{"NONE", MC_SERVER_STATE_NONE},
{"copyright", MC_META_MEDIA_COPYRIGHT},
{"description", MC_META_MEDIA_DESCRIPTION},
{"trackNum", MC_META_MEDIA_TRACK_NUM},
- {"picture", MC_META_MEDIA_PICTURE}}}};
+ {"picture", MC_META_MEDIA_PICTURE}}},
+ {kMediaControllerRepeatState,
+ {{"REPEAT_OFF", MC_REPEAT_MODE_OFF},
+ {"REPEAT_ONE", MC_REPEAT_MODE_ONE_MEDIA},
+ {"REPEAT_ALL", MC_REPEAT_MODE_ON}}}};
PlatformEnumReverseMap Types::platform_enum_reverse_map_ = {};
static const std::string kMediaControllerPlaybackState;
static const std::string kMediaControllerPlaybackAction;
static const std::string kMediaControllerMetadataAttribute;
+ static const std::string kMediaControllerRepeatState;
static common::PlatformResult GetPlatformEnumMap(
const std::string& type, std::map<std::string, int> const** platform_str);