Moved audio sharing to new network model

This commit is contained in:
Mitchell McCaffrey 2020-12-12 16:30:55 +11:00
parent 5e244617ae
commit bdba2ecc13
2 changed files with 50 additions and 24 deletions

View File

@ -5,6 +5,8 @@ import React, { useContext, useState, useEffect, useCallback } from "react";
import Session from "./Session";
import { isStreamStopped, omit } from "../helpers/shared";
import PlayerContext from "../contexts/PlayerContext";
import Party from "../components/party/Party";
/**
@ -17,6 +19,7 @@ import Party from "../components/party/Party";
* @param {NetworkedPartyProps} props
*/
function NetworkedParty({ gameId, session }) {
const { partyState } = useContext(PlayerContext);
const [stream, setStream] = useState(null);
const [partyStreams, setPartyStreams] = useState({});
@ -26,8 +29,8 @@ function NetworkedParty({ gameId, session }) {
for (let track of tracks) {
// Only add the audio track of the stream to the remote peer
if (track.kind === "audio") {
for (let peer of Object.values(session.peers)) {
peer.connection.addTrack(track, localStream);
for (let player of Object.values(partyState)) {
session.startStreamTo(player.sessionId, track, localStream);
}
}
}
@ -41,19 +44,24 @@ function NetworkedParty({ gameId, session }) {
track.stop();
// Only sending audio so only remove the audio track
if (track.kind === "audio") {
for (let peer of Object.values(session.peers)) {
peer.connection.removeTrack(track, localStream);
for (let player of Object.values(partyState)) {
session.endStreamTo(player.sessionId, track, localStream);
}
}
}
},
[session]
[session, partyState]
);
useEffect(() => {
function handlePeerConnect({ peer }) {
function handlePlayerJoined(sessionId) {
if (stream) {
peer.connection.addStream(stream);
const tracks = stream.getTracks();
for (let track of tracks) {
if (track.kind === "audio") {
session.startStreamTo(sessionId, track, stream);
}
}
}
}
@ -75,12 +83,12 @@ function NetworkedParty({ gameId, session }) {
}
}
session.on("peerConnect", handlePeerConnect);
session.on("playerJoined", handlePlayerJoined);
session.on("peerTrackAdded", handlePeerTrackAdded);
session.on("peerTrackRemoved", handlePeerTrackRemoved);
return () => {
session.off("peerConnect", handlePeerConnect);
session.off("playerJoined", handlePlayerJoined);
session.off("peerTrackAdded", handlePeerTrackAdded);
session.off("peerTrackRemoved", handlePeerTrackRemoved);
};

View File

@ -108,24 +108,11 @@ class Session extends EventEmitter {
}
}
/**
* Send data to all connected peers
*
* @param {string} id - the id of the event to send
* @param {object} data
* @param {string} channel
*/
send(id, data, channel) {
for (let peer of Object.values(this.peers)) {
peer.connection.send({ id, data }, channel);
}
}
/**
* Send data to a single peer
*
* @param {string} sessionId - the socket id of the player to send to
* @param {string} eventId - the id of the event to send
* @param {string} sessionId - The socket id of the player to send to
* @param {string} eventId - The id of the event to send
* @param {object} data
* @param {string} channel
*/
@ -140,6 +127,37 @@ class Session extends EventEmitter {
}
}
/**
* Start streaming to a peer
*
* @param {string} sessionId - The socket id of the player to stream to
* @param {MediaStreamTrack} track
* @param {MediaStream} stream
*/
startStreamTo(sessionId, track, stream) {
if (!(sessionId in this.peers)) {
this._addPeer(sessionId, true);
this.peers[sessionId].connection.once("connect", () => {
this.peers[sessionId].connection.addTrack(track, stream);
});
} else {
this.peers[sessionId].connection.addTrack(track, stream);
}
}
/**
* End streaming to a peer
*
* @param {string} sessionId - The socket id of the player to stream to
* @param {MediaStreamTrack} track
* @param {MediaStream} stream
*/
endStreamTo(sessionId, track, stream) {
if (sessionId in this.peers) {
this.peers[sessionId].connection.removeTrack(track, stream);
}
}
/**
* Join a party
*