Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(2921)

Unified Diff: chrome/browser/resources/chromeos/emulator/audio_settings.js

Issue 1274403003: Full Implementation of Audio for the Chrome Os Device Emulator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Updated with merge Created 5 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/resources/chromeos/emulator/audio_settings.js
diff --git a/chrome/browser/resources/chromeos/emulator/audio_settings.js b/chrome/browser/resources/chromeos/emulator/audio_settings.js
new file mode 100644
index 0000000000000000000000000000000000000000..5966aa1ac5cd852a5ce92ed5f2f2221e975a13d5
--- /dev/null
+++ b/chrome/browser/resources/chromeos/emulator/audio_settings.js
@@ -0,0 +1,168 @@
+// Copyright 2015 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+/** @enum {string} */ var AudioNodeType = {
+ HEADPHONE: 'HEADPHONE',
+ MIC: 'MIC',
+ USB: 'USB',
+ BLUETOOTH: 'BLUETOOTH',
+ HDMI: 'HDMI',
+ INTERNAL_SPEAKER: 'INTERNAL_SPEAKER',
+ INTERNAL_MIC: 'INTERNAL_MIC',
+ KEYBOARD_MIC: 'KEYBOARD_MIC',
+ AOKR: 'AOKR',
+ POST_MIX_LOOPBACK: 'POST_MIX_LOOPBACK',
+ POST_DSP_LOOPBACK: 'POST_DSP_LOOPBACK',
+ OTHER: 'OTHER',
+ NONE: '',
+};
+
+/**
+ * An audio node. Based on the struct AudioNode found in audio_node.h.
+ * @constructor
+ */
+var AudioNode = function() {
+ // Whether node will input or output audio.
+ this.isInput = false;
+
+ // Node ID. Set to arbitrary default.
+ this.id = '30001';
+
+ // Display name of the node. When this is empty, cras will automatically
+ // use |this.deviceName| as the display name.
+ this.name = '';
+
+ // The text label of the selected node name.
+ this.deviceName = 'New Device';
+
+ // Based on the AudioNodeType enum.
+ this.type = AudioNodeType.HEADPHONE;
+
+ // Whether the node is active or not.
+ this.active = false;
+
+ // The time the node was plugged in (in seconds).
+ this.pluggedTime = 0;
+};
+
+Polymer({
+ is: 'audio-settings',
+
+ properties: {
+ /**
+ * The title to be displayed in a heading element for the element.
+ */
+ title: {type: String},
+
+ /**
+ * A set of audio nodes.
+ * @type !Array<!AudioNode>
+ */
+ nodes: {type: Array, value: function() { return []; }},
+
+ /**
+ * A set of options for the possible audio node types.
+ * AudioNodeType |type| is based on the AudioType emumation.
+ * {@type !Array<!{name: string, type: string}>}
stevenjb 2015/08/10 21:47:34 Shouldn't this be !Array<!{name: string, type: Aud
mozartalouis 2015/08/10 23:02:07 michaelpg@ suggested that in order for the pre-sub
michaelpg 2015/08/11 00:25:09 We've been following the @type {...} convention fr
+ */
+ nodeTypeOptions: {
+ type: Array,
+ value: function() {
+ return [
+ {name: 'Headphones', type: AudioNodeType.HEADPHONE},
+ {name: 'Mic', type: AudioNodeType.MIC},
+ {name: 'Usb', type: AudioNodeType.USB},
+ {name: 'Bluetooth', type: AudioNodeType.BLUETOOTH},
+ {name: 'HDMI', type: AudioNodeType.HDMI},
+ {name: 'Internal Speaker', type: AudioNodeType.INTERNAL_SPEAKER},
+ {name: 'Internal Mic', type: AudioNodeType.INTERNAL_MIC},
+ {name: 'Keyboard Mic', type: AudioNodeType.KEYBOARD_MIC},
+ {name: 'Aokr', type: AudioNodeType.AOKR},
+ {name: 'Post Mix Loopback', type: AudioNodeType.POST_MIX_LOOPBACK},
+ {name: 'Post Dsp Loopback', type: AudioNodeType.POST_DSP_LOOPBACK},
+ {name: 'Other', type: AudioNodeType.OTHER}
+ ];
+ }
+ },
+ },
+
+ ready: function() { this.title = 'Audio Settings'; },
+
+ /**
+ * Adds a new node with default settings to the list of nodes.
+ */
+ appendNewNode: function() {
+ this.push('nodes', new AudioNode());
+ },
+
+ /**
+ * This adds or modifies an audio node to the AudioNodeList.
+ * @param {model: {index: number}} e Event with a model containing
+ * the index in |nodes| to add.
+ */
+ insertAudioNode: function(e) {
+ // Create a new audio node and add all the properties from |nodes[i]|.
+ // Also, send the corresponding type value based on the name of |info.type|.
+ var info = this.nodes[e.model.index];
+ chrome.send('insertAudioNode', [info, this.getAudioTypeForName(info.type)]);
stevenjb 2015/08/10 21:47:34 I still don't understand why we are passing info.t
mozartalouis 2015/08/10 23:02:07 You have to pass info.type because with insertAudi
stevenjb 2015/08/10 23:14:09 This is super confusing. At minimum this needs to
+ },
+
+ /**
+ * Removes the audio node with id |id|.
+ * @param {model: {index: number}} e Event with a model containing
+ * the index in |nodes| to add.
+ */
+ removeAudioNode: function(e) {
+ var info = this.nodes[e.model.index];
+ chrome.send('removeAudioNode', [info.id]);
+ },
+
+ /**
+ * Returns the text for the label that corresponds to |type|.
+ * @param {string} type A string representing an AudioType
+ * of a node.
stevenjb 2015/08/10 21:47:34 Shouldn't |type| be of type {AudioNodeType} ?
mozartalouis 2015/08/10 23:02:07 Done. should i rename them getAudioTypeName get
+ * @return {string} The display name corresponding to |type|.
+ */
+ getNameForAudioType: function(type) {
+ for (var i = 0; i < this.nodeTypeOptions.length; ++i) {
+ if (this.nodeTypeOptions[i].type == type)
+ return this.nodeTypeOptions[i].name;
+ }
+ },
+
+ /**
+ * Returns the text for the label that corresponds to |name|.
+ * @param {string} name A string representing an AudioType
+ * of a nodes name.
+ * @return {string} The label which represents |name|.
stevenjb 2015/08/10 21:47:34 Sill unclear. This returns this.nodeTypeOptions[i]
mozartalouis 2015/08/10 23:02:07 Done.
+ */
+ getAudioTypeForName: function(name) {
+ for (var i = 0; i < this.nodeTypeOptions.length; ++i) {
+ if (this.nodeTypeOptions[i].name == name)
+ return this.nodeTypeOptions[i].type;
+ }
+ },
+
+ /**
+ * Called by the WebUI which provides a list of nodes.
+ * @param {!Array<!AudioNode>} nodeList A list of audio nodes.
+ */
+ updateAudioNodes: function(nodeList) {
+ /** @type {!Array<!AudioNode>} */ var newNodeList = [];
+ for (var i = 0; i < nodeList.length; ++i) {
+ // create a new audio node and add all the properties from |nodeList[i]|
+ var node = new AudioNode();
+
+ node.isInput = nodeList[i]['isInput'];
+ node.id = nodeList[i]['id'];
+ node.deviceName = nodeList[i]['deviceName'];
+ node.type = this.getNameForAudioType(nodeList[i]['type']);
+ node.name = nodeList[i]['name'];
+ node.active = nodeList[i]['active'];
stevenjb 2015/08/10 21:47:34 Now we can do: Object.assign(node, nodeList[i]);
mozartalouis 2015/08/10 23:02:07 Done.
+
+ newNodeList.push(node);
+ }
+ this.nodes = newNodeList;
+ }
+});

Powered by Google App Engine
This is Rietveld 408576698