diff --git a/src/s_audio_pa.c b/src/s_audio_pa.c
index 66618d46dd4bbe84e05e51aaceff70b1b9a62adf..de5fe711b46e8f836a33d710529507b5d6af810f 100644
--- a/src/s_audio_pa.c
+++ b/src/s_audio_pa.c
@@ -13,9 +13,12 @@
 #include <stdlib.h>
 #include <portaudio.h>
 #include "s_audio_pablio.h"
+#ifdef MSW
+#include <malloc.h>
+#else
+#include <alloca.h>
+#endif
 
-#define MAX_PA_CHANS 32
-#define MAX_SAMPLES_PER_FRAME (MAX_PA_CHANS * DEFDACBLKSIZE)
     /* LATER try to figure out how to handle default devices in portaudio;
     the way s_audio.c handles them isn't going to work here. */
 
@@ -196,16 +199,6 @@ int pa_open_audio(int inchans, int outchans, int rate, t_sample *soundin,
     /* fprintf(stderr, "open callback %d\n", (callbackfn != 0)); */
     pa_init();
     /* post("in %d out %d rate %d device %d", inchans, outchans, rate, deviceno); */
-    if (inchans > MAX_PA_CHANS)
-    {
-        post("input channels reduced to maximum %d", MAX_PA_CHANS);
-        inchans = MAX_PA_CHANS;
-    }
-    if (outchans > MAX_PA_CHANS)
-    {
-        post("output channels reduced to maximum %d", MAX_PA_CHANS);
-        outchans = MAX_PA_CHANS;
-    }
     
     if (inchans > 0)
     {
@@ -288,10 +281,15 @@ void pa_close_audio( void)
 
 int pa_send_dacs(void)
 {
-    float samples[MAX_SAMPLES_PER_FRAME], *fp1, *fp2;
+    unsigned int framesize = (sizeof(float) * DEFDACBLKSIZE) *
+        (pa_inchans > pa_outchans ? pa_inchans:pa_outchans);
+    float *samples, *fp1, *fp2;
     int i, j;
     double timebefore;
     
+    
+    samples = alloca(framesize);
+    
     timebefore = sys_getrealtime();
     if ((pa_inchans && GetAudioStreamReadable(pa_stream) < DEFDACBLKSIZE) ||
         (pa_outchans && GetAudioStreamWriteable(pa_stream) < DEFDACBLKSIZE))