Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

JitsiLocalTrack.js 3.3KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. var JitsiTrack = require("./JitsiTrack");
  2. var StreamEventTypes = require("../../service/RTC/StreamEventTypes");
  3. var RTCEvents = require("../../service/RTC/RTCEvents");
  4. /**
  5. * Represents a single media track (either audio or video).
  6. * @constructor
  7. */
  8. function JitsiLocalTrack(RTC, stream, eventEmitter, videoType, isGUMStream)
  9. {
  10. JitsiTrack.call(this, RTC, stream);
  11. this.eventEmitter = eventEmitter;
  12. this.videoType = videoType;
  13. this.isGUMStream = true;
  14. if(isGUMStream === false)
  15. this.isGUMStream = isGUMStream;
  16. this.stream.onended = function () {
  17. this.eventEmitter.emit(StreamEventTypes.EVENT_TYPE_LOCAL_ENDED, this);
  18. }.bind(this);
  19. }
  20. JitsiLocalTrack.prototype = Object.create(JitsiTrack.prototype);
  21. JitsiLocalTrack.prototype.constructor = JitsiLocalTrack;
  22. /**
  23. * Mutes / unmutes the track.
  24. * @param mute {boolean} if true the track will be muted. Otherwise the track will be unmuted.
  25. */
  26. JitsiLocalTrack.prototype._setMute = function (mute) {
  27. var isAudio = this.type === JitsiTrack.AUDIO;
  28. var eventType = isAudio ? RTCEvents.AUDIO_MUTE : RTCEvents.VIDEO_MUTE;
  29. if ((window.location.protocol != "https:" && this.isGUMStream) ||
  30. (isAudio && this.isGUMStream) || this.videoType === "screen" ||
  31. // FIXME FF does not support 'removeStream' method used to mute
  32. RTCBrowserType.isFirefox()) {
  33. var tracks = this._getTracks();
  34. for (var idx = 0; idx < tracks.length; idx++) {
  35. tracks[idx].enabled = !mute;
  36. }
  37. if(isAudio)
  38. this.rtc.room.setAudioMute(mute);
  39. else
  40. this.rtc.room.setVideoMute(mute);
  41. this.eventEmitter.emit(eventType, mute);
  42. } else {
  43. if (mute) {
  44. this.rtc.room.removeStream(this.stream);
  45. this.stream.stop();
  46. if(isAudio)
  47. this.rtc.room.setAudioMute(mute);
  48. else
  49. this.rtc.room.setVideoMute(mute);
  50. this.eventEmitter.emit(eventType, true);
  51. } else {
  52. var self = this;
  53. this.rtc.obtainAudioAndVideoPermissions(
  54. {devices: (this.isAudioStream() ? ["audio"] : ["video"])})
  55. .then(function (stream) {
  56. if (isAudio) {
  57. self.rtc.changeLocalAudio(stream,
  58. function () {
  59. this.rtc.room.setAudioMute(mute);
  60. self.eventEmitter.emit(eventType, false);
  61. });
  62. } else {
  63. self.rtc.changeLocalVideo(stream, false,
  64. function () {
  65. this.rtc.room.setVideoMute(mute);
  66. self.eventEmitter.emit(eventType, false);
  67. });
  68. }
  69. });
  70. }
  71. }
  72. }
  73. /**
  74. * Stops sending the media track. And removes it from the HTML.
  75. * NOTE: Works for local tracks only.
  76. */
  77. JitsiLocalTrack.prototype.stop = function () {
  78. this.rtc.room.removeStream(this.stream);
  79. this.stream.stop();
  80. this.detach();
  81. }
  82. /**
  83. * Starts sending the track.
  84. * NOTE: Works for local tracks only.
  85. */
  86. JitsiLocalTrack.prototype.start = function() {
  87. this.rtc.room.addStream(this.stream, function () {});
  88. }
  89. module.exports = JitsiLocalTrack;