summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-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);
}