At Mon, 27 Jul 2009 16:43:05 +0900, Kuninori Morimoto wrote: > > > Dear Takashi > > Thank you for your comment > > > > when 1st buffer was send, > > > driver stop. > > > 2nd trigger function isn't called. > > > > Check the raw value returned from the pointer callback, too. > > This can be the real cause. > > I might have been doing a very big misunderstanding. > > > The pointer callback is supposed to give the currently played position > > offset in a ring buffer, and ranged from 0 to buffer_size-1. > > Does this "ring buffer" mean > I should transmit runtime->dma_area many times > from offset 0x0 ?? Yes and no. A ring buffer may contain multiple "periods" (or "fragments") in it. In your case, a ring buffer has 4 periods. Until these 4 periods are sent out, the offset goes incrementally. Once it reaches to buffer_size, it returns to zero again. > => when I call 4th elapsed, > should I send runtime->dma_area + 0x0 again ? Yes. > If so, > my driver get STOP on trigger funtion many times > even if I didn't stop it. > > START > STOP > underrun!!! > START > STOP > underrun!!! > ... > > Does this correct operation ? Yes, because the PCM core thinks a buffer underrun happens, judging from the pointer callback value your driver returned. That's why I asked many times to check the values returned from the pointer callback. This value and the timing of snd_pcm_period_elapsed() is the only information the PCM core checks. Takashi _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel