mirror of
https://github.com/alsa-project/alsa-lib.git
synced 2025-10-29 05:40:25 -04:00
Some fixes
This commit is contained in:
parent
03f9565ef8
commit
8fb9fab748
1 changed files with 21 additions and 13 deletions
|
|
@ -88,12 +88,14 @@ static void snd_pcm_share_interrupt(snd_pcm_share_slave_t *slave)
|
||||||
else {
|
else {
|
||||||
if (pcm->mode & SND_PCM_ASYNC)
|
if (pcm->mode & SND_PCM_ASYNC)
|
||||||
kill(share->async_pid, share->async_sig);
|
kill(share->async_pid, share->async_sig);
|
||||||
|
share->hw_ptr = *slave->pcm->hw_ptr;
|
||||||
ready = 0;
|
ready = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case SND_PCM_STATE_RUNNING:
|
case SND_PCM_STATE_RUNNING:
|
||||||
if (pcm->mode & SND_PCM_ASYNC)
|
if (pcm->mode & SND_PCM_ASYNC)
|
||||||
kill(share->async_pid, share->async_sig);
|
kill(share->async_pid, share->async_sig);
|
||||||
|
share->hw_ptr = *slave->pcm->hw_ptr;
|
||||||
ready = (snd_pcm_mmap_avail(pcm) >= pcm->setup.avail_min);
|
ready = (snd_pcm_mmap_avail(pcm) >= pcm->setup.avail_min);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
@ -154,6 +156,7 @@ static void snd_pcm_share_stop(snd_pcm_t *pcm, int state)
|
||||||
slave->running_count--;
|
slave->running_count--;
|
||||||
if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
|
if (pcm->stream == SND_PCM_STREAM_CAPTURE) {
|
||||||
snd_pcm_avail_update(slave->pcm);
|
snd_pcm_avail_update(slave->pcm);
|
||||||
|
share->hw_ptr = *slave->pcm->hw_ptr;
|
||||||
snd_pcm_areas_copy(pcm->running_areas, 0,
|
snd_pcm_areas_copy(pcm->running_areas, 0,
|
||||||
pcm->stopped_areas, 0,
|
pcm->stopped_areas, 0,
|
||||||
pcm->setup.format.channels, pcm->setup.buffer_size,
|
pcm->setup.format.channels, pcm->setup.buffer_size,
|
||||||
|
|
@ -189,12 +192,14 @@ static void snd_pcm_share_slave_forward(snd_pcm_share_slave_t *slave)
|
||||||
snd_pcm_t *pcm = share->pcm;
|
snd_pcm_t *pcm = share->pcm;
|
||||||
switch (share->state) {
|
switch (share->state) {
|
||||||
case SND_PCM_STATE_RUNNING:
|
case SND_PCM_STATE_RUNNING:
|
||||||
|
share->hw_ptr = *slave->pcm->hw_ptr;
|
||||||
break;
|
break;
|
||||||
case SND_PCM_STATE_DRAINING:
|
case SND_PCM_STATE_DRAINING:
|
||||||
{
|
{
|
||||||
size_t a, offset;
|
size_t a, offset;
|
||||||
if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
|
if (pcm->stream != SND_PCM_STREAM_PLAYBACK)
|
||||||
continue;
|
continue;
|
||||||
|
share->hw_ptr = *slave->pcm->hw_ptr;
|
||||||
a = snd_pcm_mmap_avail(pcm);
|
a = snd_pcm_mmap_avail(pcm);
|
||||||
frames = a - share->draining_silence;
|
frames = a - share->draining_silence;
|
||||||
offset = snd_pcm_mmap_offset(pcm);
|
offset = snd_pcm_mmap_offset(pcm);
|
||||||
|
|
@ -600,11 +605,11 @@ static ssize_t _snd_pcm_share_mmap_forward(snd_pcm_t *pcm, size_t size)
|
||||||
ret = snd_pcm_rewind(slave->pcm, frames);
|
ret = snd_pcm_rewind(slave->pcm, frames);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
size += ret;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
snd_pcm_mmap_appl_forward(pcm, size);
|
snd_pcm_mmap_appl_forward(pcm, size);
|
||||||
snd_pcm_share_slave_forward(share->slave);
|
if (share->state == SND_PCM_STATE_RUNNING)
|
||||||
|
snd_pcm_share_slave_forward(share->slave);
|
||||||
return size;
|
return size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -650,6 +655,7 @@ static int snd_pcm_share_start(snd_pcm_t *pcm)
|
||||||
share->state = SND_PCM_STATE_RUNNING;
|
share->state = SND_PCM_STATE_RUNNING;
|
||||||
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
|
if (pcm->stream == SND_PCM_STREAM_PLAYBACK) {
|
||||||
size_t hw_avail = snd_pcm_mmap_playback_hw_avail(pcm);
|
size_t hw_avail = snd_pcm_mmap_playback_hw_avail(pcm);
|
||||||
|
size_t xfer = 0;
|
||||||
if (hw_avail == 0) {
|
if (hw_avail == 0) {
|
||||||
err = -EPIPE;
|
err = -EPIPE;
|
||||||
goto _end;
|
goto _end;
|
||||||
|
|
@ -666,11 +672,19 @@ static int snd_pcm_share_start(snd_pcm_t *pcm)
|
||||||
assert(share->hw_ptr == 0);
|
assert(share->hw_ptr == 0);
|
||||||
share->hw_ptr = *slave->pcm->hw_ptr;
|
share->hw_ptr = *slave->pcm->hw_ptr;
|
||||||
share->appl_ptr = *slave->pcm->appl_ptr;
|
share->appl_ptr = *slave->pcm->appl_ptr;
|
||||||
snd_pcm_areas_copy(pcm->stopped_areas, 0,
|
while (xfer < hw_avail) {
|
||||||
pcm->running_areas, snd_pcm_mmap_offset(pcm),
|
size_t frames = hw_avail - xfer;
|
||||||
pcm->setup.format.channels, hw_avail,
|
size_t offset = snd_pcm_mmap_offset(pcm);
|
||||||
pcm->setup.format.sfmt);
|
size_t cont = pcm->setup.buffer_size - offset;
|
||||||
_snd_pcm_share_mmap_forward(pcm, pcm->setup.buffer_size);
|
if (cont < frames)
|
||||||
|
frames = cont;
|
||||||
|
snd_pcm_areas_copy(pcm->stopped_areas, xfer,
|
||||||
|
pcm->running_areas, offset,
|
||||||
|
pcm->setup.format.channels, frames,
|
||||||
|
pcm->setup.format.sfmt);
|
||||||
|
xfer += frames;
|
||||||
|
}
|
||||||
|
_snd_pcm_share_mmap_forward(pcm, hw_avail);
|
||||||
}
|
}
|
||||||
if (slave->running_count == 0) {
|
if (slave->running_count == 0) {
|
||||||
err = snd_pcm_start(slave->pcm);
|
err = snd_pcm_start(slave->pcm);
|
||||||
|
|
@ -895,12 +909,6 @@ static int snd_pcm_share_channels_mask(snd_pcm_t *pcm, bitset_t *cmask)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int snd_pcm_share_poll_descriptor(snd_pcm_t *pcm)
|
|
||||||
{
|
|
||||||
snd_pcm_share_t *share = pcm->private;
|
|
||||||
return share->client_socket;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void snd_pcm_share_dump(snd_pcm_t *pcm, FILE *fp)
|
static void snd_pcm_share_dump(snd_pcm_t *pcm, FILE *fp)
|
||||||
{
|
{
|
||||||
snd_pcm_share_t *share = pcm->private;
|
snd_pcm_share_t *share = pcm->private;
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue