summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/sound_port.c
diff options
context:
space:
mode:
Diffstat (limited to 'pjmedia/src/pjmedia/sound_port.c')
-rw-r--r--pjmedia/src/pjmedia/sound_port.c30
1 files changed, 30 insertions, 0 deletions
diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c
index 5fbbaab5..50ea18c6 100644
--- a/pjmedia/src/pjmedia/sound_port.c
+++ b/pjmedia/src/pjmedia/sound_port.c
@@ -17,6 +17,7 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
#include <pjmedia/sound_port.h>
+#include <pjmedia/delaybuf.h>
#include <pjmedia/echo.h>
#include <pjmedia/errno.h>
#include <pjmedia/plc.h>
@@ -62,6 +63,10 @@ struct pjmedia_snd_port
unsigned channel_count;
unsigned samples_per_frame;
unsigned bits_per_sample;
+
+#if PJMEDIA_SOUND_USE_DELAYBUF
+ pjmedia_delay_buf *delay_buf;
+#endif
};
/*
@@ -93,6 +98,15 @@ static pj_status_t play_cb(/* in */ void *user_data,
frame.timestamp.u32.hi = 0;
frame.timestamp.u32.lo = timestamp;
+#if PJMEDIA_SOUND_USE_DELAYBUF
+ status = pjmedia_delay_buf_get(snd_port->delay_buf, (pj_int16_t*)output);
+ if (status != PJ_SUCCESS) {
+ pj_bzero(output, size);
+ }
+
+ pjmedia_port_put_frame(port, &frame);
+#endif
+
status = pjmedia_port_get_frame(port, &frame);
if (status != PJ_SUCCESS)
goto no_frame;
@@ -185,12 +199,19 @@ static pj_status_t rec_cb(/* in */ void *user_data,
pjmedia_echo_capture(snd_port->ec_state, (pj_int16_t*) input, 0);
}
+#if PJMEDIA_SOUND_USE_DELAYBUF
+ PJ_UNUSED_ARG(size);
+ PJ_UNUSED_ARG(timestamp);
+ PJ_UNUSED_ARG(frame);
+ pjmedia_delay_buf_put(snd_port->delay_buf, (pj_int16_t*)input);
+#else
frame.buf = (void*)input;
frame.size = size;
frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
frame.timestamp.u32.lo = timestamp;
pjmedia_port_put_frame(port, &frame);
+#endif
return PJ_SUCCESS;
}
@@ -324,6 +345,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create( pj_pool_t *pool,
pjmedia_snd_port **p_port)
{
pjmedia_snd_port *snd_port;
+ pj_status_t status;
PJ_ASSERT_RETURN(pool && p_port, PJ_EINVAL);
@@ -338,6 +360,14 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create( pj_pool_t *pool,
snd_port->channel_count = channel_count;
snd_port->samples_per_frame = samples_per_frame;
snd_port->bits_per_sample = bits_per_sample;
+
+#if PJMEDIA_SOUND_USE_DELAYBUF
+ status = pjmedia_delay_buf_create(pool, "snd_buff", samples_per_frame,
+ 16, &snd_port->delay_buf);
+ PJ_ASSERT_RETURN(status == PJ_SUCCESS, status);
+#else
+ PJ_UNUSED_ARG(status);
+#endif
*p_port = snd_port;