@Override public void messageVoiceData(byte[] data) { if (!mRunning) return; JumbleUDPMessageType dataType = JumbleUDPMessageType.values()[data[0] >> 5 & 0x7]; int msgFlags = data[0] & 0x1f; byte[] voiceData = new byte[data.length - 1]; System.arraycopy(data, 1, voiceData, 0, voiceData.length); PacketDataStream pds = new PacketDataStream(voiceData, voiceData.length); int session = (int) pds.readLong(); User user = getService().getUserHandler().getUser(session); if (user != null && !user.isLocalMuted()) { // TODO check for whispers here int seq = (int) pds.readLong(); ByteBuffer packet = ByteBuffer.allocate(pds.left() + 1); packet.put((byte) msgFlags); packet.put(pds.dataBlock(pds.left())); AudioOutputSpeech aop = mAudioOutputs.get(session); if (aop != null && aop.getCodec() != dataType) { aop.destroy(); aop = null; } if (aop == null) { aop = new AudioOutputSpeech(session, dataType, this); mAudioOutputs.put(session, aop); } aop.addFrameToBuffer(packet.array(), seq); mLastPacket = System.nanoTime(); synchronized (mInactiveLock) { mInactiveLock.notify(); } } }