Lines Matching refs:loop
93 static inline snd_pcm_uframes_t get_whole_latency(struct loopback *loop)
95 return loop->latency;
323 static int setparams(struct loopback *loop, snd_pcm_uframes_t bufsize)
336 if ((err = setparams_stream(loop->play, pt_params)) < 0) {
337 logit(LOG_CRIT, "Unable to set parameters for %s stream: %s\n", loop->play->id, snd_strerror(err));
340 if ((err = setparams_stream(loop->capt, ct_params)) < 0) {
341 logit(LOG_CRIT, "Unable to set parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err));
345 if ((err = setparams_bufsize(loop->play, p_params, pt_params, bufsize / loop->play->pitch)) < 0) {
346 logit(LOG_CRIT, "Unable to set buffer parameters for %s stream: %s\n", loop->play->id, snd_strerror(err));
349 if ((err = setparams_bufsize(loop->capt, c_params, ct_params, bufsize / loop->capt->pitch)) < 0) {
350 logit(LOG_CRIT, "Unable to set buffer parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err));
354 if ((err = setparams_set(loop->play, p_params, p_swparams, bufsize / loop->play->pitch)) < 0) {
355 logit(LOG_CRIT, "Unable to set sw parameters for %s stream: %s\n", loop->play->id, snd_strerror(err));
358 if ((err = setparams_set(loop->capt, c_params, c_swparams, bufsize / loop->capt->pitch)) < 0) {
359 logit(LOG_CRIT, "Unable to set sw parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err));
364 if (!loop->linked)
365 if (snd_pcm_link(loop->capt->handle, loop->play->handle) >= 0)
366 loop->linked = 1;
368 if ((err = snd_pcm_prepare(loop->play->handle)) < 0) {
369 logit(LOG_CRIT, "Prepare %s error: %s\n", loop->play->id, snd_strerror(err));
372 if (!loop->linked && (err = snd_pcm_prepare(loop->capt->handle)) < 0) {
373 logit(LOG_CRIT, "Prepare %s error: %s\n", loop->capt->id, snd_strerror(err));
378 snd_pcm_dump(loop->play->handle, loop->output);
379 snd_pcm_dump(loop->capt->handle, loop->output);
415 static void xrun_profile0(struct loopback *loop)
419 if (snd_pcm_delay(loop->play->handle, &pdelay) >= 0 &&
420 snd_pcm_delay(loop->capt->handle, &cdelay) >= 0) {
421 getcurtimestamp(&loop->xrun_last_update);
422 loop->xrun_last_pdelay = pdelay;
423 loop->xrun_last_cdelay = cdelay;
424 loop->xrun_buf_pcount = loop->play->buf_count;
425 loop->xrun_buf_ccount = loop->capt->buf_count;
427 loop->xrun_out_frames = loop->src_out_frames;
432 static inline void xrun_profile(struct loopback *loop)
434 if (loop->xrun)
435 xrun_profile0(loop);
438 static void xrun_stats0(struct loopback *loop)
445 expected = ((double)loop->latency /
446 (double)loop->play->rate_req) * 1000;
448 last = (double)timediff(t, loop->xrun_last_update) / 1000;
449 wake = (double)timediff(t, loop->xrun_last_wake) / 1000;
450 check = (double)timediff(t, loop->xrun_last_check) / 1000;
451 sincejob = (double)timediff(t, loop->tstamp_start) / 1000;
452 if (loop->xrun_last_pdelay != XRUN_PROFILE_UNKNOWN)
453 queued = ((double)loop->xrun_last_pdelay /
454 (double)loop->play->rate) * 1000;
455 if (loop->xrun_last_cdelay != XRUN_PROFILE_UNKNOWN)
456 cqueued = ((double)loop->xrun_last_cdelay /
457 (double)loop->capt->rate) * 1000;
458 maxbuf = ((double)loop->play->buffer_size /
459 (double)loop->play->rate) * 1000;
460 proc = (double)loop->xrun_max_proctime / 1000;
461 pfilled = ((double)(loop->xrun_buf_pcount + loop->xrun_out_frames) /
462 (double)loop->play->rate) * 1000;
463 cfilled = ((double)loop->xrun_buf_ccount /
464 (double)loop->capt->rate) * 1000;
465 avail_min = (((double)loop->play->buffer_size -
466 (double)loop->play->avail_min ) /
467 (double)loop->play->rate) * 1000;
471 if (missing >= 0 && loop->xrun_max_missing < missing)
472 loop->xrun_max_missing = missing;
473 loop->xrun_max_proctime = 0;
476 logit(LOG_INFO, " expected %.4fms, processing %.4fms, max missing %.4fms\n", expected, proc, loop->xrun_max_missing);
482 static inline void xrun_stats(struct loopback *loop)
484 if (loop->xrun)
485 xrun_stats0(loop);
493 static void buf_remove(struct loopback *loop, snd_pcm_uframes_t count)
498 if (loop->play->buf == loop->capt->buf) {
499 if (count < loop->capt->buf_count)
500 loop->capt->buf_count -= count;
502 loop->capt->buf_count = 0;
507 static void buf_add_copy(struct loopback *loop)
509 struct loopback_handle *capt = loop->capt;
510 struct loopback_handle *play = loop->play;
543 static void buf_add_src(struct loopback *loop)
545 struct loopback_handle *capt = loop->capt;
546 struct loopback_handle *play = loop->play;
561 (float *)loop->src_data.data_in +
567 (float *)loop->src_data.data_in +
575 loop->src_data.input_frames = pos;
576 loop->src_data.output_frames = play->buf_size -
577 loop->src_out_frames;
578 loop->src_data.end_of_input = 0;
579 old_data_out = loop->src_data.data_out;
580 loop->src_data.data_out = old_data_out + loop->src_out_frames;
581 src_process(loop->src_state, &loop->src_data);
582 loop->src_data.data_out = old_data_out;
583 capt->buf_count -= loop->src_data.input_frames_used;
584 count = loop->src_data.output_frames_gen +
585 loop->src_out_frames;
597 src_float_to_int_array(loop->src_data.data_out +
603 src_float_to_short_array(loop->src_data.data_out +
616 (long)pos, (long)loop->src_data.output_frames_gen,
617 (long)loop->src_out_frames, play->buf_count);
619 loop->src_out_frames = (loop->src_data.output_frames_gen +
620 loop->src_out_frames) - pos;
621 if (loop->src_out_frames > 0) {
622 memmove(loop->src_data.data_out,
623 loop->src_data.data_out + pos * play->channels,
624 loop->src_out_frames * play->channels * sizeof(float));
628 static void buf_add_src(struct loopback *loop ATTRIBUTE_UNUSED)
633 static void buf_add(struct loopback *loop, snd_pcm_uframes_t count)
638 if (loop->play->buf == loop->capt->buf) {
639 loop->play->buf_count += count;
641 buf_add_src(loop);
799 static snd_pcm_sframes_t remove_samples(struct loopback *loop,
803 struct loopback_handle *play = loop->play;
804 struct loopback_handle *capt = loop->capt;
806 if (loop->play->buf == loop->capt->buf) {
807 if ((snd_pcm_uframes_t)count > loop->play->buf_count)
808 count = loop->play->buf_count;
809 if ((snd_pcm_uframes_t)count > loop->capt->buf_count)
810 count = loop->capt->buf_count;
829 static int xrun_sync(struct loopback *loop)
831 struct loopback_handle *play = loop->play;
832 struct loopback_handle *capt = loop->capt;
833 snd_pcm_sframes_t fill = get_whole_latency(loop);
839 snd_output_printf(loop->output, "%s: xrun sync %i %i\n", loop->id, capt->xrun_pending, play->xrun_pending);
853 buf_add(loop, diff);
892 pdelay += loop->src_out_frames;
899 loop->total_queued_count = 0;
900 loop->pitch_diff = loop->pitch_diff_min = loop->pitch_diff_max = 0;
902 snd_output_printf(loop->output,
911 , (long)loop->src_out_frames
914 snd_output_printf(loop->output,
925 diff = remove_samples(loop, 1, (delay1 - fill) / capt->pitch);
927 snd_output_printf(loop->output,
936 snd_output_printf(loop->output,
938 diff = remove_samples(loop, 0, diff);
943 snd_output_printf(loop->output,
951 snd_output_printf(loop->output,
953 diff -= remove_samples(loop, 1, diff);
958 snd_output_printf(loop->output,
965 snd_output_printf(loop->output,
970 snd_output_printf(loop->output,
986 snd_output_printf(loop->output,
989 buf_remove(loop, delay1 - diff);
991 snd_output_printf(loop->output,
1003 snd_output_printf(loop->output,
1019 snd_output_printf(loop->output, "%s: xrun sync ok\n", loop->id);
1029 pdelay += loop->src_out_frames;
1034 snd_output_printf(loop->output, "%s: sync verify: %li\n", loop->id, delay1);
1037 loop->xrun_max_proctime = 0;
1082 void update_pitch(struct loopback *loop)
1084 double pitch = loop->pitch;
1087 if (loop->sync == SYNC_TYPE_SAMPLERATE) {
1088 loop->src_data.src_ratio = (double)1.0 / (pitch *
1089 loop->play->pitch * loop->capt->pitch);
1091 snd_output_printf(loop->output, "%s: Samplerate src_ratio update1: %.8f\n", loop->id, loop->src_data.src_ratio);
1094 if (loop->sync == SYNC_TYPE_CAPTRATESHIFT) {
1095 set_rate_shift(loop->capt, pitch);
1097 if (loop->use_samplerate) {
1098 loop->src_data.src_ratio =
1100 (loop->play->pitch * loop->capt->pitch);
1102 snd_output_printf(loop->output, "%s: Samplerate src_ratio update2: %.8f\n", loop->id, loop->src_data.src_ratio);
1106 else if (loop->sync == SYNC_TYPE_PLAYRATESHIFT) {
1108 set_rate_shift(loop->play, 1 / pitch);
1110 if (loop->use_samplerate) {
1111 loop->src_data.src_ratio =
1113 (loop->play->pitch * loop->capt->pitch);
1115 snd_output_printf(loop->output, "%s: Samplerate src_ratio update3: %.8f\n", loop->id, loop->src_data.src_ratio);
1120 snd_output_printf(loop->output, "New pitch for %s: %.8f (min/max samples = %li/%li)\n", loop->id, pitch, loop->pitch_diff_min, loop->pitch_diff_max);
1377 int pcmjob_init(struct loopback *loop)
1383 loop->cfile = fopen(FILE_CWRITE, "w+");
1386 loop->pfile = fopen(FILE_PWRITE, "w+");
1388 if ((err = openit(loop->play)) < 0)
1390 if ((err = openit(loop->capt)) < 0)
1392 snprintf(id, sizeof(id), "%s/%s", loop->play->id, loop->capt->id);
1394 loop->id = strdup(id);
1395 if (loop->sync == SYNC_TYPE_AUTO && (loop->capt->ctl_rate_shift || loop->capt->ctl_pitch))
1396 loop->sync = SYNC_TYPE_CAPTRATESHIFT;
1397 if (loop->sync == SYNC_TYPE_AUTO && (loop->play->ctl_rate_shift || loop->play->ctl_pitch))
1398 loop->sync = SYNC_TYPE_PLAYRATESHIFT;
1400 if (loop->sync == SYNC_TYPE_AUTO && loop->src_enable)
1401 loop->sync = SYNC_TYPE_SAMPLERATE;
1403 if (loop->sync == SYNC_TYPE_AUTO)
1404 loop->sync = SYNC_TYPE_SIMPLE;
1405 if (loop->slave == SLAVE_TYPE_AUTO &&
1406 loop->capt->ctl_notify &&
1407 loop->capt->ctl_active &&
1408 loop->capt->ctl_format &&
1409 loop->capt->ctl_rate &&
1410 loop->capt->ctl_channels)
1411 loop->slave = SLAVE_TYPE_ON;
1412 if (loop->slave == SLAVE_TYPE_ON) {
1413 err = set_notify(loop->capt, 1);
1416 if (loop->capt->ctl_notify == NULL ||
1417 snd_ctl_elem_value_get_boolean(loop->capt->ctl_notify, 0) == 0) {
1418 logit(LOG_CRIT, "unable to enable slave mode for %s\n", loop->id);
1423 err = control_init(loop);
1428 pcmjob_done(loop);
1432 static void freeloop(struct loopback *loop)
1435 if (loop->use_samplerate) {
1436 if (loop->src_state)
1437 src_delete(loop->src_state);
1438 loop->src_state = NULL;
1439 free((void *)loop->src_data.data_in);
1440 loop->src_data.data_in = NULL;
1441 free(loop->src_data.data_out);
1442 loop->src_data.data_out = NULL;
1445 if (loop->play->buf == loop->capt->buf)
1446 loop->play->buf = NULL;
1447 freeit(loop->play);
1448 freeit(loop->capt);
1451 int pcmjob_done(struct loopback *loop)
1453 control_done(loop);
1454 closeit(loop->play);
1455 closeit(loop->capt);
1456 freeloop(loop);
1457 free(loop->id);
1458 loop->id = NULL;
1460 if (loop->pfile) {
1461 fclose(loop->pfile);
1462 loop->pfile = NULL;
1466 if (loop->cfile) {
1467 fclose(loop->cfile);
1468 loop->cfile = NULL;
1482 static void fix_format(struct loopback *loop, int force)
1484 snd_pcm_format_t format = loop->capt->format;
1486 if (!force && loop->sync != SYNC_TYPE_SAMPLERATE)
1495 loop->capt->format = format;
1496 loop->play->format = format;
1499 int pcmjob_start(struct loopback *loop)
1504 loop->pollfd_count = loop->play->ctl_pollfd_count +
1505 loop->capt->ctl_pollfd_count;
1506 if ((err = snd_pcm_poll_descriptors_count(loop->play->handle)) < 0)
1508 loop->play->pollfd_count = err;
1509 loop->pollfd_count += err;
1510 if ((err = snd_pcm_poll_descriptors_count(loop->capt->handle)) < 0)
1512 loop->capt->pollfd_count = err;
1513 loop->pollfd_count += err;
1514 if (loop->slave == SLAVE_TYPE_ON) {
1515 err = get_active(loop->capt);
1520 err = get_format(loop->capt);
1523 loop->play->format = loop->capt->format = err;
1524 fix_format(loop, 0);
1525 err = get_rate(loop->capt);
1528 loop->play->rate_req = loop->capt->rate_req = err;
1529 err = get_channels(loop->capt);
1532 loop->play->channels = loop->capt->channels = err;
1534 loop->reinit = 0;
1535 loop->use_samplerate = 0;
1537 if (loop->latency_req) {
1538 loop->latency_reqtime = frames_to_time(loop->play->rate_req,
1539 loop->latency_req);
1540 loop->latency_req = 0;
1542 loop->latency = time_to_frames(loop->play->rate_req, loop->latency_reqtime);
1543 if ((err = setparams(loop, loop->latency/2)) < 0)
1546 showlatency(loop->output, loop->latency, loop->play->rate_req, "Latency");
1547 if (loop->play->access == loop->capt->access &&
1548 loop->play->format == loop->capt->format &&
1549 loop->play->rate == loop->capt->rate &&
1550 loop->play->channels == loop->capt->channels &&
1551 loop->sync != SYNC_TYPE_SAMPLERATE) {
1553 snd_output_printf(loop->output, "shared buffer!!!\n");
1554 if ((err = init_handle(loop->play, 1)) < 0)
1556 if ((err = init_handle(loop->capt, 0)) < 0)
1558 if (loop->play->buf_size < loop->capt->buf_size) {
1559 char *nbuf = realloc(loop->play->buf,
1560 loop->capt->buf_size *
1561 loop->capt->frame_size);
1566 loop->play->buf = nbuf;
1567 loop->play->buf_size = loop->capt->buf_size;
1568 } else if (loop->capt->buf_size < loop->play->buf_size) {
1569 char *nbuf = realloc(loop->capt->buf,
1570 loop->play->buf_size *
1571 loop->play->frame_size);
1576 loop->capt->buf = nbuf;
1577 loop->capt->buf_size = loop->play->buf_size;
1579 loop->capt->buf = loop->play->buf;
1581 if ((err = init_handle(loop->play, 1)) < 0)
1583 if ((err = init_handle(loop->capt, 1)) < 0)
1585 if (loop->play->rate_req != loop->play->rate ||
1586 loop->capt->rate_req != loop->capt->rate) {
1588 loop->use_samplerate = 1;
1589 format1 = loop->play->format;
1590 format2 = loop->capt->format;
1591 fix_format(loop, 1);
1592 if (loop->play->format != format1 ||
1593 loop->capt->format != format2) {
1594 pcmjob_stop(loop);
1600 if (loop->sync == SYNC_TYPE_SAMPLERATE)
1601 loop->use_samplerate = 1;
1602 if (loop->use_samplerate && !loop->src_enable) {
1604 loop->use_samplerate = 0;
1608 if (loop->use_samplerate) {
1609 if ((loop->capt->format != SND_PCM_FORMAT_S16 ||
1610 loop->play->format != SND_PCM_FORMAT_S16) &&
1611 (loop->capt->format != SND_PCM_FORMAT_S32 ||
1612 loop->play->format != SND_PCM_FORMAT_S32)) {
1613 logit(LOG_CRIT, "samplerate conversion supports only %s or %s formats (play=%s, capt=%s)\n", snd_pcm_format_name(SND_PCM_FORMAT_S16), snd_pcm_format_name(SND_PCM_FORMAT_S32), snd_pcm_format_name(loop->play->format), snd_pcm_format_name(loop->capt->format));
1614 loop->use_samplerate = 0;
1618 loop->src_state = src_new(loop->src_converter_type,
1619 loop->play->channels, &err);
1620 loop->src_data.data_in = calloc(1, sizeof(float)*loop->capt->channels*loop->capt->buf_size);
1621 if (loop->src_data.data_in == NULL) {
1625 loop->src_data.data_out = calloc(1, sizeof(float)*loop->play->channels*loop->play->buf_size);
1626 if (loop->src_data.data_out == NULL) {
1630 loop->src_data.src_ratio = (double)loop->play->rate /
1631 (double)loop->capt->rate;
1632 loop->src_data.end_of_input = 0;
1633 loop->src_out_frames = 0;
1635 loop->src_state = NULL;
1638 if (loop->sync == SYNC_TYPE_SAMPLERATE || loop->use_samplerate) {
1645 snd_output_printf(loop->output, "%s sync type: %s", loop->id, sync_types[loop->sync]);
1647 if (loop->sync == SYNC_TYPE_SAMPLERATE)
1648 snd_output_printf(loop->output, " (%s)", src_types[loop->src_converter_type]);
1650 snd_output_printf(loop->output, "\n");
1652 lhandle_start(loop->play);
1653 lhandle_start(loop->capt);
1654 if ((err = snd_pcm_format_set_silence(loop->play->format,
1655 loop->play->buf,
1656 loop->play->buf_size * loop->play->channels)) < 0) {
1657 logit(LOG_CRIT, "%s: silence error\n", loop->id);
1661 snd_output_printf(loop->output, "%s: capt->buffer_size = %li, play->buffer_size = %li\n", loop->id, loop->capt->buf_size, loop->play->buf_size);
1662 loop->pitch = 1.0;
1663 update_pitch(loop);
1664 loop->pitch_delta = 1.0 / ((double)loop->capt->rate * 4);
1665 loop->total_queued_count = 0;
1666 loop->pitch_diff = 0;
1667 count = get_whole_latency(loop) / loop->play->pitch;
1668 loop->play->buf_count = count;
1669 if (loop->play->buf == loop->capt->buf)
1670 loop->capt->buf_pos = count;
1671 err = writeit(loop->play);
1673 snd_output_printf(loop->output, "%s: silence queued %i samples\n", loop->id, err);
1674 if (count > loop->play->buffer_size)
1675 count = loop->play->buffer_size;
1677 logit(LOG_CRIT, "%s: initial playback fill error (%i/%i/%u)\n", loop->id, err, (int)count, loop->play->buffer_size);
1681 loop->running = 1;
1682 loop->stop_pending = 0;
1683 if (loop->xrun) {
1684 getcurtimestamp(&loop->xrun_last_update);
1685 loop->xrun_last_pdelay = XRUN_PROFILE_UNKNOWN;
1686 loop->xrun_last_cdelay = XRUN_PROFILE_UNKNOWN;
1687 loop->xrun_max_proctime = 0;
1689 if ((err = snd_pcm_start(loop->capt->handle)) < 0) {
1690 logit(LOG_CRIT, "pcm start %s error: %s\n", loop->capt->id, snd_strerror(err));
1693 if (!loop->linked) {
1694 if ((err = snd_pcm_start(loop->play->handle)) < 0) {
1695 logit(LOG_CRIT, "pcm start %s error: %s\n", loop->play->id, snd_strerror(err));
1701 pcmjob_stop(loop);
1705 int pcmjob_stop(struct loopback *loop)
1709 if (loop->running) {
1710 if ((err = snd_pcm_drop(loop->capt->handle)) < 0)
1711 logit(LOG_WARNING, "pcm drop %s error: %s\n", loop->capt->id, snd_strerror(err));
1712 if ((err = snd_pcm_drop(loop->play->handle)) < 0)
1713 logit(LOG_WARNING, "pcm drop %s error: %s\n", loop->play->id, snd_strerror(err));
1714 if ((err = snd_pcm_hw_free(loop->capt->handle)) < 0)
1715 logit(LOG_WARNING, "pcm hw_free %s error: %s\n", loop->capt->id, snd_strerror(err));
1716 if ((err = snd_pcm_hw_free(loop->play->handle)) < 0)
1717 logit(LOG_WARNING, "pcm hw_free %s error: %s\n", loop->play->id, snd_strerror(err));
1718 loop->running = 0;
1720 freeloop(loop);
1724 int pcmjob_pollfds_init(struct loopback *loop, struct pollfd *fds)
1728 if (loop->running) {
1729 err = snd_pcm_poll_descriptors(loop->play->handle, fds + idx, loop->play->pollfd_count);
1732 idx += loop->play->pollfd_count;
1733 err = snd_pcm_poll_descriptors(loop->capt->handle, fds + idx, loop->capt->pollfd_count);
1736 idx += loop->capt->pollfd_count;
1738 if (loop->play->ctl_pollfd_count > 0 &&
1739 (loop->slave == SLAVE_TYPE_ON || loop->controls)) {
1740 err = snd_ctl_poll_descriptors(loop->play->ctl, fds + idx, loop->play->ctl_pollfd_count);
1743 idx += loop->play->ctl_pollfd_count;
1745 if (loop->capt->ctl_pollfd_count > 0 &&
1746 (loop->slave == SLAVE_TYPE_ON || loop->controls)) {
1747 err = snd_ctl_poll_descriptors(loop->capt->ctl, fds + idx, loop->capt->ctl_pollfd_count);
1750 idx += loop->capt->ctl_pollfd_count;
1752 loop->active_pollfd_count = idx;
1756 static snd_pcm_sframes_t get_queued_playback_samples(struct loopback *loop)
1760 if (snd_pcm_delay(loop->play->handle, &delay) < 0)
1762 loop->play->last_delay = delay;
1763 delay += loop->play->buf_count;
1765 delay += loop->src_out_frames;
1770 static snd_pcm_sframes_t get_queued_capture_samples(struct loopback *loop)
1775 if ((err = snd_pcm_delay(loop->capt->handle, &delay)) < 0)
1777 loop->capt->last_delay = delay;
1778 delay += loop->capt->buf_count;
1799 struct loopback *loop = lhandle->loopback;
1809 if (lhandle == loop->play)
1812 snd_output_printf(loop->output, "%s: ctl event!!!! %s\n", lhandle->id, snd_ctl_event_elem_get_name(ev));
1836 snd_output_printf(loop->output, "%s: ctl event active %i\n", lhandle->id, err);
1839 loop->stop_pending = 1;
1840 loop->stop_count = 0;
1843 loop->stop_pending = 0;
1844 if (loop->running == 0)
1848 pcmjob_stop(loop);
1849 err = pcmjob_start(loop);
1856 int pcmjob_pollfds_handle(struct loopback *loop, struct pollfd *fds)
1858 struct loopback_handle *play = loop->play;
1859 struct loopback_handle *capt = loop->capt;
1865 snd_output_printf(loop->output, "%s: pollfds handle\n", loop->id);
1866 if (verbose > 13 || loop->xrun)
1867 getcurtimestamp(&loop->tstamp_start);
1871 snd_output_printf(loop->output, "%s: delay error: %s / %li / %li\n", play->id, snd_strerror(err), play->buf_size, play->buf_count);
1873 snd_output_printf(loop->output, "%s: delay %li / %li / %li\n", play->id, pdelay, play->buf_size, play->buf_count);
1875 snd_output_printf(loop->output, "%s: delay error: %s / %li / %li\n", capt->id, snd_strerror(err), capt->buf_size, capt->buf_count);
1877 snd_output_printf(loop->output, "%s: delay %li / %li / %li\n", capt->id, cdelay, capt->buf_size, capt->buf_count);
1880 if (loop->running) {
1893 if (loop->xrun) {
1895 loop->xrun_last_wake = loop->xrun_last_wake0;
1896 loop->xrun_last_wake0 = loop->tstamp_start;
1898 loop->xrun_last_check = loop->xrun_last_check0;
1899 loop->xrun_last_check0 = loop->tstamp_start;
1905 (loop->slave == SLAVE_TYPE_ON || loop->controls)) {
1921 (loop->slave == SLAVE_TYPE_ON || loop->controls)) {
1937 snd_output_printf(loop->output, "%s: prevents = 0x%x, crevents = 0x%x\n", loop->id, prevents, crevents);
1938 if (!loop->running)
1954 buf_add(loop, ccount);
1955 if (capt->xrun_pending || loop->reinit)
1960 buf_remove(loop, pcount);
1963 if (play->xrun_pending || loop->reinit)
1968 if ((err = xrun_sync(loop)) < 0)
1971 if (loop->reinit) {
1972 err = pcmjob_stop(loop);
1975 err = pcmjob_start(loop);
1979 if (loop->sync != SYNC_TYPE_NONE &&
1982 snd_pcm_sframes_t diff, lat = get_whole_latency(loop);
1985 (double)loop->total_queued_count) - lat;
1988 snd_output_printf(loop->output, "%s: sync diff %li old diff %li\n", loop->id, diff, loop->pitch_diff);
1990 if (diff == loop->pitch_diff)
1991 loop->pitch += loop->pitch_delta;
1992 else if (diff > loop->pitch_diff)
1993 loop->pitch += loop->pitch_delta*2;
1995 if (diff == loop->pitch_diff)
1996 loop->pitch -= loop->pitch_delta;
1997 else if (diff < loop->pitch_diff)
1998 loop->pitch -= loop->pitch_delta*2;
2000 loop->pitch_diff = diff;
2001 if (loop->pitch_diff_min > diff)
2002 loop->pitch_diff_min = diff;
2003 if (loop->pitch_diff_max < diff)
2004 loop->pitch_diff_max = diff;
2005 update_pitch(loop);
2010 loop->total_queued_count = 0;
2012 if (loop->sync != SYNC_TYPE_NONE) {
2016 if (loop->total_queued_count & 1) {
2017 pqueued = get_queued_playback_samples(loop);
2018 cqueued = get_queued_capture_samples(loop);
2020 cqueued = get_queued_capture_samples(loop);
2021 pqueued = get_queued_playback_samples(loop);
2025 snd_output_printf(loop->output, "%s: queued %li/%li samples\n", loop->id, pqueued, cqueued);
2031 loop->total_queued_count += 1;
2036 snd_output_printf(loop->output, "%s: end delay error: %s / %li / %li\n", play->id, snd_strerror(err), play->buf_size, play->buf_count);
2038 snd_output_printf(loop->output, "%s: end delay %li / %li / %li\n", play->id, pdelay, play->buf_size, play->buf_count);
2040 snd_output_printf(loop->output, "%s: end delay error: %s / %li / %li\n", capt->id, snd_strerror(err), capt->buf_size, capt->buf_count);
2042 snd_output_printf(loop->output, "%s: end delay %li / %li / %li\n", capt->id, cdelay, capt->buf_size, capt->buf_count);
2045 if (verbose > 13 || loop->xrun) {
2047 getcurtimestamp(&loop->tstamp_end);
2048 diff = timediff(loop->tstamp_end, loop->tstamp_start);
2050 snd_output_printf(loop->output, "%s: processing time %lius\n", loop->id, diff);
2051 if (loop->xrun && loop->xrun_max_proctime < diff)
2052 loop->xrun_max_proctime = diff;
2058 snd_output_printf(loop->state, ##args)
2064 struct loopback *loop = lhandle->loopback;
2069 if (!loop->running)
2078 void pcmjob_state(struct loopback *loop)
2082 OUT("State dump for thread %p job %i: %s:\n", (void *)self, loop->thread, loop->id);
2083 OUT(" running = %i\n", loop->running);
2084 OUT(" sync = %i\n", loop->sync);
2085 OUT(" slave = %i\n", loop->slave);
2086 if (!loop->running)
2088 OUT(" pollfd_count = %i\n", loop->pollfd_count);
2089 OUT(" pitch = %.8f, delta = %.8f, diff = %li, min = %li, max = %li\n", loop->pitch, loop->pitch_delta, loop->pitch_diff, loop->pitch_diff_min, loop->pitch_diff_max);
2090 OUT(" use_samplerate = %i\n", loop->use_samplerate);
2092 show_handle(loop->play, "playback");
2093 show_handle(loop->capt, "capture");