FS-7047 #resolve #comment [mod_rayo] arbitrary MRCP headers can now be sent to unimrcp output components
This commit is contained in:
parent
f024ea3c2b
commit
a3f630fc2e
|
@ -51,6 +51,8 @@ struct output_component {
|
||||||
int stop;
|
int stop;
|
||||||
/** output renderer to use */
|
/** output renderer to use */
|
||||||
const char *renderer;
|
const char *renderer;
|
||||||
|
/** optional headers to pass to renderer */
|
||||||
|
const char *headers;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define OUTPUT_FINISH "finish", RAYO_OUTPUT_COMPLETE_NS
|
#define OUTPUT_FINISH "finish", RAYO_OUTPUT_COMPLETE_NS
|
||||||
|
@ -77,6 +79,28 @@ static struct rayo_component *create_output_component(struct rayo_actor *actor,
|
||||||
output_component->max_time_ms = iks_find_int_attrib(output, "max-time");
|
output_component->max_time_ms = iks_find_int_attrib(output, "max-time");
|
||||||
output_component->start_paused = iks_find_bool_attrib(output, "start-paused");
|
output_component->start_paused = iks_find_bool_attrib(output, "start-paused");
|
||||||
output_component->renderer = switch_core_strdup(RAYO_POOL(output_component), iks_find_attrib_soft(output, "renderer"));
|
output_component->renderer = switch_core_strdup(RAYO_POOL(output_component), iks_find_attrib_soft(output, "renderer"));
|
||||||
|
/* get custom headers */
|
||||||
|
{
|
||||||
|
switch_stream_handle_t headers = { 0 };
|
||||||
|
iks *header = NULL;
|
||||||
|
int first = 1;
|
||||||
|
SWITCH_STANDARD_STREAM(headers);
|
||||||
|
for (header = iks_find(output, "header"); header; header = iks_next_tag(header)) {
|
||||||
|
if (!strcmp("header", iks_name(header))) {
|
||||||
|
const char *name = iks_find_attrib_soft(header, "name");
|
||||||
|
const char *value = iks_find_attrib_soft(header, "value");
|
||||||
|
if (!zstr(name) && !zstr(value)) {
|
||||||
|
headers.write_function(&headers, "%s%s=%s", first ? "{" : ",", name, value);
|
||||||
|
first = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (headers.data) {
|
||||||
|
headers.write_function(&headers, "}");
|
||||||
|
output_component->headers = switch_core_strdup(RAYO_POOL(output_component), (char *)headers.data);
|
||||||
|
free(headers.data);
|
||||||
|
}
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
switch_core_destroy_memory_pool(&pool);
|
switch_core_destroy_memory_pool(&pool);
|
||||||
}
|
}
|
||||||
|
@ -438,7 +462,12 @@ static switch_status_t next_file(switch_file_handle_t *handle)
|
||||||
context->ssml = switch_mprintf("ssml://%s", ssml_str);
|
context->ssml = switch_mprintf("ssml://%s", ssml_str);
|
||||||
} else {
|
} else {
|
||||||
/* renderer will parse the SSML */
|
/* renderer will parse the SSML */
|
||||||
context->ssml = switch_mprintf("tts://%s||%s", output->renderer, ssml_str);
|
if (!zstr(output->headers) && !strncmp("unimrcp", output->renderer, 7)) {
|
||||||
|
/* pass MRCP headers */
|
||||||
|
context->ssml = switch_mprintf("tts://%s||%s%s", output->renderer, output->headers, ssml_str);
|
||||||
|
} else {
|
||||||
|
context->ssml = switch_mprintf("tts://%s||%s", output->renderer, ssml_str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
iks_free(ssml_str);
|
iks_free(ssml_str);
|
||||||
} else if (iks_has_children(context->cur_doc)) {
|
} else if (iks_has_children(context->cur_doc)) {
|
||||||
|
@ -457,7 +486,12 @@ static switch_status_t next_file(switch_file_handle_t *handle)
|
||||||
context->ssml = switch_mprintf("ssml://%s", ssml_str);
|
context->ssml = switch_mprintf("ssml://%s", ssml_str);
|
||||||
} else {
|
} else {
|
||||||
/* renderer will parse the SSML */
|
/* renderer will parse the SSML */
|
||||||
context->ssml = switch_mprintf("tts://%s||%s", output->renderer, ssml_str);
|
if (!zstr(output->headers) && !strncmp("unimrcp", output->renderer, 7)) {
|
||||||
|
/* pass MRCP headers */
|
||||||
|
context->ssml = switch_mprintf("tts://%s||%s%s", output->renderer, output->headers, ssml_str);
|
||||||
|
} else {
|
||||||
|
context->ssml = switch_mprintf("tts://%s||%s", output->renderer, ssml_str);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Missing <speak>\n");
|
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_INFO, "Missing <speak>\n");
|
||||||
|
|
Loading…
Reference in New Issue