Загрузка данных


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);
}