public IEnumerator ReceiverGetStreams() { var obj = new GameObject("audio"); var source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); var audioTrack = new AudioStreamTrack(source); var stream = new MediaStream(); stream.AddTrack(audioTrack); yield return(0); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.AddStream(0, stream); yield return(test); foreach (var receiver in test.component.GetPeerReceivers(1)) { Assert.That(receiver.Streams, Has.Count.EqualTo(1)); } test.component.Dispose(); foreach (var track in stream.GetTracks()) { track.Dispose(); } stream.Dispose(); Object.DestroyImmediate(test.gameObject); Object.DestroyImmediate(source.clip); Object.DestroyImmediate(obj); }
public IEnumerator MediaStreamTrackThrowExceptionAfterPeerDisposed() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; var obj = new GameObject("audio"); var source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); AudioStreamTrack track = new AudioStreamTrack(source); peer1.AddTrack(track); MediaStreamTrack track1 = null; peer2.OnTrack = e => { track1 = e.Track; }; yield return(SignalingOffer(peer1, peer2)); Assert.That(track1, Is.Not.Null); peer2.Dispose(); Assert.That(() => track1.Id, Throws.TypeOf <ObjectDisposedException>()); track.Dispose(); track1.Dispose(); Object.DestroyImmediate(source.clip); Object.DestroyImmediate(obj); }
public IEnumerator ReceiverGetStreams() { var audioTrack = new AudioStreamTrack("audio"); var stream = new MediaStream(WebRTC.Context.CreateMediaStream("audiostream")); stream.AddTrack(audioTrack); yield return(0); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.SetStream(stream); yield return(test); foreach (var receiver in test.component.GetReceivers(1)) { Assert.That(receiver.Streams, Has.Count.EqualTo(1)); } test.component.Dispose(); foreach (var track in stream.GetTracks()) { track.Dispose(); } stream.Dispose(); }
private void CaptureAudioStart() { if (!useMicToggle.isOn) { sourceAudio.clip = clip; sourceAudio.loop = true; sourceAudio.Play(); audioStreamTrack = new AudioStreamTrack(sourceAudio); return; } var deviceName = Microphone.devices[micListDropdown.value]; Microphone.GetDeviceCaps(deviceName, out int minFreq, out int maxFreq); var micClip = Microphone.Start(deviceName, true, 1, 48000); // set the latency to “0” samples before the audio starts to play. while (!(Microphone.GetPosition(deviceName) > 0)) { } sourceAudio.clip = micClip; sourceAudio.loop = true; sourceAudio.Play(); audioStreamTrack = new AudioStreamTrack(sourceAudio); }
public IEnumerator ReceiverGetStreams() { var audioTrack = new AudioStreamTrack(); var stream = new MediaStream(); stream.AddTrack(audioTrack); yield return(0); var test = new MonoBehaviourTest <SignalingPeers>(); test.component.AddStream(0, stream); yield return(test); foreach (var receiver in test.component.GetPeerReceivers(1)) { Assert.That(receiver.Streams, Has.Count.EqualTo(1)); } test.component.Dispose(); foreach (var track in stream.GetTracks()) { track.Dispose(); } stream.Dispose(); Object.DestroyImmediate(test.gameObject); }
public IEnumerator SetLocalDescriptionFailed() { var peer = new RTCPeerConnection(); var stream = new MediaStream(); var track = new AudioStreamTrack("audio"); var sender = peer.AddTrack(track, stream); RTCOfferOptions options = default; var op = peer.CreateOffer(ref options); yield return(op); Assert.True(op.IsDone); Assert.False(op.IsError); var desc = op.Desc; // change sdp to cannot parse desc.sdp = desc.sdp.Replace("m=audio", "m=audiable"); var op2 = peer.SetLocalDescription(ref desc); yield return(op2); Assert.True(op2.IsDone); Assert.True(op2.IsError); Assert.IsNotEmpty(op2.Error.message); peer.RemoveTrack(sender); track.Dispose(); stream.Dispose(); peer.Close(); peer.Dispose(); }
public IEnumerator MediaStreamTrackThrowExceptionAfterPeerDisposed() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; AudioStreamTrack track = new AudioStreamTrack(); peer1.AddTrack(track); MediaStreamTrack track1 = null; peer2.OnTrack = e => { track1 = e.Track; }; yield return(SignalingOffer(peer1, peer2)); Assert.That(track1, Is.Not.Null); peer2.Dispose(); Assert.That(() => track1.Id, Throws.TypeOf <InvalidOperationException>()); track.Dispose(); track1.Dispose(); }
public IEnumerator TransceiverReturnsSender() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; AudioStreamTrack track1 = new AudioStreamTrack(); peer1.AddTrack(track1); yield return(SignalingOffer(peer1, peer2)); Assert.That(peer2.GetTransceivers().Count(), Is.EqualTo(1)); RTCRtpSender sender1 = peer2.GetTransceivers().First().Sender; Assert.That(sender1, Is.Not.Null); AudioStreamTrack track2 = new AudioStreamTrack(); RTCRtpSender sender2 = peer2.AddTrack(track2); Assert.That(sender2, Is.Not.Null); Assert.That(sender1, Is.EqualTo(sender2)); track1.Dispose(); track2.Dispose(); peer1.Dispose(); peer2.Dispose(); }
public IEnumerator AddMultiAudioTrack() { GameObject obj = new GameObject("audio"); AudioSource source = obj.AddComponent <AudioSource>(); int channels = 2; source.clip = AudioClip.Create("test", 48000, channels, 48000, false); source.Play(); var test = new MonoBehaviourTest <SignalingPeers>(); test.gameObject.AddComponent <AudioListener>(); // first track var track1 = new AudioStreamTrack(source); var sender1 = test.component.AddTrack(0, track1); yield return(test); var receivers = test.component.GetPeerReceivers(1); Assert.That(receivers.Count(), Is.EqualTo(1)); var receiver = receivers.First(); var audioTrack = receiver.Track as AudioStreamTrack; Assert.That(audioTrack, Is.Not.Null); yield return(new WaitUntil(() => audioTrack.Renderer != null)); Assert.That(audioTrack.Renderer, Is.Not.Null); Assert.That(audioTrack.Renderer.channels, Is.EqualTo(channels)); // second track var track2 = new AudioStreamTrack(source); var sender2 = test.component.AddTrack(0, track2); yield return(new WaitUntil(() => test.component.NegotiationCompleted())); yield return(new WaitUntil(() => test.component.GetPeerReceivers(1).Count() == 2)); receivers = test.component.GetPeerReceivers(1); Assert.That(receivers.Count(), Is.EqualTo(2)); receiver = receivers.Last(); audioTrack = receiver.Track as AudioStreamTrack; Assert.That(audioTrack, Is.Not.Null); yield return(new WaitUntil(() => audioTrack.Renderer != null)); Assert.That(audioTrack.Renderer, Is.Not.Null); Assert.That(audioTrack.Renderer.channels, Is.EqualTo(channels)); test.component.Dispose(); Object.DestroyImmediate(test.gameObject); Object.DestroyImmediate(obj); }
public void AudioStreamTrackInstantiateMultiple() { var track1 = new AudioStreamTrack(); var track2 = new AudioStreamTrack(); track1.Dispose(); track2.Dispose(); }
public IEnumerator UnitySetUp() { WebRTC.WebRTC.Initialize(); RTCConfiguration config = default; RTCIceCandidate candidate_ = null; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { candidate_ = candidate; }; AudioStreamTrack track = new AudioStreamTrack(); peer1.AddTrack(track); var op1 = peer1.CreateOffer(); yield return(op1); m_DescOffer = op1.Desc; var op2 = peer1.SetLocalDescription(ref m_DescOffer); yield return(op2); var op3 = peer2.SetRemoteDescription(ref m_DescOffer); yield return(op3); var op4 = peer2.CreateAnswer(); yield return(op4); m_DescAnswer = op4.Desc; var op5 = peer2.SetLocalDescription(ref m_DescAnswer); yield return(op5); var op6 = peer1.SetRemoteDescription(ref m_DescAnswer); yield return(op6); yield return(new WaitUntil(() => candidate_ != null)); m_candidate = candidate_; track.Dispose(); peer1.Close(); peer2.Close(); m_Context = SynchronizationContext.Current; signaling1 = CreateSignaling(m_SignalingType, m_Context); signaling2 = CreateSignaling(m_SignalingType, m_Context); }
public IEnumerator RemoteOnRemoveTrack() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; var stream = new MediaStream(); MediaStream receiveStream = null; var track = new AudioStreamTrack(); stream.AddTrack(track); RTCRtpSender sender = peer1.AddTrack(track, stream); bool isInvokeNegotiationNeeded1 = false; peer1.OnNegotiationNeeded = () => isInvokeNegotiationNeeded1 = true; bool isInvokeOnRemoveTrack = false; peer2.OnTrack = e => { Assert.That(e.Streams, Has.Count.EqualTo(1)); receiveStream = e.Streams.First(); receiveStream.OnRemoveTrack = ev => isInvokeOnRemoveTrack = true; }; yield return(SignalingOffer(peer1, peer2)); peer1.RemoveTrack(sender); var op9 = new WaitUntilWithTimeout(() => isInvokeNegotiationNeeded1, 5000); yield return(op9); Assert.That(op9.IsCompleted, Is.True); yield return(SignalingOffer(peer1, peer2)); var op10 = new WaitUntilWithTimeout(() => isInvokeOnRemoveTrack, 5000); yield return(op10); Assert.That(op10.IsCompleted, Is.True); stream.Dispose(); receiveStream.Dispose(); track.Dispose(); peer1.Dispose(); peer2.Dispose(); }
public IEnumerator CurrentDirection() { var config = GetConfiguration(); var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); var audioTrack = new AudioStreamTrack("audio"); var transceiver1 = peer1.AddTransceiver(TrackKind.Audio); transceiver1.Direction = RTCRtpTransceiverDirection.RecvOnly; Assert.IsNull(transceiver1.CurrentDirection); RTCOfferOptions options1 = new RTCOfferOptions { offerToReceiveAudio = true }; RTCAnswerOptions options2 = default; var op1 = peer1.CreateOffer(ref options1); yield return(op1); var desc = op1.Desc; var op2 = peer1.SetLocalDescription(ref desc); yield return(op2); var op3 = peer2.SetRemoteDescription(ref desc); yield return(op3); var transceiver2 = peer2.GetTransceivers().First(x => x.Receiver.Track.Kind == TrackKind.Audio); Assert.True(transceiver2.Sender.ReplaceTrack(audioTrack)); transceiver2.Direction = RTCRtpTransceiverDirection.SendOnly; var op4 = peer2.CreateAnswer(ref options2); yield return(op4); desc = op4.Desc; var op5 = peer2.SetLocalDescription(ref desc); yield return(op5); var op6 = peer1.SetRemoteDescription(ref desc); yield return(op6); Assert.AreEqual(transceiver1.CurrentDirection, RTCRtpTransceiverDirection.RecvOnly); Assert.AreEqual(transceiver2.CurrentDirection, RTCRtpTransceiverDirection.SendOnly); audioTrack.Dispose(); peer1.Close(); peer2.Close(); peer1.Dispose(); peer2.Dispose(); }
public void EqualIdWithAudioTrack() { var guid = Guid.NewGuid().ToString(); var source = new AudioTrackSource(); var track = new AudioStreamTrack(WebRTC.Context.CreateAudioTrack(guid, source.self)); Assert.That(track, Is.Not.Null); Assert.That(track.Id, Is.EqualTo(guid)); track.Dispose(); source.Dispose(); }
public void AddTransceiver() { var peer = new RTCPeerConnection(); var track = new AudioStreamTrack(); Assert.AreEqual(0, peer.GetTransceivers().Count()); var transceiver = peer.AddTransceiver(track); Assert.NotNull(transceiver); Assert.IsNull(transceiver.CurrentDirection); RTCRtpSender sender = transceiver.Sender; Assert.NotNull(sender); Assert.AreEqual(track, sender.Track); RTCRtpSendParameters parameters = sender.GetParameters(); Assert.NotNull(parameters); Assert.NotNull(parameters.encodings); foreach (var encoding in parameters.encodings) { Assert.True(encoding.active); Assert.Null(encoding.maxBitrate); Assert.Null(encoding.minBitrate); Assert.Null(encoding.maxFramerate); Assert.Null(encoding.scaleResolutionDownBy); Assert.IsNotEmpty(encoding.rid); } Assert.IsNotEmpty(parameters.transactionId); Assert.AreEqual(1, peer.GetTransceivers().Count()); Assert.NotNull(peer.GetTransceivers().First()); Assert.NotNull(parameters.codecs); foreach (var codec in parameters.codecs) { Assert.NotNull(codec); Assert.NotZero(codec.payloadType); Assert.IsNotEmpty(codec.mimeType); Assert.IsNotEmpty(codec.sdpFmtpLine); Assert.Null(codec.clockRate); Assert.Null(codec.channels); } Assert.NotNull(parameters.rtcp); Assert.NotNull(parameters.headerExtensions); foreach (var extension in parameters.headerExtensions) { Assert.NotNull(extension); Assert.IsNotEmpty(extension.uri); Assert.NotZero(extension.id); } track.Dispose(); peer.Dispose(); }
public void AudioStreamTrackInstantiateOnce() { GameObject obj = new GameObject("audio"); AudioSource source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 48000, 2, 48000, false); var track = new AudioStreamTrack(source); track.Dispose(); UnityEngine.Object.DestroyImmediate(source.clip); UnityEngine.Object.DestroyImmediate(obj); }
public void GetTransceivers() { var peer = new RTCPeerConnection(); var track = new AudioStreamTrack("audio"); var sender = peer.AddTrack(track); Assert.That(peer.GetTransceivers().ToList(), Has.Count.EqualTo(1)); Assert.That(peer.GetTransceivers().Select(t => t.Sender).ToList(), Has.Member(sender)); track.Dispose(); peer.Dispose(); }
public void AudioStreamTrackPlayAudio() { GameObject obj = new GameObject("audio"); AudioSource source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); var track = new AudioStreamTrack(source); source.Play(); track.Dispose(); Object.DestroyImmediate(obj); }
public IEnumerator AddAndRemoveAudioTrack() { var audioTrack = new AudioStreamTrack(); var test = new MonoBehaviourTest <SignalingPeers>(); var sender = test.component.AddTrack(0, audioTrack); yield return(test); Assert.That(test.component.RemoveTrack(0, sender), Is.EqualTo(RTCErrorType.None)); yield return(new WaitUntil(() => test.component.NegotiationCompleted())); test.component.Dispose(); Object.DestroyImmediate(test.gameObject); }
public IEnumerator RestartIceInvokeOnNegotiationNeeded() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; var obj = new GameObject("audio"); var source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); AudioStreamTrack track = new AudioStreamTrack(source); peer1.AddTrack(track); yield return(SignalingOffer(peer1, peer2)); bool isInvokeOnNegotiationNeeded1 = false; bool isInvokeOnNegotiationNeeded2 = false; peer1.OnNegotiationNeeded = () => isInvokeOnNegotiationNeeded1 = true; peer2.OnNegotiationNeeded = () => isInvokeOnNegotiationNeeded2 = true; peer1.RestartIce(); var op9 = new WaitUntilWithTimeout(() => isInvokeOnNegotiationNeeded1, 5000); yield return(op9); Assert.That(op9.IsCompleted, Is.True); peer2.RestartIce(); var op10 = new WaitUntilWithTimeout(() => isInvokeOnNegotiationNeeded2, 5000); yield return(op10); Assert.That(op10.IsCompleted, Is.True); track.Dispose(); peer1.Close(); peer2.Close(); Object.DestroyImmediate(source.clip); Object.DestroyImmediate(obj); }
public void AddAndRemoveAudioStreamTrack() { var stream = new MediaStream(); var track = new AudioStreamTrack("audio"); Assert.AreEqual(TrackKind.Audio, track.Kind); Assert.AreEqual(0, stream.GetAudioTracks().Count()); Assert.True(stream.AddTrack(track)); Assert.AreEqual(1, stream.GetAudioTracks().Count()); Assert.NotNull(stream.GetAudioTracks().First()); Assert.True(stream.RemoveTrack(track)); Assert.AreEqual(0, stream.GetAudioTracks().Count()); track.Dispose(); stream.Dispose(); }
public void AddAndRemoveAudioStreamTrack() { var stream = new MediaStream(); var track = new AudioStreamTrack("audio"); Assert.That(TrackKind.Audio, Is.EqualTo(track.Kind)); Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(0)); Assert.That(stream.AddTrack(track), Is.True); Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(1)); Assert.That(stream.GetAudioTracks(), Has.All.Not.Null); Assert.That(stream.RemoveTrack(track), Is.True); Assert.That(stream.GetAudioTracks(), Has.Count.EqualTo(0)); track.Dispose(); stream.Dispose(); }
protected virtual void OnDisable() { AudioSettings.OnAudioConfigurationChanged -= OnAudioConfigurationChanged; try { if (track != null) { track.Enabled = false; } } catch (InvalidOperationException) { track = null; } }
public IEnumerator TransceiverReturnsSender() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; var obj1 = new GameObject("audio1"); var source1 = obj1.AddComponent <AudioSource>(); source1.clip = AudioClip.Create("test1", 480, 2, 48000, false); AudioStreamTrack track1 = new AudioStreamTrack(source1); peer1.AddTrack(track1); yield return(SignalingOffer(peer1, peer2)); Assert.That(peer2.GetTransceivers().Count(), Is.EqualTo(1)); RTCRtpSender sender1 = peer2.GetTransceivers().First().Sender; Assert.That(sender1, Is.Not.Null); var obj2 = new GameObject("audio2"); var source2 = obj2.AddComponent <AudioSource>(); source2.clip = AudioClip.Create("test2", 480, 2, 48000, false); AudioStreamTrack track2 = new AudioStreamTrack(source2); RTCRtpSender sender2 = peer2.AddTrack(track2); Assert.That(sender2, Is.Not.Null); Assert.That(sender1, Is.EqualTo(sender2)); track1.Dispose(); track2.Dispose(); peer1.Dispose(); peer2.Dispose(); Object.DestroyImmediate(source1.clip); Object.DestroyImmediate(source2.clip); Object.DestroyImmediate(obj1); Object.DestroyImmediate(obj2); }
public IEnumerator AddAndRemoveAudioTrack() { var test = new MonoBehaviourTest <SignalingPeers>(); var source = test.gameObject.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 48000, 2, 48000, false); var audioTrack = new AudioStreamTrack(source); var sender = test.component.AddTrack(0, audioTrack); yield return(test); Assert.That(test.component.RemoveTrack(0, sender), Is.EqualTo(RTCErrorType.None)); yield return(new WaitUntil(() => test.component.NegotiationCompleted())); test.component.Dispose(); UnityEngine.Object.DestroyImmediate(source.clip); UnityEngine.Object.DestroyImmediate(test.gameObject); }
public IEnumerator RestartIceInvokeOnNegotiationNeeded() { RTCConfiguration config = default; config.iceServers = new[] { new RTCIceServer { urls = new[] { "stun:stun.l.google.com:19302" } } }; var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); peer1.OnIceCandidate = candidate => { peer2.AddIceCandidate(candidate); }; peer2.OnIceCandidate = candidate => { peer1.AddIceCandidate(candidate); }; AudioStreamTrack track = new AudioStreamTrack(); peer1.AddTrack(track); yield return(SignalingOffer(peer1, peer2)); bool isInvokeOnNegotiationNeeded1 = false; bool isInvokeOnNegotiationNeeded2 = false; peer1.OnNegotiationNeeded = () => isInvokeOnNegotiationNeeded1 = true; peer2.OnNegotiationNeeded = () => isInvokeOnNegotiationNeeded2 = true; peer1.RestartIce(); var op9 = new WaitUntilWithTimeout(() => isInvokeOnNegotiationNeeded1, 5000); yield return(op9); Assert.That(op9.IsCompleted, Is.True); peer2.RestartIce(); var op10 = new WaitUntilWithTimeout(() => isInvokeOnNegotiationNeeded2, 5000); yield return(op10); Assert.That(op10.IsCompleted, Is.True); track.Dispose(); peer1.Close(); peer2.Close(); }
protected virtual void OnAudioFilterRead(float[] data, int channels) { NativeArray <float> nativeArray = new NativeArray <float>(data, Allocator.Temp); try { track?.SetData(ref nativeArray, channels, m_sampleRate); } // todo(kazuki):: Should catch only ObjectDisposedException but // AudioStreamTrack also throws NullReferenceException. catch (Exception) { track = null; } finally { nativeArray.Dispose(); } }
public IEnumerator SetRemoteDescriptionFailed() { var config = GetDefaultConfiguration(); var peer1 = new RTCPeerConnection(ref config); var peer2 = new RTCPeerConnection(ref config); var stream = new MediaStream(); var obj = new GameObject("audio"); var source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); var track = new AudioStreamTrack(source); var sender = peer1.AddTrack(track, stream); var op1 = peer1.CreateOffer(); yield return(op1); var desc = op1.Desc; var op2 = peer1.SetLocalDescription(ref desc); yield return(op2); // change sdp to cannot parse desc.sdp = desc.sdp.Replace("a=mid:0", "a=mid:10"); var op3 = peer2.SetRemoteDescription(ref desc); yield return(op3); Assert.True(op3.IsDone); Assert.True(op3.IsError); Assert.IsNotEmpty(op3.Error.message); peer1.RemoveTrack(sender); track.Dispose(); stream.Dispose(); peer1.Close(); peer2.Close(); peer1.Dispose(); peer2.Dispose(); Object.DestroyImmediate(source.clip); Object.DestroyImmediate(obj); }
public void GetTransceivers() { var peer = new RTCPeerConnection(); var obj = new GameObject("audio"); var source = obj.AddComponent <AudioSource>(); source.clip = AudioClip.Create("test", 480, 2, 48000, false); var track = new AudioStreamTrack(source); var sender = peer.AddTrack(track); Assert.That(peer.GetTransceivers().ToList(), Has.Count.EqualTo(1)); Assert.That(peer.GetTransceivers().Select(t => t.Sender).ToList(), Has.Member(sender)); track.Dispose(); peer.Dispose(); Object.DestroyImmediate(source.clip); Object.DestroyImmediate(obj); }
private void Setup() { Debug.Log("Set up source/receive streams"); sourceStream = new MediaStream(); var videoTrack = cam.CaptureStreamTrack(WebRTCSettings.StreamSize.x, WebRTCSettings.StreamSize.y); sourceStream.AddTrack(videoTrack); sourceImage.texture = cam.targetTexture; sourceAudio.clip = audioclipStereoSample; sourceAudio.loop = true; sourceAudio.Play(); var audioTrack = new AudioStreamTrack(sourceAudio); sourceStream.AddTrack(audioTrack); startButton.interactable = false; callButton.interactable = true; }