Moved audio sharing to new network model
This commit is contained in:
parent
5e244617ae
commit
bdba2ecc13
@ -5,6 +5,8 @@ import React, { useContext, useState, useEffect, useCallback } from "react";
|
|||||||
import Session from "./Session";
|
import Session from "./Session";
|
||||||
import { isStreamStopped, omit } from "../helpers/shared";
|
import { isStreamStopped, omit } from "../helpers/shared";
|
||||||
|
|
||||||
|
import PlayerContext from "../contexts/PlayerContext";
|
||||||
|
|
||||||
import Party from "../components/party/Party";
|
import Party from "../components/party/Party";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -17,6 +19,7 @@ import Party from "../components/party/Party";
|
|||||||
* @param {NetworkedPartyProps} props
|
* @param {NetworkedPartyProps} props
|
||||||
*/
|
*/
|
||||||
function NetworkedParty({ gameId, session }) {
|
function NetworkedParty({ gameId, session }) {
|
||||||
|
const { partyState } = useContext(PlayerContext);
|
||||||
const [stream, setStream] = useState(null);
|
const [stream, setStream] = useState(null);
|
||||||
const [partyStreams, setPartyStreams] = useState({});
|
const [partyStreams, setPartyStreams] = useState({});
|
||||||
|
|
||||||
@ -26,8 +29,8 @@ function NetworkedParty({ gameId, session }) {
|
|||||||
for (let track of tracks) {
|
for (let track of tracks) {
|
||||||
// Only add the audio track of the stream to the remote peer
|
// Only add the audio track of the stream to the remote peer
|
||||||
if (track.kind === "audio") {
|
if (track.kind === "audio") {
|
||||||
for (let peer of Object.values(session.peers)) {
|
for (let player of Object.values(partyState)) {
|
||||||
peer.connection.addTrack(track, localStream);
|
session.startStreamTo(player.sessionId, track, localStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -41,19 +44,24 @@ function NetworkedParty({ gameId, session }) {
|
|||||||
track.stop();
|
track.stop();
|
||||||
// Only sending audio so only remove the audio track
|
// Only sending audio so only remove the audio track
|
||||||
if (track.kind === "audio") {
|
if (track.kind === "audio") {
|
||||||
for (let peer of Object.values(session.peers)) {
|
for (let player of Object.values(partyState)) {
|
||||||
peer.connection.removeTrack(track, localStream);
|
session.endStreamTo(player.sessionId, track, localStream);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
[session]
|
[session, partyState]
|
||||||
);
|
);
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
function handlePeerConnect({ peer }) {
|
function handlePlayerJoined(sessionId) {
|
||||||
if (stream) {
|
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("peerTrackAdded", handlePeerTrackAdded);
|
||||||
session.on("peerTrackRemoved", handlePeerTrackRemoved);
|
session.on("peerTrackRemoved", handlePeerTrackRemoved);
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
session.off("peerConnect", handlePeerConnect);
|
session.off("playerJoined", handlePlayerJoined);
|
||||||
session.off("peerTrackAdded", handlePeerTrackAdded);
|
session.off("peerTrackAdded", handlePeerTrackAdded);
|
||||||
session.off("peerTrackRemoved", handlePeerTrackRemoved);
|
session.off("peerTrackRemoved", handlePeerTrackRemoved);
|
||||||
};
|
};
|
||||||
|
@ -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
|
* Send data to a single peer
|
||||||
*
|
*
|
||||||
* @param {string} sessionId - the socket id of the player to send to
|
* @param {string} sessionId - The socket id of the player to send to
|
||||||
* @param {string} eventId - the id of the event to send
|
* @param {string} eventId - The id of the event to send
|
||||||
* @param {object} data
|
* @param {object} data
|
||||||
* @param {string} channel
|
* @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
|
* Join a party
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user