Lines Matching refs:loop
91 static inline snd_pcm_uframes_t get_whole_latency(struct loopback *loop) in get_whole_latency() argument
93 return loop->latency; in get_whole_latency()
321 static int setparams(struct loopback *loop, snd_pcm_uframes_t bufsize) in setparams() argument
334 if ((err = setparams_stream(loop->play, pt_params)) < 0) { in setparams()
335 …logit(LOG_CRIT, "Unable to set parameters for %s stream: %s\n", loop->play->id, snd_strerror(err)); in setparams()
338 if ((err = setparams_stream(loop->capt, ct_params)) < 0) { in setparams()
339 …logit(LOG_CRIT, "Unable to set parameters for %s stream: %s\n", loop->capt->id, snd_strerror(err)); in setparams()
343 if ((err = setparams_bufsize(loop->play, p_params, pt_params, bufsize / loop->play->pitch)) < 0) { in setparams()
344 …logit(LOG_CRIT, "Unable to set buffer parameters for %s stream: %s\n", loop->play->id, snd_strerro… in setparams()
347 if ((err = setparams_bufsize(loop->capt, c_params, ct_params, bufsize / loop->capt->pitch)) < 0) { in setparams()
348 …logit(LOG_CRIT, "Unable to set buffer parameters for %s stream: %s\n", loop->capt->id, snd_strerro… in setparams()
352 if ((err = setparams_set(loop->play, p_params, p_swparams, bufsize / loop->play->pitch)) < 0) { in setparams()
353 …logit(LOG_CRIT, "Unable to set sw parameters for %s stream: %s\n", loop->play->id, snd_strerror(er… in setparams()
356 if ((err = setparams_set(loop->capt, c_params, c_swparams, bufsize / loop->capt->pitch)) < 0) { in setparams()
357 …logit(LOG_CRIT, "Unable to set sw parameters for %s stream: %s\n", loop->capt->id, snd_strerror(er… in setparams()
362 if (!loop->linked) in setparams()
363 if (snd_pcm_link(loop->capt->handle, loop->play->handle) >= 0) in setparams()
364 loop->linked = 1; in setparams()
366 if ((err = snd_pcm_prepare(loop->play->handle)) < 0) { in setparams()
367 logit(LOG_CRIT, "Prepare %s error: %s\n", loop->play->id, snd_strerror(err)); in setparams()
370 if (!loop->linked && (err = snd_pcm_prepare(loop->capt->handle)) < 0) { in setparams()
371 logit(LOG_CRIT, "Prepare %s error: %s\n", loop->capt->id, snd_strerror(err)); in setparams()
376 snd_pcm_dump(loop->play->handle, loop->output); in setparams()
377 snd_pcm_dump(loop->capt->handle, loop->output); in setparams()
413 static void xrun_profile0(struct loopback *loop) in xrun_profile0() argument
417 if (snd_pcm_delay(loop->play->handle, &pdelay) >= 0 && in xrun_profile0()
418 snd_pcm_delay(loop->capt->handle, &cdelay) >= 0) { in xrun_profile0()
419 getcurtimestamp(&loop->xrun_last_update); in xrun_profile0()
420 loop->xrun_last_pdelay = pdelay; in xrun_profile0()
421 loop->xrun_last_cdelay = cdelay; in xrun_profile0()
422 loop->xrun_buf_pcount = loop->play->buf_count; in xrun_profile0()
423 loop->xrun_buf_ccount = loop->capt->buf_count; in xrun_profile0()
425 loop->xrun_out_frames = loop->src_out_frames; in xrun_profile0()
430 static inline void xrun_profile(struct loopback *loop) in xrun_profile() argument
432 if (loop->xrun) in xrun_profile()
433 xrun_profile0(loop); in xrun_profile()
436 static void xrun_stats0(struct loopback *loop) in xrun_stats0() argument
443 expected = ((double)loop->latency / in xrun_stats0()
444 (double)loop->play->rate_req) * 1000; in xrun_stats0()
446 last = (double)timediff(t, loop->xrun_last_update) / 1000; in xrun_stats0()
447 wake = (double)timediff(t, loop->xrun_last_wake) / 1000; in xrun_stats0()
448 check = (double)timediff(t, loop->xrun_last_check) / 1000; in xrun_stats0()
449 sincejob = (double)timediff(t, loop->tstamp_start) / 1000; in xrun_stats0()
450 if (loop->xrun_last_pdelay != XRUN_PROFILE_UNKNOWN) in xrun_stats0()
451 queued = ((double)loop->xrun_last_pdelay / in xrun_stats0()
452 (double)loop->play->rate) * 1000; in xrun_stats0()
453 if (loop->xrun_last_cdelay != XRUN_PROFILE_UNKNOWN) in xrun_stats0()
454 cqueued = ((double)loop->xrun_last_cdelay / in xrun_stats0()
455 (double)loop->capt->rate) * 1000; in xrun_stats0()
456 maxbuf = ((double)loop->play->buffer_size / in xrun_stats0()
457 (double)loop->play->rate) * 1000; in xrun_stats0()
458 proc = (double)loop->xrun_max_proctime / 1000; in xrun_stats0()
459 pfilled = ((double)(loop->xrun_buf_pcount + loop->xrun_out_frames) / in xrun_stats0()
460 (double)loop->play->rate) * 1000; in xrun_stats0()
461 cfilled = ((double)loop->xrun_buf_ccount / in xrun_stats0()
462 (double)loop->capt->rate) * 1000; in xrun_stats0()
463 avail_min = (((double)loop->play->buffer_size - in xrun_stats0()
464 (double)loop->play->avail_min ) / in xrun_stats0()
465 (double)loop->play->rate) * 1000; in xrun_stats0()
469 if (missing >= 0 && loop->xrun_max_missing < missing) in xrun_stats0()
470 loop->xrun_max_missing = missing; in xrun_stats0()
471 loop->xrun_max_proctime = 0; in xrun_stats0()
474 …logit(LOG_INFO, " expected %.4fms, processing %.4fms, max missing %.4fms\n", expected, proc, loop… in xrun_stats0()
480 static inline void xrun_stats(struct loopback *loop) in xrun_stats() argument
482 if (loop->xrun) in xrun_stats()
483 xrun_stats0(loop); in xrun_stats()
491 static void buf_remove(struct loopback *loop, snd_pcm_uframes_t count) in buf_remove() argument
496 if (loop->play->buf == loop->capt->buf) { in buf_remove()
497 if (count < loop->capt->buf_count) in buf_remove()
498 loop->capt->buf_count -= count; in buf_remove()
500 loop->capt->buf_count = 0; in buf_remove()
505 static void buf_add_copy(struct loopback *loop)
507 struct loopback_handle *capt = loop->capt;
508 struct loopback_handle *play = loop->play;
541 static void buf_add_src(struct loopback *loop) in buf_add_src() argument
543 struct loopback_handle *capt = loop->capt; in buf_add_src()
544 struct loopback_handle *play = loop->play; in buf_add_src()
559 (float *)loop->src_data.data_in + in buf_add_src()
565 (float *)loop->src_data.data_in + in buf_add_src()
573 loop->src_data.input_frames = pos; in buf_add_src()
574 loop->src_data.output_frames = play->buf_size - in buf_add_src()
575 loop->src_out_frames; in buf_add_src()
576 loop->src_data.end_of_input = 0; in buf_add_src()
577 old_data_out = loop->src_data.data_out; in buf_add_src()
578 loop->src_data.data_out = old_data_out + loop->src_out_frames; in buf_add_src()
579 src_process(loop->src_state, &loop->src_data); in buf_add_src()
580 loop->src_data.data_out = old_data_out; in buf_add_src()
581 capt->buf_count -= loop->src_data.input_frames_used; in buf_add_src()
582 count = loop->src_data.output_frames_gen + in buf_add_src()
583 loop->src_out_frames; in buf_add_src()
595 src_float_to_int_array(loop->src_data.data_out + in buf_add_src()
601 src_float_to_short_array(loop->src_data.data_out + in buf_add_src()
614 (long)pos, (long)loop->src_data.output_frames_gen, in buf_add_src()
615 (long)loop->src_out_frames, play->buf_count); in buf_add_src()
617 loop->src_out_frames = (loop->src_data.output_frames_gen + in buf_add_src()
618 loop->src_out_frames) - pos; in buf_add_src()
619 if (loop->src_out_frames > 0) { in buf_add_src()
620 memmove(loop->src_data.data_out, in buf_add_src()
621 loop->src_data.data_out + pos * play->channels, in buf_add_src()
622 loop->src_out_frames * play->channels * sizeof(float)); in buf_add_src()
626 static void buf_add_src(struct loopback *loop) in buf_add_src() argument
631 static void buf_add(struct loopback *loop, snd_pcm_uframes_t count) in buf_add() argument
636 if (loop->play->buf == loop->capt->buf) { in buf_add()
637 loop->play->buf_count += count; in buf_add()
639 buf_add_src(loop); in buf_add()
797 static snd_pcm_sframes_t remove_samples(struct loopback *loop, in remove_samples() argument
801 struct loopback_handle *play = loop->play; in remove_samples()
802 struct loopback_handle *capt = loop->capt; in remove_samples()
804 if (loop->play->buf == loop->capt->buf) { in remove_samples()
805 if (count > loop->play->buf_count) in remove_samples()
806 count = loop->play->buf_count; in remove_samples()
807 if (count > loop->capt->buf_count) in remove_samples()
808 count = loop->capt->buf_count; in remove_samples()
827 static int xrun_sync(struct loopback *loop) in xrun_sync() argument
829 struct loopback_handle *play = loop->play; in xrun_sync()
830 struct loopback_handle *capt = loop->capt; in xrun_sync()
831 snd_pcm_uframes_t fill = get_whole_latency(loop); in xrun_sync()
837 …snd_output_printf(loop->output, "%s: xrun sync %i %i\n", loop->id, capt->xrun_pending, play->xrun_… in xrun_sync()
851 buf_add(loop, diff); in xrun_sync()
890 pdelay += loop->src_out_frames; in xrun_sync()
897 loop->total_queued_count = 0; in xrun_sync()
898 loop->pitch_diff = loop->pitch_diff_min = loop->pitch_diff_max = 0; in xrun_sync()
900 snd_output_printf(loop->output, in xrun_sync()
909 , (long)loop->src_out_frames in xrun_sync()
912 snd_output_printf(loop->output, in xrun_sync()
923 diff = remove_samples(loop, 1, (delay1 - fill) / capt->pitch); in xrun_sync()
925 snd_output_printf(loop->output, in xrun_sync()
934 snd_output_printf(loop->output, in xrun_sync()
936 diff = remove_samples(loop, 0, diff); in xrun_sync()
941 snd_output_printf(loop->output, in xrun_sync()
949 snd_output_printf(loop->output, in xrun_sync()
951 diff -= remove_samples(loop, 1, diff); in xrun_sync()
956 snd_output_printf(loop->output, in xrun_sync()
963 snd_output_printf(loop->output, in xrun_sync()
968 snd_output_printf(loop->output, in xrun_sync()
984 snd_output_printf(loop->output, in xrun_sync()
987 buf_remove(loop, delay1 - diff); in xrun_sync()
989 snd_output_printf(loop->output, in xrun_sync()
1001 snd_output_printf(loop->output, in xrun_sync()
1017 snd_output_printf(loop->output, "%s: xrun sync ok\n", loop->id); in xrun_sync()
1027 pdelay += loop->src_out_frames; in xrun_sync()
1032 snd_output_printf(loop->output, "%s: sync verify: %li\n", loop->id, delay1); in xrun_sync()
1035 loop->xrun_max_proctime = 0; in xrun_sync()
1080 void update_pitch(struct loopback *loop) in update_pitch() argument
1082 double pitch = loop->pitch; in update_pitch()
1085 if (loop->sync == SYNC_TYPE_SAMPLERATE) { in update_pitch()
1086 loop->src_data.src_ratio = (double)1.0 / (pitch * in update_pitch()
1087 loop->play->pitch * loop->capt->pitch); in update_pitch()
1089 …snd_output_printf(loop->output, "%s: Samplerate src_ratio update1: %.8f\n", loop->id, loop->src_da… in update_pitch()
1092 if (loop->sync == SYNC_TYPE_CAPTRATESHIFT) { in update_pitch()
1093 set_rate_shift(loop->capt, pitch); in update_pitch()
1095 if (loop->use_samplerate) { in update_pitch()
1096 loop->src_data.src_ratio = in update_pitch()
1098 (loop->play->pitch * loop->capt->pitch); in update_pitch()
1100 …snd_output_printf(loop->output, "%s: Samplerate src_ratio update2: %.8f\n", loop->id, loop->src_da… in update_pitch()
1104 else if (loop->sync == SYNC_TYPE_PLAYRATESHIFT) { in update_pitch()
1106 set_rate_shift(loop->play, 1 / pitch); in update_pitch()
1108 if (loop->use_samplerate) { in update_pitch()
1109 loop->src_data.src_ratio = in update_pitch()
1111 (loop->play->pitch * loop->capt->pitch); in update_pitch()
1113 …snd_output_printf(loop->output, "%s: Samplerate src_ratio update3: %.8f\n", loop->id, loop->src_da… in update_pitch()
1118 …snd_output_printf(loop->output, "New pitch for %s: %.8f (min/max samples = %li/%li)\n", loop->id, … in update_pitch()
1375 int pcmjob_init(struct loopback *loop) in pcmjob_init() argument
1381 loop->cfile = fopen(FILE_CWRITE, "w+"); in pcmjob_init()
1384 loop->pfile = fopen(FILE_PWRITE, "w+"); in pcmjob_init()
1386 if ((err = openit(loop->play)) < 0) in pcmjob_init()
1388 if ((err = openit(loop->capt)) < 0) in pcmjob_init()
1390 snprintf(id, sizeof(id), "%s/%s", loop->play->id, loop->capt->id); in pcmjob_init()
1392 loop->id = strdup(id); in pcmjob_init()
1393 if (loop->sync == SYNC_TYPE_AUTO && (loop->capt->ctl_rate_shift || loop->capt->ctl_pitch)) in pcmjob_init()
1394 loop->sync = SYNC_TYPE_CAPTRATESHIFT; in pcmjob_init()
1395 if (loop->sync == SYNC_TYPE_AUTO && (loop->play->ctl_rate_shift || loop->play->ctl_pitch)) in pcmjob_init()
1396 loop->sync = SYNC_TYPE_PLAYRATESHIFT; in pcmjob_init()
1398 if (loop->sync == SYNC_TYPE_AUTO && loop->src_enable) in pcmjob_init()
1399 loop->sync = SYNC_TYPE_SAMPLERATE; in pcmjob_init()
1401 if (loop->sync == SYNC_TYPE_AUTO) in pcmjob_init()
1402 loop->sync = SYNC_TYPE_SIMPLE; in pcmjob_init()
1403 if (loop->slave == SLAVE_TYPE_AUTO && in pcmjob_init()
1404 loop->capt->ctl_notify && in pcmjob_init()
1405 loop->capt->ctl_active && in pcmjob_init()
1406 loop->capt->ctl_format && in pcmjob_init()
1407 loop->capt->ctl_rate && in pcmjob_init()
1408 loop->capt->ctl_channels) in pcmjob_init()
1409 loop->slave = SLAVE_TYPE_ON; in pcmjob_init()
1410 if (loop->slave == SLAVE_TYPE_ON) { in pcmjob_init()
1411 err = set_notify(loop->capt, 1); in pcmjob_init()
1414 if (loop->capt->ctl_notify == NULL || in pcmjob_init()
1415 snd_ctl_elem_value_get_boolean(loop->capt->ctl_notify, 0) == 0) { in pcmjob_init()
1416 logit(LOG_CRIT, "unable to enable slave mode for %s\n", loop->id); in pcmjob_init()
1421 err = control_init(loop); in pcmjob_init()
1426 pcmjob_done(loop); in pcmjob_init()
1430 static void freeloop(struct loopback *loop) in freeloop() argument
1433 if (loop->use_samplerate) { in freeloop()
1434 if (loop->src_state) in freeloop()
1435 src_delete(loop->src_state); in freeloop()
1436 loop->src_state = NULL; in freeloop()
1437 free((void *)loop->src_data.data_in); in freeloop()
1438 loop->src_data.data_in = NULL; in freeloop()
1439 free(loop->src_data.data_out); in freeloop()
1440 loop->src_data.data_out = NULL; in freeloop()
1443 if (loop->play->buf == loop->capt->buf) in freeloop()
1444 loop->play->buf = NULL; in freeloop()
1445 freeit(loop->play); in freeloop()
1446 freeit(loop->capt); in freeloop()
1449 int pcmjob_done(struct loopback *loop) in pcmjob_done() argument
1451 control_done(loop); in pcmjob_done()
1452 closeit(loop->play); in pcmjob_done()
1453 closeit(loop->capt); in pcmjob_done()
1454 freeloop(loop); in pcmjob_done()
1455 free(loop->id); in pcmjob_done()
1456 loop->id = NULL; in pcmjob_done()
1458 if (loop->pfile) { in pcmjob_done()
1459 fclose(loop->pfile); in pcmjob_done()
1460 loop->pfile = NULL; in pcmjob_done()
1464 if (loop->cfile) { in pcmjob_done()
1465 fclose(loop->cfile); in pcmjob_done()
1466 loop->cfile = NULL; in pcmjob_done()
1480 static void fix_format(struct loopback *loop, int force) in fix_format() argument
1482 snd_pcm_format_t format = loop->capt->format; in fix_format()
1484 if (!force && loop->sync != SYNC_TYPE_SAMPLERATE) in fix_format()
1493 loop->capt->format = format; in fix_format()
1494 loop->play->format = format; in fix_format()
1497 int pcmjob_start(struct loopback *loop) in pcmjob_start() argument
1502 loop->pollfd_count = loop->play->ctl_pollfd_count + in pcmjob_start()
1503 loop->capt->ctl_pollfd_count; in pcmjob_start()
1504 if ((err = snd_pcm_poll_descriptors_count(loop->play->handle)) < 0) in pcmjob_start()
1506 loop->play->pollfd_count = err; in pcmjob_start()
1507 loop->pollfd_count += err; in pcmjob_start()
1508 if ((err = snd_pcm_poll_descriptors_count(loop->capt->handle)) < 0) in pcmjob_start()
1510 loop->capt->pollfd_count = err; in pcmjob_start()
1511 loop->pollfd_count += err; in pcmjob_start()
1512 if (loop->slave == SLAVE_TYPE_ON) { in pcmjob_start()
1513 err = get_active(loop->capt); in pcmjob_start()
1518 err = get_format(loop->capt); in pcmjob_start()
1521 loop->play->format = loop->capt->format = err; in pcmjob_start()
1522 fix_format(loop, 0); in pcmjob_start()
1523 err = get_rate(loop->capt); in pcmjob_start()
1526 loop->play->rate_req = loop->capt->rate_req = err; in pcmjob_start()
1527 err = get_channels(loop->capt); in pcmjob_start()
1530 loop->play->channels = loop->capt->channels = err; in pcmjob_start()
1532 loop->reinit = 0; in pcmjob_start()
1533 loop->use_samplerate = 0; in pcmjob_start()
1535 if (loop->latency_req) { in pcmjob_start()
1536 loop->latency_reqtime = frames_to_time(loop->play->rate_req, in pcmjob_start()
1537 loop->latency_req); in pcmjob_start()
1538 loop->latency_req = 0; in pcmjob_start()
1540 loop->latency = time_to_frames(loop->play->rate_req, loop->latency_reqtime); in pcmjob_start()
1541 if ((err = setparams(loop, loop->latency/2)) < 0) in pcmjob_start()
1544 showlatency(loop->output, loop->latency, loop->play->rate_req, "Latency"); in pcmjob_start()
1545 if (loop->play->access == loop->capt->access && in pcmjob_start()
1546 loop->play->format == loop->capt->format && in pcmjob_start()
1547 loop->play->rate == loop->capt->rate && in pcmjob_start()
1548 loop->play->channels == loop->capt->channels && in pcmjob_start()
1549 loop->sync != SYNC_TYPE_SAMPLERATE) { in pcmjob_start()
1551 snd_output_printf(loop->output, "shared buffer!!!\n"); in pcmjob_start()
1552 if ((err = init_handle(loop->play, 1)) < 0) in pcmjob_start()
1554 if ((err = init_handle(loop->capt, 0)) < 0) in pcmjob_start()
1556 if (loop->play->buf_size < loop->capt->buf_size) { in pcmjob_start()
1557 char *nbuf = realloc(loop->play->buf, in pcmjob_start()
1558 loop->capt->buf_size * in pcmjob_start()
1559 loop->capt->frame_size); in pcmjob_start()
1564 loop->play->buf = nbuf; in pcmjob_start()
1565 loop->play->buf_size = loop->capt->buf_size; in pcmjob_start()
1566 } else if (loop->capt->buf_size < loop->play->buf_size) { in pcmjob_start()
1567 char *nbuf = realloc(loop->capt->buf, in pcmjob_start()
1568 loop->play->buf_size * in pcmjob_start()
1569 loop->play->frame_size); in pcmjob_start()
1574 loop->capt->buf = nbuf; in pcmjob_start()
1575 loop->capt->buf_size = loop->play->buf_size; in pcmjob_start()
1577 loop->capt->buf = loop->play->buf; in pcmjob_start()
1579 if ((err = init_handle(loop->play, 1)) < 0) in pcmjob_start()
1581 if ((err = init_handle(loop->capt, 1)) < 0) in pcmjob_start()
1583 if (loop->play->rate_req != loop->play->rate || in pcmjob_start()
1584 loop->capt->rate_req != loop->capt->rate) { in pcmjob_start()
1586 loop->use_samplerate = 1; in pcmjob_start()
1587 format1 = loop->play->format; in pcmjob_start()
1588 format2 = loop->capt->format; in pcmjob_start()
1589 fix_format(loop, 1); in pcmjob_start()
1590 if (loop->play->format != format1 || in pcmjob_start()
1591 loop->capt->format != format2) { in pcmjob_start()
1592 pcmjob_stop(loop); in pcmjob_start()
1598 if (loop->sync == SYNC_TYPE_SAMPLERATE) in pcmjob_start()
1599 loop->use_samplerate = 1; in pcmjob_start()
1600 if (loop->use_samplerate && !loop->src_enable) { in pcmjob_start()
1602 loop->use_samplerate = 0; in pcmjob_start()
1606 if (loop->use_samplerate) { in pcmjob_start()
1607 if ((loop->capt->format != SND_PCM_FORMAT_S16 || in pcmjob_start()
1608 loop->play->format != SND_PCM_FORMAT_S16) && in pcmjob_start()
1609 (loop->capt->format != SND_PCM_FORMAT_S32 || in pcmjob_start()
1610 loop->play->format != SND_PCM_FORMAT_S32)) { in pcmjob_start()
1611 …_format_name(SND_PCM_FORMAT_S32), snd_pcm_format_name(loop->play->format), snd_pcm_format_name(loo… in pcmjob_start()
1612 loop->use_samplerate = 0; in pcmjob_start()
1616 loop->src_state = src_new(loop->src_converter_type, in pcmjob_start()
1617 loop->play->channels, &err); in pcmjob_start()
1618 loop->src_data.data_in = calloc(1, sizeof(float)*loop->capt->channels*loop->capt->buf_size); in pcmjob_start()
1619 if (loop->src_data.data_in == NULL) { in pcmjob_start()
1623 loop->src_data.data_out = calloc(1, sizeof(float)*loop->play->channels*loop->play->buf_size); in pcmjob_start()
1624 if (loop->src_data.data_out == NULL) { in pcmjob_start()
1628 loop->src_data.src_ratio = (double)loop->play->rate / in pcmjob_start()
1629 (double)loop->capt->rate; in pcmjob_start()
1630 loop->src_data.end_of_input = 0; in pcmjob_start()
1631 loop->src_out_frames = 0; in pcmjob_start()
1633 loop->src_state = NULL; in pcmjob_start()
1636 if (loop->sync == SYNC_TYPE_SAMPLERATE || loop->use_samplerate) { in pcmjob_start()
1643 snd_output_printf(loop->output, "%s sync type: %s", loop->id, sync_types[loop->sync]); in pcmjob_start()
1645 if (loop->sync == SYNC_TYPE_SAMPLERATE) in pcmjob_start()
1646 snd_output_printf(loop->output, " (%s)", src_types[loop->src_converter_type]); in pcmjob_start()
1648 snd_output_printf(loop->output, "\n"); in pcmjob_start()
1650 lhandle_start(loop->play); in pcmjob_start()
1651 lhandle_start(loop->capt); in pcmjob_start()
1652 if ((err = snd_pcm_format_set_silence(loop->play->format, in pcmjob_start()
1653 loop->play->buf, in pcmjob_start()
1654 loop->play->buf_size * loop->play->channels)) < 0) { in pcmjob_start()
1655 logit(LOG_CRIT, "%s: silence error\n", loop->id); in pcmjob_start()
1659 …snd_output_printf(loop->output, "%s: capt->buffer_size = %li, play->buffer_size = %li\n", loop->id… in pcmjob_start()
1660 loop->pitch = 1.0; in pcmjob_start()
1661 update_pitch(loop); in pcmjob_start()
1662 loop->pitch_delta = 1.0 / ((double)loop->capt->rate * 4); in pcmjob_start()
1663 loop->total_queued_count = 0; in pcmjob_start()
1664 loop->pitch_diff = 0; in pcmjob_start()
1665 count = get_whole_latency(loop) / loop->play->pitch; in pcmjob_start()
1666 loop->play->buf_count = count; in pcmjob_start()
1667 if (loop->play->buf == loop->capt->buf) in pcmjob_start()
1668 loop->capt->buf_pos = count; in pcmjob_start()
1669 err = writeit(loop->play); in pcmjob_start()
1671 snd_output_printf(loop->output, "%s: silence queued %i samples\n", loop->id, err); in pcmjob_start()
1672 if (count > loop->play->buffer_size) in pcmjob_start()
1673 count = loop->play->buffer_size; in pcmjob_start()
1675 …logit(LOG_CRIT, "%s: initial playback fill error (%i/%i/%u)\n", loop->id, err, (int)count, loop->p… in pcmjob_start()
1679 loop->running = 1; in pcmjob_start()
1680 loop->stop_pending = 0; in pcmjob_start()
1681 if (loop->xrun) { in pcmjob_start()
1682 getcurtimestamp(&loop->xrun_last_update); in pcmjob_start()
1683 loop->xrun_last_pdelay = XRUN_PROFILE_UNKNOWN; in pcmjob_start()
1684 loop->xrun_last_cdelay = XRUN_PROFILE_UNKNOWN; in pcmjob_start()
1685 loop->xrun_max_proctime = 0; in pcmjob_start()
1687 if ((err = snd_pcm_start(loop->capt->handle)) < 0) { in pcmjob_start()
1688 logit(LOG_CRIT, "pcm start %s error: %s\n", loop->capt->id, snd_strerror(err)); in pcmjob_start()
1691 if (!loop->linked) { in pcmjob_start()
1692 if ((err = snd_pcm_start(loop->play->handle)) < 0) { in pcmjob_start()
1693 logit(LOG_CRIT, "pcm start %s error: %s\n", loop->play->id, snd_strerror(err)); in pcmjob_start()
1699 pcmjob_stop(loop); in pcmjob_start()
1703 int pcmjob_stop(struct loopback *loop) in pcmjob_stop() argument
1707 if (loop->running) { in pcmjob_stop()
1708 if ((err = snd_pcm_drop(loop->capt->handle)) < 0) in pcmjob_stop()
1709 logit(LOG_WARNING, "pcm drop %s error: %s\n", loop->capt->id, snd_strerror(err)); in pcmjob_stop()
1710 if ((err = snd_pcm_drop(loop->play->handle)) < 0) in pcmjob_stop()
1711 logit(LOG_WARNING, "pcm drop %s error: %s\n", loop->play->id, snd_strerror(err)); in pcmjob_stop()
1712 if ((err = snd_pcm_hw_free(loop->capt->handle)) < 0) in pcmjob_stop()
1713 logit(LOG_WARNING, "pcm hw_free %s error: %s\n", loop->capt->id, snd_strerror(err)); in pcmjob_stop()
1714 if ((err = snd_pcm_hw_free(loop->play->handle)) < 0) in pcmjob_stop()
1715 logit(LOG_WARNING, "pcm hw_free %s error: %s\n", loop->play->id, snd_strerror(err)); in pcmjob_stop()
1716 loop->running = 0; in pcmjob_stop()
1718 freeloop(loop); in pcmjob_stop()
1722 int pcmjob_pollfds_init(struct loopback *loop, struct pollfd *fds) in pcmjob_pollfds_init() argument
1726 if (loop->running) { in pcmjob_pollfds_init()
1727 err = snd_pcm_poll_descriptors(loop->play->handle, fds + idx, loop->play->pollfd_count); in pcmjob_pollfds_init()
1730 idx += loop->play->pollfd_count; in pcmjob_pollfds_init()
1731 err = snd_pcm_poll_descriptors(loop->capt->handle, fds + idx, loop->capt->pollfd_count); in pcmjob_pollfds_init()
1734 idx += loop->capt->pollfd_count; in pcmjob_pollfds_init()
1736 if (loop->play->ctl_pollfd_count > 0 && in pcmjob_pollfds_init()
1737 (loop->slave == SLAVE_TYPE_ON || loop->controls)) { in pcmjob_pollfds_init()
1738 err = snd_ctl_poll_descriptors(loop->play->ctl, fds + idx, loop->play->ctl_pollfd_count); in pcmjob_pollfds_init()
1741 idx += loop->play->ctl_pollfd_count; in pcmjob_pollfds_init()
1743 if (loop->capt->ctl_pollfd_count > 0 && in pcmjob_pollfds_init()
1744 (loop->slave == SLAVE_TYPE_ON || loop->controls)) { in pcmjob_pollfds_init()
1745 err = snd_ctl_poll_descriptors(loop->capt->ctl, fds + idx, loop->capt->ctl_pollfd_count); in pcmjob_pollfds_init()
1748 idx += loop->capt->ctl_pollfd_count; in pcmjob_pollfds_init()
1750 loop->active_pollfd_count = idx; in pcmjob_pollfds_init()
1754 static snd_pcm_sframes_t get_queued_playback_samples(struct loopback *loop) in get_queued_playback_samples() argument
1758 if (snd_pcm_delay(loop->play->handle, &delay) < 0) in get_queued_playback_samples()
1760 loop->play->last_delay = delay; in get_queued_playback_samples()
1761 delay += loop->play->buf_count; in get_queued_playback_samples()
1763 delay += loop->src_out_frames; in get_queued_playback_samples()
1768 static snd_pcm_sframes_t get_queued_capture_samples(struct loopback *loop) in get_queued_capture_samples() argument
1773 if ((err = snd_pcm_delay(loop->capt->handle, &delay)) < 0) in get_queued_capture_samples()
1775 loop->capt->last_delay = delay; in get_queued_capture_samples()
1776 delay += loop->capt->buf_count; in get_queued_capture_samples()
1797 struct loopback *loop = lhandle->loopback; in handle_ctl_events() local
1807 if (lhandle == loop->play) in handle_ctl_events()
1810 …snd_output_printf(loop->output, "%s: ctl event!!!! %s\n", lhandle->id, snd_ctl_event_elem_get_name… in handle_ctl_events()
1834 snd_output_printf(loop->output, "%s: ctl event active %i\n", lhandle->id, err); in handle_ctl_events()
1837 loop->stop_pending = 1; in handle_ctl_events()
1838 loop->stop_count = 0; in handle_ctl_events()
1841 loop->stop_pending = 0; in handle_ctl_events()
1842 if (loop->running == 0) in handle_ctl_events()
1846 pcmjob_stop(loop); in handle_ctl_events()
1847 err = pcmjob_start(loop); in handle_ctl_events()
1854 int pcmjob_pollfds_handle(struct loopback *loop, struct pollfd *fds) in pcmjob_pollfds_handle() argument
1856 struct loopback_handle *play = loop->play; in pcmjob_pollfds_handle()
1857 struct loopback_handle *capt = loop->capt; in pcmjob_pollfds_handle()
1863 snd_output_printf(loop->output, "%s: pollfds handle\n", loop->id); in pcmjob_pollfds_handle()
1864 if (verbose > 13 || loop->xrun) in pcmjob_pollfds_handle()
1865 getcurtimestamp(&loop->tstamp_start); in pcmjob_pollfds_handle()
1869 …snd_output_printf(loop->output, "%s: delay error: %s / %li / %li\n", play->id, snd_strerror(err), … in pcmjob_pollfds_handle()
1871 …snd_output_printf(loop->output, "%s: delay %li / %li / %li\n", play->id, pdelay, play->buf_size, p… in pcmjob_pollfds_handle()
1873 …snd_output_printf(loop->output, "%s: delay error: %s / %li / %li\n", capt->id, snd_strerror(err), … in pcmjob_pollfds_handle()
1875 …snd_output_printf(loop->output, "%s: delay %li / %li / %li\n", capt->id, cdelay, capt->buf_size, c… in pcmjob_pollfds_handle()
1878 if (loop->running) { in pcmjob_pollfds_handle()
1891 if (loop->xrun) { in pcmjob_pollfds_handle()
1893 loop->xrun_last_wake = loop->xrun_last_wake0; in pcmjob_pollfds_handle()
1894 loop->xrun_last_wake0 = loop->tstamp_start; in pcmjob_pollfds_handle()
1896 loop->xrun_last_check = loop->xrun_last_check0; in pcmjob_pollfds_handle()
1897 loop->xrun_last_check0 = loop->tstamp_start; in pcmjob_pollfds_handle()
1903 (loop->slave == SLAVE_TYPE_ON || loop->controls)) { in pcmjob_pollfds_handle()
1919 (loop->slave == SLAVE_TYPE_ON || loop->controls)) { in pcmjob_pollfds_handle()
1935 …snd_output_printf(loop->output, "%s: prevents = 0x%x, crevents = 0x%x\n", loop->id, prevents, crev… in pcmjob_pollfds_handle()
1936 if (!loop->running) in pcmjob_pollfds_handle()
1952 buf_add(loop, ccount); in pcmjob_pollfds_handle()
1953 if (capt->xrun_pending || loop->reinit) in pcmjob_pollfds_handle()
1958 buf_remove(loop, pcount); in pcmjob_pollfds_handle()
1961 if (play->xrun_pending || loop->reinit) in pcmjob_pollfds_handle()
1966 if ((err = xrun_sync(loop)) < 0) in pcmjob_pollfds_handle()
1969 if (loop->reinit) { in pcmjob_pollfds_handle()
1970 err = pcmjob_stop(loop); in pcmjob_pollfds_handle()
1973 err = pcmjob_start(loop); in pcmjob_pollfds_handle()
1977 if (loop->sync != SYNC_TYPE_NONE && in pcmjob_pollfds_handle()
1980 snd_pcm_sframes_t diff, lat = get_whole_latency(loop); in pcmjob_pollfds_handle()
1983 (double)loop->total_queued_count) - lat; in pcmjob_pollfds_handle()
1986 …snd_output_printf(loop->output, "%s: sync diff %li old diff %li\n", loop->id, diff, loop->pitch_di… in pcmjob_pollfds_handle()
1988 if (diff == loop->pitch_diff) in pcmjob_pollfds_handle()
1989 loop->pitch += loop->pitch_delta; in pcmjob_pollfds_handle()
1990 else if (diff > loop->pitch_diff) in pcmjob_pollfds_handle()
1991 loop->pitch += loop->pitch_delta*2; in pcmjob_pollfds_handle()
1993 if (diff == loop->pitch_diff) in pcmjob_pollfds_handle()
1994 loop->pitch -= loop->pitch_delta; in pcmjob_pollfds_handle()
1995 else if (diff < loop->pitch_diff) in pcmjob_pollfds_handle()
1996 loop->pitch -= loop->pitch_delta*2; in pcmjob_pollfds_handle()
1998 loop->pitch_diff = diff; in pcmjob_pollfds_handle()
1999 if (loop->pitch_diff_min > diff) in pcmjob_pollfds_handle()
2000 loop->pitch_diff_min = diff; in pcmjob_pollfds_handle()
2001 if (loop->pitch_diff_max < diff) in pcmjob_pollfds_handle()
2002 loop->pitch_diff_max = diff; in pcmjob_pollfds_handle()
2003 update_pitch(loop); in pcmjob_pollfds_handle()
2008 loop->total_queued_count = 0; in pcmjob_pollfds_handle()
2010 if (loop->sync != SYNC_TYPE_NONE) { in pcmjob_pollfds_handle()
2014 if (loop->total_queued_count & 1) { in pcmjob_pollfds_handle()
2015 pqueued = get_queued_playback_samples(loop); in pcmjob_pollfds_handle()
2016 cqueued = get_queued_capture_samples(loop); in pcmjob_pollfds_handle()
2018 cqueued = get_queued_capture_samples(loop); in pcmjob_pollfds_handle()
2019 pqueued = get_queued_playback_samples(loop); in pcmjob_pollfds_handle()
2023 snd_output_printf(loop->output, "%s: queued %li/%li samples\n", loop->id, pqueued, cqueued); in pcmjob_pollfds_handle()
2029 loop->total_queued_count += 1; in pcmjob_pollfds_handle()
2034 …snd_output_printf(loop->output, "%s: end delay error: %s / %li / %li\n", play->id, snd_strerror(er… in pcmjob_pollfds_handle()
2036 …snd_output_printf(loop->output, "%s: end delay %li / %li / %li\n", play->id, pdelay, play->buf_siz… in pcmjob_pollfds_handle()
2038 …snd_output_printf(loop->output, "%s: end delay error: %s / %li / %li\n", capt->id, snd_strerror(er… in pcmjob_pollfds_handle()
2040 …snd_output_printf(loop->output, "%s: end delay %li / %li / %li\n", capt->id, cdelay, capt->buf_siz… in pcmjob_pollfds_handle()
2043 if (verbose > 13 || loop->xrun) { in pcmjob_pollfds_handle()
2045 getcurtimestamp(&loop->tstamp_end); in pcmjob_pollfds_handle()
2046 diff = timediff(loop->tstamp_end, loop->tstamp_start); in pcmjob_pollfds_handle()
2048 snd_output_printf(loop->output, "%s: processing time %lius\n", loop->id, diff); in pcmjob_pollfds_handle()
2049 if (loop->xrun && loop->xrun_max_proctime < diff) in pcmjob_pollfds_handle()
2050 loop->xrun_max_proctime = diff; in pcmjob_pollfds_handle()
2056 snd_output_printf(loop->state, ##args)
2062 struct loopback *loop = lhandle->loopback; in show_handle() local
2067 if (!loop->running) in show_handle()
2076 void pcmjob_state(struct loopback *loop) in pcmjob_state() argument
2080 OUT("State dump for thread %p job %i: %s:\n", (void *)self, loop->thread, loop->id); in pcmjob_state()
2081 OUT(" running = %i\n", loop->running); in pcmjob_state()
2082 OUT(" sync = %i\n", loop->sync); in pcmjob_state()
2083 OUT(" slave = %i\n", loop->slave); in pcmjob_state()
2084 if (!loop->running) in pcmjob_state()
2086 OUT(" pollfd_count = %i\n", loop->pollfd_count); in pcmjob_state()
2087 … diff = %li, min = %li, max = %li\n", loop->pitch, loop->pitch_delta, loop->pitch_diff, loop->pitc… in pcmjob_state()
2088 OUT(" use_samplerate = %i\n", loop->use_samplerate); in pcmjob_state()
2090 show_handle(loop->play, "playback"); in pcmjob_state()
2091 show_handle(loop->capt, "capture"); in pcmjob_state()