summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcinap_lenrek <cinap_lenrek@gmx.de>2013-01-27 17:20:42 +0100
committercinap_lenrek <cinap_lenrek@gmx.de>2013-01-27 17:20:42 +0100
commitc1cb685a327b180cce47a453b221e050ebff4f9e (patch)
tree41f422e1e30b19db24dd3c96c522d3c8e026bdb8
parent866ee3ab5d0818194cca8c04d1f3ec2ff1d148c9 (diff)
audioac97: fix inverted recgain control, init to zero recgain
some controls are inverted. we reflect this by specifying negative range in the volume table now and let genaudiovolread() and genaudiovolwrite() do the conversion.
-rw-r--r--sys/src/9/pc/audioac97mix.c35
-rw-r--r--sys/src/9/pc/audiohda.c2
-rw-r--r--sys/src/9/port/devaudio.c25
3 files changed, 34 insertions, 28 deletions
diff --git a/sys/src/9/pc/audioac97mix.c b/sys/src/9/pc/audioac97mix.c
index c76875796..b596dab30 100644
--- a/sys/src/9/pc/audioac97mix.c
+++ b/sys/src/9/pc/audioac97mix.c
@@ -114,18 +114,18 @@ enum {
};
static Volume voltab[] = {
- [Vmaster] "master", 0x02, 63, Stereo, 0,
- [Vaudio] "audio", 0x18, 31, Stereo, 0,
- [Vhead] "head", 0x04, 31, Stereo, Capheadphones,
+ [Vmaster] "master", 0x02, -63, Stereo, 0,
+ [Vaudio] "audio", 0x18, -31, Stereo, 0,
+ [Vhead] "head", 0x04, -31, Stereo, Capheadphones,
[Vbass] "bass", 0x08, 15, Left, Captonectl,
[Vtreb] "treb", 0x08, 15, Right, Captonectl,
- [Vbeep] "beep", 0x0a, 31, Right, 0,
- [Vphone] "phone", 0x0c, 31, Right, 0,
- [Vmic] "mic", 0x0e, 31, Right, Capmic,
- [Vline] "line", 0x10, 31, Stereo, 0,
- [Vcd] "cd", 0x12, 31, Stereo, 0,
- [Vvideo] "video", 0x14, 31, Stereo, 0,
- [Vaux] "aux", 0x16, 63, Stereo, 0,
+ [Vbeep] "beep", 0x0a, -31, Right, 0,
+ [Vphone] "phone", 0x0c, -31, Right, 0,
+ [Vmic] "mic", 0x0e, -31, Right, Capmic,
+ [Vline] "line", 0x10, -31, Stereo, 0,
+ [Vcd] "cd", 0x12, -31, Stereo, 0,
+ [Vvideo] "video", 0x14, -31, Stereo, 0,
+ [Vaux] "aux", 0x16, -63, Stereo, 0,
[Vrecgain] "recgain", 0x1c, 15, Stereo, 0,
[Vmicgain] "micgain", 0x1e, 15, Right, Capmic,
[Vspeed] "speed", 0x2c, 0, Absolute, 0,
@@ -160,11 +160,10 @@ ac97volget(Audio *adev, int x, int a[2])
default:
v = m->rr(adev, vol->reg);
if(v & 0x8000){
- a[0] = 0;
- a[1] = 0;
+ a[0] = a[1] = vol->range < 0 ? 0x7f : 0;
} else {
- a[0] = vol->range - ((v>>8) & 0x7f);
- a[1] = vol->range - (v & 0x7f);
+ a[0] = ((v>>8) & 0x7f);
+ a[1] = (v & 0x7f);
}
}
return 0;
@@ -191,18 +190,18 @@ ac97volset(Audio *adev, int x, int a[2])
}
break;
case Left:
- v = (vol->range - a[0]) & 0x7f;
+ v = a[0] & 0x7f;
w = m->rr(adev, vol->reg) & 0x7f;
m->wr(adev, vol->reg, (v<<8)|w);
break;
case Right:
v = m->rr(adev, vol->reg) & 0x7f00;
- w = (vol->range - a[1]) & 0x7f;
+ w = a[1] & 0x7f;
m->wr(adev, vol->reg, v|w);
break;
case Stereo:
- v = (vol->range - a[0]) & 0x7f;
- w = (vol->range - a[1]) & 0x7f;
+ v = a[0] & 0x7f;
+ w = a[1] & 0x7f;
m->wr(adev, vol->reg, (v<<8)|w);
break;
}
diff --git a/sys/src/9/pc/audiohda.c b/sys/src/9/pc/audiohda.c
index d7e862eb9..f8b0ae73b 100644
--- a/sys/src/9/pc/audiohda.c
+++ b/sys/src/9/pc/audiohda.c
@@ -1321,7 +1321,7 @@ enum {
static Volume voltab[] = {
[Vmaster] "master", 0, 0x7f, Stereo, 0,
- [Vrecord] "record", 0, 0x7f, Stereo, 0,
+ [Vrecord] "recgain", 0, 0x7f, Stereo, 0,
[Vspeed] "speed", 0, 0, Absolute, 0,
[Vdelay] "delay", 0, 0, Absolute, 0,
0
diff --git a/sys/src/9/port/devaudio.c b/sys/src/9/port/devaudio.c
index 21aa6f136..5a23a60da 100644
--- a/sys/src/9/port/devaudio.c
+++ b/sys/src/9/port/devaudio.c
@@ -150,6 +150,7 @@ audioattach(char *spec)
"master 100",
"audio 100",
"head 100",
+ "recgain 0",
};
attached |= i;
@@ -367,7 +368,7 @@ long
genaudiovolread(Audio *adev, void *a, long n, vlong,
Volume *vol, int (*volget)(Audio *, int, int *), ulong caps)
{
- int i, j, v[2];
+ int i, j, r, v[2];
char *p, *e;
p = a;
@@ -382,14 +383,17 @@ genaudiovolread(Audio *adev, void *a, long n, vlong,
if(vol[i].type == Absolute)
p += snprint(p, e - p, "%s %d\n", vol[i].name, v[0]);
else {
- if(vol[i].range == 0)
+ r = abs(vol[i].range);
+ if(r == 0)
continue;
for(j=0; j<2; j++){
if(v[j] < 0)
v[j] = 0;
- if(v[j] > vol[i].range)
- v[j] = vol[i].range;
- v[j] = (v[j]*100)/vol[i].range;
+ if(v[j] > r)
+ v[j] = r;
+ if(vol[i].range < 0)
+ v[j] = r - v[j];
+ v[j] = (v[j]*100)/r;
}
switch(vol[i].type){
case Left:
@@ -418,7 +422,7 @@ long
genaudiovolwrite(Audio *adev, void *a, long n, vlong,
Volume *vol, int (*volset)(Audio *, int, int *), ulong caps)
{
- int ntok, i, j, v[2];
+ int ntok, i, j, r, v[2];
char *p, *e, *x, *tok[4];
p = a;
@@ -455,12 +459,15 @@ genaudiovolwrite(Audio *adev, void *a, long n, vlong,
if(vol[i].type == Absolute)
(*volset)(adev, i, v);
else {
+ r = abs(vol[i].range);
for(j=0; j<2; j++){
- v[j] = (50+(v[j]*vol[i].range))/100;
+ v[j] = (50+(v[j]*r))/100;
if(v[j] < 0)
v[j] = 0;
- if(v[j] > vol[i].range)
- v[j] = vol[i].range;
+ if(v[j] > r)
+ v[j] = r;
+ if(vol[i].range < 0)
+ v[j] = r - v[j];
}
(*volset)(adev, i, v);
}