[alsa-devel] Question about snd_dma_buffer bytes field
Troy Kisky
troy.kisky at boundarydevices.com
Mon May 25 23:15:44 CEST 2009
Takashi Iwai wrote:
> At Sun, 24 May 2009 19:26:42 -0700,
> Troy Kisky wrote:
>> Does
>>
>> (substream->dma_buffer.bytes) need to equal (snd_pcm_lib_period_bytes(substream) * runtime->periods) ?
>>
>> When this is not true, it seems like the buffer is not being filled correctly.
>>
>>
>> for testing, this works
>> .buffer_bytes_max = 16 * 7 * 512,
>> .period_bytes_min = 32,
>> .period_bytes_max = 7 * 512, /* This is size of ping + pong buffer*/
>>
>> and this doesn't.
>> .buffer_bytes_max = 16 * 7 * 512 + 512,
>> .period_bytes_min = 32,
>> .period_bytes_max = 7 * 512, /* This is size of ping + pong buffer*/
>>
>>
>> When playing back a sine wave, I can hear breaks.
>
> Well, there are two misunderstandings here:
>
> - substream->dma_buffer.bytes doesn't define the actual buffer size.
> It's substream->runtime->buffer_size (in frames). The former is the
> allocated buffer size which can be larger.
>
> - The buffer size doesn't have to be aligned to period_size as default,
> i.e. it's not always equal with period_size * periods, and periods
> isn't always an integer.
>
> To align the buffer size to period size, call below in the open
> callback
> snd_pcm_hw_constraint_integer(runtime, SNDRV_PCM_HW_PARAM_PERIODS);
>
>
> HTH,
>
> Takashi
>
Yes, that fixed my problem.
Thanks you
Troy
More information about the Alsa-devel
mailing list