mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-31 22:25:35 -04:00
Fix direct plugins running on 32bit emulation with 64bit arch
Fix the problems of dmix/dsnoop/dshare plugins running on 32bit mode with 64bit biarch.
This commit is contained in:
parent
99005614ba
commit
e80f80866f
5 changed files with 147 additions and 108 deletions
|
|
@ -238,8 +238,8 @@ static void mix_areas(snd_pcm_direct_t *dmix,
|
|||
static void snd_pcm_dmix_sync_area(snd_pcm_t *pcm)
|
||||
{
|
||||
snd_pcm_direct_t *dmix = pcm->private_data;
|
||||
snd_pcm_uframes_t appl_ptr, slave_appl_ptr, slave_bsize;
|
||||
snd_pcm_uframes_t size, slave_size, slave_hw_ptr;
|
||||
snd_pcm_uframes_t slave_hw_ptr, slave_appl_ptr, slave_size;
|
||||
snd_pcm_uframes_t appl_ptr, size;
|
||||
const snd_pcm_channel_area_t *src_areas, *dst_areas;
|
||||
|
||||
/* calculate the size to transfer */
|
||||
|
|
@ -253,17 +253,16 @@ static void snd_pcm_dmix_sync_area(snd_pcm_t *pcm)
|
|||
size = pcm->boundary - size;
|
||||
|
||||
/* check the available size in the slave PCM buffer */
|
||||
slave_bsize = dmix->shmptr->s.buffer_size;
|
||||
slave_hw_ptr = dmix->slave_hw_ptr;
|
||||
/* don't write on the last active period - this area may be cleared
|
||||
* by the driver during mix operation...
|
||||
*/
|
||||
slave_hw_ptr -= slave_hw_ptr % dmix->shmptr->s.period_size;
|
||||
slave_hw_ptr += slave_bsize;
|
||||
if (slave_hw_ptr >= dmix->shmptr->s.boundary)
|
||||
slave_hw_ptr -= dmix->shmptr->s.boundary;
|
||||
slave_hw_ptr -= slave_hw_ptr % dmix->slave_period_size;
|
||||
slave_hw_ptr += dmix->slave_buffer_size;
|
||||
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->shmptr->s.boundary - 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;
|
||||
if (slave_size < size)
|
||||
|
|
@ -277,22 +276,22 @@ static void snd_pcm_dmix_sync_area(snd_pcm_t *pcm)
|
|||
appl_ptr = dmix->last_appl_ptr % pcm->buffer_size;
|
||||
dmix->last_appl_ptr += size;
|
||||
dmix->last_appl_ptr %= pcm->boundary;
|
||||
slave_appl_ptr = dmix->slave_appl_ptr % slave_bsize;
|
||||
slave_appl_ptr = dmix->slave_appl_ptr % dmix->slave_buffer_size;
|
||||
dmix->slave_appl_ptr += size;
|
||||
dmix->slave_appl_ptr %= dmix->shmptr->s.boundary;
|
||||
dmix->slave_appl_ptr %= dmix->slave_boundary;
|
||||
dmix_down_sem(dmix);
|
||||
for (;;) {
|
||||
snd_pcm_uframes_t transfer = size;
|
||||
if (appl_ptr + transfer > pcm->buffer_size)
|
||||
transfer = pcm->buffer_size - appl_ptr;
|
||||
if (slave_appl_ptr + transfer > slave_bsize)
|
||||
transfer = slave_bsize - slave_appl_ptr;
|
||||
if (slave_appl_ptr + transfer > dmix->slave_buffer_size)
|
||||
transfer = dmix->slave_buffer_size - slave_appl_ptr;
|
||||
mix_areas(dmix, src_areas, dst_areas, appl_ptr, slave_appl_ptr, transfer);
|
||||
size -= transfer;
|
||||
if (! size)
|
||||
break;
|
||||
slave_appl_ptr += transfer;
|
||||
slave_appl_ptr %= slave_bsize;
|
||||
slave_appl_ptr %= dmix->slave_buffer_size;
|
||||
appl_ptr += transfer;
|
||||
appl_ptr %= pcm->buffer_size;
|
||||
}
|
||||
|
|
@ -327,7 +326,7 @@ static int snd_pcm_dmix_sync_ptr(snd_pcm_t *pcm)
|
|||
/* not really started yet - don't update hw_ptr */
|
||||
return 0;
|
||||
if (diff < 0) {
|
||||
slave_hw_ptr += dmix->shmptr->s.boundary;
|
||||
slave_hw_ptr += dmix->slave_boundary;
|
||||
diff = slave_hw_ptr - old_slave_hw_ptr;
|
||||
}
|
||||
dmix->hw_ptr += diff;
|
||||
|
|
@ -451,7 +450,6 @@ static int snd_pcm_dmix_prepare(snd_pcm_t *pcm)
|
|||
snd_pcm_direct_t *dmix = pcm->private_data;
|
||||
|
||||
snd_pcm_direct_check_interleave(dmix, pcm);
|
||||
// assert(pcm->boundary == dmix->shmptr->s.boundary); /* for sure */
|
||||
dmix->state = SND_PCM_STATE_PREPARED;
|
||||
dmix->appl_ptr = dmix->last_appl_ptr = 0;
|
||||
dmix->hw_ptr = 0;
|
||||
|
|
@ -861,25 +859,9 @@ int snd_pcm_dmix_open(snd_pcm_t **pcmp, const char *name,
|
|||
}
|
||||
|
||||
snd_pcm_direct_semaphore_down(dmix, DIRECT_IPC_SEM_CLIENT);
|
||||
ret = snd_pcm_hw_open_fd(&spcm, "dmix_client", dmix->hw_fd, 0, 0);
|
||||
if (ret < 0) {
|
||||
SNDERR("unable to open hardware");
|
||||
ret = snd_pcm_direct_open_secondary_client(&spcm, dmix, "dmix_client");
|
||||
if (ret < 0)
|
||||
goto _err;
|
||||
}
|
||||
|
||||
spcm->donot_close = 1;
|
||||
spcm->setup = 1;
|
||||
spcm->buffer_size = dmix->shmptr->s.buffer_size;
|
||||
spcm->sample_bits = dmix->shmptr->s.sample_bits;
|
||||
spcm->channels = dmix->shmptr->s.channels;
|
||||
spcm->format = dmix->shmptr->s.format;
|
||||
spcm->boundary = dmix->shmptr->s.boundary;
|
||||
spcm->info = dmix->shmptr->s.info;
|
||||
ret = snd_pcm_mmap(spcm);
|
||||
if (ret < 0) {
|
||||
SNDERR("unable to mmap channels");
|
||||
goto _err;
|
||||
}
|
||||
dmix->spcm = spcm;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue