/** Parse MRCP prosody-volume value */
static apt_bool_t mrcp_prosody_param_volume_parse(mrcp_prosody_volume_t *prosody_volume, const apt_str_t *value, apr_pool_t *pool)
{
	if(!value->length) {
		return FALSE;
	}

	/** For the volume attribute, relative changes are a number preceded by "+" or "-" (w3c ssml)*/
	if(value->buf[0]=='+' || value->buf[0]=='-') {
		prosody_volume->type = PROSODY_VOLUME_TYPE_RELATIVE_CHANGE;
	}
	else if('0'<=value->buf[0] && value->buf[0]<='9') {
		prosody_volume->type = PROSODY_VOLUME_TYPE_NUMERIC;
	}
	else {
		prosody_volume->type = PROSODY_VOLUME_TYPE_LABEL;
	}

	if(prosody_volume->type == PROSODY_VOLUME_TYPE_RELATIVE_CHANGE) {
		prosody_volume->value.relative = apt_float_value_parse(value);
	}
	else if(prosody_volume->type == PROSODY_VOLUME_TYPE_NUMERIC) {
		prosody_volume->value.numeric = apt_float_value_parse(value);
	}
	else {
		prosody_volume->value.label = apt_string_table_value_parse(prosody_volume_string_table,PROSODY_VOLUME_COUNT,value);
	}

	return TRUE;
}
/** Parse MRCPv2 recognizer header */
static apt_bool_t mrcp_v2_recog_header_parse(mrcp_header_accessor_t *accessor, apr_size_t id, const apt_str_t *value, apr_pool_t *pool)
{
	mrcp_recog_header_t *recog_header = accessor->data;
	if(id == RECOGNIZER_HEADER_CONFIDENCE_THRESHOLD) {
		recog_header->confidence_threshold = apt_float_value_parse(value);
		return TRUE;
	}
	else if(id == RECOGNIZER_HEADER_SENSITIVITY_LEVEL) {
		recog_header->sensitivity_level = apt_float_value_parse(value);
		return TRUE;
	}
	else if(id == RECOGNIZER_HEADER_SPEED_VS_ACCURACY) {
		recog_header->speed_vs_accuracy = apt_float_value_parse(value);
		return TRUE;
	}
	return mrcp_recog_header_parse(recog_header,id,value,pool);
}
/** Parse MRCP recorder header */
static apt_bool_t mrcp_recorder_header_parse(mrcp_header_accessor_t *accessor, apr_size_t id, const apt_str_t *value, apr_pool_t *pool)
{
	apt_bool_t status = TRUE;
	mrcp_recorder_header_t *recorder_header = accessor->data;
	switch(id) {
		case RECORDER_HEADER_SENSITIVITY_LEVEL:
			recorder_header->sensitivity_level = apt_float_value_parse(value);
			break;
		case RECORDER_HEADER_NO_INPUT_TIMEOUT:
			recorder_header->no_input_timeout = apt_size_value_parse(value);
			break;
		case RECORDER_HEADER_COMPLETION_CAUSE:
			recorder_header->completion_cause = apt_size_value_parse(value);
			break;
		case RECORDER_HEADER_COMPLETION_REASON:
			recorder_header->completion_reason = *value;
			break;
		case RECORDER_HEADER_FAILED_URI:
			recorder_header->failed_uri = *value;
			break;
		case RECORDER_HEADER_FAILED_URI_CAUSE:
			recorder_header->failed_uri_cause = *value;
			break;
		case RECORDER_HEADER_RECORD_URI:
			recorder_header->record_uri = *value;
			break;
		case RECORDER_HEADER_MEDIA_TYPE:
			recorder_header->media_type = *value;
			break;
		case RECORDER_HEADER_MAX_TIME:
			recorder_header->max_time = apt_size_value_parse(value);
			break;
		case RECORDER_HEADER_TRIM_LENGTH:
			recorder_header->trim_length = apt_size_value_parse(value);
			break;
		case RECORDER_HEADER_FINAL_SILENCE:
			recorder_header->final_silence = apt_size_value_parse(value);
			break;
		case RECORDER_HEADER_CAPTURE_ON_SPEECH:
			apt_boolean_value_parse(value,&recorder_header->capture_on_speech);
			break;
		case RECORDER_HEADER_VER_BUFFER_UTTERANCE:
			apt_boolean_value_parse(value,&recorder_header->ver_buffer_utterance);
			break;
		case RECORDER_HEADER_START_INPUT_TIMERS:
			apt_boolean_value_parse(value,&recorder_header->start_input_timers);
			break;
		case RECORDER_HEADER_NEW_AUDIO_CHANNEL:
			apt_boolean_value_parse(value,&recorder_header->new_audio_channel);
			break;
		default:
			status = FALSE;
	}
	return status;
}
/** Parse MRCP prosody-rate value */
static apt_bool_t mrcp_prosody_param_rate_parse(mrcp_prosody_rate_t *prosody_rate, const apt_str_t *value, apr_pool_t *pool)
{
	if(!value->length) {
		return FALSE;
	}

	/** For the rate attribute, relative changes are a number. (not preceded by a "+" or "-")(w3c ssml)*/
	if('0'<=value->buf[0] && value->buf[0]<='9') {
		prosody_rate->type = PROSODY_RATE_TYPE_RELATIVE_CHANGE;
	}
	else {
		prosody_rate->type = PROSODY_RATE_TYPE_LABEL;
	}

	if(prosody_rate->type == PROSODY_RATE_TYPE_RELATIVE_CHANGE) {
		prosody_rate->value.relative = apt_float_value_parse(value);
	}
	else {
		prosody_rate->value.label = apt_string_table_value_parse(prosody_rate_string_table,PROSODY_RATE_COUNT,value);
	}

	return TRUE;
}
/** Parse MRCP recognizer header */
static apt_bool_t mrcp_recog_header_parse(mrcp_recog_header_t *recog_header, apr_size_t id, const apt_str_t *value, apr_pool_t *pool)
{
	apt_bool_t status = TRUE;
	switch(id) {
		case RECOGNIZER_HEADER_N_BEST_LIST_LENGTH:
			recog_header->n_best_list_length = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_NO_INPUT_TIMEOUT:
			recog_header->no_input_timeout = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_RECOGNITION_TIMEOUT:
			recog_header->recognition_timeout = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_WAVEFORM_URI:
			recog_header->waveform_uri = *value;
			break;
		case RECOGNIZER_HEADER_COMPLETION_CAUSE:
			recog_header->completion_cause = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_RECOGNIZER_CONTEXT_BLOCK:
			recog_header->recognizer_context_block = *value;
			break;
		case RECOGNIZER_HEADER_START_INPUT_TIMERS:
			apt_boolean_value_parse(value,&recog_header->start_input_timers);
			break;
		case RECOGNIZER_HEADER_SPEECH_COMPLETE_TIMEOUT:
			recog_header->speech_complete_timeout = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_SPEECH_INCOMPLETE_TIMEOUT:
			recog_header->speech_incomplete_timeout = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_DTMF_INTERDIGIT_TIMEOUT:
			recog_header->dtmf_interdigit_timeout = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_DTMF_TERM_TIMEOUT:
			recog_header->dtmf_term_timeout = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_DTMF_TERM_CHAR:
			recog_header->dtmf_term_char = *value->buf;
			break;
		case RECOGNIZER_HEADER_FAILED_URI:
			recog_header->failed_uri = *value;
			break;
		case RECOGNIZER_HEADER_FAILED_URI_CAUSE:
			recog_header->failed_uri_cause = *value;
			break;
		case RECOGNIZER_HEADER_SAVE_WAVEFORM:
			apt_boolean_value_parse(value,&recog_header->save_waveform);
			break;
		case RECOGNIZER_HEADER_NEW_AUDIO_CHANNEL:
			apt_boolean_value_parse(value,&recog_header->new_audio_channel);
			break;
		case RECOGNIZER_HEADER_SPEECH_LANGUAGE:
			recog_header->speech_language = *value;
			break;
		case RECOGNIZER_HEADER_INPUT_TYPE:
			recog_header->input_type = *value;
			break;
		case RECOGNIZER_HEADER_MEDIA_TYPE:
			recog_header->media_type = *value;
			break;
		case RECOGNIZER_HEADER_INPUT_WAVEFORM_URI:
			recog_header->input_waveform_uri = *value;
			break;
		case RECOGNIZER_HEADER_COMPLETION_REASON:
			recog_header->completion_reason = *value;
			break;
		case RECOGNIZER_HEADER_VER_BUFFER_UTTERANCE:
			apt_boolean_value_parse(value,&recog_header->ver_buffer_utterance);
			break;
		case RECOGNIZER_HEADER_RECOGNITION_MODE:
			recog_header->recognition_mode = *value;
			break;
		case RECOGNIZER_HEADER_CANCEL_IF_QUEUE:
			apt_boolean_value_parse(value,&recog_header->cancel_if_queue);
			break;
		case RECOGNIZER_HEADER_HOTWORD_MAX_DURATION:
			recog_header->hotword_max_duration = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_HOTWORD_MIN_DURATION:
			recog_header->hotword_min_duration = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_INTERPRET_TEXT:
			recog_header->interpret_text = *value;
			break;
		case RECOGNIZER_HEADER_DTMF_BUFFER_TIME:
			recog_header->dtmf_buffer_time = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_CLEAR_DTMF_BUFFER:
			apt_boolean_value_parse(value,&recog_header->clear_dtmf_buffer);
			break;
		case RECOGNIZER_HEADER_EARLY_NO_MATCH:
			apt_boolean_value_parse(value,&recog_header->early_no_match);
			break;
		case RECOGNIZER_HEADER_NUM_MIN_CONSISTENT_PRONUNCIATIONS:
			recog_header->num_min_consistent_pronunciations = apt_size_value_parse(value);
			break;
		case RECOGNIZER_HEADER_CONSISTENCY_THRESHOLD:
			recog_header->consistency_threshold = apt_float_value_parse(value);
			break;
		case RECOGNIZER_HEADER_CLASH_THRESHOLD:
			recog_header->clash_threshold = apt_float_value_parse(value);
			break;
		case RECOGNIZER_HEADER_PERSONAL_GRAMMAR_URI:
			recog_header->personal_grammar_uri = *value;
			break;
		case RECOGNIZER_HEADER_ENROLL_UTTERANCE:
			apt_boolean_value_parse(value,&recog_header->enroll_utterance);
			break;
		case RECOGNIZER_HEADER_PHRASE_ID:
			recog_header->phrase_id = *value;
			break;
		case RECOGNIZER_HEADER_PHRASE_NL:
			recog_header->phrase_nl = *value;
			break;
		case RECOGNIZER_HEADER_WEIGHT:
			recog_header->weight = apt_float_value_parse(value);
			break;
		case RECOGNIZER_HEADER_SAVE_BEST_WAVEFORM:
			apt_boolean_value_parse(value,&recog_header->save_best_waveform);
			break;
		case RECOGNIZER_HEADER_NEW_PHRASE_ID:
			recog_header->new_phrase_id = *value;
			break;
		case RECOGNIZER_HEADER_CONFUSABLE_PHRASES_URI:
			recog_header->confusable_phrases_uri = *value;
			break;
		case RECOGNIZER_HEADER_ABORT_PHRASE_ENROLLMENT:
			apt_boolean_value_parse(value,&recog_header->abort_phrase_enrollment);
			break;
		default:
			status = FALSE;
	}
	return status;
}