Volume slider for remote participant audio elements
This commit is contained in:
parent
6a3e4bb59f
commit
02b26a65bb
|
@ -23,7 +23,8 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
// Link Appearance
|
// Link Appearance
|
||||||
&__link {
|
&__link,
|
||||||
|
&__contents {
|
||||||
display: block;
|
display: block;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
text-decoration: none;
|
text-decoration: none;
|
||||||
|
@ -40,11 +41,16 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&__text {
|
&__text,
|
||||||
|
&__slider {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
&__slider {
|
||||||
|
width: 50px;
|
||||||
|
}
|
||||||
|
|
||||||
&__icon {
|
&__icon {
|
||||||
vertical-align: middle;
|
vertical-align: middle;
|
||||||
position: relative;
|
position: relative;
|
||||||
|
|
|
@ -28,6 +28,7 @@ function RemoteVideo(user, VideoLayout, emitter) {
|
||||||
this.emitter = emitter;
|
this.emitter = emitter;
|
||||||
this.videoSpanId = `participant_${this.id}`;
|
this.videoSpanId = `participant_${this.id}`;
|
||||||
SmallVideo.call(this, VideoLayout);
|
SmallVideo.call(this, VideoLayout);
|
||||||
|
this._audioStreamElement = null;
|
||||||
this.hasRemoteVideoMenu = false;
|
this.hasRemoteVideoMenu = false;
|
||||||
this._supportsRemoteControl = false;
|
this._supportsRemoteControl = false;
|
||||||
this.addRemoteVideoContainer();
|
this.addRemoteVideoContainer();
|
||||||
|
@ -200,6 +201,18 @@ RemoteVideo.prototype._generatePopupContent = function () {
|
||||||
popupmenuElement.appendChild(menuItem);
|
popupmenuElement.appendChild(menuItem);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// feature check for volume setting as temasys objects cannot adjust volume
|
||||||
|
if (this._canSetAudioVolume()) {
|
||||||
|
const volumeScale = 100;
|
||||||
|
const volumeSlider = this._generatePopupMenuSliderItem({
|
||||||
|
handler: this._setAudioVolume.bind(this, volumeScale),
|
||||||
|
icon: 'icon-volume',
|
||||||
|
initialValue: this._getAudioElement().volume * volumeScale,
|
||||||
|
maxValue: volumeScale
|
||||||
|
});
|
||||||
|
popupmenuElement.appendChild(volumeSlider);
|
||||||
|
}
|
||||||
|
|
||||||
APP.translation.translateElement($(popupmenuElement));
|
APP.translation.translateElement($(popupmenuElement));
|
||||||
|
|
||||||
return popupmenuElement;
|
return popupmenuElement;
|
||||||
|
@ -343,6 +356,74 @@ RemoteVideo.prototype._generatePopupMenuItem = function (opts = {}) {
|
||||||
return menuItem;
|
return menuItem;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a div element with a slider.
|
||||||
|
*
|
||||||
|
* @param {object} options - Configuration for the div's display and slider.
|
||||||
|
* @param {string} options.icon - The classname for the icon to display.
|
||||||
|
* @param {int} options.maxValue - The maximum value on the slider. The default
|
||||||
|
* value is 100.
|
||||||
|
* @param {int} options.initialValue - The value the slider should start at.
|
||||||
|
* The default value is 0.
|
||||||
|
* @param {function} options.handler - The callback for slider value changes.
|
||||||
|
* @returns {Element} A div element with a slider.
|
||||||
|
*/
|
||||||
|
RemoteVideo.prototype._generatePopupMenuSliderItem = function (options) {
|
||||||
|
const template = `<div class='popupmenu__contents'>
|
||||||
|
<span class='popupmenu__icon'>
|
||||||
|
<i class=${options.icon}></i>
|
||||||
|
</span>
|
||||||
|
<input class='popupmenu__slider'
|
||||||
|
type='range'
|
||||||
|
min='0'
|
||||||
|
max=${options.maxValue || 100}
|
||||||
|
value=${options.initialValue || 0}>
|
||||||
|
</input>
|
||||||
|
</div>`;
|
||||||
|
|
||||||
|
const menuItem = document.createElement('li');
|
||||||
|
menuItem.className = 'popupmenu__item';
|
||||||
|
menuItem.innerHTML = template;
|
||||||
|
|
||||||
|
const slider = menuItem.getElementsByClassName('popupmenu__slider')[0];
|
||||||
|
slider.oninput = function () {
|
||||||
|
options.handler(Number(slider.value));
|
||||||
|
};
|
||||||
|
|
||||||
|
return menuItem;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the remote participant's audio element.
|
||||||
|
*
|
||||||
|
* @returns {Element} audio element
|
||||||
|
*/
|
||||||
|
RemoteVideo.prototype._getAudioElement = function () {
|
||||||
|
return this._audioStreamElement;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if the remote participant's audio can have its volume adjusted.
|
||||||
|
*
|
||||||
|
* @returns {boolean} true if the volume can be adjusted.
|
||||||
|
*/
|
||||||
|
RemoteVideo.prototype._canSetAudioVolume = function () {
|
||||||
|
const audioElement = this._getAudioElement();
|
||||||
|
return audioElement && audioElement.volume !== undefined;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Change the remote participant's volume level.
|
||||||
|
*
|
||||||
|
* @param {int} scale - The maximum value the slider can go to.
|
||||||
|
* @param {int} newVal - The value to set the slider to.
|
||||||
|
*/
|
||||||
|
RemoteVideo.prototype._setAudioVolume = function (scale, newVal) {
|
||||||
|
if (this._canSetAudioVolume()) {
|
||||||
|
this._getAudioElement().volume = newVal / scale;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Updates the remote video menu.
|
* Updates the remote video menu.
|
||||||
*
|
*
|
||||||
|
@ -613,6 +694,10 @@ RemoteVideo.prototype.addRemoteStreamElement = function (stream) {
|
||||||
}
|
}
|
||||||
|
|
||||||
$(streamElement).click(onClickHandler);
|
$(streamElement).click(onClickHandler);
|
||||||
|
|
||||||
|
if (!isVideo) {
|
||||||
|
this._audioStreamElement = streamElement;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Loading…
Reference in New Issue