From 893fc903790e1ca5bba598113c49d94a165e333b Mon Sep 17 00:00:00 2001 From: Jeremy Andrews Date: Tue, 24 Aug 2021 14:35:49 -0500 Subject: Issue #1806 - Part 4: Add more audio troubleshooting information. This should help us troubleshoot audio issues better in the future in general, since we'll know more about the hardware involved, etc. --- toolkit/content/aboutSupport.js | 106 ++++++++++++++++++++- toolkit/content/aboutSupport.xhtml | 85 +++++++++++++++++ .../locales/en-US/chrome/global/aboutSupport.dtd | 13 +++ .../en-US/chrome/global/aboutSupport.properties | 6 +- toolkit/modules/Troubleshoot.jsm | 46 ++++++++- 5 files changed, 250 insertions(+), 6 deletions(-) (limited to 'toolkit') diff --git a/toolkit/content/aboutSupport.js b/toolkit/content/aboutSupport.js index f9a0abcb0e..86f1fa35b7 100644 --- a/toolkit/content/aboutSupport.js +++ b/toolkit/content/aboutSupport.js @@ -310,7 +310,6 @@ var snapshotFormatters = { addRowFromKey("features", "webgl2DriverExtensions"); addRowFromKey("features", "webgl2Extensions"); addRowFromKey("features", "supportsHardwareH264", "hardwareH264"); - addRowFromKey("features", "currentAudioBackend", "audioBackend"); addRowFromKey("features", "direct2DEnabled", "#Direct2D"); if ("directWriteEnabled" in data) { @@ -462,6 +461,111 @@ var snapshotFormatters = { } }, + media: function media(data) { + let strings = stringBundle(); + + function insertBasicInfo(key, value) { + function createRow(key, value) { + let th = $.new("th", strings.GetStringFromName(key), "column"); + let td = $.new("td", value); + td.style["white-space"] = "pre-wrap"; + return $.new("tr", [th, td]); + } + $.append($("media-info-tbody"), [createRow(key, value)]); + } + + function createDeviceInfoRow(device) { + let deviceInfo = Ci.nsIAudioDeviceInfo; + + let states = {}; + states[deviceInfo.STATE_DISABLED] = "Disabled"; + states[deviceInfo.STATE_UNPLUGGED] = "Unplugged"; + states[deviceInfo.STATE_ENABLED] = "Enabled"; + + let preferreds = {}; + preferreds[deviceInfo.PREF_NONE] = "None"; + preferreds[deviceInfo.PREF_MULTIMEDIA] = "Multimedia"; + preferreds[deviceInfo.PREF_VOICE] = "Voice"; + preferreds[deviceInfo.PREF_NOTIFICATION] = "Notification"; + preferreds[deviceInfo.PREF_ALL] = "All"; + + let formats = {}; + formats[deviceInfo.FMT_S16LE] = "S16LE"; + formats[deviceInfo.FMT_S16BE] = "S16BE"; + formats[deviceInfo.FMT_F32LE] = "F32LE"; + formats[deviceInfo.FMT_F32BE] = "F32BE"; + + function toPreferredString(preferred) { + if (preferred == deviceInfo.PREF_NONE) { + return preferreds[deviceInfo.PREF_NONE]; + } else if (preferred & deviceInfo.PREF_ALL) { + return preferreds[deviceInfo.PREF_ALL]; + } + let str = ""; + for (let pref of [deviceInfo.PREF_MULTIMEDIA, + deviceInfo.PREF_VOICE, + deviceInfo.PREF_NOTIFICATION]) { + if (preferred & pref) { + str += " " + preferreds[pref]; + } + } + return str; + } + + function toFromatString(dev) { + let str = "default: " + formats[dev.defaultFormat] + ", support:"; + for (let fmt of [deviceInfo.FMT_S16LE, + deviceInfo.FMT_S16BE, + deviceInfo.FMT_F32LE, + deviceInfo.FMT_F32BE]) { + if (dev.supportedFormat & fmt) { + str += " " + formats[fmt]; + } + } + return str; + } + + function toRateString(dev) { + return "default: " + dev.defaultRate + + ", support: " + dev.minRate + " - " + dev.maxRate; + } + + function toLatencyString(dev) { + return dev.minLatency + " - " + dev.maxLatency; + } + + return $.new("tr", [$.new("td", device.name), + $.new("td", device.groupId), + $.new("td", device.vendor), + $.new("td", states[device.state]), + $.new("td", toPreferredString(device.preferred)), + $.new("td", toFromatString(device)), + $.new("td", device.maxChannels), + $.new("td", toRateString(device)), + $.new("td", toLatencyString(device))]); + } + + function insertDeviceInfo(side, devices) { + let rows = []; + for (let dev of devices) { + rows.push(createDeviceInfoRow(dev)); + } + $.append($("media-" + side + "-devices-tbody"), rows); + } + + // Basic information + insertBasicInfo("audioBackend", data.currentAudioBackend); + insertBasicInfo("maxAudioChannels", data.currentMaxAudioChannels); + insertBasicInfo("sampleRate", data.currentPreferredSampleRate); + + // Output devices information + insertDeviceInfo("output", data.audioOutputDevices); + + // Input devices information + insertDeviceInfo("input", data.audioInputDevices); + }, + + javaScript: function javaScript(data) { $("javascript-incremental-gc").textContent = data.incrementalGCEnabled; }, diff --git a/toolkit/content/aboutSupport.xhtml b/toolkit/content/aboutSupport.xhtml index 4ae9927399..7772f6497a 100644 --- a/toolkit/content/aboutSupport.xhtml +++ b/toolkit/content/aboutSupport.xhtml @@ -345,6 +345,91 @@ +

+ &aboutSupport.mediaTitle; +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ &aboutSupport.mediaOutputDevicesTitle; +
+ &aboutSupport.mediaDeviceName; + + &aboutSupport.mediaDeviceGroup; + + &aboutSupport.mediaDeviceVendor; + + &aboutSupport.mediaDeviceState; + + &aboutSupport.mediaDevicePreferred; + + &aboutSupport.mediaDeviceFormat; + + &aboutSupport.mediaDeviceChannels; + + &aboutSupport.mediaDeviceRate; + + &aboutSupport.mediaDeviceLatency; +
+ &aboutSupport.mediaInputDevicesTitle; +
+ &aboutSupport.mediaDeviceName; + + &aboutSupport.mediaDeviceGroup; + + &aboutSupport.mediaDeviceVendor; + + &aboutSupport.mediaDeviceState; + + &aboutSupport.mediaDevicePreferred; + + &aboutSupport.mediaDeviceFormat; + + &aboutSupport.mediaDeviceChannels; + + &aboutSupport.mediaDeviceRate; + + &aboutSupport.mediaDeviceLatency; +
+ + +

&aboutSupport.modifiedKeyPrefsTitle;

diff --git a/toolkit/locales/en-US/chrome/global/aboutSupport.dtd b/toolkit/locales/en-US/chrome/global/aboutSupport.dtd index 02eb34664a..b4da6bc774 100644 --- a/toolkit/locales/en-US/chrome/global/aboutSupport.dtd +++ b/toolkit/locales/en-US/chrome/global/aboutSupport.dtd @@ -121,3 +121,16 @@ variant of aboutSupport.showDir.label. --> + + + + + + + + + + + + + diff --git a/toolkit/locales/en-US/chrome/global/aboutSupport.properties b/toolkit/locales/en-US/chrome/global/aboutSupport.properties index 46e445f66d..751a3f096e 100644 --- a/toolkit/locales/en-US/chrome/global/aboutSupport.properties +++ b/toolkit/locales/en-US/chrome/global/aboutSupport.properties @@ -59,7 +59,6 @@ clearTypeParameters = ClearType Parameters compositing = Compositing hardwareH264 = Hardware H264 Decoding -audioBackend = Audio Backend mainThreadNoOMTC = main thread, no OMTC yes = Yes no = No @@ -98,6 +97,11 @@ glcontextCrashGuard = OpenGL resetOnNextRestart = Reset on Next Restart gpuProcessKillButton = Terminate GPU Process +audioBackend = Audio Backend +maxAudioChannels = Max Channels +channelLayout = Preferred Channel Layout +sampleRate = Preferred Sample Rate + minLibVersions = Expected minimum version loadedLibVersions = Version in use diff --git a/toolkit/modules/Troubleshoot.jsm b/toolkit/modules/Troubleshoot.jsm index 8ff6be30ba..d8f485d2c0 100644 --- a/toolkit/modules/Troubleshoot.jsm +++ b/toolkit/modules/Troubleshoot.jsm @@ -332,9 +332,6 @@ var dataProviders = { data.numAcceleratedWindows++; } - let winUtils = Services.wm.getMostRecentWindow(""). - QueryInterface(Ci.nsIInterfaceRequestor). - getInterface(Ci.nsIDOMWindowUtils) data.supportsHardwareH264 = "Unknown"; try { // After restart - data may not be available @@ -345,7 +342,6 @@ var dataProviders = { promises.push(promise); } catch (e) {} - data.currentAudioBackend = winUtils.currentAudioBackend; if (!data.numAcceleratedWindows && gfxInfo) { #ifdef XP_WIN @@ -492,6 +488,48 @@ var dataProviders = { completed(); }, + media: function media(done) { + function convertDevices(devices) { + if (!devices) { + return undefined; + } + let infos = []; + for (let i = 0; i < devices.length; ++i) { + let device = devices.queryElementAt(i, Ci.nsIAudioDeviceInfo); + infos.push({ + name: device.name, + groupId: device.groupId, + vendor: device.vendor, + type: device.type, + state: device.state, + preferred: device.preferred, + supportedFormat: device.supportedFormat, + defaultFormat: device.defaultFormat, + maxChannels: device.maxChannels, + defaultRate: device.defaultRate, + maxRate: device.maxRate, + minRate: device.minRate, + maxLatency: device.maxLatency, + minLatency: device.minLatency + }); + } + return infos; + } + + let data = {}; + let winUtils = Services.wm.getMostRecentWindow(""). + QueryInterface(Ci.nsIInterfaceRequestor). + getInterface(Ci.nsIDOMWindowUtils); + data.currentAudioBackend = winUtils.currentAudioBackend; + data.currentMaxAudioChannels = winUtils.currentMaxAudioChannels; + data.currentPreferredSampleRate = winUtils.currentPreferredSampleRate; + data.audioOutputDevices = convertDevices(winUtils.audioDevices(Ci.nsIDOMWindowUtils.AUDIO_OUTPUT). + QueryInterface(Ci.nsIArray)); + data.audioInputDevices = convertDevices(winUtils.audioDevices(Ci.nsIDOMWindowUtils.AUDIO_INPUT). + QueryInterface(Ci.nsIArray)); + done(data); + }, + javaScript: function javaScript(done) { let data = {}; let winEnumer = Services.ww.getWindowEnumerator(); -- cgit v1.2.3