static snd_pcm_uframes_t audio_get_dma_pos(struct audio_stream *s) { snd_pcm_substream_t *substream = s->stream; snd_pcm_runtime_t *runtime = substream->runtime; unsigned long flags; dma_addr_t count; unsigned long offset; dma_addr_t src,dest; if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { spin_lock_irqsave(&s->dma_lock, flags); dest = omap_get_dma_dst_pos(s->lch[s->dma_q_head]); offset = dest - runtime->dma_addr; spin_unlock_irqrestore(&s->dma_lock, flags); printk("dest is %u and offset is %u\n",dest,offset); } else { spin_lock_irqsave(&s->dma_lock, flags); src = omap_get_dma_src_pos(s->lch[s->dma_q_head]); offset = src - runtime->dma_addr; spin_unlock_irqrestore(&s->dma_lock, flags); printk("src is %u and offset is %u\n",dest,offset); } return bytes_to_frames(substream->runtime, offset); } and the log is as same....still no joy.. First time snd_omap_alsa_pointer start src is 3246792928 and offset is 3296722944 Returning pos = 18874368 Inside snd_pcm_update_hw_ptr_pos, pos is 18874368 ALSA sound/core/pcm_lib.c:167: BUG: stream = 0, pos = 0x1200000, buffer size = 0x4000, period size = 0x800 returning pos 18874368 ....... ....... Second time snd_omap_alsa_pointer start src is 3246792928 and offset is 3296722944 Returning pos = 18874368 Inside snd_pcm_update_hw_ptr_pos, pos is 18874368 ALSA sound/core/pcm_lib.c:167: BUG: stream = 0, pos = 0x1200000, buffer size = 0x4000, period size = 0x800 returning pos 18874368 ...... then it hangs in the omap_request_dma function. On 6/26/07, Pharaoh . <pharaoh137@xxxxxxxxx> wrote: > wait..wait.....I need to use locking here...let me send you log after > doing locking appropriately ..... > > On 6/26/07, Pharaoh . <pharaoh137@xxxxxxxxx> wrote: > > >It would really help if you'd show us the code of the version of the > > >driver that you're currently talking about. > > > > Hi Clemens... > > > > I had sent you the source file having pcm callbacks yesterday, now I > > have modified the pointer function as follows, I am just giving the > > pointer function here to avoid duplication, but please let me know in > > case you want to have look at the entire file. > > > > > > static snd_pcm_uframes_t snd_omap_alsa_pointer(snd_pcm_substream_t > > *substream) > > { > > > > struct omap_eac *chip = snd_pcm_substream_chip(substream); > > snd_pcm_uframes_t pos = 0; > > > > FN_ENTER; > > pos = audio_get_dma_pos(&chip->s[substream->pstr->stream]); > > printk("Returning pos = %d\n", pos); > > return pos; > > FN_EXIT; > > } > > > > static snd_pcm_uframes_t audio_get_dma_pos(struct audio_stream *s) > > { > > snd_pcm_substream_t *substream = s->stream; > > snd_pcm_runtime_t *runtime = substream->runtime; > > unsigned long flags; > > dma_addr_t count; > > unsigned long offset; > > dma_addr_t src,dest; > > > > if (substream->stream == SNDRV_PCM_STREAM_CAPTURE) { > > dest = omap_get_dma_dst_pos(s->lch[s->dma_q_head]); > > offset = dest - runtime->dma_addr; > > printk("dest is %u and offset is %u\n",dest,offset); > > } else { > > src = omap_get_dma_src_pos(s->lch[s->dma_q_head]); > > offset = src - runtime->dma_addr; > > printk("src is %u and offset is %u\n",dest,offset); > > } > > > > return bytes_to_frames(substream->runtime, offset); > > } > > > > > > And the log is as follows. > > > > For the first time. > > > > > > snd_omap_alsa_pointer start > > src is 3246792928 and offset is 3304194048 > > Returning pos = 20742144 > > Inside snd_pcm_update_hw_ptr_pos, pos is 20742144 > > ALSA sound/core/pcm_lib.c:167: BUG: stream = 0, pos = 0x13c8000, > > buffer size = 0x4000, period size = 0x800 > > returning pos 20742144 > > > > I can see things are horribaly wrong here.... > > > > > > On 6/26/07, Clemens Ladisch <cladisch@xxxxxxxxxxxx> wrote: > > > Pharaoh . wrote: > > > > After rewriting the pointer function > > > > > > It would really help if you'd show us the code of the version of the > > > driver that you're currently talking about. > > > > > > > I am not getting the input/output error but I am getting underruns. > > > > ... > > > > ALSA sound/core/pcm_lib.c:167: BUG: stream = 0, pos = 0x1150000, > buffer > > > size = 0x4000, period size = 0x800 > > > > > > Here, "pos" is the value returned by your pointer callback. This value > > > should have been a frame number somewhere in the buffer, i.e., in the > > > range 0..0x3fff. Apparently, the pointer callback doesn't correctly > > > calculate this value. > > > > > > Please remove most printk()s, and add some in the pointer callback to > > > show both the value that you get from the DMA controller, and the value > > > that this function returns. > > > > > > > > > Regards, > > > Clemens > > > > > > _______________________________________________ Alsa-devel mailing list Alsa-devel@xxxxxxxxxxxxxxxx http://mailman.alsa-project.org/mailman/listinfo/alsa-devel