tts_state_e current_state = tts_client_get_current_state(client);
RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
- // TODO: Implement business logic
+ tts_client_set_service_state_changed_cb(client, callback, user_data);
SLOG(LOG_INFO, TAG_TTSC, "[SUCCESS] Set service state changed cb");
return TTS_ERROR_NONE;
tts_state_e current_state = tts_client_get_current_state(client);
RETVM_IF(TTS_STATE_CREATED != current_state, TTS_ERROR_INVALID_STATE, "[ERROR] The current state(%d) is invalid", current_state);
- // TODO: Implement business logic
+ tts_client_set_service_state_changed_cb(client, NULL, NULL);
SLOG(LOG_DEBUG, TAG_TTSC, "[SUCCESS] Unset service state changed cb");
return TTS_ERROR_NONE;
client->supported_voice_user_data = user_data;
}
+static inline void __set_service_state_changed_cb(tts_client_s* client, tts_service_state_changed_cb callback, void* user_data)
+{
+ client->service_state_changed_cb = callback;
+ client->service_state_changed_user_data = user_data;
+}
+
int tts_client_new(tts_h* tts)
{
tts_client_s* client = (tts_client_s*)calloc(1, sizeof(tts_client_s));
__set_supported_voice_cb(client, callback, user_data);
}
+void tts_client_set_service_state_changed_cb(tts_client_s* client, tts_service_state_changed_cb callback, void* user_data)
+{
+ if (false == tts_client_is_valid_client(client)) {
+ return;
+ }
+ __set_service_state_changed_cb(client, callback, user_data);
+}
+
tts_state_changed_cb tts_client_get_state_changed_cb(tts_client_s* client)
{
if (false == tts_client_is_valid_client(client)) {
return client->supported_voice_user_data;
}
+tts_service_state_changed_cb tts_client_get_service_state_changed_cb(tts_client_s* client)
+{
+ if (false == tts_client_is_valid_client(client)) {
+ return NULL;
+ }
+ return client->service_state_changed_cb;
+}
+
+void* tts_client_get_service_state_changed_user_data(tts_client_s* client)
+{
+ if (false == tts_client_is_valid_client(client)) {
+ return NULL;
+ }
+ return client->service_state_changed_user_data;
+}
+
void tts_client_unset_all_cb(tts_client_s* client)
{
if (false == tts_client_is_valid_client(client)) {
__set_default_voice_changed_cb(client, NULL, NULL);
__set_engine_changed_cb(client, NULL, NULL);
__set_supported_voice_cb(client, NULL, NULL);
+ __set_service_state_changed_cb(client, NULL, NULL);
}
\ No newline at end of file
void* screen_reader_changed_user_data;
tts_supported_voice_cb supported_voice_cb;
void* supported_voice_user_data;
+ tts_service_state_changed_cb service_state_changed_cb;
+ void* service_state_changed_user_data;
/* mode / state */
tts_mode_e mode;
void tts_client_set_engine_changed_cb(tts_client_s* client, tts_engine_changed_cb callback, void* user_data);
void tts_client_set_screen_reader_changed_cb(tts_client_s* client, tts_screen_reader_changed_cb callback, void* user_data);
void tts_client_set_supported_voice_cb(tts_client_s* client, tts_supported_voice_cb callback, void* user_data);
+void tts_client_set_service_state_changed_cb(tts_client_s* client, tts_service_state_changed_cb callback, void* user_data);
tts_state_changed_cb tts_client_get_state_changed_cb(tts_client_s* client);
void* tts_client_get_state_changed_user_data(tts_client_s* client);
tts_supported_voice_cb tts_client_get_supported_voice_cb(tts_client_s* client);
void* tts_client_get_supported_voice_user_data(tts_client_s* client);
+tts_service_state_changed_cb tts_client_get_service_state_changed_cb(tts_client_s* client);
+void* tts_client_get_service_state_changed_user_data(tts_client_s* client);
+
void tts_client_unset_all_cb(tts_client_s* client);
#ifdef __cplusplus
return TTS_ERROR_NONE;
}
+int tts_core_notify_service_state_changed(tts_client_s* client, tts_service_state_e before_state, tts_service_state_e current_state)
+{
+ RETVM_IF(false == tts_client_is_valid_client(client), TTS_ERROR_INVALID_PARAMETER, "[ERROR] Client is invalid.");
+
+ SLOG(LOG_DEBUG, TAG_TTSC, "Service state changed from (%d) to (%d).", before_state, current_state);
+
+ tts_service_state_changed_cb callback = tts_client_get_service_state_changed_cb(client);
+ void* data = tts_client_get_service_state_changed_user_data(client);
+
+ if (NULL != callback) {
+ SLOG(LOG_DEBUG, TAG_TTSC, "Notify service state changed");
+ tts_client_use_callback(client);
+ callback(tts_client_get_handle(client), before_state, current_state, data);
+ tts_client_not_use_callback(client);
+ } else {
+ SLOG(LOG_WARN, TAG_TTSC, "No registered callback(service_state_changed)");
+ }
+
+ return TTS_ERROR_NONE;
+}
+
bool tts_core_is_valid_text(const char* text)
{
if (NULL == text) {
int tts_core_notify_default_voice_changed(tts_client_s* client, const char* before_lang, int before_voice_type, const char* language, int voice_type);
int tts_core_notify_engine_changed(tts_client_s* client, const char* engine_id, const char* language, int voice_type, bool need_credential);
int tts_core_notify_screen_reader_changed(tts_client_s* client, bool value);
+int tts_core_notify_service_state_changed(tts_client_s* client, tts_service_state_e before_state, tts_service_state_e current_state);
bool tts_core_is_valid_text(const char* text);
bool tts_core_check_screen_reader(tts_client_s* client);
dbus_error_free(&err);
}
- // TODO: implement notifier
+ if (0 == tts_core_notify_service_state_changed(tts_client_get_by_uid(uid), (tts_service_state_e)before_state, (tts_service_state_e)current_state)) {
+ SLOG(LOG_DEBUG, TAG_TTSC, "<<<< tts service state changed : uid(%u) before(%d) current(%d)", uid, before_state, current_state);
+ }
} /* TTSD_METHOD_SET_SERVICE_STATE */
else if (dbus_message_is_signal(msg, if_name, TTSD_METHOD_ERROR)) {
bundle_get_str(msg, TTS_BUNDLE_BEFORE_STATE, &before_state);
bundle_get_str(msg, TTS_BUNDLE_CURRENT_STATE, ¤t_state);
- // TODO: Implement notifier
+ if (before_state && current_state) {
+ tts_core_notify_service_state_changed(client, (tts_service_state_e)atoi(before_state), (tts_service_state_e)atoi(current_state));
+ }
} else if (0 == strncmp(TTSD_METHOD_ERROR, method, strlen(TTSD_METHOD_ERROR))) {
char *uttid = NULL;
char *reason = NULL;
int uttid;
} utterance_t;
+typedef struct {
+ ttsd_state_e before;
+ ttsd_state_e current;
+} state_changed_args_t;
+
/* If current engine exist */
//static bool g_is_engine;
static Ecore_Timer* g_check_client_timer = NULL;
static Ecore_Timer* g_wait_timer = NULL;
static Ecore_Timer* g_quit_loop_timer = NULL;
+static Ecore_Timer* g_notify_state_timer = NULL;
static utterance_t g_utt;
return EINA_TRUE;
}
+static bool __notify_state_changed_event(int pid, unsigned int uid, app_tts_state_e state, void* user_data)
+{
+ state_changed_args_t* args = (state_changed_args_t*)user_data;
+ if (NULL == args) {
+ return false;
+ }
+
+ ttsdc_ipc_send_set_service_state_message(pid, uid, args->before, args->current);
+ return true;
+}
+
+static Eina_Bool __state_changed_timer_cb(void *data)
+{
+ if (NULL == data) {
+ SLOG(LOG_ERROR, tts_tag(), "[Server] Invalid data passed.");
+ return ECORE_CALLBACK_CANCEL;
+ }
+
+ int ret = ttsd_data_foreach_clients(__notify_state_changed_event, data);
+ if (TTSD_ERROR_NONE != ret) {
+ SLOG(LOG_ERROR, tts_tag(), "[Server] Fail to notify state change.");
+ }
+
+ free(data);
+ g_notify_state_timer = NULL;
+ return ECORE_CALLBACK_CANCEL;
+}
+
+static void __state_changed_cb(ttsd_state_e before, ttsd_state_e current)
+{
+ state_changed_args_t* args = (state_changed_args_t*)calloc(1, sizeof(state_changed_args_t));
+ args->before = before;
+ args->current = current;
+
+ SLOG(LOG_INFO, tts_tag(), "[Server] Notify state chanaged from (%d) to (%d).", before, current);
+ g_notify_state_timer = ecore_timer_add(0.0, __state_changed_timer_cb, args);
+}
+
/*
* Server APIs
*/
SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize config.");
}
- if (TTSD_ERROR_NONE != ttsd_state_initialize(NULL)) {
+ if (TTSD_ERROR_NONE != ttsd_state_initialize(__state_changed_cb)) {
SLOG(LOG_ERROR, tts_tag(), "[Server WARNING] Fail to initialize state.");
}