Exemple #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();
  }