[alsa-devel] callbacks order while capturing from Line-IN

Manu Abraham abraham.manu at gmail.com
Fri Dec 17 11:20:45 CET 2010

On Fri, Dec 17, 2010 at 1:38 PM, Jaroslav Kysela <perex at perex.cz> wrote:
> On Fri, 17 Dec 2010, Manu Abraham wrote:
>> Thanks, that was very helpful. I am looking at it. I did find an issue
>> looking at the pointer callback itself straight away.
>> The logs do look thus now: http://pastebin.ca/2021872
> This is your problem (first irq_handler):
> saa7231_irq_handler (0): status=0x800 vector=43 event=43 handler:f83b91ff
> saa7231_capture_pointer (0): DEBUG:() Index:0 with frames:0, total 48 pages
> saa7231_capture_trigger (0): Trying to STOP stream, cmd=0
> The pointer should return how many samples are filled (probably value 6144
> in your case). The midlevel code expects that at least one period has been
> recorded, but your pointer() callbacks returned 0 here. It is wrong.
> Ignoring STOP/START is just a bad workaround for the broken driver.

Initially, I had to ignore the CMD's to understand what was happening,
ie why the DMA engine was giving me buffer index:0 and hence I did
ignore the START/STOP CMD's.

I did hardcoded the max frames per buffer to be 6144 (as your guess),
as you can see...

		stride		= 768; /* meaningless in 1D mode */
		buf_size	= 24576; //7680;
		x_length	= 32;// 4 /* max bytes in a line/frame/packet */
//		y_length	= 1920; /* max lines/frames/packets per buffer */
		y_length	= 6144; //1920; /* max lines/frames/packets per buffer */

	SAA7231_WR(x_length, SAA7231_BAR0, module, S2D_CHx_B1_X_LENGTH(0));
	SAA7231_WR(y_length, SAA7231_BAR0, module, S2D_CHx_B1_Y_LENGTH(0));

Initially, I was of the understanding that capture pointer wanted the
start of the buffer and hence started with 0, 6144 and multiples of
Now that you mention it; I modified it to return 6144 frames after
each interrupt.

static snd_pcm_uframes_t saa7231_capture_pointer(struct snd_pcm_substream *pcm)
	struct saa7231_audio *audio	= snd_pcm_substream_chip(pcm);
	struct saa7231_dev *saa7231	= audio->saa7231;
	struct snd_pcm_runtime *rt	= pcm->runtime;
	u32 frames, buf_size;

	buf_size = 24576;
	frames = (buf_size / 4) * (audio->index + 1);
	dprintk(SAA7231_DEBUG, 1, "DEBUG:() Index:%d with frames:%d, total %d
pages", audio->index, frames, audio->pages);
	return frames;

Eventually the arecord overrun error is gone completely

testbox v4l # arecord -D plughw:2,0 --format S16_LE --rate=48000 -c 2
> /tmp/test3.wav
Recording WAVE 'stdin' : Signed 16 bit Little Endian, Rate 48000 Hz, Stereo
^CAborted by signal Interrupt...

Eventually, fixed the capture_trigger

>> Now, I do get a .wav file The contents of which seems to be junk ??
>> Tried to play it back with alsaplayer and mplyer with no results,
>> mplayer shows no issues though.. Maybe PCM corruptions ? But at least
>> some noises it should make  ?
> Try add some printk directly to the driver to show the few recorded samples
> in the DMA buffers.

I did add a few printks, the data seems to be all 0's.


I guess the NULL data is not an Alsa related issue ? Thanks again for
all the help.


More information about the Alsa-devel mailing list