Beispiel #1
0
  private boolean mix(short[] outBuffer, int bufferSize) {
    List<AudioOutputSpeech> mix = new ArrayList<AudioOutputSpeech>();
    List<AudioOutputSpeech> del = new ArrayList<AudioOutputSpeech>();

    // TODO add priority speaker support

    for (AudioOutputSpeech speech : mAudioOutputs.values()) {
      if (!speech.needSamples(bufferSize)) del.add(speech);
      else mix.add(speech);
    }

    if (!mix.isEmpty()) {
      for (AudioOutputSpeech speech : mix) {
        float[] buffer = speech.getBuffer();
        for (int i = 0; i < bufferSize; i++) {
          short pcm = (short) (buffer[i] * Short.MAX_VALUE); // Convert float to short
          pcm = (short) Math.max(Math.min(pcm, Short.MAX_VALUE), Short.MIN_VALUE); // Clip audio
          outBuffer[i] += pcm;
        }
      }
    }

    for (AudioOutputSpeech speech : del) mAudioOutputs.remove(speech.getSession());

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