Преглед изворни кода

Adds audio levels for the active speaker avatar.

j8
fo пре 11 година
родитељ
комит
b6a665e007
5 измењених фајлова са 70 додато и 14 уклоњено
  1. 50
    7
      audio_levels.js
  2. 1
    0
      avatar.js
  3. 8
    0
      css/videolayout_default.css
  4. 5
    4
      index.html
  5. 6
    3
      videolayout.js

+ 50
- 7
audio_levels.js Прегледај датотеку

@@ -21,7 +21,7 @@ var AudioLevels = (function(my) {
21 21
             videoSpanId = 'participant_' + resourceJid;
22 22
         }
23 23
 
24
-        videoSpan = document.getElementById(videoSpanId);
24
+        var videoSpan = document.getElementById(videoSpanId);
25 25
 
26 26
         if (!videoSpan) {
27 27
             if (resourceJid)
@@ -35,8 +35,7 @@ var AudioLevels = (function(my) {
35 35
         var audioLevelCanvas = $('#' + videoSpanId + '>canvas');
36 36
 
37 37
         var videoSpaceWidth = $('#remoteVideos').width();
38
-        var thumbnailSize
39
-            = VideoLayout.calculateThumbnailSize(videoSpaceWidth);
38
+        var thumbnailSize = VideoLayout.calculateThumbnailSize(videoSpaceWidth);
40 39
         var thumbnailWidth = thumbnailSize[0];
41 40
         var thumbnailHeight = thumbnailSize[1];
42 41
 
@@ -84,6 +83,50 @@ var AudioLevels = (function(my) {
84 83
         drawContext.clearRect (0, 0,
85 84
                 audioLevelCanvas.width, audioLevelCanvas.height);
86 85
         drawContext.drawImage(canvasCache, 0, 0);
86
+
87
+        if(resourceJid === AudioLevels.LOCAL_LEVEL) {
88
+            resourceJid = Strophe.getResourceFromJid(connection.emuc.myroomjid);
89
+        }
90
+
91
+        if(resourceJid  === VideoLayout.getLargeVideoState().userResourceJid) {
92
+            AudioLevels.updateActiveSpeakerAudioLevel(audioLevel);
93
+        }
94
+    };
95
+
96
+    my.updateActiveSpeakerAudioLevel = function(audioLevel) {
97
+        var drawContext = $('#activeSpeakerAudioLevel')[0].getContext('2d');
98
+        var r = interfaceConfig.ACTIVE_SPEAKER_AVATAR_SIZE / 2;
99
+        var center = (interfaceConfig.ACTIVE_SPEAKER_AVATAR_SIZE + r) / 2;
100
+
101
+        // Save the previous state of the context.
102
+        drawContext.save();
103
+
104
+        drawContext.clearRect(0, 0, 300, 300);
105
+
106
+        // Draw a circle.
107
+        drawContext.arc(center, center, r, 0, 2 * Math.PI);
108
+
109
+        // Add a shadow around the circle
110
+        drawContext.shadowColor = interfaceConfig.SHADOW_COLOR;
111
+        drawContext.shadowBlur = getShadowLevel(audioLevel);
112
+        drawContext.shadowOffsetX = 0;
113
+        drawContext.shadowOffsetY = 0;
114
+
115
+        // Fill the shape.
116
+        drawContext.fill();
117
+
118
+        drawContext.save();
119
+
120
+        drawContext.restore();
121
+
122
+
123
+        drawContext.arc(center, center, r, 0, 2 * Math.PI);
124
+
125
+        drawContext.clip();
126
+        drawContext.clearRect(0, 0, 277, 200);
127
+
128
+        // Restore the previous context state.
129
+        drawContext.restore();
87 130
     };
88 131
 
89 132
     /**
@@ -94,7 +137,7 @@ var AudioLevels = (function(my) {
94 137
                                     thumbnailHeight) {
95 138
         audioLevelCanvas.width = thumbnailWidth + interfaceConfig.CANVAS_EXTRA;
96 139
         audioLevelCanvas.height = thumbnailHeight + interfaceConfig.CANVAS_EXTRA;
97
-    };
140
+    }
98 141
 
99 142
     /**
100 143
      * Draws the audio level canvas into the cached canvas object.
@@ -143,7 +186,7 @@ var AudioLevels = (function(my) {
143 186
                 interfaceConfig.CANVAS_RADIUS,
144 187
                 interfaceConfig.SHADOW_COLOR,
145 188
                 shadowLevel);
146
-    };
189
+    }
147 190
 
148 191
     /**
149 192
      * Returns the shadow/glow level for the given audio level.
@@ -164,7 +207,7 @@ var AudioLevels = (function(my) {
164 207
             shadowLevel = Math.round(interfaceConfig.CANVAS_EXTRA/2*((audioLevel - 0.6) / 0.4));
165 208
         }
166 209
         return shadowLevel;
167
-    };
210
+    }
168 211
 
169 212
     /**
170 213
      * Returns the video span id corresponding to the given resourceJid or local
@@ -180,7 +223,7 @@ var AudioLevels = (function(my) {
180 223
             videoSpanId = 'participant_' + resourceJid;
181 224
 
182 225
         return videoSpanId;
183
-    };
226
+    }
184 227
 
185 228
     /**
186 229
      * Indicates that the remote video has been resized.

+ 1
- 0
avatar.js Прегледај датотеку

@@ -78,6 +78,7 @@ var Avatar = (function(my) {
78 78
             if (activeSpeakerJid === jid && VideoLayout.isLargeVideoOnTop()) {
79 79
                 setVisibility($("#largeVideo"), !show);
80 80
                 setVisibility($('#activeSpeakerAvatar'), show);
81
+                setVisibility($('#activeSpeakerAudioLevel'), show);
81 82
                 setVisibility(avatar, false);
82 83
                 setVisibility(video, false);
83 84
             } else {

+ 8
- 0
css/videolayout_default.css Прегледај датотеку

@@ -377,6 +377,13 @@
377 377
     pointer-events: none;
378 378
 }
379 379
 
380
+#activeSpeakerAudioLevel {
381
+    visibility: hidden;
382
+    position: absolute;
383
+    top: 113px;
384
+    z-index: 1;
385
+}
386
+
380 387
 #mixedstream {
381 388
     display:none !important;
382 389
 }
@@ -388,6 +395,7 @@
388 395
     margin: auto;
389 396
     position: relative;
390 397
     border-radius: 50px;
398
+    z-index: 2;
391 399
 }
392 400
 
393 401
 .userAvatar {

+ 5
- 4
index.html Прегледај датотеку

@@ -49,12 +49,12 @@
49 49
     <script src="analytics.js?v=1"></script><!-- google analytics plugin -->
50 50
     <script src="rtp_sts.js?v=5"></script><!-- RTP stats processing -->
51 51
     <script src="local_sts.js?v=2"></script><!-- Local stats processing -->
52
-    <script src="videolayout.js?v=29"></script><!-- video ui -->
52
+    <script src="videolayout.js?v=30"></script><!-- video ui -->
53 53
     <script src="connectionquality.js?v=1"></script>
54 54
     <script src="toolbar.js?v=6"></script><!-- toolbar ui -->
55 55
     <script src="toolbar_toggler.js?v=2"></script>
56 56
     <script src="canvas_util.js?v=1"></script><!-- canvas drawing utils -->
57
-    <script src="audio_levels.js?v=2"></script><!-- audio levels plugin -->
57
+    <script src="audio_levels.js?v=3"></script><!-- audio levels plugin -->
58 58
     <script src="media_stream.js?v=2"></script><!-- media stream -->
59 59
     <script src="bottom_toolbar.js?v=6"></script><!-- media stream -->
60 60
     <script src="moderator.js?v=2"></script><!-- media stream -->
@@ -66,11 +66,11 @@
66 66
     <script src="message_handler.js?v=2"></script>
67 67
     <script src="api_connector.js?v=2"></script>
68 68
     <script src="settings_menu.js?v=1"></script>
69
-    <script src="avatar.js?v=1"></script><!-- avatars -->
69
+    <script src="avatar.js?v=2"></script><!-- avatars -->
70 70
     <link rel="stylesheet" href="css/font.css?v=6"/>
71 71
     <link rel="stylesheet" href="css/toastr.css?v=1">
72 72
     <link rel="stylesheet" type="text/css" media="screen" href="css/main.css?v=30"/>
73
-    <link rel="stylesheet" type="text/css" media="screen" href="css/videolayout_default.css?v=14" id="videolayout_default"/>
73
+    <link rel="stylesheet" type="text/css" media="screen" href="css/videolayout_default.css?v=15" id="videolayout_default"/>
74 74
     <link href="//netdna.bootstrapcdn.com/font-awesome/4.0.3/css/font-awesome.css" rel="stylesheet">
75 75
     <link rel="stylesheet" href="css/jquery-impromptu.css?v=4">
76 76
     <link rel="stylesheet" href="css/modaldialog.css?v=3">
@@ -265,6 +265,7 @@
265 265
                 <a target="_new"><div class="watermark rightwatermark"></div></a>
266 266
                 <a class="poweredby" href="http://jitsi.org" target="_new" >powered by jitsi.org</a>
267 267
                 <img id="activeSpeakerAvatar" src=""/>
268
+                <canvas id="activeSpeakerAudioLevel"></canvas>
268 269
                 <video id="largeVideo" autoplay oncontextmenu="return false;"></video>
269 270
             </div>
270 271
             <div id="remoteVideos">

+ 6
- 3
videolayout.js Прегледај датотеку

@@ -174,6 +174,7 @@ var VideoLayout = (function (my) {
174 174
         if (RTC.getVideoSrc($('#largeVideo')[0]) !== newSrc) {
175 175
 
176 176
             $('#activeSpeakerAvatar').css('visibility', 'hidden');
177
+            $('#activeSpeakerAudioLevel').css('visibility', 'hidden');
177 178
             // Due to the simulcast the localVideoSrc may have changed when the
178 179
             // fadeOut event triggers. In that case the getJidFromVideoSrc and
179 180
             // isVideoSrcDesktop methods will not function correctly.
@@ -1038,9 +1039,11 @@ var VideoLayout = (function (my) {
1038 1039
         $('#largeVideoContainer').width(availableWidth);
1039 1040
         $('#largeVideoContainer').height(availableHeight);
1040 1041
 
1041
-
1042
-        $('#activeSpeakerAvatar').css('top',
1043
-            (availableHeight - interfaceConfig.ACTIVE_SPEAKER_AVATAR_SIZE) / 2);
1042
+        var avatarSize = interfaceConfig.ACTIVE_SPEAKER_AVATAR_SIZE;
1043
+        var top = (availableHeight - avatarSize) / 2;
1044
+        $('#activeSpeakerAvatar').css('top', top);
1045
+        $('#activeSpeakerAudioLevel').css('top', top - avatarSize / 4);
1046
+        $('#activeSpeakerAudioLevel').css('left', availableWidth / 2 - avatarSize * 3 / 4);
1044 1047
 
1045 1048
         VideoLayout.resizeThumbnails();
1046 1049
     };

Loading…
Откажи
Сачувај