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