author | Paul Adenot <paul@paul.cx> |
Thu, 28 May 2020 09:51:30 +0000 | |
changeset 532741 | eb232dca19b05733a3103e1689acad7c028ef063 |
parent 532740 | 99be85a6ec5c09982fbda237c9c5c9d80889473d |
child 532742 | 5e0b79c5f7e1e8274a632fbbedcef32ff42cdda1 |
push id | 117348 |
push user | padenot@mozilla.com |
push date | Thu, 28 May 2020 09:58:56 +0000 |
treeherder | autoland@5e969a4bab42 [default view] [failures only] |
perfherder | [talos] [build metrics] [platform microbench] (compared to previous push) |
reviewers | chunmin |
bugs | 1628779 |
milestone | 78.0a1 |
first release with | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
last release without | nightly linux32
nightly linux64
nightly mac
nightly win32
nightly win64
|
dom/base/nsDOMWindowUtils.cpp | file | annotate | diff | comparison | revisions | |
dom/interfaces/base/nsIDOMWindowUtils.idl | file | annotate | diff | comparison | revisions |
--- a/dom/base/nsDOMWindowUtils.cpp +++ b/dom/base/nsDOMWindowUtils.cpp @@ -2214,16 +2214,60 @@ nsDOMWindowUtils::GetCurrentMaxAudioChan NS_IMETHODIMP nsDOMWindowUtils::GetCurrentPreferredSampleRate(uint32_t* aRate) { *aRate = CubebUtils::PreferredSampleRate(); return NS_OK; } NS_IMETHODIMP +nsDOMWindowUtils::DefaultDevicesRoundTripLatency(Promise** aOutPromise) { + NS_ENSURE_ARG_POINTER(aOutPromise); + *aOutPromise = nullptr; + + nsCOMPtr<nsPIDOMWindowOuter> outer = do_QueryReferent(mWindow); + NS_ENSURE_STATE(outer); + nsCOMPtr<nsPIDOMWindowInner> inner = outer->GetCurrentInnerWindow(); + NS_ENSURE_STATE(inner); + + ErrorResult err; + RefPtr<Promise> promise = Promise::Create(inner->AsGlobal(), err); + if (NS_WARN_IF(err.Failed())) { + return err.StealNSResult(); + } + + NS_ADDREF(promise.get()); + void* p = reinterpret_cast<void*>(promise.get()); + NS_DispatchBackgroundTask( + NS_NewRunnableFunction("DefaultDevicesRoundTripLatency", [p]() { + double mean, stddev; + bool success = + CubebUtils::EstimatedRoundTripLatencyDefaultDevices(&mean, &stddev); + + NS_DispatchToMainThread(NS_NewRunnableFunction( + "DefaultDevicesRoundTripLatency", [p, success, mean, stddev]() { + Promise* promise = reinterpret_cast<Promise*>(p); + if (!success) { + promise->MaybeReject(NS_ERROR_FAILURE); + NS_RELEASE(promise); + return; + } + nsTArray<double> a; + a.AppendElement(mean); + a.AppendElement(stddev); + promise->MaybeResolve(a); + NS_RELEASE(promise); + })); + })); + + promise.forget(aOutPromise); + return NS_OK; +} + +NS_IMETHODIMP nsDOMWindowUtils::AudioDevices(uint16_t aSide, nsIArray** aDevices) { NS_ENSURE_ARG_POINTER(aDevices); NS_ENSURE_ARG((aSide == AUDIO_INPUT) || (aSide == AUDIO_OUTPUT)); *aDevices = nullptr; nsresult rv = NS_OK; nsCOMPtr<nsIMutableArray> devices = do_CreateInstance(NS_ARRAY_CONTRACTID, &rv);
--- a/dom/interfaces/base/nsIDOMWindowUtils.idl +++ b/dom/interfaces/base/nsIDOMWindowUtils.idl @@ -1342,16 +1342,23 @@ interface nsIDOMWindowUtils : nsISupport readonly attribute AString currentAudioBackend; /** * Returns the max channel counts of the current audio device. */ readonly attribute unsigned long currentMaxAudioChannels; /** + * Returns the mean round trip latency in seconds for the default input and + * output device, and the stddev of this latency, as a two element array when + * the Promise succeeds. + */ + Promise defaultDevicesRoundTripLatency(); + + /** * Returns the preferred sample rate of the current audio device. */ readonly attribute unsigned long currentPreferredSampleRate; /** * Returns all the audio input/output devices. */ const unsigned short AUDIO_INPUT = 0;