diff options
| -rw-r--r-- | sys/src/9/pc/audioac97mix.c | 35 | ||||
| -rw-r--r-- | sys/src/9/pc/audiohda.c | 2 | ||||
| -rw-r--r-- | sys/src/9/port/devaudio.c | 25 |
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); } |
