AudioStreamTrackTest.cs 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. using System;
  2. using System.Collections;
  3. using System.Linq;
  4. using NUnit.Framework;
  5. using UnityEngine;
  6. using UnityEngine.TestTools;
  7. using Unity.Collections;
  8. namespace Unity.WebRTC.RuntimeTest
  9. {
  10. class AudioStreamTrackTest
  11. {
  12. [SetUp]
  13. public void SetUp()
  14. {
  15. WebRTC.Initialize(true);
  16. }
  17. [TearDown]
  18. public void TearDown()
  19. {
  20. WebRTC.Dispose();
  21. }
  22. [UnityTest]
  23. [Timeout(5000)]
  24. public IEnumerator ConstructorWithAudioSource()
  25. {
  26. var test = new MonoBehaviourTest<SignalingPeers>();
  27. var source = test.gameObject.AddComponent<AudioSource>();
  28. source.clip = AudioClip.Create("test", 48000, 2, 48000, false);
  29. var audioTrack = new AudioStreamTrack(source);
  30. var sender = test.component.AddTrack(0, audioTrack);
  31. yield return test;
  32. Assert.That(test.component.RemoveTrack(0, sender), Is.EqualTo(RTCErrorType.None));
  33. yield return new WaitUntil(() => test.component.NegotiationCompleted());
  34. test.component.Dispose();
  35. UnityEngine.Object.DestroyImmediate(source.clip);
  36. UnityEngine.Object.DestroyImmediate(test.gameObject);
  37. }
  38. [UnityTest]
  39. [Timeout(5000)]
  40. public IEnumerator ConstructorWithAudioListener()
  41. {
  42. var test = new MonoBehaviourTest<SignalingPeers>();
  43. var listener = test.gameObject.AddComponent<AudioListener>();
  44. var audioTrack = new AudioStreamTrack(listener);
  45. var sender = test.component.AddTrack(0, audioTrack);
  46. yield return test;
  47. Assert.That(test.component.RemoveTrack(0, sender), Is.EqualTo(RTCErrorType.None));
  48. yield return new WaitUntil(() => test.component.NegotiationCompleted());
  49. test.component.Dispose();
  50. UnityEngine.Object.DestroyImmediate(test.gameObject);
  51. }
  52. [UnityTest]
  53. [Timeout(5000)]
  54. public IEnumerator GCCollect()
  55. {
  56. GameObject obj = new GameObject("audio");
  57. AudioSource source = obj.AddComponent<AudioSource>();
  58. var test = new MonoBehaviourTest<SignalingPeers>();
  59. var track = new AudioStreamTrack(source);
  60. test.component.AddTrack(0, track);
  61. yield return test;
  62. GC.Collect();
  63. var receivers = test.component.GetPeerReceivers(1);
  64. Assert.That(receivers.Count(), Is.EqualTo(1));
  65. var receiver = receivers.First();
  66. var audioTrack = receiver.Track as AudioStreamTrack;
  67. Assert.That(audioTrack, Is.Not.Null);
  68. test.component.Dispose();
  69. UnityEngine.Object.DestroyImmediate(test.gameObject);
  70. UnityEngine.Object.DestroyImmediate(obj);
  71. }
  72. [UnityTest]
  73. [Timeout(5000)]
  74. public IEnumerator AddMultiAudioTrack()
  75. {
  76. GameObject obj = new GameObject("audio");
  77. AudioSource source = obj.AddComponent<AudioSource>();
  78. int channels = 2;
  79. source.clip = AudioClip.Create("test", 48000, channels, 48000, false);
  80. source.Play();
  81. var test = new MonoBehaviourTest<SignalingPeers>();
  82. test.gameObject.AddComponent<AudioListener>();
  83. // first track
  84. var track1 = new AudioStreamTrack(source);
  85. var sender1 = test.component.AddTrack(0, track1);
  86. yield return test;
  87. var receivers = test.component.GetPeerReceivers(1);
  88. Assert.That(receivers.Count(), Is.EqualTo(1));
  89. var receiver = receivers.First();
  90. var audioTrack = receiver.Track as AudioStreamTrack;
  91. Assert.That(audioTrack, Is.Not.Null);
  92. // second track
  93. var track2 = new AudioStreamTrack(source);
  94. var sender2 = test.component.AddTrack(0, track2);
  95. yield return new WaitUntil(() => test.component.NegotiationCompleted());
  96. yield return new WaitUntil(() => test.component.GetPeerReceivers(1).Count() == 2);
  97. receivers = test.component.GetPeerReceivers(1);
  98. Assert.That(receivers.Count(), Is.EqualTo(2));
  99. receiver = receivers.Last();
  100. audioTrack = receiver.Track as AudioStreamTrack;
  101. Assert.That(audioTrack, Is.Not.Null);
  102. test.component.Dispose();
  103. UnityEngine.Object.DestroyImmediate(test.gameObject);
  104. UnityEngine.Object.DestroyImmediate(obj);
  105. }
  106. [Test]
  107. public void AudioStreamTrackInstantiateOnce()
  108. {
  109. GameObject obj = new GameObject("audio");
  110. AudioSource source = obj.AddComponent<AudioSource>();
  111. source.clip = AudioClip.Create("test", 48000, 2, 48000, false);
  112. var track = new AudioStreamTrack(source);
  113. track.Dispose();
  114. UnityEngine.Object.DestroyImmediate(source.clip);
  115. UnityEngine.Object.DestroyImmediate(obj);
  116. }
  117. [Test]
  118. public void AudioStreamTrackInstantiateMultiple()
  119. {
  120. GameObject obj1 = new GameObject("audio1");
  121. AudioSource source1 = obj1.AddComponent<AudioSource>();
  122. source1.clip = AudioClip.Create("test1", 48000, 2, 48000, false);
  123. GameObject obj2 = new GameObject("audio2");
  124. AudioSource source2 = obj2.AddComponent<AudioSource>();
  125. source2.clip = AudioClip.Create("test2", 48000, 2, 48000, false);
  126. var track1 = new AudioStreamTrack(source1);
  127. var track2 = new AudioStreamTrack(source2);
  128. track1.Dispose();
  129. track2.Dispose();
  130. UnityEngine.Object.DestroyImmediate(source1.clip);
  131. UnityEngine.Object.DestroyImmediate(source2.clip);
  132. UnityEngine.Object.DestroyImmediate(obj1);
  133. UnityEngine.Object.DestroyImmediate(obj2);
  134. }
  135. [Test]
  136. public void AudioStreamTrackSetData()
  137. {
  138. GameObject obj = new GameObject("audio");
  139. AudioSource source = obj.AddComponent<AudioSource>();
  140. source.clip = AudioClip.Create("test1", 48000, 2, 48000, false);
  141. var track = new AudioStreamTrack(source);
  142. Assert.That(() => track.SetData(null, 0, 0), Throws.ArgumentNullException);
  143. float[] data = new float[2048];
  144. Assert.That(() => track.SetData(data, 0, 0), Throws.ArgumentException);
  145. Assert.That(() => track.SetData(data, 1, 0), Throws.ArgumentException);
  146. Assert.That(() => track.SetData(data, 0, 48000), Throws.ArgumentException);
  147. Assert.That(() => track.SetData(data, 1, 48000), Throws.Nothing);
  148. track.Dispose();
  149. UnityEngine.Object.DestroyImmediate(source.clip);
  150. UnityEngine.Object.DestroyImmediate(obj);
  151. }
  152. //todo(kazuki): workaround ObjectDisposedException for Linux playmode test
  153. [Test]
  154. [UnityPlatform(exclude = new[] { RuntimePlatform.LinuxEditor })]
  155. public void AudioStreamTrackPlayAudio()
  156. {
  157. GameObject obj = new GameObject("audio");
  158. AudioSource source = obj.AddComponent<AudioSource>();
  159. source.clip = AudioClip.Create("test", 480, 2, 48000, false);
  160. var track = new AudioStreamTrack(source);
  161. source.Play();
  162. track.Dispose();
  163. UnityEngine.Object.DestroyImmediate(source.clip);
  164. UnityEngine.Object.DestroyImmediate(obj);
  165. }
  166. [Test]
  167. public void AudioStreamRenderer()
  168. {
  169. var obj = new GameObject("audio");
  170. var renderer = new AudioStreamTrack.AudioStreamRenderer(null);
  171. renderer.Source = obj.AddComponent<AudioSource>();
  172. renderer.Dispose();
  173. UnityEngine.Object.DestroyImmediate(obj);
  174. }
  175. }
  176. }