summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAdrian Knoth <adi@drcomp.erfurt.thur.de>2011-02-23 11:43:09 +0100
committerTakashi Iwai <tiwai@suse.de>2011-02-23 15:42:28 +0100
commit483cee77d2be6c22ef67ac8c6711e757d138a538 (patch)
treeb9fc379a7642a9a0627c6c7c2ce7570b05ec94ca
parent432d2500ac11ca88532e08716813b189a27f74a9 (diff)
downloadlinux-483cee77d2be6c22ef67ac8c6711e757d138a538.tar.gz
linux-483cee77d2be6c22ef67ac8c6711e757d138a538.tar.bz2
linux-483cee77d2be6c22ef67ac8c6711e757d138a538.zip
ALSA: hdspm - Fix buffer handling on RME MADI/MADIface/AES(32)
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>
-rw-r--r--sound/pci/rme9652/hdspm.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/sound/pci/rme9652/hdspm.c b/sound/pci/rme9652/hdspm.c
index 92588975f580..509a35a881f5 100644
--- a/sound/pci/rme9652/hdspm.c
+++ b/sound/pci/rme9652/hdspm.c
@@ -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;
}