summaryrefslogtreecommitdiff
path: root/sys/src/9/pc/audioac97.c
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@localhost>2011-07-03 03:42:37 +0200
committercinap_lenrek <cinap_lenrek@localhost>2011-07-03 03:42:37 +0200
commit86f316987d68dbd92dac0606b8010e9a937f61ce (patch)
treea575e65f795e79a62dae3efe996f686cd5afced2 /sys/src/9/pc/audioac97.c
parentcd51302616be31e1654dd2ce02d705c079bd537d (diff)
audio: add delay control
Diffstat (limited to 'sys/src/9/pc/audioac97.c')
-rw-r--r--sys/src/9/pc/audioac97.c12
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;