summaryrefslogtreecommitdiff
path: root/scripts/volume_tuning/volume.js
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/volume_tuning/volume.js')
-rw-r--r--scripts/volume_tuning/volume.js315
1 files changed, 0 insertions, 315 deletions
diff --git a/scripts/volume_tuning/volume.js b/scripts/volume_tuning/volume.js
deleted file mode 100644
index 88f39984..00000000
--- a/scripts/volume_tuning/volume.js
+++ /dev/null
@@ -1,315 +0,0 @@
-/* Copyright (c) 2013 The Chromium OS Authors. All rights reserved.
- * Use of this source code is governed by a BSD-style license that can be
- * found in the LICENSE file.
- */
-
-var NN = 100; // Total number of points
-var FIXES = 25; // Number of fixed points, evenly spaced in the range [0, NN]
-var minmax_boxes = []; // The text input boxes for min/max/step
-var fix_boxes = []; // The text input boxes for fixed points
-
-window.onload = function() {
- init_minmax();
- init_fixes();
- init_canvas();
-};
-
-// Create min/max/step boxes
-function init_minmax() {
- var table = document.getElementById('minmax');
- var names = ['Min:' , 'Max:', 'Step:'];
- for (var i = 0; i < names.length; i++) {
- var row = table.insertRow(-1);
- var col_name = row.insertCell(-1);
- var col_box = row.insertCell(-1);
- var col_db = row.insertCell(-1);
- var box = document.createElement('input');
- box.size = 5;
- box.className = 'box';
- col_name.appendChild(document.createTextNode(names[i]));
- col_name.align = 'right';
- col_box.appendChild(box);
- col_db.appendChild(document.createTextNode('dB'));
- minmax_boxes.push(box);
- box.oninput = redraw;
- }
-}
-
-// Create fixed point boxes
-function init_fixes() {
- var table = document.getElementById('fixes');
- for (var i = 0; i <= FIXES; i++) {
- var row = table.insertRow(-1);
- var col_name = row.insertCell(-1);
- var col_box = row.insertCell(-1);
- var col_db = row.insertCell(-1);
- var box = document.createElement('input');
- box.size = 5;
- box.className = 'box';
- // round fix_pos (the dB value for this fixed point) to one place
- // after decimal point.
- var fix_pos = Math.round(i * NN * 10 / FIXES) / 10;
- col_name.appendChild(document.createTextNode(fix_pos + ':'));
- col_name.align = 'right';
- col_box.appendChild(box);
- col_db.appendChild(document.createTextNode('dB'));
- fix_boxes.push(box);
- box.oninput = redraw;
- }
-}
-
-function init_canvas() {
- redraw();
-}
-
-// Redraw everything on the canvas. This is run every time any input is changed.
-function redraw() {
- var backgroundColor = 'black';
- var gridColor = 'rgb(200,200,200)';
- var dotColor = 'rgb(245,245,0)';
- var marginLeft = 60;
- var marginBottom = 30;
- var marginTop = 20;
- var marginRight = 30;
- var canvas = document.getElementById('curve');
- var ctx = canvas.getContext('2d');
- var w = 800;
- var h = 400;
- canvas.width = w + marginLeft + marginRight;
- canvas.height = h + marginBottom + marginTop;
- ctx.fillStyle = backgroundColor;
- ctx.fillRect(0, 0, canvas.width, canvas.height);
- ctx.lineWidth = 1;
- ctx.font = '16px sans-serif';
- ctx.textAlign = 'center';
-
- // Set up coordinate system
- ctx.translate(marginLeft, h + marginTop);
- ctx.scale(1, -1);
-
- // Draw two lines at x = 0 and y = 0 which are solid lines
- ctx.strokeStyle = gridColor;
- ctx.beginPath();
- ctx.moveTo(0, h + marginTop / 2);
- ctx.lineTo(0, 0);
- ctx.lineTo(w + marginRight / 2, 0);
- ctx.stroke();
-
- // Draw vertical lines and labels on x axis
- ctx.strokeStyle = gridColor;
- ctx.fillStyle = gridColor;
- ctx.beginPath();
- ctx.setLineDash([1, 4]);
- for (var i = 0; i <= FIXES; i++) {
- var x = i * w / FIXES;
- if (i > 0) {
- ctx.moveTo(x, 0);
- ctx.lineTo(x, h + marginTop / 2);
- }
- drawText(ctx, Math.round(i * NN * 10 / FIXES) / 10, x, -20, 'center');
- }
- ctx.stroke();
- ctx.setLineDash([]);
-
- // Draw horizontal lines and labels on y axis
- var min = parseFloat(minmax_boxes[0].value);
- var max = parseFloat(minmax_boxes[1].value);
- var step = parseFloat(minmax_boxes[2].value);
-
- // Soundness checks
- if (isNaN(min) || isNaN(max) || isNaN(step)) return;
- if (min >= max || step <= 0 || (max - min) / step > 10000) return;
-
- // Let s = minimal multiple of step such that
- // vdivs = Math.round((max - min) / s) <= 20
- var vdivs;
- var s = Math.max(1, Math.floor((max - min) / 20 / step)) * step;
- while (true) {
- var vdivs = Math.round((max - min) / s);
- if (vdivs <= 20) break;
- s += step;
- }
-
- // Scale from v to y is
- // y = (v - min) / s * h / vdivs
- ctx.strokeStyle = gridColor;
- ctx.fillStyle = gridColor;
- ctx.beginPath();
- ctx.setLineDash([1, 4]);
- for (var i = 0;; i++) {
- var v = min + s * i;
- var y;
- if (v <= max) {
- y = i * h / vdivs;
- } else {
- v = max;
- y = (max - min) / s * h / vdivs;
- }
- drawText(ctx, v.toFixed(2), -5 , y - 4, 'right');
- if (i > 0) {
- ctx.moveTo(0, y);
- ctx.lineTo(w + marginRight / 2, y);
- }
- if (v >= max) break;
- }
- ctx.stroke();
- ctx.setLineDash([]);
-
- // Draw fixed points
- ctx.strokeStyle = dotColor;
- ctx.fillStyle = dotColor;
- for (var i = 0; i <= FIXES; i++) {
- var v = getFix(i);
- if (isNaN(v)) continue;
- var x = i * w / FIXES;
- var y = (v - min) / s * h / vdivs;
- ctx.beginPath();
- ctx.arc(x, y, 4, 0, 2 * Math.PI);
- ctx.stroke();
- }
-
- // Draw interpolated points
- var points = generatePoints();
- for (var i = 0; i <= NN; i++) {
- var v = points[i];
- if (isNaN(v)) continue;
- var x = i * w / NN;
- var y = (v - min) / s * h / vdivs;
- ctx.beginPath();
- ctx.arc(x, y, 2, 0, 2 * Math.PI);
- ctx.stroke();
- ctx.fill();
- }
-}
-
-// Returns the value of the fixed point with index i
-function getFix(i) {
- var v = parseFloat(fix_boxes[i].value);
- var min = parseFloat(minmax_boxes[0].value);
- var max = parseFloat(minmax_boxes[1].value);
-
- if (isNaN(v)) return v;
- if (v > max) v = max;
- if (v < min) v = min;
- return v;
-}
-
-// Returns a value quantized to the given min/max/step
-function quantize(v) {
- var min = parseFloat(minmax_boxes[0].value);
- var max = parseFloat(minmax_boxes[1].value);
- var step = parseFloat(minmax_boxes[2].value);
-
- v = min + Math.round((v - min) / step) * step;
- if (isNaN(v)) return v;
- if (v > max) v = max;
- if (v < min) v = min;
- return v;
-}
-
-// Generate points indexed by 0 to NN, using interpolation and quantization
-function generatePoints() {
- // Go through all points, for each point:
- // (1) Find the left fix: the max defined fixed point <= current point
- // (2) Find the right fix: the min defined fixed point >= current point
- // (3) If both exist, interpolate value for current point
- // (4) Otherwise skip current point
-
- // Returns left fix index for current point, or NaN if it does not exist
- var find_left = function(current) {
- for (i = FIXES; i >= 0; i--) {
- var x = NN * i / FIXES;
- if (x <= current && !isNaN(getFix(i))) {
- return i;
- }
- }
- return NaN;
- };
-
- // Returns right fix index for current point, or NaN if it does not exist
- var find_right = function(current) {
- for (i = 0; i <= FIXES; i++) {
- var x = NN * i / FIXES;
- if (x >= current && !isNaN(getFix(i))) {
- return i;
- }
- }
- return NaN;
- };
-
- // Interpolate value for point x
- var interpolate = function(x) {
- var left = find_left(x);
- if (isNaN(left)) return NaN;
-
- var right = find_right(x);
- if (isNaN(right)) return NaN;
-
- var xl = NN * left / FIXES;
- var xr = NN * right / FIXES;
- var yl = getFix(left);
- var yr = getFix(right);
-
- if (xl == xr) return yl;
-
- return yl + (yr - yl) * (x - xl) / (xr - xl);
- };
-
- var result = [];
- for (var x = 0; x <= NN; x++) {
- result.push(quantize(interpolate(x)));
- }
- return result;
-}
-
-function drawText(ctx, s, x, y, align) {
- ctx.save();
- ctx.translate(x, y);
- ctx.scale(1, -1);
- ctx.textAlign = align;
- ctx.fillText(s, 0, 0);
- ctx.restore();
-}
-
-// The output config file looks like:
-//
-// [Speaker]
-// volume_curve = explicit
-// db_at_100 = 0
-// db_at_99 = -75
-// db_at_98 = -75
-// ...
-// db_at_1 = -4500
-// db_at_0 = -4800
-// [Headphone]
-// volume_curve = simple_step
-// volume_step = 70
-// max_volume = 0
-//
-function download_config() {
- var content = '';
- content += '[Speaker]\n';
- content += ' volume_curve = explicit\n';
- var points = generatePoints();
- var last = 0;
- for (var i = NN; i >= 0; i--) {
- var v = points[i];
- if (isNaN(points[i])) v = last;
- content += ' db_at_' + i + ' = ' + Math.round(v * 100) + '\n';
- }
-
- content += '[Headphone]\n';
- content += ' volume_curve = simple_step\n';
- content += ' volume_step = 70\n';
- content += ' max_volume = 0\n';
- save_config(content);
-}
-
-function save_config(content) {
- var a = document.getElementById('save_config_anchor');
- var uriContent = 'data:application/octet-stream,' +
- encodeURIComponent(content);
- a.href = uriContent;
- a.download = 'HDA Intel PCH';
- a.click();
-}