/* wait for data, if allowed */
if (block) {
- if (switch_buffer_inuse(queue->buffer) < requested) {
+ while (switch_buffer_inuse(queue->buffer) < requested) {
queue->waiting = requested;
- switch_thread_cond_timedwait(queue->cond, queue->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
- if (switch_buffer_inuse(queue->buffer) < requested) {
- requested = switch_buffer_inuse(queue->buffer);
+ if (switch_thread_cond_timedwait(queue->cond, queue->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
}
}
queue->waiting = 0;
- } else {
- if (switch_buffer_inuse(queue->buffer) < requested) {
- requested = switch_buffer_inuse(queue->buffer);
- }
+ }
+
+ if (switch_buffer_inuse(queue->buffer) < requested) {
+ requested = switch_buffer_inuse(queue->buffer);
}
if (requested == 0) {
*data_len = 0;
switch_mutex_lock(schannel->mutex);
if (schannel->state != SPEECH_CHANNEL_CLOSED) {
mrcp_application_channel_remove(schannel->unimrcp_session, schannel->unimrcp_channel);
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while(schannel->state != SPEECH_CHANNEL_CLOSED) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
audio_queue_destroy(schannel->audio_queue);
if (schannel->state != SPEECH_CHANNEL_CLOSED) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Failed to destroy channel. Continuing\n", schannel->name);
}
/* wait for channel to be ready */
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while (schannel->state == SPEECH_CHANNEL_CLOSED) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
if (schannel->state == SPEECH_CHANNEL_READY) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) channel is ready\n", schannel->name);
}
status = SWITCH_STATUS_FALSE;
} else if (schannel->state == SPEECH_CHANNEL_ERROR) {
/* Wait for session to be cleaned up */
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while(schannel->state == SPEECH_CHANNEL_ERROR) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
if (schannel->state != SPEECH_CHANNEL_CLOSED) {
/* major issue... can't retry */
status = SWITCH_STATUS_FALSE;
goto done;
}
/* wait for IN PROGRESS */
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while (schannel->state == SPEECH_CHANNEL_READY) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
if (schannel->state != SPEECH_CHANNEL_PROCESSING) {
status = SWITCH_STATUS_FALSE;
goto done;
goto done;
}
mrcp_application_message_send(schannel->unimrcp_session, schannel->unimrcp_channel, mrcp_message);
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while (schannel->state == SPEECH_CHANNEL_PROCESSING) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
if (schannel->state == SPEECH_CHANNEL_PROCESSING) {
switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "(%s) Timed out waiting for session to close. Continuing.\n", schannel->name);
status = SWITCH_STATUS_BREAK;
}
- switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_DEBUG, "(%s) rate = %d, native_rate = %d, samplerate = %d\n", schannel->name, sh->rate, sh->native_rate, sh->samplerate);
-
/* report negotiated sample rate back to FreeSWITCH */
sh->native_rate = schannel->rate;
goto done;
}
/* wait for IN PROGRESS */
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while (schannel->state == SPEECH_CHANNEL_READY) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
if (schannel->state != SPEECH_CHANNEL_PROCESSING) {
status = SWITCH_STATUS_FALSE;
goto done;
status = SWITCH_STATUS_FALSE;
goto done;
}
- switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC);
+ while (schannel->state == SPEECH_CHANNEL_PROCESSING) {
+ if (switch_thread_cond_timedwait(schannel->cond, schannel->mutex, SPEECH_CHANNEL_TIMEOUT_USEC) == SWITCH_STATUS_TIMEOUT) {
+ break;
+ }
+ }
if (schannel->state != SPEECH_CHANNEL_READY) {
status = SWITCH_STATUS_FALSE;
goto done;