summaryrefslogtreecommitdiffstats
path: root/README
blob: 213cbdea4735569de4103f246cf7d73c63238cf6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
WHAT IS THIS?

        This tool will help you to determine the volume scaling
        factors of your sound card. If your sound card/chip
        manufacturer did not provide you with documentation to which
        attenuation specific volume settings belong this tool can help
        you to measure them.

WHAT YOU NEED?

        a) A sound card where input and output are synchronous

        b) A feedback cable that allows you to feed sound card output
           back into the input

        c) Some time

HOW TO USE IT?

        1) You plug in your feedback cable in the line out and line in
           of your soundcard

        2) You open the low-level ALSA mixer and mute/set to 0
           everything you can mute/set to 0, except what is necessary
           to get a PCM signal out of your machine and back into the
           machine. The slider you want to measure you set the highest
           possible value. The other sliders that are in our pipeline
           you set to some 'sensible' value, in the middle of its
           range somewhere. What does 'sensible' mean?  Something
           where neither clipping happens nor where the signal is too
           faint. In 'alsamixer -c0' those points are usually near 0dB
           or a bit lower. If you are not sure what to pick don't
           despair, our little tool will tell you if you picked a good
           value. 'Inner' sliders should always be kept near to 0dB.

        3) You run our little tool like this:

                make && ./dbmeasure plughw:0 log.csv

        This will now measure a few things and then ask you to lower
        the volume one step. Please comply and press return. It will
        now measure a little bit more, and ask again and so on. When
        you went through all volume levels successfully press C-D
        instead of return.

        If the volume levels mentioned in step 2 were not set up
        correctly the tool will fail and ask you to adjust them a
        little. Then repeat step 3.

        The first argument to the tool is the device to use. It will
        be opened for both capturing and playback. The second argument
        is the filename of a CSV file where the tool will place its
        results. The first column of that file is the numer of the
        volume step we are looking at. Starting with the highest
        one. The last column is the attenuation in dB relative to the
        highest volume level (and hence is always at 0dB on the first
        line). You can then load the CSV output into Gnumeric to draw
        pretty graphs.

        If you want to use the output of this tool in low-level
        drivers, keep in mind that there volume level 0 is usally the
        lowest one, while in our CSV it is the highest. You might
        hence want to invert the order of the CSV file before you make
        use of it.

WHAT DOES IT ACTUALLY DO?

        It's pretty simple. We basically just generate a sine wave @
        440Hz which we output. Then we record that again and deduce
        the amplitude of what we record. Then we ask you to change the
        volume a bit and measure the amplitude again.

        To suppress the noise we play the sine wave for one
        second. And then record the next second adding it to the
        previously recorded second and so on. Dividing the resulting
        summed signal by the number of seconds we did this will give us a
        signal where the noise level is lower on each iteration. This
        works correctly only if record and playback are perfectly in
        sync. As last step we deduce the absolute maximum of our
        summed samples and take that as the volume level for the
        volume setting.

        Before the whole logic properly starts we do a run similar to
        the above but with silence written to the device instead of
        the actual sine signal. We then repeat that as often as the
        resulting sum signal is stronger than -80 dB. This then gives
        us a hint how many seconds/iterations we need to record and
        play the summing game to push the noise level below -80 dB.

        This will only measure the volume dependant attenuation at
        440Hz. This is of course a drastic simplification of the
        actual transfer function.

WHY DO THIS?

        To do more advance volume control in PulseAudio we need the dB
        values for our sound card volume controls. More specifically I
        wanted them for my Thinkpad X60s hardware volume control.

WHO WROTE THIS?

        Lennart Poettering, 2009