Beispiel #1
0
  @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();
      }
    }
  }
Beispiel #2
0
 public void stopPlaying() {
   mRunning = false;
   mThread = null;
   for (AudioOutputSpeech s : mAudioOutputs.values()) s.destroy();
 }