use switch_queue_trypop_timeout instead of a timer in mod_loopback to improve audio quality when not using bowout features
This commit is contained in:
parent
28465f38a0
commit
02d1af647b
|
@ -77,11 +77,11 @@ struct private_object {
|
||||||
|
|
||||||
switch_frame_t cng_frame;
|
switch_frame_t cng_frame;
|
||||||
unsigned char cng_databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
unsigned char cng_databuf[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
||||||
switch_timer_t timer;
|
|
||||||
switch_caller_profile_t *caller_profile;
|
switch_caller_profile_t *caller_profile;
|
||||||
int32_t bowout_frame_count;
|
int32_t bowout_frame_count;
|
||||||
char *other_uuid;
|
char *other_uuid;
|
||||||
switch_queue_t *frame_queue;
|
switch_queue_t *frame_queue;
|
||||||
|
switch_codec_implementation_t read_impl;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct private_object private_t;
|
typedef struct private_object private_t;
|
||||||
|
@ -111,7 +111,6 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
|
||||||
int interval = 20;
|
int interval = 20;
|
||||||
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
switch_status_t status = SWITCH_STATUS_SUCCESS;
|
||||||
switch_channel_t *channel = switch_core_session_get_channel(session);
|
switch_channel_t *channel = switch_core_session_get_channel(session);
|
||||||
const switch_codec_implementation_t *read_impl;
|
|
||||||
|
|
||||||
if (codec) {
|
if (codec) {
|
||||||
iananame = codec->implementation->iananame;
|
iananame = codec->implementation->iananame;
|
||||||
|
@ -166,15 +165,7 @@ static switch_status_t tech_init(private_t *tech_pvt, switch_core_session_t *ses
|
||||||
switch_core_session_set_read_codec(session, &tech_pvt->read_codec);
|
switch_core_session_set_read_codec(session, &tech_pvt->read_codec);
|
||||||
switch_core_session_set_write_codec(session, &tech_pvt->write_codec);
|
switch_core_session_set_write_codec(session, &tech_pvt->write_codec);
|
||||||
|
|
||||||
if (tech_pvt->flag_mutex) {
|
tech_pvt->read_impl = *tech_pvt->read_codec.implementation;
|
||||||
switch_core_timer_destroy(&tech_pvt->timer);
|
|
||||||
}
|
|
||||||
|
|
||||||
read_impl = tech_pvt->read_codec.implementation;
|
|
||||||
|
|
||||||
switch_core_timer_init(&tech_pvt->timer, "soft",
|
|
||||||
read_impl->microseconds_per_packet / 1000, read_impl->samples_per_packet * 4, switch_core_session_get_pool(session));
|
|
||||||
|
|
||||||
|
|
||||||
if (!tech_pvt->flag_mutex) {
|
if (!tech_pvt->flag_mutex) {
|
||||||
switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
|
switch_mutex_init(&tech_pvt->flag_mutex, SWITCH_MUTEX_NESTED, switch_core_session_get_pool(session));
|
||||||
|
@ -376,7 +367,6 @@ static switch_status_t channel_on_destroy(switch_core_session_t *session)
|
||||||
tech_pvt = switch_core_session_get_private(session);
|
tech_pvt = switch_core_session_get_private(session);
|
||||||
|
|
||||||
if (tech_pvt) {
|
if (tech_pvt) {
|
||||||
switch_core_timer_destroy(&tech_pvt->timer);
|
|
||||||
|
|
||||||
if (switch_core_codec_ready(&tech_pvt->read_codec)) {
|
if (switch_core_codec_ready(&tech_pvt->read_codec)) {
|
||||||
switch_core_codec_destroy(&tech_pvt->read_codec);
|
switch_core_codec_destroy(&tech_pvt->read_codec);
|
||||||
|
@ -568,12 +558,10 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_core_timer_next(&tech_pvt->timer);
|
|
||||||
|
|
||||||
mutex = tech_pvt->mutex;
|
mutex = tech_pvt->mutex;
|
||||||
switch_mutex_lock(mutex);
|
|
||||||
|
|
||||||
if (switch_queue_trypop(tech_pvt->frame_queue, &pop) == SWITCH_STATUS_SUCCESS && pop) {
|
|
||||||
|
if (switch_queue_pop_timeout(tech_pvt->frame_queue, &pop, tech_pvt->read_impl.microseconds_per_packet) == SWITCH_STATUS_SUCCESS && pop) {
|
||||||
if (tech_pvt->write_frame) {
|
if (tech_pvt->write_frame) {
|
||||||
switch_frame_free(&tech_pvt->write_frame);
|
switch_frame_free(&tech_pvt->write_frame);
|
||||||
}
|
}
|
||||||
|
@ -585,6 +573,8 @@ static switch_status_t channel_read_frame(switch_core_session_t *session, switch
|
||||||
switch_set_flag(tech_pvt, TFLAG_CNG);
|
switch_set_flag(tech_pvt, TFLAG_CNG);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_mutex_lock(mutex);
|
||||||
|
|
||||||
if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
|
if (switch_test_flag(tech_pvt, TFLAG_CNG)) {
|
||||||
unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
unsigned char data[SWITCH_RECOMMENDED_BUFFER_SIZE];
|
||||||
uint32_t flag = 0;
|
uint32_t flag = 0;
|
||||||
|
@ -775,8 +765,6 @@ static switch_status_t channel_receive_message(switch_core_session_t *session, s
|
||||||
switch_frame_free(&frame);
|
switch_frame_free(&frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
switch_core_timer_sync(&tech_pvt->timer);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
Loading…
Reference in New Issue