openvidu-browser: StreamManager#updatePublisherSpeakingEventsOptions

pull/370/head
pabloFuente 2019-12-10 14:14:54 +01:00
parent 61134c5b96
commit acdfef3e21
6 changed files with 43 additions and 8 deletions

View File

@ -614,7 +614,9 @@ export class OpenVidu {
* Set OpenVidu advanced configuration options. Currently `configuration` is an object with the following optional properties (see [[OpenViduAdvancedConfiguration]] for more details): * Set OpenVidu advanced configuration options. Currently `configuration` is an object with the following optional properties (see [[OpenViduAdvancedConfiguration]] for more details):
* - `iceServers`: set custom STUN/TURN servers to be used by OpenVidu Browser * - `iceServers`: set custom STUN/TURN servers to be used by OpenVidu Browser
* - `screenShareChromeExtension`: url to a custom screen share extension for Chrome to be used instead of the default one, based on ours [https://github.com/OpenVidu/openvidu-screen-sharing-chrome-extension](https://github.com/OpenVidu/openvidu-screen-sharing-chrome-extension) * - `screenShareChromeExtension`: url to a custom screen share extension for Chrome to be used instead of the default one, based on ours [https://github.com/OpenVidu/openvidu-screen-sharing-chrome-extension](https://github.com/OpenVidu/openvidu-screen-sharing-chrome-extension)
* - `publisherSpeakingEventsOptions`: custom configuration for the [[PublisherSpeakingEvent]] feature * - `publisherSpeakingEventsOptions`: custom configuration for the [[PublisherSpeakingEvent]] feature and the [StreamManagerEvent.streamAudioVolumeChange](/api/openvidu-browser/classes/streammanagerevent.html) feature
*
* Call this method to override previous values at any moment.
*/ */
setAdvancedConfiguration(configuration: OpenViduAdvancedConfiguration): void { setAdvancedConfiguration(configuration: OpenViduAdvancedConfiguration): void {
this.advancedConfiguration = configuration; this.advancedConfiguration = configuration;

View File

@ -188,6 +188,10 @@ export class Stream implements EventDispatcher {
* @hidden * @hidden
*/ */
volumeChangeEventEnabledOnce = false; volumeChangeEventEnabledOnce = false;
/**
* @hidden
*/
harkOptions;
/** /**
@ -768,8 +772,8 @@ export class Stream implements EventDispatcher {
private setSpeechEventIfNotExists(): boolean { private setSpeechEventIfNotExists(): boolean {
if (!!this.mediaStream) { if (!!this.mediaStream) {
if (!this.speechEvent) { if (!this.speechEvent) {
const harkOptions = this.session.openvidu.advancedConfiguration.publisherSpeakingEventsOptions || {}; const harkOptions = !!this.harkOptions ? this.harkOptions : (this.session.openvidu.advancedConfiguration.publisherSpeakingEventsOptions || {});
harkOptions.interval = (typeof harkOptions.interval === 'number') ? harkOptions.interval : 50; harkOptions.interval = (typeof harkOptions.interval === 'number') ? harkOptions.interval : 100;
harkOptions.threshold = (typeof harkOptions.threshold === 'number') ? harkOptions.threshold : -50; harkOptions.threshold = (typeof harkOptions.threshold === 'number') ? harkOptions.threshold : -50;
this.speechEvent = hark(this.mediaStream, harkOptions); this.speechEvent = hark(this.mediaStream, harkOptions);
} }

View File

@ -343,6 +343,33 @@ export class StreamManager implements EventDispatcher {
return video; return video;
} }
/**
* Updates the current configuration for the [[PublisherSpeakingEvent]] feature and the [StreamManagerEvent.streamAudioVolumeChange](/api/openvidu-browser/classes/streammanagerevent.html) feature for this specific
* StreamManager audio stream, overriding the global options set with [[OpenVidu.setAdvancedConfiguration]]. This way you can customize the audio events options
* for each specific StreamManager and change them dynamically.
*
* @param publisherSpeakingEventsOptions New options to be applied to this StreamManager's audio stream. It is an object which includes the following optional properties:
* - `interval`: (number) how frequently the analyser polls the audio stream to check if speaking has started/stopped or audio volume has changed. Default **100** (ms)
* - `threshold`: (number) the volume at which _publisherStartSpeaking_, _publisherStopSpeaking_ events will be fired. Default **-50** (dB)
*/
updatePublisherSpeakingEventsOptions(publisherSpeakingEventsOptions): void {
const currentHarkOptions = !!this.stream.harkOptions ? this.stream.harkOptions : (this.stream.session.openvidu.advancedConfiguration.publisherSpeakingEventsOptions || {});
const newInterval = (typeof publisherSpeakingEventsOptions.interval === 'number') ?
publisherSpeakingEventsOptions.interval : ((typeof currentHarkOptions.interval === 'number') ? currentHarkOptions.interval : 100);
const newThreshold = (typeof publisherSpeakingEventsOptions.threshold === 'number') ?
publisherSpeakingEventsOptions.threshold : ((typeof currentHarkOptions.threshold === 'number') ? currentHarkOptions.threshold : -50);
this.stream.harkOptions = {
interval: newInterval,
threshold: newThreshold
};
if (!!this.stream.speechEvent) {
this.stream.speechEvent.setInterval(newInterval);
this.stream.speechEvent.setThreshold(newThreshold);
}
}
/* Hidden methods */
/** /**
* @hidden * @hidden
*/ */
@ -458,6 +485,8 @@ export class StreamManager implements EventDispatcher {
this.ee.emitEvent(type, eventArray); this.ee.emitEvent(type, eventArray);
} }
/* Private methods */
private pushNewStreamManagerVideo(streamManagerVideo: StreamManagerVideo) { private pushNewStreamManagerVideo(streamManagerVideo: StreamManagerVideo) {
this.videos.push(streamManagerVideo); this.videos.push(streamManagerVideo);
this.addPlayEventToFirstVideo(); this.addPlayEventToFirstVideo();

View File

@ -27,8 +27,6 @@ import { Session } from '../..';
* *
* More information: * More information:
* - This events will only be triggered for **remote streams that have audio tracks** ([[Stream.hasAudio]] must be true) * - This events will only be triggered for **remote streams that have audio tracks** ([[Stream.hasAudio]] must be true)
* - Both events share the same lifecycle. That means that you can subscribe to only one of them if you want, but if you call `Session.off('publisherStopSpeaking')`,
* keep in mind that this will also internally remove any 'publisherStartSpeaking' event
* - You can further configure how the events are dispatched by setting property `publisherSpeakingEventsOptions` in the call of [[OpenVidu.setAdvancedConfiguration]] * - You can further configure how the events are dispatched by setting property `publisherSpeakingEventsOptions` in the call of [[OpenVidu.setAdvancedConfiguration]]
*/ */
export class PublisherSpeakingEvent extends Event { export class PublisherSpeakingEvent extends Event {

View File

@ -24,7 +24,7 @@ import { StreamManager } from '../../OpenVidu/StreamManager';
* and has begun to play). This event will be dispatched when these 3 conditions are met 1) The StreamManager has no video associated in the DOM 2) It is associated to one video 3) That video starts playing * and has begun to play). This event will be dispatched when these 3 conditions are met 1) The StreamManager has no video associated in the DOM 2) It is associated to one video 3) That video starts playing
* - `streamAudioVolumeChange`: dispatched by [[StreamManager]] ([[Publisher]] and [[Subscriber]]) when the volume of its Stream's audio track * - `streamAudioVolumeChange`: dispatched by [[StreamManager]] ([[Publisher]] and [[Subscriber]]) when the volume of its Stream's audio track
* changes. Only applies if [[Stream.hasAudio]] is `true`. The frequency this event is fired with is defined by property `interval` of * changes. Only applies if [[Stream.hasAudio]] is `true`. The frequency this event is fired with is defined by property `interval` of
* [[OpenViduAdvancedConfiguration.publisherSpeakingEventsOptions]] (default 50ms) * [[OpenViduAdvancedConfiguration.publisherSpeakingEventsOptions]] (default 100ms)
*/ */
export class StreamManagerEvent extends Event { export class StreamManagerEvent extends Event {

View File

@ -33,9 +33,11 @@ export interface OpenViduAdvancedConfiguration {
screenShareChromeExtension?: string; screenShareChromeExtension?: string;
/** /**
* Custom configuration for the [[PublisherSpeakingEvent]] feature. It is an object which includes the following optional properties: * Custom configuration for the [[PublisherSpeakingEvent]] feature and the [StreamManagerEvent.streamAudioVolumeChange](/api/openvidu-browser/classes/streammanagerevent.html) feature. It is an object which includes the following optional properties:
* - `interval`: (number) how frequently the analyser polls the audio stream to check if speaking has started or stopped. Default **50** (ms) * - `interval`: (number) how frequently the analyser polls the audio stream to check if speaking has started/stopped or audio volume has changed. Default **100** (ms)
* - `threshold`: (number) the volume at which _publisherStartSpeaking_ and _publisherStopSpeaking_ events will be fired. Default **-50** (dB) * - `threshold`: (number) the volume at which _publisherStartSpeaking_ and _publisherStopSpeaking_ events will be fired. Default **-50** (dB)
*
* This sets the global default configuration that will affect all streams, but you can later customize these values for each specific stream by calling [[StreamManager.updatePublisherSpeakingEventsOptions]]
*/ */
publisherSpeakingEventsOptions?: any; publisherSpeakingEventsOptions?: any;