summaryrefslogtreecommitdiff
path: root/pjmedia/src
diff options
context:
space:
mode:
authorNanang Izzuddin <nanang@teluu.com>2015-02-11 05:15:29 +0000
committerNanang Izzuddin <nanang@teluu.com>2015-02-11 05:15:29 +0000
commit33ccbcef51df23a167a5411ca97e7cdd9b604652 (patch)
treecfad58562a8431fe9fa3c761cec05e924140afcf /pjmedia/src
parentdbae9140153559747dcb6b12c3fda2c139836733 (diff)
Close #1814: Add audio frame preview callbacks.
git-svn-id: http://svn.pjsip.org/repos/pjproject/trunk@4982 74dad513-b988-da41-8d7b-12977e46ad98
Diffstat (limited to 'pjmedia/src')
-rw-r--r--pjmedia/src/pjmedia/sound_port.c27
1 files changed, 27 insertions, 0 deletions
diff --git a/pjmedia/src/pjmedia/sound_port.c b/pjmedia/src/pjmedia/sound_port.c
index 73305d83..79525d8d 100644
--- a/pjmedia/src/pjmedia/sound_port.c
+++ b/pjmedia/src/pjmedia/sound_port.c
@@ -61,6 +61,11 @@ struct pjmedia_snd_port
pj_bool_t ec_suspended;
unsigned ec_suspend_count;
unsigned ec_suspend_limit;
+
+ /* audio frame preview callbacks */
+ void *user_data;
+ pjmedia_aud_play_cb on_play_frame;
+ pjmedia_aud_rec_cb on_rec_frame;
};
/*
@@ -100,6 +105,9 @@ static pj_status_t play_cb(void *user_data, pjmedia_frame *frame)
pjmedia_echo_playback(snd_port->ec_state, (pj_int16_t*)frame->buf);
}
+ /* Invoke preview callback */
+ if (snd_port->on_play_frame)
+ (*snd_port->on_play_frame)(snd_port->user_data, frame);
return PJ_SUCCESS;
@@ -120,6 +128,10 @@ no_frame:
}
}
+ /* Invoke preview callback */
+ if (snd_port->on_play_frame)
+ (*snd_port->on_play_frame)(snd_port->user_data, frame);
+
return PJ_SUCCESS;
}
@@ -135,6 +147,10 @@ static pj_status_t rec_cb(void *user_data, pjmedia_frame *frame)
pjmedia_clock_src_update(&snd_port->cap_clocksrc, &frame->timestamp);
+ /* Invoke preview callback */
+ if (snd_port->on_rec_frame)
+ (*snd_port->on_rec_frame)(snd_port->user_data, frame);
+
port = snd_port->port;
if (port == NULL)
return PJ_SUCCESS;
@@ -166,6 +182,10 @@ static pj_status_t play_cb_ext(void *user_data, pjmedia_frame *frame)
pjmedia_port_get_frame(port, frame);
+ /* Invoke preview callback */
+ if (snd_port->on_play_frame)
+ (*snd_port->on_play_frame)(snd_port->user_data, frame);
+
return PJ_SUCCESS;
}
@@ -179,6 +199,10 @@ static pj_status_t rec_cb_ext(void *user_data, pjmedia_frame *frame)
pjmedia_snd_port *snd_port = (pjmedia_snd_port*) user_data;
pjmedia_port *port;
+ /* Invoke preview callback */
+ if (snd_port->on_rec_frame)
+ (*snd_port->on_rec_frame)(snd_port->user_data, frame);
+
port = snd_port->port;
if (port == NULL)
return PJ_SUCCESS;
@@ -464,6 +488,9 @@ PJ_DEF(pj_status_t) pjmedia_snd_port_create2(pj_pool_t *pool,
pj_memcpy(&snd_port->aud_param, &prm->base, sizeof(snd_port->aud_param));
snd_port->options = prm->options;
snd_port->prm_ec_options = prm->ec_options;
+ snd_port->user_data = prm->user_data;
+ snd_port->on_play_frame = prm->on_play_frame;
+ snd_port->on_rec_frame = prm->on_rec_frame;
ptime_usec = prm->base.samples_per_frame * 1000 / prm->base.channel_count /
prm->base.clock_rate * 1000;