The MessageFrame class is responsible for all communications with the remote controller. There is one instance of this class associated with each active call, and one instance associated with Manager. Since there is one communications module with each call, there is no need to "distribute" incoming messages from one central point to each active call.
Audio flows from an external SofaSwitch entity via a UDP socket. This socket is in the Comms class. From the socket, there is a direct link to an instance of the Member class. Audio from the external entity is written to the buffer in the Member class.
Each Member maintains a list of the other members in this ConferenceRoom. Other members in the room are referred to as a list of participants, so we use the ParticipantDict class to hold the Participants.
Every 30 ms, the last piece of incoming audio from each Participant is multiplexed together, and sent to the UDP socket, and on to the external SofaSwitch entity.
There is one instance of the Supervisor class, which contains one instance of the MessageFrame class. This supervisor talks directly to the Manager, to enact the required control response. On startup, this Supervisor connects to the server, and waits for control messages. Multiple preallocated MessageFrames will also connect to the server, but these are waiting to be allocated to conference member. Using preallocated instances speeds up the creation time of new conference members, and improves the reliability of this process under load.
1.4.6