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; |
+ } |
+}); |