Update of /cvsroot/alsa/alsa-lib/src/pcm
In directory sc8-pr-cvs1:/tmp/cvs-serv2788
Modified Files:
pcm_dmix.c
Log Message:
Fixed check_interleave test
Index: pcm_dmix.c
===================================================================
RCS file: /cvsroot/alsa/alsa-lib/src/pcm/pcm_dmix.c,v
retrieving revision 1.23
retrieving revision 1.24
diff -u -r1.23 -r1.24
--- pcm_dmix.c 28 Feb 2003 17:23:33 -0000 1.23
+++ pcm_dmix.c 28 Feb 2003 20:32:33 -0000 1.24
@@ -539,19 +539,25 @@
* ring buffer operation
*/
-static int check_interleave(snd_pcm_dmix_t *dmix)
+static int check_interleave(snd_pcm_dmix_t *dmix, snd_pcm_t *pcm)
{
unsigned int chn, channels;
int interleaved = 1;
const snd_pcm_channel_area_t *dst_areas;
+ const snd_pcm_channel_area_t *src_areas;
channels = dmix->shmptr->s.channels;
dst_areas = snd_pcm_mmap_areas(dmix->spcm);
+ src_areas = snd_pcm_mmap_areas(pcm);
for (chn = 1; chn < channels; chn++) {
if (dst_areas[chn-1].addr != dst_areas[chn].addr) {
interleaved = 0;
break;
}
+ if (src_areas[chn-1].addr != src_areas[chn].addr) {
+ interleaved = 0;
+ break;
+ }
}
for (chn = 0; chn < channels; chn++) {
if (dst_areas[chn].first != sizeof(signed short) * chn * 8 ||
@@ -559,6 +565,11 @@
interleaved = 0;
break;
}
+ if (src_areas[chn].first != sizeof(signed short) * chn * 8 ||
+ src_areas[chn].step != channels * sizeof(signed short) * 8) {
+ interleaved = 0;
+ break;
+ }
}
return dmix->interleaved = interleaved;
}
@@ -630,8 +641,9 @@
while (size-- > 0) {
sample = *src;
+ old_sample = *sum;
if (*dst == 0)
- sample -= *sum;
+ sample -= old_sample;
*sum += sample;
do {
old_sample = *sum;
@@ -643,9 +655,9 @@
sample = old_sample;
*dst = sample;
} while (*sum != old_sample);
- ((char *)src) += dst_step;
- ((char *)dst) += src_step;
- ((char *)sum) += sum_step;
+ ((char *)src) += src_step;
+ ((char *)dst) += dst_step;
+ ((char *)sum) += sum_step;
}
}
@@ -671,7 +683,7 @@
channels = dmix->shmptr->s.channels;
if (dmix->interleaved) {
/*
- * process the all areas in one loop
+ * process all areas in one loop
* it optimizes the memory accesses for this case
*/
dmix->mix_areas1(size * channels,
@@ -997,6 +1009,7 @@
{
snd_pcm_dmix_t *dmix = pcm->private_data;
+ check_interleave(dmix, pcm);
// assert(pcm->boundary == dmix->shmptr->s.boundary); /* for sure */
dmix->state = SND_PCM_STATE_PREPARED;
dmix->appl_ptr = 0;
@@ -1571,7 +1584,6 @@
goto _err;
}
- check_interleave(dmix);
mix_select_callbacks(dmix);
pcm->poll_fd = dmix->poll_fd;
-------------------------------------------------------
This sf.net email is sponsored by:ThinkGeek
Welcome to geek heaven.
http://thinkgeek.com/sf
_______________________________________________
Alsa-cvslog mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/alsa-cvslog