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.c41
1 files changed, 35 insertions, 6 deletions
diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c
index 5924720d..e377a1ed 100644
--- a/pjmedia/src/pjmedia/sound_port.c
+++ b/pjmedia/src/pjmedia/sound_port.c
@@ -44,6 +44,9 @@ struct pjmedia_snd_port
pjmedia_dir dir;
pjmedia_port *port;
+ pjmedia_clock_src cap_clocksrc,
+ play_clocksrc;
+
unsigned clock_rate;
unsigned channel_count;
unsigned samples_per_frame;
@@ -70,6 +73,8 @@ static pj_status_t play_cb(void *user_data, pjmedia_frame *frame)
const unsigned required_size = frame->size;
pj_status_t status;
+ pjmedia_clock_src_update(&snd_port->play_clocksrc, &frame->timestamp);
+
port = snd_port->port;
if (port == NULL)
goto no_frame;
@@ -127,6 +132,8 @@ static pj_status_t rec_cb(void *user_data, pjmedia_frame *frame)
pjmedia_snd_port *snd_port = (pjmedia_snd_port*) user_data;
pjmedia_port *port;
+ pjmedia_clock_src_update(&snd_port->cap_clocksrc, &frame->timestamp);
+
port = snd_port->port;
if (port == NULL)
return PJ_SUCCESS;
@@ -138,6 +145,7 @@ static pj_status_t rec_cb(void *user_data, pjmedia_frame *frame)
pjmedia_port_put_frame(port, frame);
+
return PJ_SUCCESS;
}
@@ -423,6 +431,7 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create2(pj_pool_t *pool,
{
pjmedia_snd_port *snd_port;
pj_status_t status;
+ unsigned ptime_usec;
PJ_ASSERT_RETURN(pool && prm && p_port, PJ_EINVAL);
@@ -439,6 +448,13 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create2(pj_pool_t *pool,
snd_port->bits_per_sample = prm->base.bits_per_sample;
pj_memcpy(&snd_port->aud_param, prm, sizeof(snd_port->aud_param));
snd_port->options = prm->options;
+
+ ptime_usec = prm->base.samples_per_frame * 1000 / prm->base.channel_count /
+ prm->base.clock_rate * 1000;
+ pjmedia_clock_src_init(&snd_port->cap_clocksrc, PJMEDIA_TYPE_AUDIO,
+ snd_port->clock_rate, ptime_usec);
+ pjmedia_clock_src_init(&snd_port->play_clocksrc, PJMEDIA_TYPE_AUDIO,
+ snd_port->clock_rate, ptime_usec);
/* Start sound device immediately.
* If there's no port connected, the sound callback will return
@@ -639,29 +655,42 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_get_ec_tail( pjmedia_snd_port *snd_port,
/*
+ * Get clock source.
+ */
+PJ_DEF(pjmedia_clock_src *)
+pjmedia_snd_port_get_clock_src( pjmedia_snd_port *snd_port,
+ pjmedia_dir dir )
+{
+ return (dir == PJMEDIA_DIR_CAPTURE? &snd_port->cap_clocksrc:
+ &snd_port->play_clocksrc);
+}
+
+
+/*
* Connect a port.
*/
PJ_DEF(pj_status_t) pjmedia_snd_port_connect( pjmedia_snd_port *snd_port,
pjmedia_port *port)
{
- pjmedia_port_info *pinfo;
+ pjmedia_audio_format_detail *afd;
PJ_ASSERT_RETURN(snd_port && port, PJ_EINVAL);
+ afd = pjmedia_format_get_audio_format_detail(&port->info.fmt, PJ_TRUE);
+
/* Check that port has the same configuration as the sound device
* port.
*/
- pinfo = &port->info;
- if (pinfo->clock_rate != snd_port->clock_rate)
+ if (afd->clock_rate != snd_port->clock_rate)
return PJMEDIA_ENCCLOCKRATE;
- if (pinfo->samples_per_frame != snd_port->samples_per_frame)
+ if (PJMEDIA_AFD_SPF(afd) != snd_port->samples_per_frame)
return PJMEDIA_ENCSAMPLESPFRAME;
- if (pinfo->channel_count != snd_port->channel_count)
+ if (afd->channel_count != snd_port->channel_count)
return PJMEDIA_ENCCHANNEL;
- if (pinfo->bits_per_sample != snd_port->bits_per_sample)
+ if (afd->bits_per_sample != snd_port->bits_per_sample)
return PJMEDIA_ENCBITS;
/* Port is okay. */