summaryrefslogtreecommitdiff
path: root/src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc')
-rw-r--r--src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc193
1 files changed, 120 insertions, 73 deletions
diff --git a/src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc b/src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc
index b1ac31b9d8..d595119d45 100644
--- a/src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc
+++ b/src/components/application_manager/src/commands/mobile/perform_audio_pass_thru_request.cc
@@ -33,9 +33,10 @@
#include <cstring>
#include "application_manager/commands/mobile/perform_audio_pass_thru_request.h"
-#include "application_manager/application_manager_impl.h"
+
#include "application_manager/application_impl.h"
#include "application_manager/message_helper.h"
+#include "utils/helpers.h"
namespace application_manager {
@@ -44,25 +45,19 @@ namespace commands {
namespace str = strings;
PerformAudioPassThruRequest::PerformAudioPassThruRequest(
- const MessageSharedPtr& message)
- : CommandRequestImpl(message),
- is_active_tts_speak_(false),
- result_tts_speak_(mobile_apis::Result::SUCCESS) {
+ const MessageSharedPtr& message, ApplicationManager& application_manager)
+ : CommandRequestImpl(message, application_manager)
+ , is_active_tts_speak_(false)
+ , result_tts_speak_(mobile_apis::Result::SUCCESS) {
subscribe_on_event(hmi_apis::FunctionID::TTS_OnResetTimeout);
}
-PerformAudioPassThruRequest::~PerformAudioPassThruRequest() {
-}
+PerformAudioPassThruRequest::~PerformAudioPassThruRequest() {}
void PerformAudioPassThruRequest::onTimeOut() {
LOG4CXX_AUTO_TRACE(logger_);
- if (ApplicationManagerImpl::instance()->end_audio_pass_thru()) {
- ApplicationManagerImpl::instance()->StopAudioPassThru(connection_key());
- }
-
FinishTTSSpeak();
-
CommandRequestImpl::onTimeOut();
}
@@ -75,8 +70,7 @@ bool PerformAudioPassThruRequest::Init() {
void PerformAudioPassThruRequest::Run() {
LOG4CXX_AUTO_TRACE(logger_);
- ApplicationSharedPtr app =
- ApplicationManagerImpl::instance()->application(connection_key());
+ ApplicationSharedPtr app = application_manager_.application(connection_key());
if (!app) {
LOG4CXX_ERROR(logger_, "APPLICATION_NOT_REGISTERED");
@@ -92,7 +86,8 @@ void PerformAudioPassThruRequest::Run() {
if (IsWhiteSpaceExist()) {
LOG4CXX_ERROR(logger_,
- "Incoming perform audio pass thru has contains \\t\\n \\\\t \\\\n"
+ "Incoming perform audio pass thru has contains "
+ "\\t\\n \\\\t \\\\n"
" text contains only whitespace in initialPrompt");
SendResponse(false, mobile_apis::Result::INVALID_DATA);
return;
@@ -112,10 +107,18 @@ void PerformAudioPassThruRequest::Run() {
void PerformAudioPassThruRequest::on_event(const event_engine::Event& event) {
LOG4CXX_AUTO_TRACE(logger_);
+ using namespace helpers;
+
const smart_objects::SmartObject& message = event.smart_object();
switch (event.id()) {
case hmi_apis::FunctionID::UI_PerformAudioPassThru: {
+ LOG4CXX_TRACE(logger_, "Received UI_PerformAudioPassThru");
+
+ if (!WaitTTSSpeak()) {
+ LOG4CXX_DEBUG(logger_, "TTS.Speak is absent");
+ return;
+ }
mobile_apis::Result::eType mobile_code =
GetMobileResultCode(static_cast<hmi_apis::Common_Result::eType>(
@@ -128,47 +131,52 @@ void PerformAudioPassThruRequest::on_event(const event_engine::Event& event) {
return;
}
- if (ApplicationManagerImpl::instance()->end_audio_pass_thru()) {
- ApplicationManagerImpl::instance()->StopAudioPassThru(connection_key());
- }
-
FinishTTSSpeak();
std::string return_info;
- bool result = mobile_apis::Result::SUCCESS == mobile_code ||
- mobile_apis::Result::RETRY == mobile_code;
-
- if ((mobile_apis::Result::SUCCESS == mobile_code) &&
- (mobile_apis::Result::UNSUPPORTED_RESOURCE == result_tts_speak_)) {
+ const bool result = Compare<mobile_api::Result::eType, EQ, ONE>(
+ mobile_code,
+ mobile_apis::Result::SUCCESS,
+ mobile_apis::Result::RETRY,
+ mobile_apis::Result::WARNINGS);
+
+ const bool is_result_ok = Compare<mobile_api::Result::eType, EQ, ONE>(
+ mobile_code,
+ mobile_apis::Result::SUCCESS,
+ mobile_apis::Result::WARNINGS);
+
+ if (is_result_ok &&
+ mobile_apis::Result::UNSUPPORTED_RESOURCE == result_tts_speak_) {
mobile_code = mobile_apis::Result::WARNINGS;
return_info = "Unsupported phoneme type sent in a prompt";
}
- SendResponse(result, mobile_code, return_info.c_str(),
+ SendResponse(result,
+ mobile_code,
+ return_info.empty() ? NULL : return_info.c_str(),
&(message[strings::msg_params]));
break;
}
case hmi_apis::FunctionID::TTS_Speak: {
LOG4CXX_INFO(logger_, "Received TTS_Speak event");
- result_tts_speak_ = GetMobileResultCode(static_cast<hmi_apis::Common_Result::eType>(
- message[strings::params][hmi_response::code].asUInt()));
+ result_tts_speak_ =
+ GetMobileResultCode(static_cast<hmi_apis::Common_Result::eType>(
+ message[strings::params][hmi_response::code].asUInt()));
is_active_tts_speak_ = false;
if (mobile_apis::Result::SUCCESS == result_tts_speak_) {
SendRecordStartNotification();
StartMicrophoneRecording();
// update request timeout to get time for perform audio recording
- ApplicationManagerImpl::instance()->
- updateRequestTimeout(connection_key(),
- correlation_id(),
- default_timeout());
+ application_manager_.updateRequestTimeout(
+ connection_key(), correlation_id(), default_timeout());
}
break;
}
case hmi_apis::FunctionID::TTS_OnResetTimeout: {
LOG4CXX_INFO(logger_, "Received TTS_OnResetTimeout event");
- ApplicationManagerImpl::instance()->updateRequestTimeout(
+ application_manager_.updateRequestTimeout(
connection_key(), correlation_id(), default_timeout());
break;
}
@@ -180,7 +188,8 @@ void PerformAudioPassThruRequest::on_event(const event_engine::Event& event) {
}
void PerformAudioPassThruRequest::SendSpeakRequest() {
- // crate HMI TTS speak request
+ LOG4CXX_AUTO_TRACE(logger_);
+
using namespace hmi_apis;
using namespace smart_objects;
@@ -189,8 +198,8 @@ void PerformAudioPassThruRequest::SendSpeakRequest() {
if ((*message_)[str::msg_params].keyExists(str::initial_prompt) &&
(0 < (*message_)[str::msg_params][str::initial_prompt].length())) {
for (uint32_t i = 0;
- i < (*message_)[str::msg_params][str::initial_prompt].length();
- ++i) {
+ i < (*message_)[str::msg_params][str::initial_prompt].length();
+ ++i) {
msg_params[hmi_request::tts_chunks][i][str::text] =
(*message_)[str::msg_params][str::initial_prompt][i][str::text];
msg_params[hmi_request::tts_chunks][i][str::type] =
@@ -205,12 +214,13 @@ void PerformAudioPassThruRequest::SendSpeakRequest() {
}
void PerformAudioPassThruRequest::SendPerformAudioPassThruRequest() {
- smart_objects::SmartObject msg_params = smart_objects::SmartObject(
- smart_objects::SmartType_Map);
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ smart_objects::SmartObject msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
msg_params[str::app_id] = connection_key();
- // duration
msg_params[hmi_request::max_duration] =
(*message_)[str::msg_params][str::max_duration];
@@ -218,21 +228,21 @@ void PerformAudioPassThruRequest::SendPerformAudioPassThruRequest() {
smart_objects::SmartObject(smart_objects::SmartType_Array);
if ((*message_)[str::msg_params].keyExists(str::audio_pass_display_text1)) {
- msg_params[hmi_request::audio_pass_display_texts]
- [0][hmi_request::field_name] = static_cast<int32_t>
- (hmi_apis::Common_TextFieldName::audioPassThruDisplayText1);
- msg_params[hmi_request::audio_pass_display_texts]
- [0][hmi_request::field_text] =
- (*message_)[str::msg_params][str::audio_pass_display_text1];
+ msg_params[hmi_request::audio_pass_display_texts][0]
+ [hmi_request::field_name] = static_cast<int32_t>(
+ hmi_apis::Common_TextFieldName::audioPassThruDisplayText1);
+ msg_params[hmi_request::audio_pass_display_texts][0]
+ [hmi_request::field_text] =
+ (*message_)[str::msg_params][str::audio_pass_display_text1];
}
if ((*message_)[str::msg_params].keyExists(str::audio_pass_display_text2)) {
- msg_params[hmi_request::audio_pass_display_texts]
- [1][hmi_request::field_name] = static_cast<int32_t>
- (hmi_apis::Common_TextFieldName::audioPassThruDisplayText2);
- msg_params[hmi_request::audio_pass_display_texts]
- [1][hmi_request::field_text] =
- (*message_)[str::msg_params][str::audio_pass_display_text2];
+ msg_params[hmi_request::audio_pass_display_texts][1]
+ [hmi_request::field_name] = static_cast<int32_t>(
+ hmi_apis::Common_TextFieldName::audioPassThruDisplayText2);
+ msg_params[hmi_request::audio_pass_display_texts][1]
+ [hmi_request::field_text] =
+ (*message_)[str::msg_params][str::audio_pass_display_text2];
}
if ((*message_)[str::msg_params].keyExists(str::mute_audio)) {
@@ -243,23 +253,28 @@ void PerformAudioPassThruRequest::SendPerformAudioPassThruRequest() {
msg_params[str::mute_audio] = true;
}
- SendHMIRequest(hmi_apis::FunctionID::UI_PerformAudioPassThru,
- &msg_params, true);
+ SendHMIRequest(
+ hmi_apis::FunctionID::UI_PerformAudioPassThru, &msg_params, true);
}
void PerformAudioPassThruRequest::SendRecordStartNotification() {
- smart_objects::SmartObject msg_params = smart_objects::SmartObject(
- smart_objects::SmartType_Map);
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ smart_objects::SmartObject msg_params =
+ smart_objects::SmartObject(smart_objects::SmartType_Map);
msg_params[strings::app_id] = connection_key();
CreateHMINotification(hmi_apis::FunctionID::UI_OnRecordStart, msg_params);
}
void PerformAudioPassThruRequest::StartMicrophoneRecording() {
- ApplicationManagerImpl::instance()->begin_audio_pass_thru();
+ LOG4CXX_AUTO_TRACE(logger_);
+
+ application_manager_.BeginAudioPassThrough();
- ApplicationManagerImpl::instance()->StartAudioPassThruThread(
- connection_key(), correlation_id(),
+ application_manager_.StartAudioPassThruThread(
+ connection_key(),
+ correlation_id(),
(*message_)[str::msg_params][str::max_duration].asInt(),
(*message_)[str::msg_params][str::sampling_rate].asInt(),
(*message_)[str::msg_params][str::bits_per_sample].asInt(),
@@ -286,25 +301,25 @@ bool PerformAudioPassThruRequest::IsWhiteSpaceExist() {
}
}
- if ((*message_)[strings::msg_params].
- keyExists(strings::audio_pass_display_text1)) {
-
- str = (*message_)[strings::msg_params]
- [strings::audio_pass_display_text1].asCharArray();
+ if ((*message_)[strings::msg_params].keyExists(
+ strings::audio_pass_display_text1)) {
+ str = (*message_)[strings::msg_params][strings::audio_pass_display_text1]
+ .asCharArray();
if (!CheckSyntax(str)) {
- LOG4CXX_ERROR(logger_,
+ LOG4CXX_ERROR(
+ logger_,
"Invalid audio_pass_display_text1 value syntax check failed");
return true;
}
}
- if ((*message_)[strings::msg_params].
- keyExists(strings::audio_pass_display_text2)) {
-
- str = (*message_)[strings::msg_params]
- [strings::audio_pass_display_text2].asCharArray();
+ if ((*message_)[strings::msg_params].keyExists(
+ strings::audio_pass_display_text2)) {
+ str = (*message_)[strings::msg_params][strings::audio_pass_display_text2]
+ .asCharArray();
if (!CheckSyntax(str)) {
- LOG4CXX_ERROR(logger_,
+ LOG4CXX_ERROR(
+ logger_,
"Invalid audio_pass_display_text2 value syntax check failed");
return true;
}
@@ -312,11 +327,43 @@ bool PerformAudioPassThruRequest::IsWhiteSpaceExist() {
return false;
}
-void PerformAudioPassThruRequest::FinishTTSSpeak(){
- if (is_active_tts_speak_) {
- is_active_tts_speak_ = false;
- SendHMIRequest(hmi_apis::FunctionID::TTS_StopSpeaking, NULL);
+void PerformAudioPassThruRequest::FinishTTSSpeak() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ if (application_manager_.EndAudioPassThrough()) {
+ LOG4CXX_DEBUG(logger_, "Stop AudioPassThru.");
+ application_manager_.StopAudioPassThru(connection_key());
}
+ if (!is_active_tts_speak_) {
+ LOG4CXX_WARN(logger_, "TTS Speak is inactive.");
+ return;
+ }
+ is_active_tts_speak_ = false;
+ SendHMIRequest(hmi_apis::FunctionID::TTS_StopSpeaking, NULL);
+}
+
+bool PerformAudioPassThruRequest::WaitTTSSpeak() {
+ LOG4CXX_AUTO_TRACE(logger_);
+ uint64_t default_timeout_msec =
+ application_manager_.get_settings().default_timeout();
+ const TimevalStruct start_time = date_time::DateTime::getCurrentTime();
+
+ // Waiting for TTS_Speak
+ while (is_active_tts_speak_) {
+ uint64_t difference_between_start_current_time =
+ date_time::DateTime::calculateTimeSpan(start_time);
+ // Send GENERIC_ERROR after default timeout
+ if (difference_between_start_current_time > default_timeout_msec) {
+ LOG4CXX_WARN(logger_, "Expired timeout for TTS.Speak response");
+ // Don't use onTimeOut(), because default_timeout_ is bigger than
+ // Default time in *.ini file
+ FinishTTSSpeak();
+ SendResponse(false,
+ mobile_apis::Result::eType::GENERIC_ERROR,
+ "Expired timeout for TTS.Speak response");
+ return false;
+ }
+ }
+ return true;
}
} // namespace commands