static switch_status_t audio_queue_write(audio_queue_t *queue, void *data, switch_size_t *data_len);
static switch_status_t audio_queue_read(audio_queue_t *queue, void *data, switch_size_t *data_len, int block);
static switch_status_t audio_queue_clear(audio_queue_t *queue);
+static switch_status_t audio_queue_signal(audio_queue_t *queue);
static switch_status_t audio_queue_destroy(audio_queue_t *queue);
/*********************************************************************************************************************************************
SPEECH_CHANNEL_READY,
/** processing speech request */
SPEECH_CHANNEL_PROCESSING,
+ /** finished processing speech request */
+ SPEECH_CHANNEL_DONE,
/** error opening channel */
SPEECH_CHANNEL_ERROR
};
static switch_status_t audio_queue_write(audio_queue_t *queue, void *data, switch_size_t *data_len)
{
switch_status_t status = SWITCH_STATUS_SUCCESS;
+#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
+ switch_size_t len = *data_len;
+#endif
switch_mutex_lock(queue->mutex);
#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
- switch_size_t len = *data_len;
if (queue->file_write) {
switch_file_write(queue->file_write, data, &len);
}
{
switch_size_t requested = *data_len;
switch_status_t status = SWITCH_STATUS_SUCCESS;
+#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
+ switch_size_t len = *data_len;
+#endif
switch_mutex_lock(queue->mutex);
/* wait for data, if allowed */
#ifdef MOD_UNIMRCP_DEBUG_AUDIO_QUEUE
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) audio queue read total = %ld\tread = %ld\trequested = %ld\n", queue->name,
queue->read_bytes, *data_len, requested);
- switch_size_t len = *data_len;
if (queue->file_read) {
switch_file_write(queue->file_read, data, &len);
}
return SWITCH_STATUS_SUCCESS;
}
+/**
+ * Wake any threads waiting on this queue
+ *
+ * @param queue the queue to empty
+ * @return SWITCH_STATUS_SUCCESS
+ */
+static switch_status_t audio_queue_signal(audio_queue_t *queue)
+{
+ switch_mutex_lock(queue->mutex);
+ switch_thread_cond_signal(queue->cond);
+ switch_mutex_unlock(queue->mutex);
+ return SWITCH_STATUS_SUCCESS;
+}
+
/**
* Destroy the audio queue
*
}
switch_mutex_lock(schannel->mutex);
- if (schannel->state == SPEECH_CHANNEL_PROCESSING) {
+ switch (schannel->state) {
+ case SPEECH_CHANNEL_DONE:
+ /* pull any remaining audio - never blocking */
+ if (audio_queue_read(schannel->audio_queue, data, len, 0) == SWITCH_STATUS_FALSE) {
+ /* all frames read */
+ status = SWITCH_STATUS_BREAK;
+ }
+ break;
+ case SPEECH_CHANNEL_PROCESSING:
+ /* IN-PROGRESS */
audio_queue_read(schannel->audio_queue, data, len, block);
- } else {
+ break;
+ default:
status = SWITCH_STATUS_BREAK;
}
switch_mutex_unlock(schannel->mutex);
return "READY";
case SPEECH_CHANNEL_PROCESSING:
return "PROCESSING";
+ case SPEECH_CHANNEL_DONE:
+ return "DONE";
case SPEECH_CHANNEL_ERROR:
return "ERROR";
}
{
if (schannel->state == SPEECH_CHANNEL_PROCESSING && state != SPEECH_CHANNEL_PROCESSING) {
/* wake anyone waiting for audio data */
- audio_queue_clear(schannel->audio_queue);
+ audio_queue_signal(schannel->audio_queue);
}
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) %s ==> %s\n", schannel->name, speech_channel_state_to_string(schannel->state),
memset((uint8_t *) data + bytes_read, schannel->silence, *datalen - bytes_read);
}
} else {
+ /* ready for next speak request */
+ speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
*datalen = 0;
status = SWITCH_STATUS_BREAK;
}
if (message->start_line.request_state == MRCP_REQUEST_STATE_COMPLETE) {
/* got COMPLETE */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) COMPLETE\n", schannel->name);
- speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
+ speech_channel_set_state(schannel, SPEECH_CHANNEL_DONE);
} else {
/* received unexpected request state */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) unexpected STOP response, request_state = %d\n", schannel->name,
if (message->start_line.method_id == SYNTHESIZER_SPEAK_COMPLETE) {
/* got SPEAK-COMPLETE */
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) SPEAK-COMPLETE\n", schannel->name);
- speech_channel_set_state(schannel, SPEECH_CHANNEL_READY);
+ speech_channel_set_state(schannel, SPEECH_CHANNEL_DONE);
} else {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) unexpected event, method_id = %d\n", schannel->name,
(int) message->start_line.method_id);