コード例 #1
0
        private void HandleInvitation(DataInputStream dataInputStream, model.RtpMidiServer rtpMidiServer)
        {
            int protocolVersion = dataInputStream.ReadInt();

            if (protocolVersion != PROTOCOL_VERSION)
            {
                Log.Info("RtpMidi", "Protocol version: {} did not match version {}", protocolVersion, PROTOCOL_VERSION);
                return;
            }
            int initiatorToken = dataInputStream.ReadInt();
            int ssrc           = dataInputStream.ReadInt();
            //Scanner scanner = new Scanner(dataInputStream).UseDelimiter(NUL_TERMINATOR);
            //if (!scanner.HasNext)
            //{
            //    Log.Info("RtpMidi","Could not find \\0 terminating string");
            //    return;
            //}
            //string name = scanner.Next();
            string name = dataInputStream.ReadLine();

            foreach (IRtpMidiCommandListener listener in listeners)
            {
                listener.OnMidiInvitation(new RtpMidiInvitationRequest(protocolVersion, initiatorToken, ssrc, name), rtpMidiServer);
            }
        }
コード例 #2
0
 public RtpMidiSessionConnection(RtpMidiSession rtpMidiSession, model.RtpMidiServer rtpMidiServer, int ssrc, IRtpMidiMessageSender rtpMidiMessageSender)
 {
     RtpMidiSession       = rtpMidiSession;
     RtpMidiServer        = rtpMidiServer;
     Ssrc                 = ssrc;
     RtpMidiMessageSender = rtpMidiMessageSender;
 }
コード例 #3
0
 public void OnEndSession(RtpMidiEndSession rtpMidiEndSession, model.RtpMidiServer rtpMidiServer)
 {
     Log.Info("RtpMidi", "Session ended with: {}", rtpMidiServer);
     acceptedServers.Remove(rtpMidiServer);
     foreach (IEndSessionListener listener in endSessionListeners)
     {
         listener.OnEndSession(rtpMidiEndSession, rtpMidiServer);
     }
 }
コード例 #4
0
 private void SendMidiInvitationAnswer(model.RtpMidiServer rtpMidiServer, string type, RtpMidiInvitation midiInvitation)
 {
     try {
         Log.Info("RtpMidi", "Sending invitation {} to: {}", type, rtpMidiServer);
         Send(midiInvitation, rtpMidiServer);
     }
     catch (IOException e) {
         Log.Error("RtpMidi", "IOException while sending invitation {}", type, e);
     }
 }
コード例 #5
0
        public void handle(byte[] data, model.RtpMidiServer appleMidiServer)
        {
            DataInputStream dataInputStream = new DataInputStream(new MemoryStream(data));

            try {
                byte header1 = (byte)dataInputStream.ReadByte();
                if (header1 != RtpMidiCommand.MIDI_COMMAND_HEADER1)
                {
                    Log.Info("RtpMidi", "Header did not contain first MIDI command header");
                    return;
                }
                byte header2 = (byte)dataInputStream.ReadByte();
                if (header2 != RtpMidiCommand.MIDI_COMMAND_HEADER2)
                {
                    Log.Info("RtpMidi", "Header did not contain second MIDI command header");
                    return;
                }
                byte[] commandBuffer    = new byte[COMMAND_BUFFER_LENGTH];
                int    commandBytesRead = dataInputStream.Read(commandBuffer);
                if (commandBytesRead != COMMAND_BUFFER_LENGTH)
                {
                    Log.Info("RtpMidi", "The number of command bytes: {} did not match: {}", commandBytesRead, COMMAND_BUFFER_LENGTH);
                    return;
                }
                string      command = Encoding.UTF8.GetString(commandBuffer);
                CommandWord commandWord;
                try
                {
                    commandWord = (CommandWord)System.Enum.Parse(typeof(CommandWord), command);
                }
                catch (IllegalArgumentException e) {
                    Log.Info("RtpMidi", "Could not parse command word from: {}", command);
                    return;
                }
                switch (commandWord)
                {
                case CommandWord.IN:
                    HandleInvitation(dataInputStream, appleMidiServer);
                    break;

                case CommandWord.CK:
                    HandleSynchronization(dataInputStream, appleMidiServer);
                    break;

                case CommandWord.BY:
                    HandleEndSession(dataInputStream, appleMidiServer);
                    break;
                }
            }
            catch (System.IO.IOException e)
            {
                Log.Error("RtpMidi", "IOException while parsing message", e);
            }
        }
コード例 #6
0
        private void HandleEndSession(DataInputStream dataInputStream, model.RtpMidiServer rtpMidiServer)
        {
            int protocolVersion = dataInputStream.ReadInt();

            if (protocolVersion != PROTOCOL_VERSION)
            {
                Log.Info("RtpMidi", "Protocol version: {} did not match version {}", protocolVersion, PROTOCOL_VERSION);
                return;
            }
            int initiatorToken = dataInputStream.ReadInt();
            int ssrc           = dataInputStream.ReadInt();

            foreach (IRtpMidiCommandListener listener in listeners)
            {
                listener.OnEndSession(new RtpMidiEndSession(protocolVersion, initiatorToken, ssrc), rtpMidiServer);
            }
        }
コード例 #7
0
 public void OnMidiInvitation(RtpMidiInvitationRequest invitation, model.RtpMidiServer rtpMidiServer)
 {
     Log.Info("RtpMidi", "MIDI invitation from: {}", rtpMidiServer);
     if (GetSessionServerState() == State.ACCEPT_INVITATIONS)
     {
         SendMidiInvitationAnswer(rtpMidiServer, "accept",
                                  new RtpMidiInvitationAccepted(invitation.ProtocolVersion, invitation.InitiatorToken, Ssrc, Name));
         RtpMidiSession           rtpMidiSession = sessions.Last; // Pop()
         RtpMidiSessionConnection connection     =
             new RtpMidiSessionConnection(rtpMidiSession, rtpMidiServer, Ssrc, this);
         rtpMidiSession.Sender = connection;
         currentSessions.Add(invitation.Ssrc, connection);
         NotifyMaxNumberOfSessions();
     }
     else
     {
         SendMidiInvitationAnswer(rtpMidiServer, "decline",
                                  new RtpMidiInvitationDeclined(invitation.ProtocolVersion, invitation.InitiatorToken, Ssrc, Name));
     }
 }
コード例 #8
0
        public void OnEndSession(RtpMidiEndSession rtpMidiEndSession, model.RtpMidiServer rtpMidiServer)
        {
            Log.Info("RtpMidi", "Session end from: {}", rtpMidiServer);
            RtpMidiSessionConnection midiServer = currentSessions.GetValueOrDefault(rtpMidiEndSession.Ssrc);

            if (midiServer != null)
            {
                RtpMidiSession RtpMidiSession = midiServer.RtpMidiSession;
                RtpMidiSession.Sender = null;
                RtpMidiSession.OnEndSession(rtpMidiEndSession, rtpMidiServer);
            }
            currentSessions.Remove(rtpMidiEndSession.Ssrc);
            RtpMidiSessionConnection sessionTuple = currentSessions.GetValueOrDefault(rtpMidiEndSession.Ssrc);

            if (sessionTuple != null)
            {
                sessions.AddLast(sessionTuple.RtpMidiSession);
                NotifyMaxNumberOfSessions();
            }
        }
コード例 #9
0
        private void HandleSynchronization(DataInputStream dataInputStream, model.RtpMidiServer rtpMidiServer)
        {
            int  ssrc         = dataInputStream.ReadInt();
            byte count        = (byte)dataInputStream.ReadByte();
            int  paddingBytes = dataInputStream.Read(new byte[NUMBER_OF_PADDING_BYTES]);

            if (paddingBytes != NUMBER_OF_PADDING_BYTES)
            {
                Log.Info("RtpMidi", "The number of padding bytes: {} did not match: {}", paddingBytes, NUMBER_OF_PADDING_BYTES);
                return;
            }
            long timestamp1 = dataInputStream.ReadLong();
            long timestamp2 = dataInputStream.ReadLong();
            long timestamp3 = dataInputStream.ReadLong();

            foreach (IRtpMidiCommandListener listener in listeners)
            {
                listener.OnClockSynchronization(new RtpMidiClockSynchronization(ssrc, count, timestamp1, timestamp2, timestamp3), rtpMidiServer);
            }
        }
コード例 #10
0
        public void OnMidiInvitation(RtpMidiInvitationRequest invitation, model.RtpMidiServer rtpMidiServer)
        {
            Log.Info("RtpMidi", "MIDI invitation from: {}", rtpMidiServer);
            bool contains = acceptedServers.Contains(rtpMidiServer);

            if (contains)
            {
                Log.Info("RtpMidi", "Server {} was still in accepted servers list. Removing old entry.", rtpMidiServer);
                OnEndSession(new RtpMidiEndSession(invitation.ProtocolVersion, invitation.InitiatorToken, invitation.Ssrc), rtpMidiServer);
            }
            if (getServerState() == State.ACCEPT_INVITATIONS)
            {
                SendMidiInvitationAnswer(rtpMidiServer, "accept",
                                         new RtpMidiInvitationAccepted(invitation.ProtocolVersion, invitation.InitiatorToken, Ssrc, Name));
                acceptedServers.Add(rtpMidiServer);
            }
            else
            {
                SendMidiInvitationAnswer(rtpMidiServer, "decline",
                                         new RtpMidiInvitationDeclined(invitation.ProtocolVersion, invitation.InitiatorToken, Ssrc, Name));
            }
        }
コード例 #11
0
 public void OnMidiInvitation(RtpMidiInvitationRequest invitation, model.RtpMidiServer rtpMidiServer)
 {
 }
コード例 #12
0
 private void Send(RtpMidiCommand midiCommand, model.RtpMidiServer rtpMidiServer)
 {
     Send(midiCommand.ToByteArray(), rtpMidiServer);
 }
コード例 #13
0
 public void OnEndSession(RtpMidiEndSession rtpMidiEndSession, model.RtpMidiServer rtpMidiServer)
 {
     OnEndSession();
 }
コード例 #14
0
 public void OnClockSynchronization(RtpMidiClockSynchronization clockSynchronization, model.RtpMidiServer rtpMidiServer)
 {
 }
コード例 #15
0
        public void OnClockSynchronization(RtpMidiClockSynchronization clockSynchronization, model.RtpMidiServer rtpMidiServer)
        {
            if (clockSynchronization.Count == (byte)0)
            {
                RtpMidiSessionConnection sessionTuple = currentSessions.GetValueOrDefault(clockSynchronization.Ssrc);
                long currentTimestamp;
                if (sessionTuple != null)
                {
                    long sessionTimestamp = sessionTuple.RtpMidiSession.GetCurrentTimestamp();
                    if (sessionTimestamp != -1)
                    {
                        currentTimestamp = sessionTimestamp;
                    }
                    else
                    {
                        currentTimestamp = GetFallbackTimestamp();
                    }
                }
                else
                {
                    currentTimestamp = GetFallbackTimestamp();
                }
                Log.Debug("RtpMidi", "Answering with timestamp: {}", currentTimestamp);
                RtpMidiClockSynchronization clockSynchronizationAnswer =
                    new RtpMidiClockSynchronization(Ssrc, (byte)1, clockSynchronization.Timestamp1,
                                                    currentTimestamp, 0L);
                try
                {
                    Send(clockSynchronizationAnswer, rtpMidiServer);
                }
                catch (IOException e)
                {
                    Log.Error("RtpMidi", "IOException while sending clock synchronization", e);
                }
            }
            else
            if (clockSynchronization.Count == (byte)2)
            {
                long offsetEstimate =
                    (clockSynchronization.Timestamp3 + clockSynchronization.Timestamp1) / 2 -
                    clockSynchronization.Timestamp2;

                RtpMidiSessionConnection midiServer = currentSessions.GetValueOrDefault(clockSynchronization.Ssrc);
                if (midiServer != null)
                {
                    midiServer.RtpMidiSession.OffsetEstimate = offsetEstimate;
                }
            }
        }
コード例 #16
0
 public void OnClockSynchronization(RtpMidiClockSynchronization clockSynchronization, model.RtpMidiServer rtpMidiServer)
 {
     Log.Debug("RtpMidi", "MIDI clock synchronization: clockSynchronization: {}, appleMidiServer: {}", clockSynchronization, rtpMidiServer);
 }
コード例 #17
0
 public void OnEndSession(RtpMidiEndSession rtpMidiEndSession, model.RtpMidiServer rtpMidiServer)
 {
     Log.Debug("RtpMidi", "MIDI end session: rtpMidiEndSession: {}, rtpMidiServer: {}", rtpMidiEndSession,
               rtpMidiServer);
 }
コード例 #18
0
 public void OnMidiInvitation(RtpMidiInvitationRequest invitation, model.RtpMidiServer rtpMidiServer)
 {
     Log.Debug("RtpMidi", "MIDI invitation: invitation: {}, appleMidiServer: {}", invitation, rtpMidiServer);
 }
コード例 #19
0
 public void Send(RtpMidiMessage rtpMidiMessage, model.RtpMidiServer rtpMidiServer)
 {
     Send(rtpMidiMessage.ToByteArray(), rtpMidiServer);
 }
コード例 #20
0
        private void Send(byte[] data, model.RtpMidiServer rtpMidiServer)
        {
            Log.Debug("RtpMidi", "Sending data {} to server {}", BitConverter.ToString(data).Replace("-", ""), rtpMidiServer);

            socket.Send(new DatagramPacket(data, data.Length, rtpMidiServer.InetAddress, rtpMidiServer.Port));
        }
コード例 #21
0
        private void Send(RtpMidiCommand midiCommand, model.RtpMidiServer rtpMidiServer)
        {
            byte[] invitationAcceptedBytes = midiCommand.ToByteArray();

            socket.Send(new DatagramPacket(invitationAcceptedBytes, invitationAcceptedBytes.Length, rtpMidiServer.InetAddress, rtpMidiServer.Port));
        }