Ejemplo n.º 1
0
    /// <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));
    }
Ejemplo n.º 2
0
    /// <summary>
    /// Saves on the data structure the data contained in a chunk.
    /// </summary>
    /// <param name="row">Image's chunk message.</param>
    private void SaveChunk(AudioChunkMessage row)
    {
        AudioStruc clipStruc = msgData[row.id];

        for (int i = 0; i < row.data.Length && i < row.size && clipStruc.samplesReceived < clipStruc.data.Length; i++)
        {
            clipStruc.data[i + row.order * clipStruc.chunkSize] = row.data[i];
            clipStruc.samplesReceived += 1;
        }
        msgData[row.id] = clipStruc;
        Debug.Log(clipStruc.samplesReceived + "/" + clipStruc.data.Length
                  + " samples currently recived for ID " + row.id + ".");
    }
Ejemplo n.º 3
0
 /// <summary>
 /// Processes the chunk messages received on the client.
 /// </summary>
 /// <param name="row">Clip's chunk message.</param>
 private void OnAudioChunkReceived(AudioChunkMessage row)
 {
     msgData.AddChunk(row, SaveChunk);
 }