diff -Naur alsa-lib-1.0.10/configure alsa-lib-1.0.10-new/configure
--- alsa-lib-1.0.10/configure	2005-11-16 14:44:47.000000000 +0000
+++ alsa-lib-1.0.10-new/configure	2008-02-23 18:36:50.000000000 +0000
@@ -18948,7 +18948,7 @@
 esac
 
 cat >>confdefs.h <<_ACEOF
-#define DATADIR "$dir"
+#define DATADIR "/usr/share/"
 _ACEOF
 
 
diff -Naur alsa-lib-1.0.10/src/pcm/pcm_dmix.c alsa-lib-1.0.10-new/src/pcm/pcm_dmix.c
--- alsa-lib-1.0.10/src/pcm/pcm_dmix.c	2005-09-19 12:37:08.000000000 +0000
+++ alsa-lib-1.0.10-new/src/pcm/pcm_dmix.c	2008-02-23 18:38:16.000000000 +0000
@@ -50,6 +50,10 @@
 const char *_snd_module_pcm_dmix = "";
 #endif
 
+#define CHUMBY_SECRET_SAUCE   1
+#define CHUMBY_RESYNC_DELAY   22   // ~.5ms at 44.1Khz
+
+
 #ifndef DOC_HIDDEN
 /* start is pending - this state happens when rate plugin does a delayed commit */
 #define STATE_RUN_PENDING	1024
@@ -143,6 +147,8 @@
 #include "pcm_dmix_i386.c"
 #elif defined(__x86_64__)
 #include "pcm_dmix_x86_64.c"
+#elif defined(__arm__)
+#include "pcm_dmix_arm.c"
 #else
 #include "pcm_dmix_generic.c"
 #endif
@@ -260,12 +266,45 @@
 	 */
 	slave_hw_ptr -= slave_hw_ptr % dmix->slave_period_size;
 	slave_hw_ptr += dmix->slave_buffer_size;
+
+    #ifdef CHUMBY_SECRET_SAUCE
+    if (dmix->slave_hw_ptr > dmix->slave_appl_ptr) {
+        // Either the slave_appl_ptr wrapped at dmix->slave_boundary
+        // or this is an underrun condition that has not been detected by the
+        // remainder of the system -- how can we tell?  
+        // 
+        // Well, slave_appl_ptr and slave_hw_ptr should never really be more
+        // than dmix->slave_buffer_size units apart (because valid pointers 
+        // must reside within the boundaries of the ring buffer).  So, if 
+        // slave_appl_ptr has wrapped, slave_hw_ptr should be greater than 
+        // slave_boundary because slave_buffer_size was added to it above and 
+        // furthermore slave_appl_ptr should be less than slave_buffer_size.  
+        // Otherwise, this is an underrun and slave_appl_ptr should be adjusted 
+        // to slave_hw_ptr + CHUMBY_RESYNC_DELAY
+
+        if (dmix->slave_appl_ptr <= dmix->slave_buffer_size && 
+            slave_hw_ptr >= dmix->slave_boundary) {
+            // slave_appl_ptr wrapped at boundary
+            slave_hw_ptr -= dmix->slave_boundary;
+        } else {
+            // undetected underrun condition, adjust slave_appl_ptr
+            dmix->slave_appl_ptr = dmix->slave_hw_ptr + CHUMBY_RESYNC_DELAY;
+        }
+    }
+
+    if (dmix->slave_appl_ptr < slave_hw_ptr)
+        slave_size = slave_hw_ptr - dmix->slave_appl_ptr;
+    else
+        slave_size = 0;
+    #else
 	if (slave_hw_ptr >= dmix->slave_boundary)
 		slave_hw_ptr -= dmix->slave_boundary;
 	if (slave_hw_ptr < dmix->slave_appl_ptr)
 		slave_size = slave_hw_ptr + (dmix->slave_boundary - dmix->slave_appl_ptr);
 	else
 		slave_size = slave_hw_ptr - dmix->slave_appl_ptr;
+    #endif
+
 	if (slave_size < size)
 		size = slave_size;
 	if (! size)
@@ -463,6 +502,10 @@
 	dmix->hw_ptr %= pcm->period_size;
 	dmix->appl_ptr = dmix->last_appl_ptr = dmix->hw_ptr;
 	dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr;
+
+    #ifdef CHUMBY_SECRET_SAUCE
+    dmix->slave_appl_ptr += CHUMBY_RESYNC_DELAY;
+    #endif
 	return 0;
 }
 
@@ -471,7 +514,17 @@
 	int err;
 
 	snd_pcm_hwsync(dmix->spcm);
-	dmix->slave_appl_ptr = dmix->slave_hw_ptr = *dmix->spcm->hw.ptr;
+	dmix->slave_hw_ptr = *dmix->spcm->hw.ptr;
+    #ifndef CHUMBY_SECRET_SAUCE
+    dmix->slave_appl_ptr = dmix->slave_hw_ptr;
+    #else
+    {
+        snd_pcm_uframes_t delta = dmix->slave_appl_ptr - dmix->slave_hw_ptr;
+        if (delta > dmix->slave_buffer_size || delta < CHUMBY_RESYNC_DELAY)
+            dmix->slave_appl_ptr = dmix->slave_hw_ptr + CHUMBY_RESYNC_DELAY;
+    }
+    #endif
+
 	err = snd_timer_start(dmix->timer);
 	if (err < 0)
 		return err;
diff -Naur alsa-lib-1.0.10/src/pcm/pcm_dmix_arm.c alsa-lib-1.0.10-new/src/pcm/pcm_dmix_arm.c
--- alsa-lib-1.0.10/src/pcm/pcm_dmix_arm.c	1970-01-01 00:00:00.000000000 +0000
+++ alsa-lib-1.0.10-new/src/pcm/pcm_dmix_arm.c	2008-02-23 18:36:50.000000000 +0000
@@ -0,0 +1,22 @@
+/*
+ * optimized mixing code for i386
+ */
+
+#define MIX_AREAS1 mix_areas1
+#define MIX_AREAS1_MMX mix_areas1_mmx
+#define MIX_AREAS2 mix_areas2
+#define LOCK_PREFIX ""
+#include "pcm_dmix_arm.h"
+#undef MIX_AREAS1
+#undef MIX_AREAS1_MMX
+#undef MIX_AREAS2
+#undef LOCK_PREFIX
+
+static unsigned long long dmix_supported_format =
+	(1ULL << SND_PCM_FORMAT_S16_LE) | (1ULL << SND_PCM_FORMAT_S32_LE);
+
+static void mix_select_callbacks(snd_pcm_direct_t *dmix)
+{
+	dmix->u.dmix.mix_areas1 = mix_areas1;
+	dmix->u.dmix.mix_areas2 = mix_areas2;
+}
diff -Naur alsa-lib-1.0.10/src/pcm/pcm_dmix_arm.h alsa-lib-1.0.10-new/src/pcm/pcm_dmix_arm.h
--- alsa-lib-1.0.10/src/pcm/pcm_dmix_arm.h	1970-01-01 00:00:00.000000000 +0000
+++ alsa-lib-1.0.10-new/src/pcm/pcm_dmix_arm.h	2008-02-23 18:36:50.000000000 +0000
@@ -0,0 +1,118 @@
+/**
+ * \file pcm/pcm_dmix_arm.h
+ * \ingroup PCM_Plugins
+ * \brief PCM Direct Stream Mixing (dmix) Plugin Interface - ARM assembler code
+ * \author Greg Hutchins <ghutchins@gmail.com>
+ * \date 2007
+ */
+/*
+ *  PCM - Direct Stream Mixing
+ *  Copyright (c) 2007 by Greg Hutchins <ghutchins@gmail.com>
+ *
+ *
+ *   This library is free software; you can redistribute it and/or modify
+ *   it under the terms of the GNU Lesser General Public License as
+ *   published by the Free Software Foundation; either version 2.1 of
+ *   the License, or (at your option) any later version.
+ *
+ *   This program is distributed in the hope that it will be useful,
+ *   but WITHOUT ANY WARRANTY; without even the implied warranty of
+ *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ *   GNU Lesser General Public License for more details.
+ *
+ *   You should have received a copy of the GNU Lesser General Public
+ *   License along with this library; if not, write to the Free Software
+ *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
+ *
+ */
+
+/*
+ *  for plain ARM
+ */
+static void MIX_AREAS1(unsigned int size,
+		       volatile signed short *dst, signed short *src,
+		       volatile signed int *sum, size_t dst_step,
+		       size_t src_step, size_t sum_step)
+{
+    int _7fff =  0x7FFF;
+
+    /*
+     *  R0  - size
+     *  R1  - dst
+     *  R2  - src
+     *  R3  - sum
+     */
+    __asm__ (
+        "  ldr    r9, %4\n"             /* r9 = dst_step */
+        "  ldr    r8, %5\n"             /* r8 = src_step */
+        "  ldr    r7, %6\n"             /* r7 = sum_step */
+        "  ldr    r6, %7\n"             /* r6 = _7fff */
+        "1:ldr    lr, [%3]\n"           /* old_sample = *sum */
+        "  ldrh   ip, [%1]\n"           /* ip = *dst */
+        "  cmp    ip, #0\n"             /* *dst == 0? */
+        "  ldrsh  r4, [%2], +r8\n"      /* sample = *src; src += src_step */
+        "  rsbeq  r4, lr, r4\n"         /* yes, sample -= *sum */
+        "  add    lr, r4, lr\n"         /* ARCH_ADD(sum, sample) */
+        "  str    lr, [%3], +r7\n"      /* *sum += sample; sum += sum_step */
+        "  mov    r5, lr, asr #15\n"    /* sample = saturate16(sample) */
+        "  teq    r5, lr, asr #31\n"
+        "  eorne  lr, r6, lr, asr #31\n"
+        "  subs   %0, %0, #1\n"         /* --size */
+        "  strh   lr, [%1], +r9\n"      /* *dst = sample; dst += dst_step */
+        "  bne    1b\n"                 /* if size != 0 branch 1b for more */
+
+        : /* no output regs */
+        : "r" (size), "r" (dst), "r" (src), "r" (sum), 
+          "m" (dst_step), "m" (src_step), "m" (sum_step), "m" (_7fff)
+        : "r4", "r5", "r6", "r7", "r8", "r9", "lr"
+    );
+}
+
+
+/*
+ *  for plain ARM, 32-bit version (24-bit resolution)
+ */
+static void MIX_AREAS2(unsigned int size,
+		       volatile signed int *dst, signed int *src,
+		       volatile signed int *sum, size_t dst_step,
+		       size_t src_step, size_t sum_step)
+{
+    int _7fffff =  0x7FFFFF;
+    int _800000 = -0x800000;
+
+    /*
+     *  R0  - size
+     *  R1  - dst
+     *  R2  - src
+     *  R3  - sum
+     */
+    __asm__ (
+        "  ldr    r9, %4\n"             /* r9 = dst_step */
+        "  ldr    r8, %5\n"             /* r8 = src_step */
+        "  ldr    r7, %6\n"             /* r7 = sum_step */
+        "  ldr    r6, %7\n"             /* r6 = _7fffff */
+        "  ldr    r5, %8\n"             /* r5 = _800000 */
+        "1:ldr    lr, [%3]\n"           /* old_sample = *sum */
+        "  ldr    ip, [%1]\n"           /* ip = *dst */
+        "  ldr    r4, [%2], +r8\n"      /* sample = *src; src += src_step */
+        "  mov    r4, r4, asr #8\n"     /* sample = *src / 256 */
+        "  cmp    ip, #0\n"             /* *dst == 0? */
+        "  rsbeq  r4, lr, r4\n"         /* yes, sample -= old_sample */
+        "  add    lr, r4, lr\n"         /* ARCH_ADD(sum, sample) */
+        "  str    lr, [%3], +r7\n"      /* *sum += sample; sum += sum_step */
+        "  cmp    lr, r6\n"             /* old_sample > 0x7fffff? */
+        "  movge  lr, r6\n"             /* yes, sample = 0x7fffff */
+        "  cmp    lr, r5\n"             /* old_sample < -0x800000? */
+        "  movlt  lr, r5\n"             /* yes, sample = -0x800000 */
+        "  subs   %0, %0, #1\n"         /* --size */
+        "  mov    lr, lr, lsl #8\n"     /* sample *= 256 */
+        "  str    lr, [%1], +r9\n"      /* *dst = sample; dst += dst_step */
+        "  bne    1b\n"                 /* if size != 0 branch 1b for more */
+
+        : /* no output regs */
+        : "r" (size), "r" (dst), "r" (src), "r" (sum), 
+          "m" (dst_step), "m" (src_step), "m" (sum_step),
+          "m" (_7fffff), "m" (_800000)
+        : "r4", "r5", "r6", "r7", "r8", "r9", "lr"
+    );
+}
