mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-12-16 08:56:42 -05:00
Fixed check_interleave test
This commit is contained in:
parent
8faee9967f
commit
20f261e3fd
1 changed files with 19 additions and 7 deletions
|
|
@ -539,19 +539,25 @@ static int client_discard(snd_pcm_dmix_t *dmix)
|
||||||
* ring buffer operation
|
* 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;
|
unsigned int chn, channels;
|
||||||
int interleaved = 1;
|
int interleaved = 1;
|
||||||
const snd_pcm_channel_area_t *dst_areas;
|
const snd_pcm_channel_area_t *dst_areas;
|
||||||
|
const snd_pcm_channel_area_t *src_areas;
|
||||||
|
|
||||||
channels = dmix->shmptr->s.channels;
|
channels = dmix->shmptr->s.channels;
|
||||||
dst_areas = snd_pcm_mmap_areas(dmix->spcm);
|
dst_areas = snd_pcm_mmap_areas(dmix->spcm);
|
||||||
|
src_areas = snd_pcm_mmap_areas(pcm);
|
||||||
for (chn = 1; chn < channels; chn++) {
|
for (chn = 1; chn < channels; chn++) {
|
||||||
if (dst_areas[chn-1].addr != dst_areas[chn].addr) {
|
if (dst_areas[chn-1].addr != dst_areas[chn].addr) {
|
||||||
interleaved = 0;
|
interleaved = 0;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
if (src_areas[chn-1].addr != src_areas[chn].addr) {
|
||||||
|
interleaved = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
for (chn = 0; chn < channels; chn++) {
|
for (chn = 0; chn < channels; chn++) {
|
||||||
if (dst_areas[chn].first != sizeof(signed short) * chn * 8 ||
|
if (dst_areas[chn].first != sizeof(signed short) * chn * 8 ||
|
||||||
|
|
@ -559,6 +565,11 @@ static int check_interleave(snd_pcm_dmix_t *dmix)
|
||||||
interleaved = 0;
|
interleaved = 0;
|
||||||
break;
|
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;
|
return dmix->interleaved = interleaved;
|
||||||
}
|
}
|
||||||
|
|
@ -630,8 +641,9 @@ static void mix_areas1(unsigned int size,
|
||||||
|
|
||||||
while (size-- > 0) {
|
while (size-- > 0) {
|
||||||
sample = *src;
|
sample = *src;
|
||||||
|
old_sample = *sum;
|
||||||
if (*dst == 0)
|
if (*dst == 0)
|
||||||
sample -= *sum;
|
sample -= old_sample;
|
||||||
*sum += sample;
|
*sum += sample;
|
||||||
do {
|
do {
|
||||||
old_sample = *sum;
|
old_sample = *sum;
|
||||||
|
|
@ -643,9 +655,9 @@ static void mix_areas1(unsigned int size,
|
||||||
sample = old_sample;
|
sample = old_sample;
|
||||||
*dst = sample;
|
*dst = sample;
|
||||||
} while (*sum != old_sample);
|
} while (*sum != old_sample);
|
||||||
((char *)src) += dst_step;
|
((char *)src) += src_step;
|
||||||
((char *)dst) += src_step;
|
((char *)dst) += dst_step;
|
||||||
((char *)sum) += sum_step;
|
((char *)sum) += sum_step;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -671,7 +683,7 @@ static void mix_areas(snd_pcm_dmix_t *dmix,
|
||||||
channels = dmix->shmptr->s.channels;
|
channels = dmix->shmptr->s.channels;
|
||||||
if (dmix->interleaved) {
|
if (dmix->interleaved) {
|
||||||
/*
|
/*
|
||||||
* process the all areas in one loop
|
* process all areas in one loop
|
||||||
* it optimizes the memory accesses for this case
|
* it optimizes the memory accesses for this case
|
||||||
*/
|
*/
|
||||||
dmix->mix_areas1(size * channels,
|
dmix->mix_areas1(size * channels,
|
||||||
|
|
@ -997,6 +1009,7 @@ static int snd_pcm_dmix_prepare(snd_pcm_t *pcm)
|
||||||
{
|
{
|
||||||
snd_pcm_dmix_t *dmix = pcm->private_data;
|
snd_pcm_dmix_t *dmix = pcm->private_data;
|
||||||
|
|
||||||
|
check_interleave(dmix, pcm);
|
||||||
// assert(pcm->boundary == dmix->shmptr->s.boundary); /* for sure */
|
// assert(pcm->boundary == dmix->shmptr->s.boundary); /* for sure */
|
||||||
dmix->state = SND_PCM_STATE_PREPARED;
|
dmix->state = SND_PCM_STATE_PREPARED;
|
||||||
dmix->appl_ptr = 0;
|
dmix->appl_ptr = 0;
|
||||||
|
|
@ -1571,7 +1584,6 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
check_interleave(dmix);
|
|
||||||
mix_select_callbacks(dmix);
|
mix_select_callbacks(dmix);
|
||||||
|
|
||||||
pcm->poll_fd = dmix->poll_fd;
|
pcm->poll_fd = dmix->poll_fd;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue