Skip to content

Commit 68198ce

Browse files
author
Christian Bernier
committed
Add an example of AudioPostProcessor to mix the audio of 2 data sources.
1 parent aebb3c1 commit 68198ce

File tree

2 files changed

+82
-0
lines changed

2 files changed

+82
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package com.otaliastudios.transcoder.postprocessor;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import java.nio.ShortBuffer;
6+
import java.util.ArrayDeque;
7+
import java.util.Queue;
8+
9+
public class MixerSourceAudioPostProcessor implements AudioPostProcessor {
10+
11+
Queue<ShortBuffer> mBuffers = new ArrayDeque<>();
12+
13+
@Override
14+
public long calculateNewDurationUs(long durationUs) {
15+
return 0;
16+
}
17+
18+
@Override
19+
public long postProcess(@NonNull ShortBuffer inputBuffer, @NonNull ShortBuffer outputBuffer, long bufferDurationUs) {
20+
if (inputBuffer.remaining() > 0) {
21+
ShortBuffer sourceBuffer = ShortBuffer.allocate(inputBuffer.limit());
22+
sourceBuffer.put(inputBuffer);
23+
sourceBuffer.rewind();
24+
mBuffers.add(sourceBuffer);
25+
}
26+
return 0;
27+
}
28+
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package com.otaliastudios.transcoder.postprocessor;
2+
3+
import androidx.annotation.NonNull;
4+
5+
import java.nio.ShortBuffer;
6+
7+
import static java.lang.Math.min;
8+
9+
public class MixerTargetAudioPostProcessor implements AudioPostProcessor {
10+
private MixerSourceAudioPostProcessor mSource;
11+
private float mSourceVolume;
12+
private float mTargetVolume;
13+
14+
@Override
15+
public long calculateNewDurationUs(long durationUs) {
16+
return durationUs;
17+
}
18+
19+
public MixerTargetAudioPostProcessor(MixerSourceAudioPostProcessor source, float sourceVolume, float targetVolume)
20+
{
21+
mSource = source;
22+
mSourceVolume = sourceVolume;
23+
mTargetVolume = targetVolume;
24+
}
25+
26+
private short mixSamples(short sourceSample, short targetSample) {
27+
float mixedSample = (sourceSample * mSourceVolume) + (targetSample * mTargetVolume);
28+
if (mixedSample < Short.MIN_VALUE)
29+
mixedSample = Short.MIN_VALUE;
30+
else if (mixedSample > Short.MAX_VALUE)
31+
mixedSample = Short.MAX_VALUE;
32+
return (short)mixedSample;
33+
}
34+
35+
@Override
36+
public long postProcess(@NonNull ShortBuffer inputBuffer, @NonNull ShortBuffer outputBuffer, long bufferDurationUs) {
37+
ShortBuffer sourceBuffer = mSource.mBuffers.peek();
38+
int inputRemaining = inputBuffer.remaining();
39+
while (sourceBuffer != null && inputRemaining > 0) {
40+
int sourceRemaining = sourceBuffer.remaining();
41+
int remaining = min(inputRemaining, sourceRemaining);
42+
for (int i=0; i<remaining; i++) {
43+
outputBuffer.put(mixSamples(sourceBuffer.get(), inputBuffer.get()));
44+
}
45+
inputRemaining -= sourceRemaining;
46+
if (inputRemaining >= 0) {
47+
mSource.mBuffers.remove();
48+
sourceBuffer = mSource.mBuffers.peek();
49+
}
50+
}
51+
outputBuffer.put(inputBuffer);
52+
return bufferDurationUs;
53+
}
54+
}

0 commit comments

Comments
 (0)