MediaControllerClient::~MediaControllerClient() {
ScopeLogger();
if (handle_) {
+ std::lock_guard<std::mutex> lock(handle_mutex_);
int ret = mc_client_destroy(handle_);
if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
LOGGER(ERROR) << "Unable to destroy media controller client";
}
+ handle_ = nullptr;
}
}
PlatformResult MediaControllerClient::FindServers(picojson::array* servers) {
ScopeLogger();
int ret;
-
- ret = mc_client_foreach_server(handle_, FindServersCallback, servers);
- if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+ {
+ std::lock_guard<std::mutex> lock(handle_mutex_);
+ ret = mc_client_foreach_server(handle_, FindServersCallback, servers);
+ }
+ if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
return LogAndCreateResult(
ErrorCode::UNKNOWN_ERR, "Unable to fetch active servers, error",
("mc_client_foreach_server() error: %d, message: %s", ret, get_error_message(ret)));
free(name);
};
mc_server_state_e state;
- ret = mc_client_get_latest_server_info(handle_, &name, &state);
- if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+ {
+ std::lock_guard<std::mutex> lock(handle_mutex_);
+ ret = mc_client_get_latest_server_info(handle_, &name, &state);
+ }
+ if (MEDIA_CONTROLLER_ERROR_NONE != ret) {
return LogAndCreateResult(
ErrorCode::UNKNOWN_ERR, "Error getting latest server info",
("mc_client_get_latest_server_info() error: %d, message: %s", ret, get_error_message(ret)));
}
int ret;
+ std::lock_guard<std::mutex> lock(handle_mutex_);
ret = mc_client_send_playback_state_command(handle_, server_name.c_str(),
static_cast<mc_playback_states_e>(state_e));
if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
#define MEDIACONTROLLER_MEDIACONTROLLER_CLIENT_H_
#include <media_controller_client.h>
+#include <mutex>
#include <string>
#include "common/platform_result.h"
private:
mc_client_h handle_;
+ // This mutex is used to guard handle_ usage in TaskQueue
+ // and its destruction, but there is no need to
+ // guard every call on main thread.
+ std::mutex handle_mutex_;
+
JsonCallback playback_info_listener_;
JsonCallback server_status_listener_;
JsonCallback command_reply_callback_;