Add to set playing mode to decide where the synthesized pcm data will be played
[platform/core/uifw/tts.git] / client / tts_ipc.c
1 /*
2 *  Copyright (c) 2021 Samsung Electronics Co., Ltd All Rights Reserved
3 *  Licensed under the Apache License, Version 2.0 (the "License");
4 *  you may not use this file except in compliance with the License.
5 *  You may obtain a copy of the License at
6 *  http://www.apache.org/licenses/LICENSE-2.0
7 *  Unless required by applicable law or agreed to in writing, software
8 *  distributed under the License is distributed on an "AS IS" BASIS,
9 *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
10 *  See the License for the specific language governing permissions and
11 *  limitations under the License.
12 */
13 #include "tts_ipc.h"
14 #include "tts_dbus.h"
15 #include "tts_tidl.h"
16 #include "tts_dlog.h"
17
18
19 typedef enum {
20         OPEN_CONNECTION,
21         CLOSE_CONNECTION,
22         STOP_LISTENING,
23         REQUEST_HELLO,
24         REQUEST_HELLO_SYNC,
25         REQUEST_INITIALIZE,
26         REQUEST_FINALIZE,
27         REQUEST_ADD_TEXT,
28         REQUEST_PLAY,
29         REQUEST_STOP,
30         REQUEST_PAUSE,
31         REQUEST_SET_PRIVATE_DATA,
32         REQUEST_GET_PRIVATE_DATA,
33         REQUEST_PLAY_PCM,
34         REQUEST_STOP_PCM,
35         REQUEST_ADD_PCM,
36         REQUEST_GET_SERVICE_STATE
37 } tts_ipc_vtable_e;
38
39
40 static int(*ttsc_dbus_vtable[])() = { &tts_dbus_open_connection, &tts_dbus_close_connection, &tts_dbus_stop_listening,
41                                                 &tts_dbus_request_hello, &tts_dbus_request_hello_sync, &tts_dbus_request_initialize,
42                                                 &tts_dbus_request_finalize, &tts_dbus_request_add_text, &tts_dbus_request_play, &tts_dbus_request_stop,
43                                                 &tts_dbus_request_pause, &tts_dbus_request_set_private_data, &tts_dbus_request_get_private_data,
44                                                 &tts_dbus_request_play_pcm, &tts_dbus_request_stop_pcm, &tts_dbus_request_add_pcm,
45                                                 &tts_dbus_request_get_service_state };
46
47 static int(*ttsc_tidl_vtable[])() = { &tts_tidl_open_connection, &tts_tidl_close_connection, &tts_tidl_stop_listening,
48                                                 &tts_tidl_request_hello, &tts_tidl_request_hello_sync, &tts_tidl_request_initialize,
49                                                 &tts_tidl_request_finalize, &tts_tidl_request_add_text, &tts_tidl_request_play, &tts_tidl_request_stop,
50                                                 &tts_tidl_request_pause, &tts_tidl_request_set_private_data, &tts_tidl_request_get_private_data,
51                                                 &tts_tidl_request_play_pcm, &tts_tidl_request_stop_pcm, &tts_tidl_request_add_pcm,
52                                                 &tts_tidl_request_get_service_state };
53
54 static int (**g_vtable)();
55 static tts_ipc_method_e g_ipc_method = TTS_IPC_METHOD_UNDEFINED;
56
57 int tts_ipc_set_method(tts_ipc_method_e method)
58 {
59         switch (method) {
60         case TTS_IPC_METHOD_DBUS:
61                 g_vtable = ttsc_dbus_vtable;
62                 break;
63         case TTS_IPC_METHOD_TIDL:
64                 g_vtable = ttsc_tidl_vtable;
65                 break;
66         default:
67                 SLOG(LOG_ERROR, TAG_TTSC, "[ERROR] IPC method is not valid");
68                 g_vtable = NULL;
69                 return TTS_ERROR_INVALID_PARAMETER;
70         }
71
72         g_ipc_method = method;
73         return TTS_ERROR_NONE;
74 }
75
76 bool tts_ipc_is_method_set()
77 {
78         SLOG(LOG_INFO, TAG_TTSC, "Set method (TIDL or DBUS) for ipc");
79         return (g_ipc_method != TTS_IPC_METHOD_UNDEFINED);
80 }
81
82 int tts_ipc_open_connection(unsigned int uid)
83 {
84         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_open_connection");
85
86         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
87         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
88
89         return g_vtable[OPEN_CONNECTION](uid);
90 }
91
92 int tts_ipc_close_connection(unsigned int uid)
93 {
94         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_close_connection");
95
96         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
97         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
98
99         return g_vtable[CLOSE_CONNECTION](uid);
100 }
101
102 int tts_ipc_stop_listening(unsigned int uid)
103 {
104         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_stop_listening");
105
106         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
107         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
108
109         return g_vtable[STOP_LISTENING](uid);
110 }
111
112 int tts_ipc_request_hello(unsigned int uid, tts_mode_e mode, tts_playing_mode_e playing_mode, int registered_event_mask)
113 {
114         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_hello");
115
116         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
117         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
118
119         return g_vtable[REQUEST_HELLO](uid, mode, playing_mode, registered_event_mask);
120 }
121
122 int tts_ipc_request_hello_sync(unsigned int uid)
123 {
124         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_hello_sync");
125
126         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
127         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
128
129         return g_vtable[REQUEST_HELLO_SYNC](uid);
130 }
131
132 int tts_ipc_request_initialize(unsigned int uid, tts_mode_e mode, tts_playing_mode_e playing_mode, int registered_event_mask, tts_service_state_e* service_state, bool* credential_needed)
133 {
134         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_initialize");
135
136         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
137         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
138
139         return g_vtable[REQUEST_INITIALIZE](uid, mode, registered_event_mask, service_state, credential_needed);
140 }
141
142 int tts_ipc_request_finalize(unsigned int uid)
143 {
144         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_finalize");
145
146         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
147         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
148
149         return g_vtable[REQUEST_FINALIZE](uid);
150 }
151
152 int tts_ipc_request_add_text(unsigned int uid, const char* text, const char* lang, int vctype, int speed, int uttid, const char* credential)
153 {
154         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_add_text");
155
156         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
157         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
158
159         return g_vtable[REQUEST_ADD_TEXT](uid, text, lang, vctype, speed, uttid, credential);
160 }
161
162 int tts_ipc_request_set_private_data(unsigned int uid, const char* key, const char* data)
163 {
164         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_set_private_data");
165
166         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
167         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
168
169         return g_vtable[REQUEST_SET_PRIVATE_DATA](uid, key, data);
170 }
171
172 int tts_ipc_request_get_private_data(unsigned int uid, const char* key, char** data)
173 {
174         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_get_private_data");
175
176         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
177         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
178
179         return g_vtable[REQUEST_GET_PRIVATE_DATA](uid, key, data);
180 }
181
182 int tts_ipc_request_play(unsigned int uid, const char* credential)
183 {
184         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_play");
185
186         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
187         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
188
189         return g_vtable[REQUEST_PLAY](uid, credential);
190 }
191
192 int tts_ipc_request_stop(unsigned int uid)
193 {
194         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_stop");
195
196         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
197         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
198
199         return g_vtable[REQUEST_STOP](uid);
200 }
201
202 int tts_ipc_request_pause(unsigned int uid)
203 {
204         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_pause");
205
206         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
207         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
208
209         return g_vtable[REQUEST_PAUSE](uid);
210 }
211
212 int tts_ipc_request_play_pcm(unsigned int uid)
213 {
214         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_play_pcm");
215
216         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
217         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
218
219         return g_vtable[REQUEST_PLAY_PCM](uid);
220 }
221
222 int tts_ipc_request_stop_pcm(unsigned int uid)
223 {
224         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_stop_pcm");
225
226         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
227         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
228
229         return g_vtable[REQUEST_STOP_PCM](uid);
230 }
231
232 int tts_ipc_request_add_pcm(unsigned int uid, int event, const char* data, int data_size, int audio_type, int rate)
233 {
234         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_add_pcm");
235
236         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
237         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
238
239         return g_vtable[REQUEST_ADD_PCM](uid, event, data, data_size, audio_type, rate);
240 }
241
242 int tts_ipc_request_get_service_state(unsigned int uid, tts_service_state_e* service_state)
243 {
244         SLOG(LOG_INFO, TAG_TTSC, "[IPC] tts_ipc_request_get_service_state");
245
246         RETVM_IF(false == tts_client_is_valid_uid(uid), TTS_ERROR_INVALID_PARAMETER, "Fail to get tts_client with uid(%u)", uid);
247         RETVM_IF(NULL == g_vtable, TTS_ERROR_OPERATION_FAILED, "[ERROR] IPC method is not set");
248
249         return g_vtable[REQUEST_GET_SERVICE_STATE](uid, service_state);
250 }