[alsa-devel] Application hangs with different period sizes

anuj aggarwal anuj.aggarwal at gmail.com
Thu Aug 7 12:18:49 CEST 2008


Hi,

Regarding the below mentioned problem, we added some debugging in ALSA layer
and our audio codec driver to understand the problem.  And I think, we
understand the root cause of the issue.
Whenever we call *snd_pcm_writei* function from application, it executes
kernel function *snd_pcm_lib_write1* from sound/core/pcm_lib.c. This
function copies the user buffer and updates some alsa  variables
and trigger the DMA ( if alsa is in PREPARED state).  And same thing is
done in snd_pcm_readi() function call.

In case of DMA transfer, the DMA callback will update the hw_ptr depending
on the number of bytes xfered. So now two functions are updating the hw_ptr
(DMA callback and write/read function) and this is the problem. Only DMA
callback should update the hw_ptr because DMA is the one who is doing the
real transfer, not  the write/read function. Read and write function should
only update the appl_ptr and leave the hw_ptr for DMA callback.

After applying the below patch, my application works fine. Can someone look
into the patch provided below and confirm our understanding?

diff -uNr lsp_0.9.7_old/sound/core/pcm_lib.c
lsp_0.9.7_new/sound/core/pcm_lib.c
--- lsp_0.9.7_old/sound/core/pcm_lib.c  2007-11-26 07:57:25.000000000 -0600
+++ lsp_0.9.7_new/sound/core/pcm_lib.c  2008-07-10 23:16:19.000000000 -0500
@@ -1648,8 +1648,6 @@
                snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
                snd_pcm_uframes_t avail;
                snd_pcm_uframes_t cont;
-               if (runtime->sleep_min == 0 && runtime->status->state ==
SNDRV_PCM_STATE_RUNNING)
-                       snd_pcm_update_hw_ptr(substream);
                avail = snd_pcm_playback_avail(runtime);
                if (((avail < runtime->control->avail_min && size > avail)
||
                   (size >= runtime->xfer_align && avail <
runtime->xfer_align))) {
@@ -1924,8 +1922,6 @@
                snd_pcm_uframes_t frames, appl_ptr, appl_ofs;
                snd_pcm_uframes_t avail;
                snd_pcm_uframes_t cont;
-               if (runtime->sleep_min == 0 && runtime->status->state ==
SNDRV_PCM_STATE_RUNNING)
-                       snd_pcm_update_hw_ptr(substream);
              __draining:
                avail = snd_pcm_capture_avail(runtime);
                if (runtime->status->state == SNDRV_PCM_STATE_DRAINING) {

Please provide your comments.

Regards,
Anuj


On Thu, Jul 3, 2008 at 9:01 PM, Gustavo da Silva Serra <
gustavo.serra at tet.com.br> wrote:

> Sorry, I didn't read the log.
>
> I don't know where you can find this limitation, the only thing I know is
> that a specific model of Audigy, for example, seems to support only two
> periods.
> Can't you just use 1024 or 512? I don't know why the application crashes,
> it is something that is beyond my knowledge, sorry.
>
>
> anuj aggarwal escreveu:
>
>> I think the library/driver is able to configure the way user has
>> requested. See the logs (in my first mail) which confirm that the requested
>> period size has been taken for configuration.
>>
>> Where can I found the limitation in the driver code/spec which says that
>> these period sizes are not supported? Any suggestion is most welcome...
>>
>> Thanks,
>> Anuj
>>
>> On Thu, Jul 3, 2008 at 6:30 PM, Gustavo da Silva Serra <
>> gustavo.serra at tet.com.br <mailto:gustavo.serra at tet.com.br>> wrote:
>>
>>    I think that snd_pcm_hw_params_set_period_size_near() will not
>>    return an error, but you must check the "val" parameter, is it
>>    returning the same value that you passed?
>>
>>    "Some periods are not supported" means that some cards may not
>>    support periods that aren't power of two. I am not sure, since I
>>    am new to ALSA and I am working most with aloop.
>>
>>    anuj aggarwal escreveu:
>>
>>        I am doing the same. I used
>>        snd_pcm_hw_params_set_period_size_near() to set the period
>>        size and checked the return value also; it was not an error.
>>
>>        I have one more question. When you say 'Some periods are not
>>        supported', what does that mean? What are the constraints
>>        which make some periods not-supported by the audio codec driver?
>>
>>        On Thu, Jul 3, 2008 at 5:11 PM, Gustavo da Silva Serra
>>        <gustavo.serra at tet.com.br <mailto:gustavo.serra at tet.com.br>
>>        <mailto:gustavo.serra at tet.com.br
>>        <mailto:gustavo.serra at tet.com.br>>> wrote:
>>
>>           Do you check the result of the function that sets the
>>        period size?
>>           Some periods are not supported and you can't assume that
>>        they are
>>           valid and proceed in your application. Use
>>           snd_pcm_hw_params_set_period_time_near to see what is the
>>        nearest
>>           possible value for period.
>>                 <
>> http://www.alsa-project.org/alsa-doc/alsa-lib/group___p_c_m___h_w___params.html#gf5e53bcb748185a4da3b8538720a5792
>> >
>>
>>           anuj aggarwal escreveu:
>>
>>               My audio driver supports buffer sizes from 128 to 32768 and
>>               period sizes
>>               from 8 to 2048. I am trying to set the period size as 1030
>>               (just a random
>>               number between 8 & 2048, but not multiple of 2^n) and
>>        buffer
>>               size as
>>               16*buffer_size (i.e. 16480). The output is as follows:
>>
>>               Buffer size range from 128 to 32768
>>               Period size range from 8 to 2048
>>               Request period size 1030 and got 1030
>>               Plug PCM: Hardware PCM card 0 'TWL4030' device 0
>>        subdevice 0
>>               Its setup is:
>>                stream       : PLAYBACK
>>                access       : RW_INTERLEAVED
>>                format       : S16_LE
>>                subformat    : STD
>>                channels     : 2
>>                rate         : 44100
>>                exact rate   : 44100 (44100/1)
>>                msbits       : 16
>>                buffer_size  : 16480
>>                period_size  : 1030
>>                period_time  : 23356
>>                tstamp_mode  : NONE
>>                period_step  : 1
>>                avail_min    : 1030
>>                start_threshold  : 16480
>>                stop_threshold   : 16480
>>                silence_threshold: 0
>>                silence_size : 0
>>                boundary     : 1080033280
>>
>>               The problem with this setup is the application just hangs
>>               without playing
>>               anything. If I use period size as 2048, the app plays
>>        the song
>>               but clips the
>>               last part of it. If I use 1024/512, it works fine.
>>
>>               I have tried alsa lib version 1.0.15 & 1.0.16 but the
>>        problem
>>               persists. Is
>>               there anything wrong with my app or audio driver?
>>
>>               Please help.
>>
>>               Thanks in advance,
>>               Anuj Aggarwal
>>               _______________________________________________
>>               Alsa-devel mailing list
>>               Alsa-devel at alsa-project.org
>>        <mailto:Alsa-devel at alsa-project.org>
>>        <mailto:Alsa-devel at alsa-project.org
>>        <mailto:Alsa-devel at alsa-project.org>>
>>
>>               http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
>>
>>               __________ NOD32 3238 (20080703) Information __________
>>
>>               This message was checked by NOD32 antivirus system.
>>               http://www.eset.com
>>
>>
>>
>>
>>
>>
>>
>>        --        Best Regards,
>>        Anuj Aggarwal
>>
>>
>>
>>
>>
>> --
>> Best Regards,
>> Anuj Aggarwal
>>
>
>


-- 
Best Regards,
Anuj Aggarwal


More information about the Alsa-devel mailing list