From e94f3cfdf951034693a9b9fc1f8b7190317779ad Mon Sep 17 00:00:00 2001 From: Jaroslav Kysela Date: Tue, 16 Jun 2009 20:10:19 +0200 Subject: [PATCH 1/3] pcm dmix plugin: fix MIX_AREAS_24 routine for i386 & x86_64 platforms The code was copied from ALSA bug#4577 from CannibalZerg. Signed-off-by: Jaroslav Kysela --- src/pcm/pcm_dmix_i386.h | 2 +- src/pcm/pcm_dmix_x86_64.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/pcm/pcm_dmix_i386.h b/src/pcm/pcm_dmix_i386.h index 9ea155d9..462371a5 100644 --- a/src/pcm/pcm_dmix_i386.h +++ b/src/pcm/pcm_dmix_i386.h @@ -400,8 +400,8 @@ static void MIX_AREAS_24(unsigned int size, "\tmovzwl (%%esi), %%ecx\n" "\tmovl (%%ebx), %%edx\n" "\tsall $16, %%eax\n" + "\torl %%eax, %%ecx\n" "\t" LOCK_PREFIX "btsw $0, (%%edi)\n" - "\tleal (%%ecx,%%eax,1), %%ecx\n" "\tjc 2f\n" "\t" XSUB " %%edx, %%ecx\n" "2:" diff --git a/src/pcm/pcm_dmix_x86_64.h b/src/pcm/pcm_dmix_x86_64.h index b4d0a412..ab40f50a 100644 --- a/src/pcm/pcm_dmix_x86_64.h +++ b/src/pcm/pcm_dmix_x86_64.h @@ -284,11 +284,11 @@ static void MIX_AREAS_24(unsigned int size, * *sum += sample; */ "\tmovsbl 2(%%rsi), %%eax\n" - "\tmovswl (%%rsi), %%ecx\n" + "\tmovzwl (%%rsi), %%ecx\n" "\tmovl (%%rbx), %%edx\n" "\tsall $16, %%eax\n" + "\torl %%eax, %%ecx\n" "\t" LOCK_PREFIX "btsw $0, (%%rdi)\n" - "\t.byte 0x67, 0x8d, 0x0c, 0x01\n" "\tjc 2f\n" "\t" XSUB " %%edx, %%ecx\n" "2:" From cbf395d6920a17d844ba5fa6afd615e23d00e596 Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Mon, 22 Jun 2009 10:00:03 +0200 Subject: [PATCH 2/3] MIDI event decoder: prevent running status after sysex Running status cannot be using in the command immediately following a system exclusive command, so we have to reset the running status state in that case. Signed-off-by: Clemens Ladisch --- src/seq/seq_midi_event.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/seq/seq_midi_event.c b/src/seq/seq_midi_event.c index b5caa1b8..92c749ab 100644 --- a/src/seq/seq_midi_event.c +++ b/src/seq/seq_midi_event.c @@ -442,6 +442,7 @@ long snd_midi_event_decode(snd_midi_event_t *dev, unsigned char *buf, long count if (cmd == MIDI_CMD_COMMON_SYSEX) { + snd_midi_event_reset_decode(dev); qlen = ev->data.ext.len; if (count < qlen) return -ENOMEM; From 394b376b3b10308a5d21da7ef87f002b4bf07bf8 Mon Sep 17 00:00:00 2001 From: Clemens Ladisch Date: Mon, 22 Jun 2009 10:00:46 +0200 Subject: [PATCH 3/3] seq_midi_event: fix decoding of (N)RPN events When decoding (N)RPN sequencer events into raw MIDI commands, the extra_decode_xrpn() function had accidentally swapped the MSB and LSB controller values of both the parameter number and the data value. Signed-off-by: Clemens Ladisch --- src/seq/seq_midi_event.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/seq/seq_midi_event.c b/src/seq/seq_midi_event.c index 92c749ab..53d05725 100644 --- a/src/seq/seq_midi_event.c +++ b/src/seq/seq_midi_event.c @@ -567,10 +567,10 @@ static int extra_decode_xrpn(snd_midi_event_t *dev, unsigned char *buf, int coun if (dev->nostat && count < 12) return -ENOMEM; cmd = MIDI_CMD_CONTROL|(ev->data.control.channel & 0x0f); - bytes[0] = ev->data.control.param & 0x007f; - bytes[1] = (ev->data.control.param & 0x3f80) >> 7; - bytes[2] = ev->data.control.value & 0x007f; - bytes[3] = (ev->data.control.value & 0x3f80) >> 7; + bytes[0] = (ev->data.control.param & 0x3f80) >> 7; + bytes[1] = ev->data.control.param & 0x007f; + bytes[2] = (ev->data.control.value & 0x3f80) >> 7; + bytes[3] = ev->data.control.value & 0x007f; if (cmd != dev->lastcmd && !dev->nostat) { if (count < 9) return -ENOMEM;