sound_port.c:
/*
* Callback to be called for each clock ticks.
*/
static void clock_callback(const pj_timestamp *ts, void *user_data)
{
pjmedia_snd_port *snd_port = (pjmedia_snd_port*) user_data;
pjmedia_port *port = snd_port->port;
pjmedia_frame frame;
pj_status_t status;
/* Sound port not connected */
if (port == NULL)
return;
/* Playback, get a frame from underlying port, put into delay buffer */
pjmedia_clock_src_update(&snd_port->play_clocksrc, ts);
pj_bzero(&frame, sizeof(frame));
frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
frame.buf = snd_port->frame_buf;
frame.size = snd_port->samples_per_frame * 2;
frame.timestamp.u64 = ts->u64;
status = pjmedia_port_get_frame(port, &frame);
if (status != PJ_SUCCESS || frame.type != PJMEDIA_FRAME_TYPE_AUDIO) {
pjmedia_zero_samples(snd_port->frame_buf, snd_port->samples_per_frame);
}
pjmedia_delay_buf_put(snd_port->play_dbuf, frame.buf);
/* Record: get a frame from delay buffer, put into underlying port */
pjmedia_clock_src_update(&snd_port->cap_clocksrc, ts);
status = pjmedia_delay_buf_get(snd_port->cap_dbuf, snd_port->frame_buf);
pj_bzero(&frame, sizeof(frame));
frame.type = PJMEDIA_FRAME_TYPE_AUDIO;
frame.buf = snd_port->frame_buf;
frame.size = snd_port->samples_per_frame * 2;
frame.timestamp.u64 = ts->u64;
if (status != PJ_SUCCESS) {
pjmedia_zero_samples(snd_port->frame_buf, snd_port->samples_per_frame);
}
pjmedia_port_put_frame(port, &frame);
}
master_port.c:
/*
* Callback to be called for each clock ticks.
*/
static void clock_callback(const pj_timestamp *ts, void *user_data)
{
pjmedia_master_port *m = (pjmedia_master_port*) user_data;
pjmedia_frame frame;
pj_status_t status;
/* Lock access to ports. */
pj_lock_acquire(m->lock);
/* Get frame from upstream port and pass it to downstream port */
pj_bzero(&frame, sizeof(frame));
frame.buf = m->buff;
frame.size = m->buff_size;
frame.timestamp.u64 = ts->u64;
status = pjmedia_port_get_frame(m->u_port, &frame);
if (status != PJ_SUCCESS)
frame.type = PJMEDIA_FRAME_TYPE_NONE;
status = pjmedia_port_put_frame(m->d_port, &frame);
/* Get frame from downstream port and pass it to upstream port */
pj_bzero(&frame, sizeof(frame));
frame.buf = m->buff;
frame.size = m->buff_size;
frame.timestamp.u64 = ts->u64;
status = pjmedia_port_get_frame(m->d_port, &frame);
if (status != PJ_SUCCESS)
frame.type = PJMEDIA_FRAME_TYPE_NONE;
status = pjmedia_port_put_frame(m->u_port, &frame);
/* Release lock */
pj_lock_release(m->lock);
}