Add API - espp_client_set_seek_done_cb()
authorSangchul Lee <sc11.lee@samsung.com>
Wed, 10 May 2023 22:56:41 +0000 (07:56 +0900)
committer이상철/Tizen Platform Lab(SR)/삼성전자 <sc11.lee@samsung.com>
Thu, 11 May 2023 05:35:24 +0000 (14:35 +0900)
Signed-off-by: Sangchul Lee <sc11.lee@samsung.com>
src/client/espp_service_client.c
src/client/espp_service_client.h
src/client/espp_service_client_event_handler.c
src/client/espp_service_client_priv.h
src/common/espp_service_ipc.c
src/common/espp_service_ipc.h
src/daemon/espp_service_handler.c

index 44f2231f14e8cebdc967f2402d5891863b8b5ffa..6eabe8e952a928096f47f3cdc541c603069ea463 100644 (file)
@@ -63,6 +63,29 @@ int espp_client_set_prepare_async_done_cb(espp_h espp, espp_prepare_async_done_c
        return ESPP_CLIENT_ERROR_NONE;
 }
 
+int espp_client_set_seek_done_cb(espp_h espp, espp_seek_done_cb callback, void *user_data)
+{
+       espp_s *_espp = (espp_s *)espp;
+       g_autoptr(GMutexLocker) locker = NULL;
+
+       RET_VAL_IF(!espp, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "espp is NULL");
+       RET_VAL_IF(!callback, ESPP_CLIENT_ERROR_INVALID_PARAMETER, "callback is NULL");
+
+       locker = g_mutex_locker_new(&_espp->mutex);
+
+       if (espp_service_client_socket_request_set_callback(_espp, ESPP_SERVICE_EVENT_CB_SEEK_DONE, (void *)callback, user_data) != 0)
+               return ESPP_CLIENT_ERROR_INVALID_OPERATION;
+
+       LOG_WARNING_IF_CALLBACK_EXISTS(_espp->seek_done_cb);
+
+       _espp->seek_done_cb.callback = callback;
+       _espp->seek_done_cb.user_data = user_data;
+
+       LOG_INFO("espp[%p] callback[%p] user_data[%p]", espp, callback, user_data);
+
+       return ESPP_CLIENT_ERROR_NONE;
+}
+
 int espp_client_set_resource_conflicted_cb(espp_h espp, espp_resource_conflicted_cb callback, void *user_data)
 {
        espp_s *_espp = (espp_s *)espp;
index a4457f959442f0cfa303d9b192aaefe4c99f866b..0308b7b60688d34ed4169fc2e153ebff59b09f38 100644 (file)
@@ -180,6 +180,13 @@ typedef void (*espp_ready_to_prepare_cb)(espp_stream_type_e stream_type, void *u
  */
 typedef void (*espp_prepare_async_done_cb)(bool result, void *user_data);
 
+/**
+ * @brief Called when the seek operation of the ESPP service client handle has been finished.
+ * @param[in] user_data    The user data passed from the callback registration function
+ * @see espp_client_set_seek_done_cb()
+ */
+typedef void (*espp_seek_done_cb)(void *user_data);
+
 /**
  * @brief Called when a H/W resource of the ESPP service client handle has been conflicted.
  * @param[in] user_data    The user data passed from the callback registration function
@@ -215,6 +222,20 @@ int espp_client_set_ready_to_prepare_cb(espp_h espp, espp_ready_to_prepare_cb ca
  */
 int espp_client_set_prepare_async_done_cb(espp_h espp, espp_prepare_async_done_cb callback, void *user_data);
 
+/**
+ * @brief Sets a callback function to be invoked when the seek operation of the ESPP service client handle has been finished.
+ * @param[in] espp       ESPP service client handle
+ * @param[in] callback   Callback function pointer
+ * @param[in] user_data  The user data to be passed to the callback function
+ * @return @c 0 on success,
+ *         otherwise a negative error value
+ * @retval #ESPP_CLIENT_ERROR_NONE Successful
+ * @retval #ESPP_CLIENT_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #ESPP_CLIENT_ERROR_INVALID_OPERATION Invalid operation
+ * @post espp_seek_done_cb() will be invoked.
+ */
+int espp_client_set_seek_done_cb(espp_h espp, espp_seek_done_cb callback, void *user_data);
+
 /**
  * @brief Sets a callback function to be invoked when when a H/W resource of the ESPP service client handle has been conflicted.
  * @param[in] espp       ESPP service client handle
index 92607ccf0411116772a8f536c3176ce707b897f8..63519591f903445d66090402f81255671309776f 100644 (file)
@@ -90,10 +90,28 @@ static void __handle_event_cb_prepare_async_done(espp_s *espp, espp_service_data
        result->ret = 0;
 }
 
+static void __handle_event_cb_seek_done(espp_s *espp, espp_service_data_from_server_s *data, espp_service_data_from_client_s *result)
+{
+       ASSERT(espp);
+       ASSERT(data);
+       ASSERT(result);
+
+       result->ret = -1;
+
+       if (espp->seek_done_cb.callback) {
+               LOG_DEBUG(">>> callback[%p] user_data[%p]", espp->seek_done_cb.callback, espp->seek_done_cb.user_data);
+               ((espp_seek_done_cb)(espp->seek_done_cb.callback))(espp->seek_done_cb.user_data);
+               LOG_DEBUG("<<< end of the callback");
+       }
+
+       result->ret = 0;
+}
+
 static func_handler handlers[] = {
        [ESPP_SERVICE_EVENT_MSG] = __handle_event_msg,
        [ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE] = __handle_event_cb_ready_to_prepare,
        [ESPP_SERVICE_EVENT_CB_PREPARE_ASYNC_DONE] = __handle_event_cb_prepare_async_done,
+       [ESPP_SERVICE_EVENT_CB_SEEK_DONE] = __handle_event_cb_seek_done,
 };
 
 static void __func_handler(espp_s *espp, espp_service_data_from_server_s *data, espp_service_data_from_client_s *result)
index 415e7b83b0a72181bae1859ae5c146962c5315d4..f317934650cd582dc2ff608ee21a12a16add5093 100644 (file)
@@ -57,6 +57,7 @@ typedef struct _espp_s {
 
        espp_callback_s ready_to_prepare_cb;
        espp_callback_s prepare_async_done_cb;
+       espp_callback_s seek_done_cb;
        espp_callback_s resource_conflicted_cb;
 } espp_s;
 
index 99cfe14b3dcc34fb0b3ae58ccafd7b579b224477..e7b92f2f57608ebcb6b3f477dcf3f6b2c0989a98 100644 (file)
@@ -39,6 +39,7 @@ espp_service_ipc_data_s events[] = {
        [ESPP_SERVICE_EVENT_MSG] = { "Message", "s" },
        [ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE] = { "ReadyToPrepareCB", "i" },
        [ESPP_SERVICE_EVENT_CB_PREPARE_ASYNC_DONE] = { "PrepareAsyncDoneCB", "b" },
+       [ESPP_SERVICE_EVENT_CB_SEEK_DONE] = { "SeekDoneCB", NULL },
        [ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED] = { "PrepareAsyncDoneCB", NULL },
 };
 
index 262505fa3326c8b3f4a6346870994a87d17b3465..a4c364cdc6e357b6d91f9b4d0dd29a2ff38b0efd 100644 (file)
@@ -48,6 +48,7 @@ typedef enum {
        ESPP_SERVICE_EVENT_MSG,
        ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE,
        ESPP_SERVICE_EVENT_CB_PREPARE_ASYNC_DONE,
+       ESPP_SERVICE_EVENT_CB_SEEK_DONE,
        ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED,
 } espp_service_event_e;
 
index d2398b4c73483f72dbea3c7d005015087d136547..e2b844f4f0281e2a5e353c61b3040fd33c76facf 100644 (file)
@@ -455,6 +455,26 @@ static void __prepare_async_done_cb(bool res, void *user_data)
        espp_service_send_data(tbs->event_fd, &data);
 }
 
+static void __seek_done_cb(void *user_data)
+{
+       handler_userdata_s *hdata = (handler_userdata_s *)user_data;
+       tb_data_s *tbs;
+       espp_service_data_from_server_s data;
+
+       ASSERT(hdata);
+       ASSERT(hdata->svc);
+       ASSERT(hdata->fd >= 0);
+
+       LOG_DEBUG("fd[%d], ESPP[%p]", hdata->fd, hdata->espp);
+
+       RET_IF(!(tbs = g_hash_table_lookup(hdata->svc->fd_table, hdata->key)), "failed to g_hash_table_lookup(), key[%s]", hdata->key);
+
+       LOG_DEBUG("event_fd[%d], ESPP[%p]", tbs->event_fd, tbs->espp);
+
+       FILL_SOCKET_MSG_EVENT(data, ESPP_SERVICE_EVENT_CB_SEEK_DONE);
+       espp_service_send_data(tbs->event_fd, &data);
+}
+
 static void __resource_conflicted_cb(void *user_data)
 {
        handler_userdata_s *hdata = (handler_userdata_s *)user_data;
@@ -478,6 +498,7 @@ static void __resource_conflicted_cb(void *user_data)
 static cb_intf_s cb_setters[] = {
        [ESPP_SERVICE_EVENT_CB_READY_TO_PREPARE] = { (set_cb_func)esplusplayer_set_ready_to_prepare_cb, __ready_to_prepare_cb},
        [ESPP_SERVICE_EVENT_CB_PREPARE_ASYNC_DONE] = { (set_cb_func)esplusplayer_set_prepare_async_done_cb, __prepare_async_done_cb},
+       [ESPP_SERVICE_EVENT_CB_SEEK_DONE] = { (set_cb_func)esplusplayer_set_seek_done_cb, __seek_done_cb},
        [ESPP_SERVICE_EVENT_CB_RESOURCE_CONFLICTED] = { (set_cb_func)esplusplayer_set_resource_conflicted_cb, __resource_conflicted_cb},
 };