static int arequest_frame(AVFilterLink *outlink) { AVFilterContext *ctx = outlink->src; LoopContext *s = ctx->priv; int ret = 0; if ((!s->size) || (s->nb_samples < s->size) || (s->nb_samples >= s->size && s->loop == 0)) { int nb_samples = av_audio_fifo_size(s->left); if (s->loop == 0 && nb_samples > 0) { AVFrame *out; out = ff_get_audio_buffer(outlink, nb_samples); if (!out) return AVERROR(ENOMEM); av_audio_fifo_read(s->left, (void **)out->extended_data, nb_samples); out->pts = s->pts; s->pts += nb_samples; ret = ff_filter_frame(outlink, out); if (ret < 0) return ret; } ret = ff_request_frame(ctx->inputs[0]); } else { ret = push_samples(ctx, 1024); } if (ret == AVERROR_EOF && s->nb_samples > 0 && s->loop != 0) { ret = push_samples(ctx, outlink->sample_rate); } return ret; }
static int read_subframe(const struct sr_dev_inst *sdi, uint8_t *buf) { struct dev_context *devc = sdi->priv; uint8_t sig[3], ctrl; unsigned int num; gboolean interleave; interleave = readout_steps[devc->step].interleave; ctrl = C1284_NSTROBE; if ((interleave && devc->adc2) || (!interleave && devc->channel == 2)) ctrl |= C1284_NAUTOFD; ieee1284_write_control(sdi->conn, ctrl); num = readout_steps[devc->step].num; if (num < 1000) skip_samples(sdi->conn, ctrl, 1000 - num); read_samples(sdi->conn, ctrl, buf + (devc->adc2 ? 1 : 0), num, interleave ? 2 : 1); read_samples(sdi->conn, ctrl, sig, 3, 1); if (sig[0] != 0x01 || sig[1] != 0xfe || sig[2] != 0x80) { if (--devc->retries) { sr_dbg("Missing signature at end of buffer, %i tries remaining", devc->retries); return TRUE; } else { sr_err("Failed to read frame without transfer errors"); devc->step = 0; } } else { if (interleave && !devc->adc2) { devc->adc2 = TRUE; devc->retries = MAX_RETRIES; return TRUE; } else { if (interleave) num *= 2; if (!devc->step) { struct sr_datafeed_packet packet = { .type = SR_DF_TRIGGER }; push_samples(sdi, buf, 6); sr_session_send(sdi, &packet); buf += 6; num -= 6; } push_samples(sdi, buf, num); if (++devc->step > devc->last_step) devc->step = 0; } } devc->adc2 = FALSE; devc->retries = MAX_RETRIES; return devc->step > 0; }
static int afilter_frame(AVFilterLink *inlink, AVFrame *frame) { AVFilterContext *ctx = inlink->dst; AVFilterLink *outlink = ctx->outputs[0]; LoopContext *s = ctx->priv; int ret = 0; if (s->ignored_samples + frame->nb_samples > s->start && s->size > 0 && s->loop != 0) { if (s->nb_samples < s->size) { int written = FFMIN(frame->nb_samples, s->size - s->nb_samples); int drain = 0; ret = av_audio_fifo_write(s->fifo, (void **)frame->extended_data, written); if (ret < 0) return ret; if (!s->nb_samples) { drain = FFMAX(0, s->start - s->ignored_samples); s->pts = frame->pts; av_audio_fifo_drain(s->fifo, drain); s->pts += s->start - s->ignored_samples; } s->nb_samples += ret - drain; drain = frame->nb_samples - written; if (s->nb_samples == s->size && drain > 0) { int ret2; ret2 = av_audio_fifo_write(s->left, (void **)frame->extended_data, frame->nb_samples); if (ret2 < 0) return ret2; av_audio_fifo_drain(s->left, drain); } frame->nb_samples = ret; s->pts += ret; ret = ff_filter_frame(outlink, frame); } else { int nb_samples = frame->nb_samples; av_frame_free(&frame); ret = push_samples(ctx, nb_samples); } } else { s->ignored_samples += frame->nb_samples; frame->pts = s->pts; s->pts += frame->nb_samples; ret = ff_filter_frame(outlink, frame); } return ret; }