summaryrefslogtreecommitdiff
path: root/pjmedia/src/pjmedia/sound_port.c
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2011-07-19 03:42:28 +0000
committerNanang Izzuddin <nanang@teluu.com>2011-07-19 03:42:28 +0000
commitcd283c8825c9a94400f27735acb1c9385e90ffc8 (patch)
tree56d5722310fa8957ce5d1ba7cbd137cf8802dcc7 /pjmedia/src/pjmedia/sound_port.c
parented8f8d08abba9040f769e922aa0c1adbde86fbbc (diff)
Re #1326: Initial code integration from branch 2.0-dev to trunk as "2.0-pre-alpha-svn".
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@3664 74dad513-b988-da41-8d7b-12977e46ad98
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. */