diff --git a/app/src/RoomClient.js b/app/src/RoomClient.js index 219cb10..7d1d20d 100644 --- a/app/src/RoomClient.js +++ b/app/src/RoomClient.js @@ -1129,8 +1129,8 @@ export default class RoomClient - const audioElements = document.getElementById("audio"); - for( let i=0; i { const { - micConsumers + micConsumers, + audioOutputDevice } = props; return ( @@ -19,6 +21,7 @@ const AudioPeers = (props) => ); }) @@ -34,7 +37,8 @@ AudioPeers.propTypes = const mapStateToProps = (state) => ({ - micConsumers : micConsumerSelector(state) + micConsumers : micConsumerSelector(state), + audioOutputDevice : settings.selectedAudioOutputDevice }); const AudioPeersContainer = connect( diff --git a/app/src/components/PeerAudio/PeerAudio.js b/app/src/components/PeerAudio/PeerAudio.js index 38d7faf..accf1fe 100644 --- a/app/src/components/PeerAudio/PeerAudio.js +++ b/app/src/components/PeerAudio/PeerAudio.js @@ -10,6 +10,7 @@ export default class PeerAudio extends React.PureComponent // Latest received audio track. // @type {MediaStreamTrack} this._audioTrack = null; + this._audioOutputDevice = null; } render() @@ -24,9 +25,10 @@ export default class PeerAudio extends React.PureComponent componentDidMount() { - const { audioTrack } = this.props; + const { audioTrack, audioOutputDevice } = this.props; this._setTrack(audioTrack); + this._setOutputDevice(audioOutputDevice); } // eslint-disable-next-line camelcase @@ -60,6 +62,20 @@ export default class PeerAudio extends React.PureComponent audio.srcObject = null; } } + + _setOutputDevice(audioOutputDevice){ + if(this._audioOutputDevice === audioOutputDevice) + return; + + this._audioOutputDevice = audioOutputDevice; + + const { audio } = this.refs; + + if (audioOutputDevice && typeof audio.setSinkId === 'function') + { + audio.setSinkId(audioOutputDevice); + } + } } PeerAudio.propTypes =