ALSA: asihpi - Improve non-busmaster adapter operation
Make playback silence callback a no-op, card automatically outputs silence when written data runs out. Increasing update interval and thus minimum period avoids xrun on startup or because of timer jitter. Signed-off-by: Eliot Blennerhassett <eblennerhassett@audioscience.com> Signed-off-by: Takashi Iwai <tiwai@suse.de>
This commit is contained in:
parent
7bf76c33e9
commit
26aebef420
|
@ -1012,6 +1012,7 @@ static int snd_card_asihpi_playback_open(struct snd_pcm_substream *substream)
|
||||||
|
|
||||||
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
snd_pcm_hw_constraint_step(runtime, 0, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||||
card->update_interval_frames);
|
card->update_interval_frames);
|
||||||
|
|
||||||
snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
snd_pcm_hw_constraint_minmax(runtime, SNDRV_PCM_HW_PARAM_PERIOD_SIZE,
|
||||||
card->update_interval_frames * 2, UINT_MAX);
|
card->update_interval_frames * 2, UINT_MAX);
|
||||||
|
|
||||||
|
@ -1054,7 +1055,7 @@ static int snd_card_asihpi_playback_copy(struct snd_pcm_substream *substream,
|
||||||
hpi_handle_error(hpi_outstream_write_buf(dpcm->h_stream,
|
hpi_handle_error(hpi_outstream_write_buf(dpcm->h_stream,
|
||||||
runtime->dma_area, len, &dpcm->format));
|
runtime->dma_area, len, &dpcm->format));
|
||||||
|
|
||||||
dpcm->pcm_buf_host_rw_ofs = dpcm->pcm_buf_host_rw_ofs + len;
|
dpcm->pcm_buf_host_rw_ofs += len;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1064,16 +1065,11 @@ static int snd_card_asihpi_playback_silence(struct snd_pcm_substream *
|
||||||
snd_pcm_uframes_t pos,
|
snd_pcm_uframes_t pos,
|
||||||
snd_pcm_uframes_t count)
|
snd_pcm_uframes_t count)
|
||||||
{
|
{
|
||||||
unsigned int len;
|
/* Usually writes silence to DMA buffer, which should be overwritten
|
||||||
struct snd_pcm_runtime *runtime = substream->runtime;
|
by real audio later. Our fifos cannot be overwritten, and are not
|
||||||
struct snd_card_asihpi_pcm *dpcm = runtime->private_data;
|
free-running DMAs. Silence is output on fifo underflow.
|
||||||
|
This callback is still required to allow the copy callback to be used.
|
||||||
len = frames_to_bytes(runtime, count);
|
*/
|
||||||
VPRINTK1(KERN_INFO "playback silence %u bytes\n", len);
|
|
||||||
|
|
||||||
memset(runtime->dma_area, 0, len);
|
|
||||||
hpi_handle_error(hpi_outstream_write_buf(dpcm->h_stream,
|
|
||||||
runtime->dma_area, len, &dpcm->format));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2885,6 +2881,9 @@ static int __devinit snd_asihpi_probe(struct pci_dev *pci_dev,
|
||||||
if (err)
|
if (err)
|
||||||
asihpi->update_interval_frames = 512;
|
asihpi->update_interval_frames = 512;
|
||||||
|
|
||||||
|
if (!asihpi->support_mmap)
|
||||||
|
asihpi->update_interval_frames *= 2;
|
||||||
|
|
||||||
hpi_handle_error(hpi_instream_open(asihpi->adapter_index,
|
hpi_handle_error(hpi_instream_open(asihpi->adapter_index,
|
||||||
0, &h_stream));
|
0, &h_stream));
|
||||||
|
|
||||||
|
|
Reference in New Issue