Esempio n. 1
0
        private void LoopNameUpdate(object sender, KeyEventArgs e)
        {
            if (e.KeyCode == Keys.Enter || e.KeyCode == Keys.Return)
            {
                TextBox box = (TextBox)sender;

                // UPDATE CLIENTS WITH NEW NAME
                foreach (KeyValuePair <string, Client> kvp in clients)
                {
                    Client c = kvp.Value;
                    if (c.IsConnected())
                    {
                        string loop = "01";
                        if (int.Parse(box.Tag.ToString()) < 10)
                        {
                            loop = "0" + box.Tag.ToString();
                        }
                        else
                        {
                            loop = box.Tag.ToString();
                        }

                        udpServer.Reply(Encoding.ASCII.GetBytes("LPN" + loop + box.Text), c.endpoint);
                    }
                }

                box.BackColor = Color.FromArgb(32, 32, 32);
            }
        }
Esempio n. 2
0
        private void SendAudio()
        {
            // SEND AUDIO TO CLIENTS
            lock (clientsLock)
            {
                foreach (KeyValuePair <string, Client> kvp in clients)
                {
                    Client c = kvp.Value;
                    if (c.IsConnected() && c.outgoingSamples != null && c.outgoingSamples.Length > 0)
                    {
                        byte[] encoded_data = c.encoder.Encode(c.outgoingSamples, c.audioFormat);
                        if (encoded_data != null)
                        {
                            udpServer.Reply(encoded_data, c.endpoint);
                        }
                    }
                }
            }

            // SEND AUDIO TO PFL
        }
Esempio n. 3
0
        private void ServerReceivedData(byte[] data, IPEndPoint sender)
        {
            // GET CLIENT
            Client c = GetClient(sender);

            if (Encoding.ASCII.GetString(data).Substring(0, 3) == "HLO")             // HELLO
            {
                // CLIENT CONNECTED
                string client_guid = Encoding.ASCII.GetString(data).Substring(3);

                Logger.WriteLine("SERVER RECEIVED: " + Encoding.ASCII.GetString(data));
                udpServer.Reply(Encoding.ASCII.GetBytes("HELLO CLIENT!"), sender);

                lock (clientsLock)
                {
                    if (clients.ContainsKey(client_guid))
                    {
                        clients[client_guid].SetConnected(true);
                        clients[client_guid].endpoint = sender;

                        // RESEND ALL CLIENT LOOP LIGHTS STATUSES
                        InitializeClientLoopButtons(client_guid);

                        // RESEND ALL LOOP NAMES
                        SendAllLoopNames(sender);
                    }
                    else
                    {
                        clients.Add(client_guid, new Client(sender, serverSampleRate, serverChannels, client_guid));

                        // SEND ALL CLIENT LOOP LIGHTS STATUSES (Just in case)
                        InitializeClientLoopButtons(client_guid);

                        // SEND ALL LOOP NAMES
                        SendAllLoopNames(sender);
                    }
                    // SET LAST PACKET TIME
                    clients[client_guid].lastPacket = DateTime.Now;
                }
            }
            else if (c != null)
            {
                // SET LAST PACKET TIME
                clients[c.guid].lastPacket = DateTime.Now;

                if (!c.IsConnected())
                {
                    // CLIENT WOKE TO LIFE AGAIN
                    c.SetConnected(true);
                    clients[c.guid].endpoint = sender;
                    InitializeClientLoopButtons(c.guid);
                }

                if (Encoding.ASCII.GetString(data) == "BYE SERVER!")
                {
                    // CLIENT CONNECTED
                    Logger.WriteLine("SERVER RECEIVED: " + Encoding.ASCII.GetString(data));

                    lock (clientsLock)
                    {
                        // MARK AS DISCONNECTED
                        clients[c.guid].SetConnected(false);

                        // TURN OFF ALL CLIENTS LOOP LIGHTS
                        for (int i = 0; i < numLoops; i++)
                        {
                            udpServer.Reply(CMD.GetCmdBytes(CMD.CMDS.TurnOffLoopListenLight, (byte)i), sender);
                            udpServer.Reply(CMD.GetCmdBytes(CMD.CMDS.TurnOffLoopTalkLight, (byte)i), sender);
                            udpServer.Reply(CMD.GetCmdBytes(CMD.CMDS.TurnOffLoopTalkFlash, (byte)i), sender);
                        }
                    }

                    udpServer.Reply(Encoding.ASCII.GetBytes("BYE CLIENT!"), sender);
                }
                else if (data.Length == 3)
                {
                    // RECEIVED COMMAND
                    Logger.WriteLine("SERVER RECEIVED COMMAND: " + data[0] + " " + data[1] + " " + data[2]);
                    CMD.ExecuteCmd(data, c.guid);
                }
                else
                {
                    // ASSUME SAMPLE RECEIVED
                    lock (clientsLock)
                    {
                        processIncomingAudioData(data, clients[c.guid]);
                    }
                }
            }
        }
Esempio n. 4
0
        static public void RunCommand(CMDS command, byte argument, string sender)
        {
            switch (command)
            {
            case CMDS.StartListeningToLoop:
                if (!clients[sender].GetSources().Contains((int)argument))
                {
                    clients[sender].AddSource((int)argument);
                    loops[(int)argument].addListenerToLoop(sender);
                    UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOnLoopListenLight, argument), clients[sender].endpoint);
                }
                break;

            case CMDS.StopListeningToLoop:
                if (clients[sender].GetSources().Contains((int)argument))
                {
                    clients[sender].RemoveSource((int)argument);
                    loops[(int)argument].removeListenerFromLoop(sender);
                    UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOffLoopListenLight, argument), clients[sender].endpoint);
                }
                break;

            case CMDS.StartTalkingToLoop:
                // REMOVE TALKER FROM ALL LOOPS
                for (int i = 0; i < loops.Count; i++)
                {
                    if (loops[i].talkers.Contains(sender))
                    {
                        loops[i].removeTalkerFromLoop(sender);
                        clients[sender].destinations.Remove(i);
                        UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOffLoopTalkFlash, (byte)i), clients[sender].endpoint);
                    }
                }

                if (!clients[sender].destinations.Contains((int)argument))
                {
                    clients[sender].destinations.Add((int)argument);
                    loops[(int)argument].addTalkerToLoop(sender);
                    UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOnLoopTalkFlash, argument), clients[sender].endpoint);

                    // ACTIVATE ACTIVE-LIGHT FOR ALL USERS
                    foreach (KeyValuePair <string, Client> kvp in clients)
                    {
                        Client c = kvp.Value;

                        if (c.IsConnected() && kvp.Key != sender)
                        {
                            UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOnLoopTalkLight, argument), c.endpoint);
                        }
                    }
                }

                // Check if loop is left without talkers
                for (int i = 0; i < loops.Count; i++)
                {
                    if (loops[i].talkers.Count == 0)
                    {
                        // No more talkers in this loop, turn of active talker light for all users
                        foreach (KeyValuePair <string, Client> kvp in clients)
                        {
                            Client c = kvp.Value;

                            if (c.IsConnected())
                            {
                                UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOffLoopTalkLight, (byte)i), c.endpoint);
                            }
                        }
                    }
                }
                break;

            case CMDS.StopTalkingToLoop:
                if (clients[sender].destinations.Contains((int)argument))
                {
                    clients[sender].destinations.Remove((int)argument);
                    loops[(int)argument].removeTalkerFromLoop(sender);
                    UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOffLoopTalkFlash, argument), clients[sender].endpoint);

                    // IF LOOP IS EMPTY BLANK TALK BUTTONS
                    if (loops[(int)argument].talkers.Count == 0)
                    {
                        foreach (KeyValuePair <string, Client> kvp in clients)
                        {
                            Client c = kvp.Value;

                            if (c.IsConnected())
                            {
                                UdpServer.Reply(CMD.GetCmdBytes(CMDS.TurnOffLoopTalkLight, argument), c.endpoint);
                            }
                        }
                    }
                }
                break;

            case CMDS.TurnOnLoopListenLight:
                if (lButtons.ContainsKey((int)argument))
                {
                    lButtons[(int)argument].Invoke(new Action(() => { lButtons[(int)argument].setLitState(true); }));
                }
                break;

            case CMDS.TurnOffLoopListenLight:
                if (lButtons.ContainsKey((int)argument))
                {
                    lButtons[(int)argument].Invoke(new Action(() => { lButtons[(int)argument].setLitState(false); }));
                }
                break;

            case CMDS.TurnOnLoopTalkLight:
                if (tButtons.ContainsKey((int)argument))
                {
                    tButtons[(int)argument].Invoke(new Action(() => { tButtons[(int)argument].setLitState(true); }));
                }
                break;

            case CMDS.TurnOffLoopTalkLight:
                if (tButtons.ContainsKey((int)argument))
                {
                    tButtons[(int)argument].Invoke(new Action(() => { tButtons[(int)argument].setLitState(false); }));
                }
                break;

            case CMDS.SetClientAudioFormat:
                clients[sender].audioFormat = (int)argument;
                clients[sender].decoder.SetFormat((int)argument);
                clients[sender].encoder.SetFormat((int)argument);
                break;


            case CMDS.Ping:
                UdpServer.Reply(CMD.GetCmdBytes(CMDS.Pong, (byte)0), clients[sender].endpoint);
                break;
            }
        }
Esempio n. 5
0
        private void FetchAudio()
        {
            // DETERMINE MAX AND MIN CLIENTS INPUT BUFFER LENGTHS
            processAudio = true;
            double maxBuffer = 0;
            double minBuffer = double.MaxValue;
            double bufferLength;

            // NOMINAL NUMBER OF BYTES TO GET FROM BUFFERS
            int bytes = 2 * (int)Math.Ceiling(mainServerInterval * (serverFormat.SampleRate / 1000d) * 4 * serverFormat.Channels);

            // ALIGN BY WHOLE SAMPLES 2ch * 4bytes pr channel
            while (bytes % 8 != 0)
            {
                bytes++;
            }


            Monitor.Enter(clientsLock);

            foreach (KeyValuePair <string, Client> kvp in clients)
            {
                Client c = kvp.Value;

                TimeSpan packet = DateTime.Now - c.lastPacket;

                if (c.IsConnected() && packet.TotalMilliseconds < 200)
                {
                    bufferLength = c.inputStream.BufferedBytes;
                    if (bufferLength > maxBuffer)
                    {
                        maxBuffer = bufferLength;
                    }
                    if (bufferLength < minBuffer)
                    {
                        minBuffer = bufferLength;
                    }
                }
            }


            // IF THE CLINET WITH THE LEAST AMOUNT OF AUDIO BUFFERED DON'T
            // HAVE ENOUGH, DON'T PROCESS AUDIO THIS TICK
            if (minBuffer < bytes)
            {
                processAudio = false;
            }

            // UNLESS - THE CLIENT WITH THE MOST AMOUNT OF AUDIO HAS MORE
            // THAN DOUBLE THE NUMBER OF BYTES REQUIRED
            if (maxBuffer > bytes * 2)
            {
                //processAudio = true;
            }

            if (processAudio)
            {
                foreach (KeyValuePair <string, Client> kvp in clients)
                {
                    Client c = kvp.Value;
                    if (c.IsConnected())
                    {
                        c.currentSamples = new byte[bytes];
                        c.inputStream.Read(c.currentSamples, 0, bytes);
                    }
                }
            }

            Monitor.Exit(clientsLock);
        }
Esempio n. 6
0
        private void MixAudio()
        {
            List <float> output;
            List <float> pfl;
            int          currentSamples   = 0;
            int          connectedClients = 0;

            // MIX CLIENTS AUDIO
            lock (clientsLock)
            {
                foreach (KeyValuePair <string, Client> kvp in clients)
                {
                    Client c = kvp.Value;
                    if (c.IsConnected())
                    {
                        connectedClients++;
                        output = new List <float>();
                        for (int i = 0; i < c.currentSamples.Length / 4; i++)
                        {
                            output.Add(0f);
                        }

                        lock (c.sourcesLock)
                        {
                            foreach (int loop in c.GetSources())
                            {
                                Loop l = loops[loop];
                                lock (l.talkersLock)
                                {
                                    foreach (string talker in l.talkers)
                                    {
                                        if (clients[talker].IsConnected() && (c.guid != talker || NminusOne == false))
                                        {
                                            output = mixSamples(output, clients[talker]);
                                        }
                                    }
                                }
                            }
                        }

                        c.outgoingSamples = Converters.floats2bytes(output.ToArray());
                    }
                    else
                    {
                        c.outgoingSamples = null;
                    }
                    currentSamples = c.currentSamples.Length;
                }

                // MIX LOOP AUDIO FOR METERING AND SERVER PFL
                pfl = new List <float>();
                for (int i = 0; i < currentSamples / 4; i++)
                {
                    pfl.Add(0f);
                }

                foreach (Loop loop in loops)
                {
                    output = new List <float>();
                    for (int i = 0; i < currentSamples / 4; i++)
                    {
                        output.Add(0f);
                    }

                    foreach (string talker in loop.talkers)
                    {
                        output = mixSamples(output, clients[talker]);
                    }
                    loop.outgoingSamples = Converters.floats2bytes(output.ToArray());

                    if (loop.pfl)
                    {
                        pfl = mixSamples(pfl, output);
                    }
                }
                byte[] bytes = Converters.floats2bytes(pfl.ToArray());

                // If no clients are connected, ignore pfl
                if (connectedClients > 0)
                {
                    pflBuffer.AddSamples(bytes, 0, bytes.Length);

                    // Keep pflBuffer below 200ms
                    if (pflBuffer.BufferedDuration.TotalMilliseconds > 200)
                    {
                        double bytes_to_read = (sampleRate / 1000) * channels * (pflBuffer.BufferedDuration.TotalMilliseconds - 200);
                        byte[] void_array    = new byte[(int)bytes_to_read];
                        pflBuffer.Read(void_array, 0, (int)bytes_to_read);

                        //Logger.WriteLine("Trew away " + bytes_to_read.ToString() + " bytes from pflBuffer");
                    }
                }
            }
        }