Reset (); _ sendBufferEvent. Reset ();
//Запуск потоків з'єднань вхідних і вихідних даних
m_outputThread=new Thread (new ThreadStart (OutputThread)); _ outputThread. Start ();
_ inputThread=new Thread (new ThreadStart (InputThread)); _ inputThread. Start ();
_ transmit=true;
//керуючий цикл
//керуючий клієнт запитує дію у сервера і виконує його
bool localDisconnect=true; (! m_disconnect)
{request=new Command (Command. CommandType. ClientAction); _ acnpClient. SendCommand (request);
response=m_acnpClient. RecieveCommand (); (response == null)
{_ disconnect=true; () ;;
} (response. Value)
{Command. CommandType. None://Нічого не робити. Sleep (3000) ;; Command. CommandType. ServerLogout://Розірвати соедіненіе_transmit=false; _disconnect=true;=false; () ;;; Command. CommandType. ServerClearUserList://Очистити контакт-ліст_callbacks. OnContactListClear () ;; Command. CommandType. ServerUserOnline://Новий пользовательuserName=m_acnpClient. RecieveData lt; DataString gt; (); _ callbacks. OnContactListAddUser (userName. Value) ;;
}
}
//У випадку, якщо клієнт самостійно розірвав з'єднання
//необхідно послати повідомлення сервера (localDisconnect)
{request=new Command (Command. CommandType. ClientLogout); _ acnpClient. SendCommand (request);
}
}
//Потік вихідних даннихvoid OutputThread ()
{(! m_disconnect)
{(m_transmit)
{
//Чекаємо, поки дані не надійдуть у буфер
m_sendBufferEvent. WaitOne ();
audioData=m_sendBuffer. GetNext (); _ acnpOutput. SendAudioData (audioData);
}
}
}
//Потік входять даннихvoid InputThread ()
{ws=new AudioStream (new WaveFormat (8000, 1)); _ plabackThread=new Thread (new ParameterizedThreadStart (PlayBackThread)); _ plabackThread. Start (ws);
(! m_disconnect)
{(! m_transmit)
{;
}
data=m_acnpInput. RecieveAudioData (); (data == null)
{;
}
. Add (data);
(ws. IsReady ())
{ps=PlaybackState. Stopped;
//невідоме поведінку бібліотеки NAudio
//іноді при читанні властивості виникає виняток
try
{= m_iwp. PlaybackState;
} (Exception ex)
{str=ex. Message;
}
(ps!=PlaybackState. Playing)
{_ recieveBufferEvent. Set ();
}
}
}
}
//Потік воспроізведеніяvoid PlayBackThread (object wsObj)
{ws=(AudioStream) wsObj; _iwp=new DirectSoundOut ();
bs=new BlockAlignReductionStream (ws); _ iwp. Init (ws); _ iwp. PlaybackStopped +=new EventHandler (OnPlaybackStopped);
(! m_disconnect)
{_ recieveBufferEvent. WaitOne ();
(ws. IsReady ())
{(m_iwp. PlaybackState!=PlaybackState. Playing)
{_ iwp. Play ();
}
}
}
}
//Логування сообщеніяvoid Log (string message)
{. Log (message);
}
# region IAudioReciever Members
//Лічильник надходжень аудіо блоковint m_c=0;
//Установка класу передплатника на події клієнта
void IClient. SetCallbacks (IClientCallbacks callbacks)
{_ callbacks=callbacks;
}
//Отримання аудіоданих від бібліотеки NAudioIClient. AddAudioData (byte [] buffer, int count)
{(m_disconnect ||! m_transmit)
{;
}
_ ...