[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