From 984bf83deec7f484b63729faea038b12fa3f078d Mon Sep 17 00:00:00 2001 From: Greg Fodor <gfodor@gmail.com> Date: Tue, 20 Mar 2018 16:06:51 -0700 Subject: [PATCH] Audio levels work --- package.json | 1 + src/assets/images/level_fill.png | Bin 0 -> 1613 bytes src/assets/images/level_fill@2x.png | Bin 0 -> 3054 bytes src/assets/images/mic_level.png | Bin 0 -> 3017 bytes src/assets/images/mic_level@2x.png | Bin 0 -> 6108 bytes src/assets/images/mic_small.png | Bin src/assets/images/mic_small@2x.png | Bin 0 -> 765 bytes src/assets/images/package.json | 5 +++ src/assets/images/speaker_level.png | Bin 0 -> 2913 bytes src/assets/images/speaker_level@2x.png | Bin 0 -> 5861 bytes src/assets/images/yarn.lock | 7 ++++ src/react-components/ui-root.js | 39 +++++++++++------ src/room.scss | 56 ++++++++++++++++++++++--- yarn.lock | 4 ++ 14 files changed, 93 insertions(+), 19 deletions(-) create mode 100644 src/assets/images/level_fill.png create mode 100644 src/assets/images/level_fill@2x.png create mode 100644 src/assets/images/mic_level.png create mode 100644 src/assets/images/mic_level@2x.png mode change 100755 => 100644 src/assets/images/mic_small.png create mode 100644 src/assets/images/mic_small@2x.png create mode 100644 src/assets/images/package.json create mode 100644 src/assets/images/speaker_level.png create mode 100644 src/assets/images/speaker_level@2x.png create mode 100644 src/assets/images/yarn.lock diff --git a/package.json b/package.json index f79c4e4c4..8ec1ea977 100644 --- a/package.json +++ b/package.json @@ -29,6 +29,7 @@ "material-design-lite": "^1.3.0", "minijanus": "^0.5.0", "mobile-detect": "^1.4.1", + "moving-average": "^1.0.0", "naf-janus-adapter": "https://github.com/mozilla/naf-janus-adapter#feature/disconnect", "networked-aframe": "https://github.com/mozillareality/networked-aframe#mr-social-client/master", "nipplejs": "^0.6.7", diff --git a/src/assets/images/level_fill.png b/src/assets/images/level_fill.png new file mode 100644 index 0000000000000000000000000000000000000000..99f77b5655e6a50e0444364a3c2cfb4882b3b2d9 GIT binary patch literal 1613 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 LNkvXXu0mjf`|k{D literal 0 HcmV?d00001 diff --git a/src/assets/images/level_fill@2x.png b/src/assets/images/level_fill@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..477d9801bb6d33737b571fce454ff265ff79e77c GIT binary patch literal 3054 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/mic_level.png b/src/assets/images/mic_level.png new file mode 100644 index 0000000000000000000000000000000000000000..5be15458d9ed41c46f861d8dd8435a11e452f80c GIT binary patch literal 3017 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 LNkvXXu0mjf_SCz` literal 0 HcmV?d00001 diff --git a/src/assets/images/mic_level@2x.png b/src/assets/images/mic_level@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..94739aa1977cc5d5317eeb770905ed212ff248b4 GIT binary patch literal 6108 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/mic_small.png b/src/assets/images/mic_small.png old mode 100755 new mode 100644 diff --git a/src/assets/images/mic_small@2x.png b/src/assets/images/mic_small@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..b94cede41804adacdf7e268e6082baffca4403cb GIT binary patch literal 765 zcmV<Z0s{SsP)<h;3K|Lk000e1NJLTq0015U001rs1^@s6KT4?&00009a7bBm000&x z000&x0ZCFM@Bjb+0drDELIAGL9O(c600d`2O+f$vv5yP<VFdsH0+LBYK~#7F?N`yY zqCgCdRzL?%2Wkb<f!l#};Ojs-7(2kNME&<1{q_eszz$|}VZw$7ZvhYP7x$cqFqzzB zlFR_n066CYmY5}Ve{pBAEQUS-HXO0!?q|T6Uo<9Q(Dg@1W5LyzwhLI5pv&gG2Wi9? zL;V5LU6)cPF=I=^5q2r`AvQD|rc0p@ac92XnbU{(BbbOM;)!@7o`~NfHY_Xp99GnF zYQ-$hOR5zHzI_N%st0sd_G3LzJT%5=^0A2V-vvS76nTgNi<>BlT%PBed^-YhBmu$p ze!myncJ9}ncDo(1SHy$j=@_r7OZ>nlY=>be&sP;OdsRGv!iWg8&DE-^T{D-#7GmSC z84X9KZHR5T3ULj}EBW)F;dp2pim-;9rAWSDu~<~q$G4#y4lsq}3rheFZ#PH88Q8Nd zt32Tfm%oSEY<A)6k^1Avb27}ujVe}pJgUXRI3@7HT3ho>_1%{%zY^~~B0anE^W{sT zP1Cd*1c$eo6anIfOTA_xNfO=gFod2yxc0tAo({5LG7mO1Hk*yuD?V`o$@BSqt|`WG ztjXb}@zHNt_FlF=%D|_j(8pX2L@xOy^}>H>i@Jqe96;hiDmR(PKg&hucsw@j@CH>| zW<eG8>2zvLg12hoj{?W<_hu=mw58;Gd#1>dM~e-Fmt6OA1yug!a-r+>T6F<>bh%s> zozS-HL2tcY)9dw;{QssF6bA;XvCZ?LfDLu%Sn9xu{4u6mY$z~SwPZp)Vf_ThOWvsV ze*wCxZF)ue9TE9Moc!|RJk?vP0L6zfwbe@7ynVD9DqE*=pe=el`$mZN9PNDFu-Mz} v)(H9ee8Ms7bv^@E?#GRwX&|OAiT{Q_X;*_iX0LnY00000NkvXXu0mjfw^CuK literal 0 HcmV?d00001 diff --git a/src/assets/images/package.json b/src/assets/images/package.json new file mode 100644 index 000000000..0a5693e4e --- /dev/null +++ b/src/assets/images/package.json @@ -0,0 +1,5 @@ +{ + "dependencies": { + "moving-average": "^1.0.0" + } +} diff --git a/src/assets/images/speaker_level.png b/src/assets/images/speaker_level.png new file mode 100644 index 0000000000000000000000000000000000000000..9ccedcc0350f90c95744d928128594829b5f5b90 GIT binary patch literal 2913 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 LNkvXXu0mjfb{vXk literal 0 HcmV?d00001 diff --git a/src/assets/images/speaker_level@2x.png b/src/assets/images/speaker_level@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a807745cbcaaf823e6e8e99deda15459d1ed1d9a GIT binary patch literal 5861 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%0D|*Q?MZ2i=s;_P2i$axrvV>fi`f7PO`<sV zs+d=om&RSqMGg)Q&`@nHvI8Vt821ebT<ee|ip=k&R*4R@%HpLULxt%Zflsule&!Kf z&wk=u%ZV8FG*}=(M@k##dbUz{Ag4P)*RzLU;~OMU`gAX}R(Qa*{vd#kLOzEzKGkiV z2<bFAtsICkBc{#XPpgHOk|W~@X#F}&PAfNCoJcd5)_&l|=!EdV!U8oxGZt_mu(JyV z*bNF;Ias&Dwk1*4(HY@^oN*sW^q6$zq6`(c=Qzqqq0_-S=iPKlc)+dx3)eGG34!is z3xQkdyqQP>fk%TS__~(O?ws&a@O0Fd$2qJYm}1u#3b0w62lLptVaPI_axItXtnfhI ztmgt0U<1Hw`TF&%by3+>#8?}p%h#>b!b{1Ucv*k~tbql=A#sxDTEWUSHixcEdLcYe z&}~Vf04u<CBK@w{1`W-5AC8^3a*Omvcqs*AzmyaG{4?&^UW_71lLcVq_M2Fqp-Oru zJm9R~?>RG{izIqX^hx`HR?x<RJNc{F*F9NDS2LCtdMUh=lHAXfseaE}TEW#g>xS4Z zlKk#uO0V3?RrFeTDJ8j|DTy92Mfjtw>sR++D`O4RSif&__wL;f(sKqOyp)m!2of2P z2%Q_bQ?l4VA_MCz8kF!-DiB~wtjCGEw;%el-=Eu0?v~7#SU}8H=IY*w478PRkitu; zP=Ejlfmr4i@zdt!=4soL1gS;SSnU^?$7(pLSVlkAV>;yC*+C00<@M{=x712aq*&V9 z0<0i5>^y}S_0LS2vW!?Dcx!757VNqn5L;By189-K#Be?+yam!MsJ^Y^Cj0?*QPMvz zk+~@G9+vU5dlj`pI43{-^wZfos|joM&p-dntdkb2xAl9l)9zTm<7d2g|DLhFAJ_SB zQ_l3yoa*cJ-o1ODgv_Au*5Ib7+>z?7U|)%4z69f2u7h(G3eQ7YjMuln)odv`hui-U z^-jcZpM|W2!VAFl9Ks4xgpO2f`WiEKvqRzKWGT%a$*_p^K=0%UEn7Y)yb?fSLoMJf zJ&=@%q+pL?3&Dn>u{%C6W-AVbR{>6lzbpx{ih5WT%<7MDAt|)#pzvw}Ng5U5bxqVj zgptgJ*rXsKrbOno#Zz^gvFh?EUB`N$@EQiz@%;RJyt%pgGeo&ibK6c2{0w6~2_4kS v&fGY>ros|uz3~1_Yl5G(aGubLHOv12Q_N_S^AQ~G00000NkvXXu0mjfl%Pf{ literal 0 HcmV?d00001 diff --git a/src/assets/images/yarn.lock b/src/assets/images/yarn.lock new file mode 100644 index 000000000..1f192c246 --- /dev/null +++ b/src/assets/images/yarn.lock @@ -0,0 +1,7 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +moving-average@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/moving-average/-/moving-average-1.0.0.tgz#b1247ba8dd2d7927c619f1eac8036cf933d65adc" diff --git a/src/react-components/ui-root.js b/src/react-components/ui-root.js index 61dda7b6f..ed6b4e2d7 100644 --- a/src/react-components/ui-root.js +++ b/src/react-components/ui-root.js @@ -8,6 +8,7 @@ import { SCHEMA } from "../storage/store"; import MobileDetect from 'mobile-detect'; import { IntlProvider, FormattedMessage, addLocaleData } from 'react-intl'; import en from 'react-intl/locale-data/en'; +import MovingAverage from 'moving-average'; const mobiledetect = new MobileDetect(navigator.userAgent); @@ -175,6 +176,7 @@ class UIRoot extends Component { this.setupTestTone(); this.props.concurrentLoadDetector.addEventListener("concurrentload", this.onConcurrentLoad); this.handleForcedVREntryType(); + this.micLevelMovingAverage = MovingAverage(200); this.props.scene.addEventListener("loaded", this.onSceneLoaded); } @@ -365,7 +367,9 @@ class UIRoot extends Component { v = Math.max(levels[x] - 127, v); } - this.setState({ micLevel: v / 128.0 }) + const level = v / 128.0 ; + this.micLevelMovingAverage.push(Date.now(), level); + this.setState({ micLevel: this.micLevelMovingAverage.movingAverage() }) }, 50); this.setState({ mediaStream, micUpdateInterval }); @@ -446,29 +450,38 @@ class UIRoot extends Component { const selectedMicDeviceId = this.state.micDevices.filter(d => d.label === selectedMicLabel).map(d => d.deviceId)[0]; + const maxLevelHeight = 111; + const micClip = { clip: `rect(${maxLevelHeight - Math.floor(this.state.micLevel * maxLevelHeight)}px, 111px, 111px, 0px)` }; + const speakerClip = { clip: `rect(${this.state.tonePlaying ? 0 : maxLevelHeight}px, 111px, 111px, 0px)` }; + const audioSetupPanel = this.state.entryStep === ENTRY_STEPS.audio_setup ? ( <div className="audio-setup-panel"> - <div className="audio-setup-panel--title"> + <div className="audio-setup-panel__title"> <FormattedMessage id="audio.title"/> </div> - <div className="audio-setup-panel--subtitle"> + <div className="audio-setup-panel__subtitle"> { mobiledetect.mobile() || this.state.enterInVR && (<FormattedMessage id={ mobiledetect.mobile() ? "audio.subtitle-mobile" : "audio.subtitle-desktop" }/>) } </div> - <div className="audio-setup-panel--device-chooser"> - <select className="audio-setup-panel--device-chooser--dropdown" value={selectedMicDeviceId} onChange={this.micDeviceChanged}> + <div className="audio-setup-panel__levels"> + <div className="audio-setup-panel__levels__mic"> + <img src="./src/assets/images/mic_level.png" srcSet="mic_level@2x.png 2x" className="audio-setup-panel__levels__mic_icon"/> + <img src="./src/assets/images/level_fill.png" srcSet="level_fill@2x.png 2x" className="audio-setup-panel__levels__level" style={ micClip }/> + </div> + <div className="audio-setup-panel__levels__speaker"> + <img src="./src/assets/images/speaker_level.png" srcSet="speaker_level@2x.png 2x" className="audio-setup-panel__levels__speaker_icon"/> + <img src="./src/assets/images/level_fill.png" srcSet="level_fill@2x.png 2x" className="audio-setup-panel__levels__level" style={ speakerClip }/> + </div> + </div> + <div className="audio-setup-panel__device-chooser"> + <select className="audio-setup-panel__device-chooser__dropdown" value={selectedMicDeviceId} onChange={this.micDeviceChanged}> { this.state.micDevices.map(d => (<option key={ d.deviceId } value={ d.deviceId }> {d.label}</option>)) } </select> - <div className="audio-setup-panel--device-chooser--mic-icon"> - <img src="./src/assets/images/mic_small.png"/> + <div className="audio-setup-panel__device-chooser__mic-icon"> + <img src="./src/assets/images/mic_small.png" srcSet="mic_small@2x.png 2x"/> </div> </div> - <br/> - { this.state.tonePlaying && (<div>Tone</div>) } - <br/> - { this.state.micLevel } - <br/> - <div className="audio-setup-panel--enter-button" onClick={this.onAudioReadyButton}> + <div className="audio-setup-panel__enter-button" onClick={this.onAudioReadyButton}> <FormattedMessage id="audio.enter-now"/> </div> </div> diff --git a/src/room.scss b/src/room.scss index 75a99a2dd..10386c8e6 100644 --- a/src/room.scss +++ b/src/room.scss @@ -225,16 +225,16 @@ $darker-grey: rgba(64, 64, 64, 1.0); align-items: center; } -.audio-setup-panel--title { +.audio-setup-panel__title { font-size: 1.3em; } -.audio-setup-panel--subtitle { +.audio-setup-panel__subtitle { font-size: 1.0em; padding-top: 4px; } -.audio-setup-panel--device-chooser { +.audio-setup-panel__device-chooser { display: flex; flex-direction: column; justify-content: center; @@ -242,11 +242,11 @@ $darker-grey: rgba(64, 64, 64, 1.0); position: relative; } -.audio-setup-panel--enter-button { +.audio-setup-panel__enter-button { @extend %bottom-button; } -.audio-setup-panel--device-chooser--dropdown { +.audio-setup-panel__device-chooser__dropdown { @extend %rounded-border; @extend %default-font; @@ -257,8 +257,52 @@ $darker-grey: rgba(64, 64, 64, 1.0); width: 90%; } -.audio-setup-panel--device-chooser--mic-icon { +.audio-setup-panel__device-chooser__mic-icon { position: absolute; left: 7.5%; top: 10px; } + +.audio-setup-panel__levels { + margin-top: 20px; + margin-bottom: 20px; + display: flex; + justify-content: space-evenly; + align-items: center; + width: 100%; +} + +.audio-setup-panel__levels__mic { + position:relative; + width: 111px; + height: 111px; +} + +.audio-setup-panel__levels__mic_icon { + position: absolute; + top: 0; + left: 0; + z-index: 2; +} + +.audio-setup-panel__levels__speaker { + position:relative; + width: 111px; + height: 111px; +} + +.audio-setup-panel__levels__speaker_icon { + position: absolute; + top: 0; + left: 0; + z-index: 2; +} + +.audio-setup-panel__levels__level { + position: absolute; + top: 0; + left: 0; + opacity: 1.0; + z-index: 1; +} + diff --git a/yarn.lock b/yarn.lock index 553764888..427f56fd9 100644 --- a/yarn.lock +++ b/yarn.lock @@ -5113,6 +5113,10 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" +moving-average@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/moving-average/-/moving-average-1.0.0.tgz#b1247ba8dd2d7927c619f1eac8036cf933d65adc" + ms@0.7.1: version "0.7.1" resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.1.tgz#9cd13c03adbff25b65effde7ce864ee952017098" -- GitLab