From: Adrian McMenamin <adrian@mcmen.demon.co.uk>
To: James Courtier-Dutton <James@superbug.co.uk>,
Lee Revell <rlrevell@joe-job.com>,
Alsa-devel <alsa-devel@lists.sourceforge.net>
Subject: Re: pointer callback in pcm
Date: Sat, 11 Mar 2006 11:27:32 +0000 [thread overview]
Message-ID: <1142076452.9496.8.camel@localhost.localdomain> (raw)
In-Reply-To: <4412B17F.7080200@superbug.co.uk>
On Sat, 2006-03-11 at 11:16 +0000, James Courtier-Dutton wrote:
> Adrian,
>
> Here is a quick summary of what I think you have been saying.
> 1) Your hardware has min and max periods set to 8.
> 2) Your hardware can do DMA, but not periodic DMA. <- This is really
> the crux of the problem.
> 3) You wish to use DMA.
I really need to because transfers between the sound memory and the main
memory are very slow otherwise. When I wrote the OSS driver for this a
few years ago I simply copied stuff over, but it would effectively lock
the machine up at high sample rates.
> 4) Unknown: What triggers the audio interrupt? It should be triggered
> once each period is completed.
This is done by the ARM7 spu that controls the sound output. I write the
"firmware" for that so I have written some code that puts an IRQ on the
SH4 (main CPU) bus every time a period has been played out.
>
> Now, here is what the ALSA model assumes:
> 1) hardware period sizes are exactly the same size as the memory mapped
> DMA pages.
I wasn't aware of that but I think I've done that anyway (4k period
size)
> 2) snd_period_ellapsed() is called at periodic intervals dependent on
> where the ADC is playing samples.
> 3) If the copy callback is NULL, ALSA assumes the DMA has already completed.
> 4) If the copy callback is not NULL, ALSA calls it, but when the copy
> callback returns, the copy has been completed.
I haven't got a copy callback - should I write one?
> 5) The pointer callback is then called that should return the position
> of the ADC in frames (not bytes) within the audio buffer.
>
> So, if you wish to use DMA, you should be calling snd_period_ellapsed()
> only after the DMA has completed, alternatively, the copy() callback
> should only return after the DMA transaction has completed, but I don't
> know if delaying the copy() return is allowed.
> Can you get it to interrupt on each DMA completion?
>
In theory yes, but nobody seems have managed to reverse that bit of the
spu function effectively yet, so I'd have to use polling on the progress
of the transfer.
> I would recommend you trying to do the following:
> 1) Discover when the ADC has played the entire period.
> 2) start the DMA transfer.
> 3) At the DMA transfer complete interrrupt, call period_ellapsed().
>
> So, the problem might be how to discover that the ADC has played the
> entire period.
I've got that covered (see above).
How do I start? I am copying over 8 periods via DMA on the trigger, is
that ok? (These are all I ever hear getting played). What about the ack
callback that was recommended to me yesterday?
> You might have to use some sort of timer based polling to discover this.
>
> James
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
next prev parent reply other threads:[~2006-03-11 11:27 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-09 22:21 pointer callback in pcm Adrian McMenamin
2006-03-10 0:53 ` Lee Revell
2006-03-10 19:51 ` Adrian McMenamin
2006-03-10 20:16 ` Takashi Iwai
2006-03-10 20:21 ` Adrian McMenamin
2006-03-10 20:23 ` Lee Revell
2006-03-11 11:16 ` James Courtier-Dutton
2006-03-11 11:27 ` Adrian McMenamin [this message]
2006-03-11 15:42 ` James Courtier-Dutton
2006-03-11 15:53 ` Adrian McMenamin
2006-03-11 17:30 ` Adrian McMenamin
2006-03-11 18:47 ` James Courtier-Dutton
2006-03-11 19:08 ` Adrian McMenamin
2006-03-11 19:15 ` James Courtier-Dutton
2006-03-11 19:18 ` Adrian McMenamin
2006-03-11 19:37 ` James Courtier-Dutton
2006-03-11 19:55 ` Adrian McMenamin
2006-03-11 19:26 ` Adrian McMenamin
2006-03-11 19:35 ` James Courtier-Dutton
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1142076452.9496.8.camel@localhost.localdomain \
--to=adrian@mcmen.demon.co.uk \
--cc=James@superbug.co.uk \
--cc=alsa-devel@lists.sourceforge.net \
--cc=rlrevell@joe-job.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.