Here's part of the main code so far (the networking was done separately):
void Update()
{
if (Network.connections.Length > 0)
{
audioFloat = new float[audioInfo.clip.samples * audioInfo.clip.channels];
audioInfo.clip.GetData (audioFloat, 0);
networkView.RPC("PlayMicrophone", RPCMode.Others, ToByteArray(audioFloat), audioInfo.clip.channels);
}
}
[RPC]
void PlayMicrophone(byte[] ba, int c)
{
float[] flar = ToFloatArray (ba);
audio.clip = AudioClip.Create ("test", flar.Length, c, 44100, true, false);
audio.clip.SetData (flar, 0);
audio.loop = true;
while (!(Microphone.GetPosition("") > 0)) {}
audio.Play();
}
void OnConnectedToServer()
{
audioInfo.clip = Microphone.Start(null, true, 100, 44100);
}
// When you are the server and the client connected to
void OnPlayerConnected(NetworkPlayer player)
{
audioInfo.clip = Microphone.Start(null, true, 100, 44100);
}
public byte[] ToByteArray(float[] floatArray) {
int len = floatArray.Length * 4;
byte[] byteArray = new byte[len];
int pos = 0;
foreach (float f in floatArray) {
byte[] data = System.BitConverter.GetBytes(f);
System.Array.Copy(data, 0, byteArray, pos, 4);
pos += 4;
}
return byteArray;
}
public float[] ToFloatArray(byte[] byteArray) {
int len = byteArray.Length / 4;
float[] floatArray = new float[len];
for (int i = 0; i < byteArray.Length; i+=4) {
floatArray[i/4] = System.BitConverter.ToSingle(byteArray, i);
}
return floatArray;
}
I know it probably won't playback perfect, but I was expecting to hear even the slightest sound even for a second but it never happened. The data appears to be sent over the RPCs fine but the audio will not play.
In the Update()
function it will continually call the RPC to start playing from the microphone. This happens after the connection has been made as either a client or a server.
Since you can't send any arrays besides byte arrays, I get the audio data as a float array then convert to a byte array to be sent over to the other person connected. There are no errors when the code is ran but the sound still never plays.
The idea is to have fully live streaming 2-way audio gathered from the respective player's microphone. I feel like even though the buffer is only for 100 seconds it should still play sound up to that point.
I will probably end up using a circular buffer for that when the time comes. The sound hasn't played at all yet.
I tried using examples from Here and Here and was still unable to produce results.