c ++;
//Кожен 40-й блок ми відкидаємо, оскільки відтворення
//відбувається повільніше ніж запис. Число визначено експерементально.
if (m_c% 40 == 0)
{;
}
m_sendBuffer. Add (buffer, count);
(m_sendBuffer. IsReady ())
{_ sendBufferEvent. Set ();
}
}
# endregion
}
Клас сервера
//Клас представляє функціональність сервера
public class Server: IServer, IClientHandlerCallbacks
{
//Об'єкт, що очікує підключень клінтовTcpListener m_listener=null;
//Потік прослуховування клінтовThread m_listenThread=null;
//Список підключених пользователейList lt; User gt; m_users=new List lt; User gt; ();
//Генератор випадкових чисел для ідентифікатора користувача
private Random m_random=new Random (0);
//Список авторизованих клієнтів, що не встановили ще всі необхідні
//з'єднання і чекають їх встановлення.
private List lt; IClientHandler gt; m_waiting=new List lt; IClientHandler gt; ();
//Список клієнтів готових до работеList lt; IClientHandler gt; m_ready=new List lt; IClientHandler gt; ();
//Об'єкт для синхронізації на попередніх двох списках
private object m_handlersMutex=new object ();
//Потік вихідних даннихThread m_playbackThread=null;
//Клас підписаних на події сервераIServerCallbacks m_callbacks=null;
//Стани сервераState
{,
}
m_state=State. None;
//Закриваємо всі соедіненіяvoid CloseAllConnections ()
{_ state=State. None;
(m_listener!=null)
{
{_ listener. Stop ();
} (SocketException ex)
{
Manager. Log («Сервер: Чи не вдалося зупинити прослуховування. Причина:» + ex. Message);
}
_ listener=null;
}
(m_ready)
{(IClientHandler handler in m_ready)
{. Stop ();
}
}
(m_callbacks!=null)
{_ callbacks. OnStop ();
}
}
//Потік мікшування даних
private void Playback ()
{(m_state == State. Listening)
{(m_ready)
{length=m_ready. Count;
idx=m_ready. Count;
//Отримуємо масив, що містить аудідоданний кожного клієнта
AudioData [] data=new AudioData [idx]; merge=null; (int i=0; i lt; idx; i ++)
{[i]=m_ready [i] .GetNext ();
}
//Виробляємо мікшування аудіоданих
for (int i=idx - 1; i gt;=0; i -)
{(data [i] == null)
{;
}
(merge == null)
{= new AudioData (data [i] .Count, data [i] .Data) ;;
}
. Merge (data [i]);
}
//Відправляємо змікшованого дані назад клієнтам
for (int i=0; i lt; idx; i ++)
{_ ready [i] .Add (merge);
}
}. Sleep (190);
}
}
//Потік прослуховування підключень клієнтів
private void ListenForClients ()
{
{_ listener. Start ();
} (SocketException ex)
{. Log («Server: Failed to start listening. Reason:» + ex. Message); () ;;
}
Manager. Log («Сервер: Початок прослуховування» + m_listener. LocalEndpoint. ToString ());
(m_state == State. Listening)