- hdsp_peak_rms_t *peak_rms;
- int i;
-
- if (hdsp->io_type == H9652) {
- unsigned long rms_low, rms_high;
- int doublespeed = 0;
- if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DoubleSpeedStatus)
- doublespeed = 1;
- peak_rms = (hdsp_peak_rms_t *)arg;
- for (i = 0; i < 26; ++i) {
- if (!(doublespeed && (i & 4))) {
- if (copy_to_user_fromio((void *)peak_rms->input_peaks+i*4, hdsp->iobase+HDSP_9652_peakBase-i*4, 4) != 0)
- return -EFAULT;
- if (copy_to_user_fromio((void *)peak_rms->playback_peaks+i*4, hdsp->iobase+HDSP_9652_peakBase-(doublespeed ? 14 : 26)*4-i*4, 4) != 0)
- return -EFAULT;
- if (copy_to_user_fromio((void *)peak_rms->output_peaks+i*4, hdsp->iobase+HDSP_9652_peakBase-2*(doublespeed ? 14 : 26)*4-i*4, 4) != 0)
- return -EFAULT;
- rms_low = *(u32 *)(hdsp->iobase+HDSP_9652_rmsBase+i*8) & 0xFFFFFF00;
- rms_high = *(u32 *)(hdsp->iobase+HDSP_9652_rmsBase+i*8+4) & 0xFFFFFF00;
- rms_high += (rms_low >> 24);
- rms_low <<= 8;
- if (copy_to_user((void *)peak_rms->input_rms+i*8, &rms_low, 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->input_rms+i*8+4, &rms_high, 4) != 0)
- return -EFAULT;
- rms_low = *(u32 *)(hdsp->iobase+HDSP_9652_rmsBase+(doublespeed ? 14 : 26)*8+i*8) & 0xFFFFFF00;
- rms_high = *(u32 *)(hdsp->iobase+HDSP_9652_rmsBase+(doublespeed ? 14 : 26)*8+i*8+4) & 0xFFFFFF00;
- rms_high += (rms_low >> 24);
- rms_low <<= 8;
- if (copy_to_user((void *)peak_rms->playback_rms+i*8, &rms_low, 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->playback_rms+i*8+4, &rms_high, 4) != 0)
- return -EFAULT;
- rms_low = *(u32 *)(hdsp->iobase+HDSP_9652_rmsBase+2*(doublespeed ? 14 : 26)*8+i*8) & 0xFFFFFF00;
- rms_high = *(u32 *)(hdsp->iobase+HDSP_9652_rmsBase+2*(doublespeed ? 14 : 26)*8+i*8+4) & 0xFFFFFF00;
- rms_high += (rms_low >> 24);
- rms_low <<= 8;
- if (copy_to_user((void *)peak_rms->output_rms+i*8, &rms_low, 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->output_rms+i*8+4, &rms_high, 4) != 0)
- return -EFAULT;
- }
- }
- return 0;
- }
- if (hdsp->io_type == H9632) {
- int j;
- hdsp_9632_meters_t *m;
- int doublespeed = 0;
- if (hdsp_read (hdsp, HDSP_statusRegister) & HDSP_DoubleSpeedStatus)
- doublespeed = 1;
- m = (hdsp_9632_meters_t *)(hdsp->iobase+HDSP_9632_metersBase);
- peak_rms = (hdsp_peak_rms_t *)arg;
- for (i = 0, j = 0; i < 16; ++i, ++j) {
- if (copy_to_user((void *)peak_rms->input_peaks+i*4, &(m->input_peak[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->playback_peaks+i*4, &(m->playback_peak[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->output_peaks+i*4, &(m->output_peak[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->input_rms+i*8, &(m->input_rms_low[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->playback_rms+i*8, &(m->playback_rms_low[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->output_rms+i*8, &(m->output_rms_low[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->input_rms+i*8+4, &(m->input_rms_high[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->playback_rms+i*8+4, &(m->playback_rms_high[j]), 4) != 0)
- return -EFAULT;
- if (copy_to_user((void *)peak_rms->output_rms+i*8+4, &(m->output_rms_high[j]), 4) != 0)
- return -EFAULT;
- if (doublespeed && i == 3) i += 4;
- }
- return 0;
- }