Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 Polymer({ | 5 Polymer({ |
| 6 is: 'audio-player', | 6 is: 'audio-player', |
| 7 | 7 |
| 8 listeners: { | 8 listeners: { |
| 9 'toggle-pause-event': 'onTogglePauseEvent_', | 9 'toggle-pause-event': 'onTogglePauseEvent_', |
| 10 'small-forward-skip-event': 'onSmallForwardSkipEvent_', | 10 'small-forward-skip-event': 'onSmallForwardSkipEvent_', |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 34 | 34 |
| 35 /** | 35 /** |
| 36 * Whether the shuffle button is ON. | 36 * Whether the shuffle button is ON. |
| 37 */ | 37 */ |
| 38 shuffle: { | 38 shuffle: { |
| 39 type: Boolean, | 39 type: Boolean, |
| 40 notify: true | 40 notify: true |
| 41 }, | 41 }, |
| 42 | 42 |
| 43 /** | 43 /** |
| 44 * Whether the repeat button is ON. | 44 * What mode the repeat button idicates. |
| 45 * repeat-modes can be "repeat-none", "repeat-all", "repeat-one". | |
| 45 */ | 46 */ |
| 46 repeat: { | 47 repeat: { |
| 47 type: Boolean, | 48 type: String, |
| 48 notify: true | 49 notify: true |
| 49 }, | 50 }, |
| 50 | 51 |
| 51 /** | 52 /** |
| 52 * The audio volume. 0 is silent, and 100 is maximum loud. | 53 * The audio volume. 0 is silent, and 100 is maximum loud. |
| 53 */ | 54 */ |
| 54 volume: { | 55 volume: { |
| 55 type: Number, | 56 type: Number, |
| 56 notify: true | 57 notify: true |
| 57 }, | 58 }, |
| (...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 199 | 200 |
| 200 if (this.$.audio.readyState !== 0) | 201 if (this.$.audio.readyState !== 0) |
| 201 this.$.audio.currentTime = this.time / 1000; | 202 this.$.audio.currentTime = this.time / 1000; |
| 202 }, | 203 }, |
| 203 | 204 |
| 204 /** | 205 /** |
| 205 * Invoked when the next button in the controller is clicked. | 206 * Invoked when the next button in the controller is clicked. |
| 206 * This handler is registered in the 'on-click' attribute of the element. | 207 * This handler is registered in the 'on-click' attribute of the element. |
| 207 */ | 208 */ |
| 208 onControllerNextClicked: function() { | 209 onControllerNextClicked: function() { |
| 209 this.advance_(true /* forward */, true /* repeat */); | 210 this.advance_(true /* forward */, "repeat-all"); |
| 210 }, | 211 }, |
| 211 | 212 |
| 212 /** | 213 /** |
| 213 * Invoked when the previous button in the controller is clicked. | 214 * Invoked when the previous button in the controller is clicked. |
| 214 * This handler is registered in the 'on-click' attribute of the element. | 215 * This handler is registered in the 'on-click' attribute of the element. |
| 215 */ | 216 */ |
| 216 onControllerPreviousClicked: function() { | 217 onControllerPreviousClicked: function() { |
| 217 this.advance_(false /* forward */, true /* repeat */); | 218 this.advance_(false /* forward */, "repeat-all"); |
| 218 }, | 219 }, |
| 219 | 220 |
| 220 /** | 221 /** |
| 221 * Invoked when the playback in the audio element is ended. | 222 * Invoked when the playback in the audio element is ended. |
| 222 * This handler is registered in this.ready(). | 223 * This handler is registered in this.ready(). |
| 223 */ | 224 */ |
| 224 onAudioEnded: function() { | 225 onAudioEnded: function() { |
| 225 this.playcount++; | 226 this.playcount++; |
| 226 this.advance_(true /* forward */, this.repeat); | 227 this.advance_(true /* forward */, this.repeat); |
| 227 }, | 228 }, |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 260 // Changes the current time back to the beginning, regardless of the current | 261 // Changes the current time back to the beginning, regardless of the current |
| 261 // status (playing or paused). | 262 // status (playing or paused). |
| 262 this.$.audio.currentTime = 0; | 263 this.$.audio.currentTime = 0; |
| 263 this.time = 0; | 264 this.time = 0; |
| 264 this.$.audio.play(); | 265 this.$.audio.play(); |
| 265 }, | 266 }, |
| 266 | 267 |
| 267 /** | 268 /** |
| 268 * Goes to the previous or the next track. | 269 * Goes to the previous or the next track. |
| 269 * @param {boolean} forward True if next, false if previous. | 270 * @param {boolean} forward True if next, false if previous. |
| 270 * @param {boolean} repeat True if repeat-mode is enabled. False otherwise. | 271 * @param {string} repeatMode Repeat mode name. |
| 271 * @private | 272 * @private |
| 272 */ | 273 */ |
| 273 advance_: function(forward, repeat) { | 274 advance_: function(forward, repeatMode) { |
|
fukino
2016/09/02 12:11:48
I think we don't need to change this advance_ func
harukam
2016/09/05 04:35:03
scheduleAutoAdvance_ is called only when error hap
fukino
2016/09/05 11:44:13
I think this should work:
1) On onAudioEnded, we r
harukam
2016/09/09 04:54:50
OK. Thanks.
| |
| 275 console.assert(repeatMode == "repeat-none" || repeatMode === "repeat-all" || | |
| 276 repeatMode == "repeat-one"); | |
| 277 | |
| 274 this.cancelAutoAdvance_(); | 278 this.cancelAutoAdvance_(); |
| 275 | 279 |
| 280 if(repeatMode === "repeat-one") { | |
| 281 this.playing = true; | |
| 282 this.$.audio.currentTime = 0; | |
| 283 this.$.trackList.fire('current-track-index-changed'); | |
|
harukam
2016/09/02 11:27:27
Question, do you think this line is necessary?
Acc
fukino
2016/09/02 12:11:48
According to https://codereview.chromium.org/16818
harukam
2016/09/05 04:35:03
Thanks for the link. It works without the event fi
fukino
2016/09/05 11:44:13
Maybe we can drop the current-track-index-changed
harukam
2016/09/09 04:54:50
Acknowledged.
| |
| 284 return; | |
| 285 } | |
| 286 | |
| 287 var repeat = repeatMode === "repeat-all"; | |
| 276 var nextTrackIndex = this.$.trackList.getNextTrackIndex(forward, true); | 288 var nextTrackIndex = this.$.trackList.getNextTrackIndex(forward, true); |
| 277 var isNextTrackAvailable = | 289 var isNextTrackAvailable = |
| 278 (this.$.trackList.getNextTrackIndex(forward, repeat) !== -1); | 290 (this.$.trackList.getNextTrackIndex(forward, repeat) !== -1); |
| 279 | 291 |
| 280 this.playing = isNextTrackAvailable; | 292 this.playing = isNextTrackAvailable; |
| 281 | 293 |
| 282 var shouldFireEvent = this.$.trackList.currentTrackIndex === nextTrackIndex; | 294 var shouldFireEvent = this.$.trackList.currentTrackIndex === nextTrackIndex; |
| 283 this.$.trackList.currentTrackIndex = nextTrackIndex; | 295 this.$.trackList.currentTrackIndex = nextTrackIndex; |
| 284 this.$.audio.currentTime = 0; | 296 this.$.audio.currentTime = 0; |
| 285 // If the next track and current track is the same, | 297 // If the next track and current track is the same, |
| 286 // the event will not be fired. | 298 // the event will not be fired. |
| 287 // So we will fire the event here. | 299 // So we will fire the event here. |
| 288 // This happenes if there is only one song. | 300 // This happenes if there is only one song. |
| 289 if (shouldFireEvent) { | 301 if (shouldFireEvent) { |
| 290 this.$.trackList.fire('current-track-index-changed'); | 302 this.$.trackList.fire('current-track-index-changed'); |
| 291 } | 303 } |
| 292 }, | 304 }, |
| 293 | 305 |
| 294 /** | 306 /** |
| 295 * Timeout ID of auto advance. Used internally in scheduleAutoAdvance_() and | 307 * Timeout ID of auto advance. Used internally in scheduleAutoAdvance_() and |
| 296 * cancelAutoAdvance_(). | 308 * cancelAutoAdvance_(). |
| 297 * @type {number?} | 309 * @type {number?} |
| 298 * @private | 310 * @private |
| 299 */ | 311 */ |
| 300 autoAdvanceTimer_: null, | 312 autoAdvanceTimer_: null, |
| 301 | 313 |
| 302 /** | 314 /** |
| 303 * Schedules automatic advance to the next track after a timeout. | 315 * Schedules automatic advance to the next track after a timeout. |
| 304 * @param {boolean} forward True if next, false if previous. | 316 * @param {boolean} forward True if next, false if previous. |
| 305 * @param {boolean} repeat True if repeat-mode is enabled. False otherwise. | 317 * @param {string} repeatMode Repeat mode name. |
| 306 * @private | 318 * @private |
| 307 */ | 319 */ |
| 308 scheduleAutoAdvance_: function(forward, repeat) { | 320 scheduleAutoAdvance_: function(forward, repeatMode) { |
| 309 this.cancelAutoAdvance_(); | 321 this.cancelAutoAdvance_(); |
| 310 var currentTrackIndex = this.currentTrackIndex; | 322 var currentTrackIndex = this.currentTrackIndex; |
| 311 | 323 |
| 312 var timerId = setTimeout( | 324 var timerId = setTimeout( |
| 313 function() { | 325 function() { |
| 314 // If the other timer is scheduled, do nothing. | 326 // If the other timer is scheduled, do nothing. |
| 315 if (this.autoAdvanceTimer_ !== timerId) | 327 if (this.autoAdvanceTimer_ !== timerId) |
| 316 return; | 328 return; |
| 317 | 329 |
| 318 this.autoAdvanceTimer_ = null; | 330 this.autoAdvanceTimer_ = null; |
| 319 | 331 |
| 320 // If the track has been changed since the advance was scheduled, do | 332 // If the track has been changed since the advance was scheduled, do |
| 321 // nothing. | 333 // nothing. |
| 322 if (this.currentTrackIndex !== currentTrackIndex) | 334 if (this.currentTrackIndex !== currentTrackIndex) |
| 323 return; | 335 return; |
| 324 | 336 |
| 325 // We are advancing only if the next track is not known to be invalid. | 337 // We are advancing only if the next track is not known to be invalid. |
| 326 // This prevents an endless auto-advancing in the case when all tracks | 338 // This prevents an endless auto-advancing in the case when all tracks |
| 327 // are invalid (we will only visit each track once). | 339 // are invalid (we will only visit each track once). |
| 328 this.advance_(forward, repeat); | 340 this.advance_(forward, repeatMode); |
| 329 }.bind(this), | 341 }.bind(this), |
| 330 3000); | 342 3000); |
| 331 | 343 |
| 332 this.autoAdvanceTimer_ = timerId; | 344 this.autoAdvanceTimer_ = timerId; |
| 333 }, | 345 }, |
| 334 | 346 |
| 335 /** | 347 /** |
| 336 * Cancels the scheduled auto advance. | 348 * Cancels the scheduled auto advance. |
| 337 * @private | 349 * @private |
| 338 */ | 350 */ |
| (...skipping 147 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 486 }, | 498 }, |
| 487 | 499 |
| 488 /** | 500 /** |
| 489 * Big skip backword. | 501 * Big skip backword. |
| 490 * @private | 502 * @private |
| 491 */ | 503 */ |
| 492 onBigBackwordSkipEvent_: function(event) { | 504 onBigBackwordSkipEvent_: function(event) { |
| 493 this.$.audioController.bigSkip(false); | 505 this.$.audioController.bigSkip(false); |
| 494 }, | 506 }, |
| 495 }); | 507 }); |
| OLD | NEW |