[RN] Add ability to loop sounds

This commit is contained in:
Saúl Ibarra Corretgé 2018-06-20 15:36:28 +02:00
parent 333a0f5f90
commit 7b0a6a2ee5
2 changed files with 31 additions and 16 deletions

View File

@ -10,7 +10,8 @@ export type AudioElement = {
currentTime?: number, currentTime?: number,
pause: () => void, pause: () => void,
play: () => void, play: () => void,
setSinkId?: string => void setSinkId?: string => void,
stop: () => void
}; };
/** /**
@ -61,8 +62,6 @@ export default class AbstractAudio extends Component<Props> {
this.setAudioElementImpl = this.setAudioElementImpl.bind(this); this.setAudioElementImpl = this.setAudioElementImpl.bind(this);
} }
pause: () => void;
/** /**
* Attempts to pause the playback of the media. * Attempts to pause the playback of the media.
* *
@ -73,10 +72,8 @@ export default class AbstractAudio extends Component<Props> {
this._audioElementImpl && this._audioElementImpl.pause(); this._audioElementImpl && this._audioElementImpl.pause();
} }
play: () => void;
/** /**
* Attempts to being the playback of the media. * Attempts to begin the playback of the media.
* *
* @public * @public
* @returns {void} * @returns {void}
@ -106,8 +103,6 @@ export default class AbstractAudio extends Component<Props> {
typeof setRef === 'function' && setRef(element ? this : null); typeof setRef === 'function' && setRef(element ? this : null);
} }
setSinkId: string => void;
/** /**
* Sets the sink ID (output device ID) on the underlying audio element. * Sets the sink ID (output device ID) on the underlying audio element.
* NOTE: Currently, implemented only on Web. * NOTE: Currently, implemented only on Web.
@ -120,4 +115,14 @@ export default class AbstractAudio extends Component<Props> {
&& typeof this._audioElementImpl.setSinkId === 'function' && typeof this._audioElementImpl.setSinkId === 'function'
&& this._audioElementImpl.setSinkId(sinkId); && this._audioElementImpl.setSinkId(sinkId);
} }
/**
* Attempts to stop the playback of the media.
*
* @public
* @returns {void}
*/
stop(): void {
this._audioElementImpl && this._audioElementImpl.stop();
}
} }

View File

@ -12,11 +12,10 @@ const logger = require('jitsi-meet-logger').getLogger(__filename);
* {@link RTCView}. * {@link RTCView}.
*/ */
export default class Audio extends AbstractAudio { export default class Audio extends AbstractAudio {
/** /**
* Reference to 'react-native-sound} {@link Sound} instance. * Reference to 'react-native-sound} {@link Sound} instance.
*/ */
_sound: Sound _sound: ?Sound;
/** /**
* A callback passed to the 'react-native-sound''s {@link Sound} instance, * A callback passed to the 'react-native-sound''s {@link Sound} instance,
@ -56,9 +55,22 @@ export default class Audio extends AbstractAudio {
*/ */
componentWillUnmount() { componentWillUnmount() {
if (this._sound) { if (this._sound) {
this.setAudioElementImpl(null);
this._sound.release(); this._sound.release();
this._sound = null; this._sound = null;
this.setAudioElementImpl(null);
}
}
/**
* Attempts to begin the playback of the media.
*
* @inheritdoc
* @override
*/
play() {
if (this._sound) {
this._sound.setNumberOfLoops(this.props.loop ? -1 : 0);
super.play();
} }
} }
@ -81,10 +93,8 @@ export default class Audio extends AbstractAudio {
* @returns {void} * @returns {void}
*/ */
stop() { stop() {
// Currently not implemented for mobile. If needed, a possible if (this._sound) {
// implementation is: this._sound.stop();
// if (this._sound) { }
// this._sound.stop();
// }
} }
} }