public void run()
	{
		try {
			if(isMicAvailable) {
				// Start input line
				inputDataLine.start();

				//while (!inputDataLine.isRunning()) {
				try {
					Thread.sleep(100);
				} catch (Exception e) {
					e.printStackTrace();
				}
				//}
			}

		} catch (Exception e) {
			isMicAvailable = false;
		}

		// Start StreamSender
		if(!isMicAvailable) {
			sender.setListenOnly(true);
		}
		sender.start();

		// Start StreamReceiver
		receiver.start();

		if(initCallback != null) {
			initCallback.run();
		}

		while(!endFlag) {
			try {
				clientUserInfoManager.stepTimeout(LIMIT_TIME);
				Thread.sleep(500);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

		// Stop data source
		try {
			inputDataLine.stop();
		} catch (Exception e) {
			// ignore error
		}
	}