/// <summary> /// Corutine that captures an audio clip from the microphone, obtains its /// relevant data and sends the corresponding header and chunk messages. /// </summary> /// <returns>IEnumerator to be run.</returns> protected override IEnumerator SendStream() { uint clipId = nextId; nextId += 1; Debug.Log("Sending clip with ID " + clipId + "."); //Texture2D texture = Paint(1000); float[] samplesData = new float[voiceClip.samples * voiceClip.channels]; voiceClip.GetData(samplesData, 0); int size = Mathf.FloorToInt(samplesData.Length / Mathf.Ceil(samplesData.Length * (float)sizeof(float) / maxChunkSize)); Debug.Log("Chunk size " + size); //lastCapturedClip = voiceClip; var headerMessage = new AudioHeaderMessage(networkIdentity.netId.Value, clipId, voiceClip.samples, voiceClip.channels, frequency, size); SendHeaderMessage(clipMsgType, headerMessage); List <(int, float[], int)> chunks = DivideArrayInChunks(samplesData, size); foreach (var chunk in chunks) { var chunkMessage = new AudioChunkMessage(networkIdentity.netId.Value, clipId, chunk.Item1, chunk.Item2, chunk.Item3); SendChunkMessage(clipMsgType, chunkMessage); } Debug.Log("Clip for ID " + clipId + " has been sent."); yield return(new WaitForSeconds(0.01f)); }
/// <summary> /// Processes the header messages received on the client. /// </summary> /// <param name="header">Clip's header message.</param> private void OnAudioHeaderReceived(AudioHeaderMessage header) { AudioStruc clipS = new AudioStruc(header.samples, header.channels, header.frequency, header.chunkSize); msgData.RecoverEarlyChunks(header, clipS, SaveChunk); if (msgData.CheckTimestamp(header)) { StartCoroutine( msgData.WaitTillReceiveAllTheStream( header, (uint id) => msgData[id].samplesReceived < msgData[id].data.Length, streamTimeout)); } }