diff options
Diffstat (limited to 'pjmedia/src/pjmedia/sound_port.c')
-rw-r--r-- | pjmedia/src/pjmedia/sound_port.c | 41 |
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. */ |