aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Region/Environment/Modules/VoiceChat/VoicePacket.cs
blob: e92fa43a6125377d22466114798ab439f1b0b349 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
using System;
using System.Collections.Generic;
using System.Text;
using libsecondlife;

namespace OpenSim.Region.Environment.Modules.VoiceChat
{
    public enum VoiceCodec
    {
        None = 0,
        PCM8 = 1 << 0,
        PCM16 = 1 << 1,
        PCM32 = 1 << 2,
        Speex = 1 << 3,
    }

    public class VoicePacket
    {
        public LLUUID m_clientId;
        byte[] m_audioData;
        public int m_codec;

        public VoicePacket(byte[] data)
        {
            int pos = 0;
            m_codec = data[pos++];
            m_codec |= data[pos++] << 8;
            m_codec |= data[pos++] << 16;
            m_codec |= data[pos++] << 24;

            m_audioData = new byte[data.Length - pos];
            Buffer.BlockCopy(data, pos, m_audioData, 0, data.Length - pos);
        }

        public byte[] GetBytes()
        {
            VoicePacketHeader header = new VoicePacketHeader();
            byte[] bytes = new byte[5+16+4+m_audioData.Length];

            header.length = bytes.Length-5;
            
            //ToClient packets are type 2
            header.type = 2;

            int pos = 0;
            header.CopyTo(bytes, pos); pos += 5;
            m_clientId.GetBytes().CopyTo(bytes, pos); pos += 16;

            bytes[pos++] = (byte)((m_codec) % 256);
            bytes[pos++] = (byte)((m_codec << 8) % 256);
            bytes[pos++] = (byte)((m_codec << 16) % 256);
            bytes[pos++] = (byte)((m_codec << 24) % 256);

            m_audioData.CopyTo(bytes, pos);
            return bytes;
        }
    }
}