From a0c8c82778eef8167d343316f5d159420d26205a Mon Sep 17 00:00:00 2001 From: Michal Michalski Date: Thu, 18 Apr 2019 13:43:29 +0200 Subject: [PATCH] [mediacontroller] Get/set playback content type. http://suprem.sec.samsung.net/jira/browse/TWDAPI-219 + enum MediaControllerContentType + MediaControllerPlaybackInfo::contentType + MediaControllerServer::updateContentType() [Verification] Manual tests in js console. Signed-off-by: Michal Michalski Change-Id: Idb5bec64fac631fa92825920a745abfe02861edf --- src/mediacontroller/mediacontroller_api.js | 29 ++++++++++++++++++ src/mediacontroller/mediacontroller_client.cc | 9 ++++++ .../mediacontroller_instance.cc | 22 ++++++++++++++ .../mediacontroller_instance.h | 1 + src/mediacontroller/mediacontroller_server.cc | 30 +++++++++++++++++++ src/mediacontroller/mediacontroller_server.h | 2 ++ 6 files changed, 93 insertions(+) diff --git a/src/mediacontroller/mediacontroller_api.js b/src/mediacontroller/mediacontroller_api.js index 6350a90a..34be2a1e 100755 --- a/src/mediacontroller/mediacontroller_api.js +++ b/src/mediacontroller/mediacontroller_api.js @@ -364,6 +364,7 @@ var MediaControllerPlaybackInfo = function(data) { var _position = 0; var _shuffleMode = false; var _repeatMode = false; + var _contentType = MediaControllerContentType.UNDECIDED; var _repeatState = MediaControllerRepeatState.REPEAT_OFF; var _ageRating = MediaControllerContentAgeRating.ALL; var _metadata = new MediaControllerMetadata(); @@ -425,6 +426,15 @@ var MediaControllerPlaybackInfo = function(data) { }, enumerable: true }, + contentType: { + get: function() { + return _contentType; + }, + set: function(v) { + _contentType = edit_.isAllowed && v ? v : _contentType; + }, + enumerable: true + }, metadata: { get: function() { return _metadata; @@ -532,6 +542,25 @@ MediaControllerServer.prototype.updatePlaybackAgeRating = function(rating) { edit_.disallow(); }; +MediaControllerServer.prototype.updatePlaybackContentType = function(contentType) { + var args = validator_.validateArgs(arguments, [ + {name: 'contentType', type: types_.ENUM, values: Object.values(MediaControllerContentType)} + ]); + + var data = { + contentType: args.contentType + }; + + var result = native_.callSync('MediaControllerServer_updatePlaybackContentType', data); + if (native_.isFailure(result)) { + throw native_.getErrorObject(result); + } + + edit_.allow(); + this.playbackInfo.contentType = args.contentType; + edit_.disallow(); +} + MediaControllerServer.prototype.updateShuffleMode = function(mode) { var args = validator_.validateArgs(arguments, [ {name: 'mode', type: types_.BOOLEAN} diff --git a/src/mediacontroller/mediacontroller_client.cc b/src/mediacontroller/mediacontroller_client.cc index 2db0e8df..d9d31285 100644 --- a/src/mediacontroller/mediacontroller_client.cc +++ b/src/mediacontroller/mediacontroller_client.cc @@ -216,6 +216,14 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ return result; } + // content type + std::string contentType; + result = types::ConvertContentType(playback_h, &contentType); + if (!result) { + LoggerE("ConvertContentType failed, error: %s", result.message().c_str()); + return result; + } + // shuffle mode mc_shuffle_mode_e shuffle; ret = mc_client_get_server_shuffle_mode(handle_, server_name.c_str(), &shuffle); @@ -252,6 +260,7 @@ PlatformResult MediaControllerClient::GetPlaybackInfo(const std::string& server_ (*playback_info)["state"] = picojson::value(state); (*playback_info)["position"] = picojson::value(position); (*playback_info)["ageRating"] = picojson::value(rating); + (*playback_info)["contentType"] = picojson::value(contentType); (*playback_info)["shuffleMode"] = picojson::value(shuffle == MC_SHUFFLE_MODE_ON); (*playback_info)["repeatMode"] = picojson::value(repeat == MC_REPEAT_MODE_ON); (*playback_info)["metadata"] = metadata; diff --git a/src/mediacontroller/mediacontroller_instance.cc b/src/mediacontroller/mediacontroller_instance.cc index cb03b720..38c3ccb4 100644 --- a/src/mediacontroller/mediacontroller_instance.cc +++ b/src/mediacontroller/mediacontroller_instance.cc @@ -62,6 +62,7 @@ MediaControllerInstance::MediaControllerInstance() { REGISTER_SYNC("MediaControllerServer_updateRepeatMode", MediaControllerServerUpdateRepeatMode); REGISTER_SYNC("MediaControllerServer_updateRepeatState", MediaControllerServerUpdateRepeatState); REGISTER_SYNC("MediaControllerServer_updateShuffleMode", MediaControllerServerUpdateShuffleMode); + REGISTER_SYNC("MediaControllerServer_updatePlaybackContentType", MediaControllerServerUpdatePlaybackContentType); REGISTER_SYNC("MediaControllerServer_updateMetadata", MediaControllerServerUpdateMetadata); REGISTER_SYNC("MediaControllerServer_addChangeRequestPlaybackInfoListener", MediaControllerServerAddChangeRequestPlaybackInfoListener); @@ -249,6 +250,27 @@ void MediaControllerInstance::MediaControllerServerUpdateShuffleMode(const picoj ReportSuccess(out); } +void MediaControllerInstance::MediaControllerServerUpdatePlaybackContentType(const picojson::value& args, + picojson::object& out) { + ScopeLogger(); + if (!server_) { + LogAndReportError(PlatformResult(ErrorCode::UNKNOWN_ERR, "Unknown error occured."), &out, + ("Failed: server_")); + return; + } + + CHECK_ARGS(args, "contentType", std::string, out); + std::string content_type = args.get("contentType").get(); + + PlatformResult result = server_->SetContentType(content_type); + if (!result) { + LogAndReportError(result, &out, ("Failed: server_>SetContentType()")); + return; + } + + ReportSuccess(out); +} + void MediaControllerInstance::MediaControllerServerUpdateRepeatMode(const picojson::value& args, picojson::object& out) { ScopeLogger(); diff --git a/src/mediacontroller/mediacontroller_instance.h b/src/mediacontroller/mediacontroller_instance.h index a614174b..8e9cb167 100644 --- a/src/mediacontroller/mediacontroller_instance.h +++ b/src/mediacontroller/mediacontroller_instance.h @@ -42,6 +42,7 @@ class MediaControllerInstance : public common::ParsedInstance { 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 MediaControllerServerUpdatePlaybackContentType(const picojson::value& args, picojson::object& out); void MediaControllerServerUpdateMetadata(const picojson::value& args, picojson::object& out); void MediaControllerServerAddChangeRequestPlaybackInfoListener(const picojson::value& args, picojson::object& out); diff --git a/src/mediacontroller/mediacontroller_server.cc b/src/mediacontroller/mediacontroller_server.cc index 6eafb392..af158d79 100644 --- a/src/mediacontroller/mediacontroller_server.cc +++ b/src/mediacontroller/mediacontroller_server.cc @@ -34,6 +34,7 @@ MediaControllerServer::MediaControllerServer() playback_state_(MC_PLAYBACK_STATE_STOPPED), position_(0ULL), age_rating_(MC_CONTENT_RATING_ALL), + content_type_(MC_CONTENT_TYPE_UNDECIDED), shuffle_mode_(MC_SHUFFLE_MODE_OFF), repeat_mode_(MC_REPEAT_MODE_OFF), is_shuffle_mode_set_(false), @@ -165,6 +166,35 @@ PlatformResult MediaControllerServer::SetContentAgeRating(const std::string& rat return PlatformResult(ErrorCode::NO_ERROR); } +PlatformResult MediaControllerServer::SetContentType(const std::string& content_type) { + ScopeLogger(); + + mc_content_type_e content_type_e; + PlatformResult result = types::MediaControllerContentTypeEnum.getValue(content_type, &content_type_e); + if (!result) { + return LogAndCreateResult(ErrorCode::UNKNOWN_ERR, "Converting string to platform enum failed", + ("MediaControllerContentTypeEnum.getValue() error message: %s", result.message().c_str())); + } + + int ret = mc_server_set_playback_content_type(handle_, content_type_e); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error updating playback content type", + ("mc_server_set_playback_content_type() error: %d, message: %s", ret, get_error_message(ret))); + } + + content_type_ = content_type_e; + + ret = mc_server_update_playback_info(handle_); + if (MEDIA_CONTROLLER_ERROR_NONE != ret) { + return LogAndCreateResult( + ErrorCode::UNKNOWN_ERR, "Error updating playback info", + ("mc_server_update_playback_info() error: %d, message: %s", ret, get_error_message(ret))); + } + + return PlatformResult(ErrorCode::NO_ERROR); +} + PlatformResult MediaControllerServer::SetShuffleMode(bool mode) { ScopeLogger(); diff --git a/src/mediacontroller/mediacontroller_server.h b/src/mediacontroller/mediacontroller_server.h index 7b990fef..f08a75bb 100644 --- a/src/mediacontroller/mediacontroller_server.h +++ b/src/mediacontroller/mediacontroller_server.h @@ -35,6 +35,7 @@ class MediaControllerServer { common::PlatformResult SetPlaybackState(const std::string& state); common::PlatformResult SetPlaybackPosition(double position); common::PlatformResult SetContentAgeRating(const std::string& rating); + common::PlatformResult SetContentType(const std::string& content_type); common::PlatformResult SetShuffleMode(bool mode); common::PlatformResult SetRepeatMode(bool mode); common::PlatformResult SetRepeatState(const std::string& state); @@ -67,6 +68,7 @@ class MediaControllerServer { mc_playback_states_e playback_state_; unsigned long long position_; mc_content_age_rating_e age_rating_; + mc_content_type_e content_type_; mc_shuffle_mode_e shuffle_mode_; mc_repeat_mode_e repeat_mode_; bool is_shuffle_mode_set_; -- 2.34.1