The Project

Introduction:

Audioconf project has as main purpose the setting up of a working system for audio conferences between two or more users over the network. Despite the aspiring intentions, carrying out this task doesn't mean that this program is intended to replace other similar ones: it should be just a way to attempt the understanding of how these things could work. 
Generally speaking, an audio conference system can be formed by a server and one or more clients or be composed only by clients. In the last type of structure each client send its audio stream to all of the other partecipants, and in the same time it receives all of the other audio streams. This architecure has one big problem,  the number of streaming on the network increase quadratically with the number of partecipants and this may lead to a network failure.
The other type of system, which also uses a server application, solves the problem of the network overload because the clients comunicate only with the server. Having firmly stabilized that the basic structure of the system is the client-server one, there are several methods to implement this one depending on how the working load is split up between Clients and Server.
There are two main ways to implement the above mentioned situation. Said N the number of connected users, the first method wants that, after having received audio streams from client, the server mix them together in N different ways sending to each user a mix of the remainigs N-1 clients in order to prevent echo effect. This application shifts all the working load on the server, allowing the clients to just play received streams. 
The second performing, instead, frees the Server from some weight, demanding the client to remove echo itself from received streams. Hence, Clients send their samples to the Server which mix them together in a unique stream and transmit it to every client. Obviously, this means that Clients will receive also their samples and so, in order to avoid echo, they have to execute particular algorithms. With this solution, working load is shared equally between Clients and Server. This seems to be the right procedure to carry out the main task.