return 0;
}
+int __ma_cb_audio_streaming_data_section_changed(ma_audio_streaming_data_section_e section)
+{
+ ma_audio_streaming_data_section_changed_cb callback = NULL;
+ void* user_data;
+
+ ma_client_get_audio_streaming_data_section_changed_cb(g_ma, &callback, &user_data);
+
+ if (NULL != callback) {
+ ma_client_use_callback(g_ma);
+ callback(section, user_data);
+ ma_client_not_use_callback(g_ma);
+ SLOG(LOG_DEBUG, TAG_MAC, "[DEBUG] Audio streaming data section changed callback is called, (%d)", section);
+ } else {
+ SLOG(LOG_DEBUG, TAG_MAC, "[WARNING] Audio streaming data section changed callback is NULL");
+ }
+
+ return 0;
+}
+
int ma_get_state(ma_state_e* state)
{
if (0 != __ma_get_feature_enabled()) {
}
return ret;
}
+
+int ma_set_wake_word_audio_require_flag(bool require)
+{
+ SLOG(LOG_DEBUG, TAG_MAC, "[Manager] Set wake word audio require flag");
+
+ if (0 != __ma_get_feature_enabled()) {
+ SLOG(LOG_DEBUG, TAG_MAC, "@@@ [Manager] not supported");
+ return MA_ERROR_NOT_SUPPORTED;
+ }
+
+ ma_state_e state;
+ if (0 != ma_client_get_client_state(g_ma, &state)) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] A handle is not available");
+ SLOG(LOG_DEBUG, TAG_MAC, "@@@");
+ return MA_ERROR_INVALID_STATE;
+ }
+
+ if (state != MA_STATE_READY) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] Invalid State: Current state is not 'READY', state(%d)", state);
+ SLOG(LOG_DEBUG, TAG_MAC, "@@@");
+ return MA_ERROR_INVALID_STATE;
+ }
+
+ /* Set wake word audio require flag */
+ int pid = getpid();
+ int ret = ma_dbus_set_wake_word_audio_require_flag(pid, require);
+ if (0 != ret) {
+ SLOG(LOG_WARN, TAG_MAC, "[WARNING] retry to set wake word audio require flag");
+ } else {
+ SLOG(LOG_DEBUG, TAG_MAC, "[DEBUG] Success to set");
+ }
+ return ret;
+}
+
+int ma_set_audio_streaming_data_section_changed_cb(ma_audio_streaming_data_section_changed_cb callback, void* user_data)
+{
+ if (0 != __ma_get_feature_enabled()) {
+ return MA_ERROR_NOT_SUPPORTED;
+ }
+
+ SLOG(LOG_DEBUG, TAG_MAC, "[Client DEBUG] Set Multi-assistant audio streaming data section changed cb");
+
+ if (NULL == callback) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] Invalid parameter"); //LCOV_EXCL_LINE
+ return MA_ERROR_INVALID_PARAMETER;
+ }
+
+ ma_state_e state;
+
+ if (0 != ma_client_get_client_state(g_ma, &state)) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
+ return MA_ERROR_INVALID_STATE;
+ }
+
+ /* check state */
+ if (state != MA_STATE_INITIALIZED) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] Invalid State: Current state is not 'Initialized' (%d)", state); //LCOV_EXCL_LINE
+ return MA_ERROR_INVALID_STATE;
+ }
+
+ ma_client_set_audio_streaming_data_section_changed_cb(g_ma, callback, user_data);
+
+ return MA_ERROR_NONE;
+}
+
+int ma_unset_audio_streaming_data_section_changed_cb(void)
+{
+ if (0 != __ma_get_feature_enabled()) {
+ return MA_ERROR_NOT_SUPPORTED;
+ }
+
+ SLOG(LOG_DEBUG, TAG_MAC, "[Client DEBUG] Unset Multi-assistant audio streaming data section changed cb");
+
+ ma_state_e state;
+
+ if (0 != ma_client_get_client_state(g_ma, &state)) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] A handle is not available"); //LCOV_EXCL_LINE
+ return MA_ERROR_INVALID_STATE;
+ }
+
+ /* check state */
+ if (state != MA_STATE_INITIALIZED) {
+ SLOG(LOG_ERROR, TAG_MAC, "[ERROR] Invalid State: Current state is not 'Initialized'"); //LCOV_EXCL_LINE
+ return MA_ERROR_INVALID_STATE;
+ }
+
+ ma_client_set_audio_streaming_data_section_changed_cb(g_ma, NULL, NULL);
+
+ return MA_ERROR_NONE;
+}
void* wakeup_engine_command_user_data;
ma_preprocessing_information_changed_cb preprocessing_information_changed_cb;
void* preprocessing_information_changed_user_data;
+ ma_audio_streaming_data_section_changed_cb audio_streaming_data_section_changed_cb;
+ void* audio_streaming_data_section_changed_user_data;
/* state */
ma_state_e previous_state;
return MA_ERROR_NONE;
}
+
+int ma_client_set_audio_streaming_data_section_changed_cb(ma_h ma, ma_audio_streaming_data_section_changed_cb callback, void* user_data)
+{
+ ma_client_s* client = __client_get(ma);
+
+ if (NULL == client)
+ return MA_ERROR_INVALID_PARAMETER;
+
+ client->audio_streaming_data_section_changed_cb = callback;
+ client->audio_streaming_data_section_changed_user_data = user_data;
+
+ return MA_ERROR_NONE;
+}
+
+int ma_client_get_audio_streaming_data_section_changed_cb(ma_h ma, ma_audio_streaming_data_section_changed_cb* callback, void** user_data)
+{
+ ma_client_s* client = __client_get(ma);
+
+ if (NULL == client)
+ return MA_ERROR_INVALID_PARAMETER;
+
+ *callback = client->audio_streaming_data_section_changed_cb;
+ *user_data = client->audio_streaming_data_section_changed_user_data;
+
+ return MA_ERROR_NONE;
+}
int ma_client_get_preprocessing_information_changed_cb(ma_h ma, ma_preprocessing_information_changed_cb* callback, void** user_data);
+int ma_client_set_audio_streaming_data_section_changed_cb(ma_h ma, ma_audio_streaming_data_section_changed_cb callback, void* user_data);
+
+int ma_client_get_audio_streaming_data_section_changed_cb(ma_h ma, ma_audio_streaming_data_section_changed_cb* callback, void** user_data);
+
#ifdef __cplusplus
}
#endif
extern int __ma_cb_active_state_changed(int state);
extern int __ma_cb_wakeup_engine_command(const char *command);
extern int __ma_cb_preprocessing_information_changed(const char* app_id);
+extern int __ma_cb_audio_streaming_data_section_changed(ma_audio_streaming_data_section_e section);
static Eina_Bool listener_event_callback(void* data, Ecore_Fd_Handler* fd_handler)
{
SLOG(LOG_INFO, TAG_MAC, "@@@");
} /* MAS_METHOD_SEND_PREPROCESSING_INFORMATION */
+ else if (dbus_message_is_method_call(msg, if_name, MAS_METHOD_AUDIO_STREAMING_DATA_SECTION)) {
+ SLOG(LOG_INFO, TAG_MAC, "@@@ Activate");
+ int section;
+
+ dbus_message_get_args(msg, &err,
+ DBUS_TYPE_INT32, §ion,
+ DBUS_TYPE_INVALID);
+
+ if (dbus_error_is_set(&err)) {
+ SLOG(LOG_ERROR, TAG_MAC, "@@ Get arguments error (%s)", err.message);
+ dbus_error_free(&err);
+ } else {
+ __ma_cb_audio_streaming_data_section_changed(section);
+ }
+
+ SLOG(LOG_INFO, TAG_MAC, "@@@");
+ } /* MAS_METHOD_AUDIO_STREAMING_DATA_SECTION */
+
else if (dbus_message_is_signal(msg, if_name, MAS_METHOD_ERROR)) {
SLOG(LOG_DEBUG, TAG_MAC, "[DEBUG] Get Error");
int reason;
return 0;
}
+
+int ma_dbus_set_wake_word_audio_require_flag(int pid, bool require)
+{
+ if (0 != __dbus_check()) {
+ return MA_ERROR_OPERATION_FAILED;
+ }
+
+ DBusMessage* msg;
+
+ msg = dbus_message_new_method_call(
+ MA_SERVER_SERVICE_NAME,
+ MA_SERVER_SERVICE_OBJECT_PATH,
+ MA_SERVER_SERVICE_INTERFACE,
+ MA_METHOD_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG);
+
+ if (NULL == msg) {
+ SLOG(LOG_ERROR, TAG_MAC, "@@ Request multi-assistant set wake word audio require flag : Fail to make message"); //LCOV_EXCL_LINE
+ return MA_ERROR_OPERATION_FAILED;
+ } else {
+ SLOG(LOG_DEBUG, TAG_MAC, "[DEBUG] multi-assistant set wake word audio require flag");
+ }
+
+ int tmp_require = (require ? 1 : 0);
+ dbus_message_append_args(msg,
+ DBUS_TYPE_INT32, &pid,
+ DBUS_TYPE_INT32, &tmp_require,
+ DBUS_TYPE_INVALID);
+
+ dbus_message_set_no_reply(msg, TRUE);
+
+ DBusError error;
+ dbus_error_init (&error);
+ if (!dbus_connection_send(g_conn_sender, msg, NULL)) {
+ if (dbus_error_is_set (&error)) {
+ SLOG(LOG_ERROR, TAG_MAC, "[Dbus ERROR] Fail to Send : %s", error.message); //LCOV_EXCL_LINE
+ dbus_error_free (&error);
+ } else {
+ SLOG(LOG_ERROR, TAG_MAC, "[Dbus ERROR] Fail to Send"); //LCOV_EXCL_LINE
+ }
+ return MA_ERROR_OPERATION_FAILED;
+ } else {
+ SLOG(LOG_DEBUG, TAG_MAC, "[Dbus DEBUG] Success to Send");
+ dbus_connection_flush(g_conn_sender);
+ }
+
+ dbus_message_unref(msg);
+
+ return 0;
+}
int ma_dbus_send_preprocessing_result(int pid, bool result);
+int ma_dbus_set_wake_word_audio_require_flag(int pid, bool require);
+
#ifdef __cplusplus
}
#endif
#define MA_METHOD_SET_BACKGROUND_VOLUME "ma_method_set_background_volume"
#define MA_METHOD_SET_PREPROCESSING_ALLOW_MODE "ma_method_set_preprocessing_allow_mode"
#define MA_METHOD_SEND_PREPROCESSING_RESULT "ma_method_send_preprocessing_result"
+#define MA_METHOD_SET_WAKE_WORD_AUDIO_REQUIRE_FLAG "ma_method_set_wake_word_audio_require_flag"
#define MA_METHOD_ERROR "ma_method_error"
#define MA_UI_METHOD_INITIALIZE "ma_ui_method_initialize"
#define MAS_METHOD_WAKEUP_ENGINE_COMMAND "mas_method_wakeup_engine_command"
#define MAS_METHOD_ERROR "mas_method_error"
#define MAS_METHOD_SEND_PREPROCESSING_INFORMATION "mas_method_send_preprocessing_information"
+#define MAS_METHOD_AUDIO_STREAMING_DATA_SECTION "mas_method_audio_streaming_data_section"
#define MAS_UI_METHOD_HELLO "mas_ui_method_hello"
#define MAS_UI_METHOD_SEND_ASR_RESULT "mas_ui_method_send_asr_result"
*/
int ma_send_preprocessing_result(bool is_success);
+/**
+ * @brief Sets the wake word audio require flag.
+ * @details If set to true, wake word audio data will be included in audio streaming data.
+ * @since_tizen 5.5
+ *
+ * @param[in] require The require value to be set
+ *
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #MA_ERROR_NONE Successful
+ * @retval #MA_ERROR_NOT_SUPPORTED Not supported
+ * @retval #MA_ERROR_INVALID_STATE Invalid state
+ * @retval #MA_ERROR_OPERATION_FAILED Operation failed
+ *
+ * @pre The state should be #MA_STATE_READY.
+ */
+int ma_set_wake_word_audio_require_flag(bool require);
+
+/**
+ * @brief Sets the section changed callback for audio streaming data.
+ * @since_tizen 5.5
+ *
+ * @param[in] callback The callback
+ * @param[in] user_data The user data passed to the callback function
+ *
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #MA_ERROR_NONE Successful
+ * @retval #MA_ERROR_NOT_SUPPORTED Not supported
+ * @retval #MA_ERROR_INVALID_PARAMETER Invalid parameter
+ * @retval #MA_ERROR_INVALID_STATE Invalid state
+ *
+ * @pre The state should be #MA_STATE_INITIALIZED.
+ * @see ma_audio_streaming_data_section_changed_cb()
+ * @see ma_unset_audio_streaming_data_section_changed_cb()
+ */
+int ma_set_audio_streaming_data_section_changed_cb(ma_audio_streaming_data_section_changed_cb callback, void* user_data);
+
+/**
+ * @brief Unsets the section changed callback for audio streaming data.
+ * @since_tizen 5.5
+ *
+ * @return @c 0 on success, otherwise a negative error value
+ * @retval #MA_ERROR_NONE Successful
+ * @retval #MA_ERROR_NOT_SUPPORTED Not supported
+ * @retval #MA_ERROR_INVALID_STATE Invalid state
+ *
+ * @pre The state should be #MA_STATE_INITIALIZED.
+ * @see ma_audio_streaming_data_section_changed_cb()
+ * @see ma_set_audio_streaming_data_section_changed_cb()
+ */
+int ma_unset_audio_streaming_data_section_changed_cb(void);
+
#ifdef __cplusplus
}
#endif
MA_PREPROCESSING_ALLOW_ALL, /**< Preprocessing allowed for all audio */
} ma_preprocessing_allow_mode_e;
+/**
+ * @brief Enumerations for section information of audio streaming data.
+ * @since_tizen 5.5
+ */
+typedef enum {
+ MA_AUDIO_STREAMING_DATA_SECTION_UTTERANCE = 0, /**< Utterance section started */
+ MA_AUDIO_STREAMING_DATA_SECTION_WAKE_WORD, /**< Wake word section started */
+} ma_audio_streaming_data_section_e;
+
/**
* @brief Called when the client state is changed.
* @since_tizen 5.0
*/
typedef void (*ma_preprocessing_information_changed_cb)(const char* app_id, void* user_data);
+/**
+ * @brief Called when the section information of audio streaming data is changed.
+ * @since_tizen 5.5
+ *
+ * @param[in] section The current section information of audio streaming data
+ * @param[in] user_data The user data passed from the callback registration function
+ */
+typedef void (*ma_audio_streaming_data_section_changed_cb)(ma_audio_streaming_data_section_e section, void* user_data);
+
#ifdef __cplusplus
}
#endif