[alsa-devel] then there was "overrun" occue every time once trigger the audio recording
Zhen Fu
fuzh at marvell.com
Fri Jul 6 09:51:27 CEST 2012
Ok, I got it.
I use marvell pxa2128 chip include ZSP core that connection codec, my aim to let zsp complete independence alsa work.
When ALSA send AUDIO_STREAM_CMDID_TRIGGER command to ZSP, ZSP firmware do config something and then send AUDIO_STREAM_CMDID_DATARXTXREQ command to ALSA, then the ALSA send write/read pointer to ZSP, the ZSP through write/read pointer to fetch/transfer data, after process the ZSP send AUDIO_STREAM_CMDID_DATARXTX command to ALSA, then the ALSA change write/read pointer. My driver code below:
static snd_pcm_uframes_t
mmp_zsp_pcm_pointer(struct snd_pcm_substream *substream)
{
struct snd_pcm_runtime *runtime = substream->runtime;
struct pxa910_runtime_data *prtd = runtime->private_data;
snd_pcm_uframes_t x;
x = prtd->zsp_buf.zsp_offset;
x = bytes_to_frames(runtime, x);
if (x == prtd->zsp_buf.buf_len/4)
x = 0;
return x;
}
static void zsp_msg_handler(struct work_struct *work) {
......
.....
case AUDIO_STREAM_CMDID_DATARXTXREQ:
p_zsp_req = (cmd_audio_stream_datarxtxreq_t *)\
&zsp_data_received;
len1 = get_zsp_buf_avail(&prtd->zsp_buf);
len2 = get_fw_avail(p_zsp_req, substream->stream);
len3 = get_buf_avail(&prtd->zsp_buf, substream->stream);
tsize = ((len1 < len2) ? len1 : len2);
if ((tsize == len1) && (len1 == len3) && (tsize >= \
2 * prtd->zsp_buf.zsp_period_bytes)) {
tsize -= prtd->zsp_buf.zsp_period_bytes;
}
cmd_strm_tx.command_id = AUDIO_STREAM_CMDID_DATARXTX;
cmd_strm_tx.stream_id = prtd->stream_id;
cmd_strm_tx.addr = prtd->zsp_buf.buf_phys + \
prtd->zsp_buf.zsp_offset;
cmd_strm_tx.size = tsize;
kzmq_write(prtd->zmq_deliver, (void *)&cmd_strm_tx,
sizeof(cmd_audio_stream_datarxtx_t));
if ((prtd->zsp_buf.zsp_offset + tsize) >= \
(prtd->zsp_buf.buf_len))
prtd->zsp_buf.zsp_offset = 0;
else
prtd->zsp_buf.zsp_offset += \
tsize;
break;
case AUDIO_STREAM_CMDID_DATARXTX:
snd_pcm_period_elapsed(substream);
break;
}
When I use arecord command occue "overrun", I don't know I explain problem clear or not. Thanks a lot.
--
Best Regards,
Zhen Fu
-----Original Message-----
From: alsa-devel-bounces at alsa-project.org [mailto:alsa-devel-bounces at alsa-project.org] On Behalf Of Clemens Ladisch
Sent: Friday, July 06, 2012 3:17 PM
To: alsa-devel at alsa-project.org
Subject: Re: [alsa-devel] then there was "overrun" occue every time once trigger the audio recording
(please configure your mailer to wrap lines)
Zhen Fu wrote:
> When I use arecord command, then there was "overrun" occue every time
> once trigger the audio recording. I have no clue of alsa driver when
> and how handler xrun. In other words, how to understand function
> snd_pcm_update_hw_ptr0 in pcm_lib.c.
It behaves pretty much the same for playback and capture, so I refer
the honourable gentleman to the reply I gave some moments ago.
If you want a more specific answer, it might be a good idea not to
keep the hardware and your driver source code a secret.
Regards,
Clemens
_______________________________________________
Alsa-devel mailing list
Alsa-devel at alsa-project.org
http://mailman.alsa-project.org/mailman/listinfo/alsa-devel
More information about the Alsa-devel
mailing list