diff options
author | cinap_lenrek <cinap_lenrek@localhost> | 2011-07-03 03:42:37 +0200 |
---|---|---|
committer | cinap_lenrek <cinap_lenrek@localhost> | 2011-07-03 03:42:37 +0200 |
commit | 86f316987d68dbd92dac0606b8010e9a937f61ce (patch) | |
tree | a575e65f795e79a62dae3efe996f686cd5afced2 /sys/src/9/pc/audioac97.c | |
parent | cd51302616be31e1654dd2ce02d705c079bd537d (diff) |
audio: add delay control
Diffstat (limited to 'sys/src/9/pc/audioac97.c')
-rw-r--r-- | sys/src/9/pc/audioac97.c | 12 |
1 files changed, 11 insertions, 1 deletions
diff --git a/sys/src/9/pc/audioac97.c b/sys/src/9/pc/audioac97.c index ba8ff6777..2ea734676 100644 --- a/sys/src/9/pc/audioac97.c +++ b/sys/src/9/pc/audioac97.c @@ -56,6 +56,7 @@ struct Ctlr { int sis7012; /* for probe */ + Audio *adev; Pcidev *pcidev; Ctlr *next; }; @@ -286,6 +287,14 @@ outavail(void *arg) return available(&ctlr->outring); } +static int +outrate(void *arg) +{ + Ctlr *ctlr = arg; + int delay = ctlr->adev->delay*BytesPerSample; + return (delay <= 0) || (buffered(&ctlr->outring) <= delay); +} + static long ac97write(Audio *adev, void *vp, long n, vlong) { @@ -312,7 +321,7 @@ ac97write(Audio *adev, void *vp, long n, vlong) } p += n; } - + sleep(&ring->r, outrate, ctlr); return p - (uchar*)vp; } @@ -383,6 +392,7 @@ ac97reset(Audio *adev) Found: adev->ctlr = ctlr; + ctlr->adev = adev; if(p->vid == 0x1039 && p->did == 0x7012) ctlr->sis7012 = 1; |