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