add mutex to pre_buffer

git-svn-id: http://svn.openzap.org/svn/openzap/trunk@844 a93c3328-9c30-0410-af19-c9cd2b2d52af
This commit is contained in:
Anthony Minessale 2009-10-13 16:53:36 +00:00
parent 64b76671ee
commit f4a61117e6
2 changed files with 26 additions and 8 deletions

View File

@ -506,6 +506,7 @@ struct zap_channel {
zap_buffer_t *pre_buffer;
zap_buffer_t *digit_buffer;
zap_buffer_t *fsk_buffer;
zap_mutex_t *pre_buffer_mutex;
uint32_t dtmf_on;
uint32_t dtmf_off;
char *dtmf_hangup_buf;

View File

@ -245,12 +245,14 @@ static zap_status_t zap_channel_destroy(zap_channel_t *zchan)
zap_sleep(500);
}
zap_mutex_lock(zchan->pre_buffer_mutex);
zap_buffer_destroy(&zchan->pre_buffer);
zap_mutex_unlock(zchan->pre_buffer_mutex);
zap_buffer_destroy(&zchan->digit_buffer);
zap_buffer_destroy(&zchan->gen_dtmf_buffer);
zap_buffer_destroy(&zchan->dtmf_buffer);
zap_buffer_destroy(&zchan->fsk_buffer);
zap_buffer_destroy(&zchan->pre_buffer);
zchan->pre_buffer_size = 0;
hashtable_destroy(zchan->variable_hash);
@ -273,13 +275,13 @@ static zap_status_t zap_channel_destroy(zap_channel_t *zchan)
}
zap_mutex_destroy(&zchan->mutex);
zap_mutex_destroy(&zchan->pre_buffer_mutex);
}
return ZAP_SUCCESS;
}
OZ_DECLARE(zap_status_t) zap_channel_get_alarms(zap_channel_t *zchan)
{
zap_status_t status = ZAP_FAIL;
@ -525,6 +527,8 @@ OZ_DECLARE(zap_status_t) zap_span_add_channel(zap_span_t *span, zap_socket_t soc
}
zap_mutex_create(&new_chan->mutex);
zap_mutex_create(&new_chan->pre_buffer_mutex);
zap_buffer_create(&new_chan->digit_buffer, 128, 128, 0);
zap_buffer_create(&new_chan->gen_dtmf_buffer, 128, 128, 0);
new_chan->variable_hash = create_hashtable(16, zap_hash_hashfromstring, zap_hash_equalkeys);
@ -1202,8 +1206,10 @@ OZ_DECLARE(zap_status_t) zap_channel_done(zap_channel_t *zchan)
zap_clear_flag_locked(zchan, ZAP_CHANNEL_PROGRESS);
zap_clear_flag_locked(zchan, ZAP_CHANNEL_MEDIA);
zap_clear_flag_locked(zchan, ZAP_CHANNEL_ANSWERED);
zap_mutex_lock(zchan->pre_buffer_mutex);
zap_buffer_destroy(&zchan->pre_buffer);
zchan->pre_buffer_size = 0;
zap_mutex_unlock(zchan->pre_buffer_mutex);
zchan->init_state = ZAP_CHANNEL_STATE_DOWN;
zchan->state = ZAP_CHANNEL_STATE_DOWN;
@ -1478,11 +1484,13 @@ OZ_DECLARE(zap_status_t) zap_channel_command(zap_channel_t *zchan, zap_command_t
zchan->pre_buffer_size = val * 8;
zap_mutex_lock(zchan->pre_buffer_mutex);
if (!zchan->pre_buffer_size) {
zap_buffer_destroy(&zchan->pre_buffer);
} else if (!zchan->pre_buffer) {
zap_buffer_create(&zchan->pre_buffer, 1024, zchan->pre_buffer_size, 0);
}
zap_mutex_unlock(zchan->pre_buffer_mutex);
GOTO_STATUS(done, ZAP_SUCCESS);
@ -1550,8 +1558,10 @@ OZ_DECLARE(zap_status_t) zap_channel_command(zap_channel_t *zchan, zap_command_t
case ZAP_COMMAND_DISABLE_ECHOCANCEL:
{
zap_mutex_lock(zchan->pre_buffer_mutex);
zap_buffer_destroy(&zchan->pre_buffer);
zchan->pre_buffer_size = 0;
zap_mutex_unlock(zchan->pre_buffer_mutex);
}
break;
default:
@ -2115,16 +2125,21 @@ OZ_DECLARE(zap_status_t) zap_channel_read(zap_channel_t *zchan, void *data, zap_
if (zchan->skip_read_frames > 0 || zap_test_flag(zchan, ZAP_CHANNEL_MUTE)) {
zap_mutex_lock(zchan->pre_buffer_mutex);
if (zchan->pre_buffer && zap_buffer_inuse(zchan->pre_buffer)) {
zap_buffer_zero(zchan->pre_buffer);
}
zap_mutex_unlock(zchan->pre_buffer_mutex);
memset(data, 255, *datalen);
if (zchan->skip_read_frames > 0) {
zchan->skip_read_frames--;
}
} else if (zchan->pre_buffer_size && zchan->pre_buffer) {
} else {
zap_mutex_lock(zchan->pre_buffer_mutex);
if (zchan->pre_buffer_size && zchan->pre_buffer) {
zap_buffer_write(zchan->pre_buffer, data, *datalen);
if (zap_buffer_inuse(zchan->pre_buffer) >= zchan->pre_buffer_size) {
zap_buffer_read(zchan->pre_buffer, data, *datalen);
@ -2132,6 +2147,8 @@ OZ_DECLARE(zap_status_t) zap_channel_read(zap_channel_t *zchan, void *data, zap_
memset(data, 255, *datalen);
}
}
zap_mutex_unlock(zchan->pre_buffer_mutex);
}
return status;