{
int err;
- if (lhandle->ctl_rate_shift == NULL)
+ if (lhandle->ctl_rate_shift) {
+ snd_ctl_elem_value_set_integer(lhandle->ctl_rate_shift, 0, pitch * 100000);
+ err = snd_ctl_elem_write(lhandle->ctl, lhandle->ctl_rate_shift);
+ } else if (lhandle->capt_pitch) {
+ snd_ctl_elem_value_set_integer(lhandle->capt_pitch, 0, (1 / pitch) * 1000000);
+ err = snd_ctl_elem_write(lhandle->ctl, lhandle->capt_pitch);
+ } else {
return 0;
- snd_ctl_elem_value_set_integer(lhandle->ctl_rate_shift, 0, pitch * 100000);
- err = snd_ctl_elem_write(lhandle->ctl, lhandle->ctl_rate_shift);
+ }
if (err < 0) {
logit(LOG_CRIT, "Cannot set PCM Rate Shift element for %s: %s\n", lhandle->id, snd_strerror(err));
return err;
&lhandle->ctl_notify);
openctl_elem(lhandle, device, subdevice, "PCM Rate Shift 100000",
&lhandle->ctl_rate_shift);
+ openctl_elem(lhandle, device, subdevice, "Capture Pitch 1000000",
+ &lhandle->capt_pitch);
set_rate_shift(lhandle, 1);
openctl_elem(lhandle, device, subdevice, "PCM Slave Active",
&lhandle->ctl_active);
if (lhandle->ctl_rate_shift)
snd_ctl_elem_value_free(lhandle->ctl_rate_shift);
lhandle->ctl_rate_shift = NULL;
+ if (lhandle->capt_pitch)
+ snd_ctl_elem_value_free(lhandle->capt_pitch);
+ lhandle->capt_pitch = NULL;
if (lhandle->ctl)
err = snd_ctl_close(lhandle->ctl);
lhandle->ctl = NULL;
snprintf(id, sizeof(id), "%s/%s", loop->play->id, loop->capt->id);
id[sizeof(id)-1] = '\0';
loop->id = strdup(id);
- if (loop->sync == SYNC_TYPE_AUTO && loop->capt->ctl_rate_shift)
+ if (loop->sync == SYNC_TYPE_AUTO && (loop->capt->ctl_rate_shift || loop->capt->capt_pitch))
loop->sync = SYNC_TYPE_CAPTRATESHIFT;
if (loop->sync == SYNC_TYPE_AUTO && loop->play->ctl_rate_shift)
loop->sync = SYNC_TYPE_PLAYRATESHIFT;