ALSA: hdspm - Fix buffer handling on RME MADI/MADIface/AES(32)
authorAdrian Knoth <adi@drcomp.erfurt.thur.de>
Wed, 23 Feb 2011 10:43:09 +0000 (11:43 +0100)
committerTakashi Iwai <tiwai@suse.de>
Wed, 23 Feb 2011 14:42:28 +0000 (15:42 +0100)
Only RayDAT and AIO provide sane buffer pointers that can be used with
HDSPM_BufferPositionMask, on all other cards, this would result in a
wrong HW pointer leading to xruns and these messages:

[260808.916788] BUG: pcmC0D0p:0, pos = 2976, buffer size = 1024, period size = 512
[260808.961124] BUG: pcmC0D0c:0, pos = 4944, buffer size = 1024, period size = 512

Signed-off-by: Adrian Knoth <adi@drcomp.erfurt.thur.de>
Signed-off-by: Takashi Iwai <tiwai@suse.de>
sound/pci/rme9652/hdspm.c

index 9258897..509a35a 100644 (file)
@@ -1231,8 +1231,17 @@ static snd_pcm_uframes_t hdspm_hw_pointer(struct hdspm *hdspm)
        int position;
 
        position = hdspm_read(hdspm, HDSPM_statusRegister);
-       position &= HDSPM_BufferPositionMask;
-       position /= 4; /* Bytes per sample */
+
+       switch (hdspm->io_type) {
+       case RayDAT:
+       case AIO:
+               position &= HDSPM_BufferPositionMask;
+               position /= 4; /* Bytes per sample */
+               break;
+       default:
+               position = (position & HDSPM_BufferID) ?
+                       (hdspm->period_bytes / 4) : 0;
+       }
 
        return position;
 }