277a278,282 > /* RME says n = 104857600000000, but in the windows MADI driver, I see: > return 104857600000000 / rate; // 100 MHz > return 110100480000000 / rate; // 105 MHz > */ > #define DDS_NUMERATOR 104857600000000ULL; /* = 2^20 * 10^8 */ 1004,1008c1009 < /* RME says n = 104857600000000, but in the windows MADI driver, I see: < // return 104857600000000 / rate; // 100 MHz < return 110100480000000 / rate; // 105 MHz < */ < n = 104857600000000ULL; /* = 2^20 * 10^8 */ --- > n = DDS_NUMERATOR; 3087a3089,3159 > #define HDSP_DDS_OFFSET(xname, xindex) \ > { .iface = SNDRV_CTL_ELEM_IFACE_MIXER, \ > .name = xname, \ > .index = xindex, \ > .info = snd_hdsp_info_dds_offset, \ > .get = snd_hdsp_get_dds_offset, \ > .put = snd_hdsp_put_dds_offset \ > } > > static int hdsp_dds_offset(struct hdsp *hdsp) > { > u64 n; > u32 r; > unsigned int dds_value = hdsp->dds_value; > int system_sample_rate = hdsp->system_sample_rate; > > n = DDS_NUMERATOR; > /* > * dds_value = n / rate > * rate = n / dds_value > */ > div64_32(&n, dds_value, &r); > if (system_sample_rate >= 112000) > n *= 4; > else if (system_sample_rate >= 56000) > n *= 2; > return ((int)n) - system_sample_rate; > } > > static int hdsp_set_dds_offset(struct hdsp *hdsp, int offset_hz) > { > int rate = hdsp->system_sample_rate + offset_hz; > hdsp_set_dds_value(hdsp, rate); > return 0; > } > > static int snd_hdsp_info_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_info *uinfo) > { > uinfo->type = SNDRV_CTL_ELEM_TYPE_INTEGER; > uinfo->count = 1; > uinfo->value.integer.min = -5000; > uinfo->value.integer.max = 5000; > return 0; > } > > static int snd_hdsp_get_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) > { > struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); > > ucontrol->value.enumerated.item[0] = hdsp_dds_offset(hdsp); > return 0; > } > > static int snd_hdsp_put_dds_offset(struct snd_kcontrol *kcontrol, struct snd_ctl_elem_value *ucontrol) > { > struct hdsp *hdsp = snd_kcontrol_chip(kcontrol); > int change; > int val; > > if (!snd_hdsp_use_is_exclusive(hdsp)) > return -EBUSY; > val = ucontrol->value.enumerated.item[0]; > spin_lock_irq(&hdsp->lock); > if (val != hdsp_dds_offset(hdsp)) > change = (hdsp_set_dds_offset(hdsp, val) == 0) ? 1 : 0; > else > change = 0; > spin_unlock_irq(&hdsp->lock); > return change; > } > 3092c3164,3165 < HDSP_XLR_BREAKOUT_CABLE("XLR Breakout Cable", 0) --- > HDSP_XLR_BREAKOUT_CABLE("XLR Breakout Cable", 0), > HDSP_DDS_OFFSET("DDS Sample Rate Offset (Hz)", 0)