summaryrefslogtreecommitdiff
path: root/voip/java/android/net/rtp/AudioGroup.java
diff options
context:
space:
mode:
Diffstat (limited to 'voip/java/android/net/rtp/AudioGroup.java')
-rw-r--r--voip/java/android/net/rtp/AudioGroup.java206
1 files changed, 0 insertions, 206 deletions
diff --git a/voip/java/android/net/rtp/AudioGroup.java b/voip/java/android/net/rtp/AudioGroup.java
deleted file mode 100644
index 8faeb88db6e9..000000000000
--- a/voip/java/android/net/rtp/AudioGroup.java
+++ /dev/null
@@ -1,206 +0,0 @@
-/*
- * Copyright (C) 2010 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package android.net.rtp;
-
-import android.media.AudioManager;
-
-import java.util.HashMap;
-import java.util.Locale;
-import java.util.Map;
-
-/**
- * An AudioGroup is an audio hub for the speaker, the microphone, and
- * {@link AudioStream}s. Each of these components can be logically turned on
- * or off by calling {@link #setMode(int)} or {@link RtpStream#setMode(int)}.
- * The AudioGroup will go through these components and process them one by one
- * within its execution loop. The loop consists of four steps. First, for each
- * AudioStream not in {@link RtpStream#MODE_SEND_ONLY}, decodes its incoming
- * packets and stores in its buffer. Then, if the microphone is enabled,
- * processes the recorded audio and stores in its buffer. Third, if the speaker
- * is enabled, mixes all AudioStream buffers and plays back. Finally, for each
- * AudioStream not in {@link RtpStream#MODE_RECEIVE_ONLY}, mixes all other
- * buffers and sends back the encoded packets. An AudioGroup does nothing if
- * there is no AudioStream in it.
- *
- * <p>Few things must be noticed before using these classes. The performance is
- * highly related to the system load and the network bandwidth. Usually a
- * simpler {@link AudioCodec} costs fewer CPU cycles but requires more network
- * bandwidth, and vise versa. Using two AudioStreams at the same time doubles
- * not only the load but also the bandwidth. The condition varies from one
- * device to another, and developers should choose the right combination in
- * order to get the best result.</p>
- *
- * <p>It is sometimes useful to keep multiple AudioGroups at the same time. For
- * example, a Voice over IP (VoIP) application might want to put a conference
- * call on hold in order to make a new call but still allow people in the
- * conference call talking to each other. This can be done easily using two
- * AudioGroups, but there are some limitations. Since the speaker and the
- * microphone are globally shared resources, only one AudioGroup at a time is
- * allowed to run in a mode other than {@link #MODE_ON_HOLD}. The others will
- * be unable to acquire these resources and fail silently.</p>
- *
- * <p class="note">Using this class requires
- * {@link android.Manifest.permission#RECORD_AUDIO} permission. Developers
- * should set the audio mode to {@link AudioManager#MODE_IN_COMMUNICATION}
- * using {@link AudioManager#setMode(int)} and change it back when none of
- * the AudioGroups is in use.</p>
- *
- * @see AudioStream
- */
-public class AudioGroup {
- /**
- * This mode is similar to {@link #MODE_NORMAL} except the speaker and
- * the microphone are both disabled.
- */
- public static final int MODE_ON_HOLD = 0;
-
- /**
- * This mode is similar to {@link #MODE_NORMAL} except the microphone is
- * disabled.
- */
- public static final int MODE_MUTED = 1;
-
- /**
- * This mode indicates that the speaker, the microphone, and all
- * {@link AudioStream}s in the group are enabled. First, the packets
- * received from the streams are decoded and mixed with the audio recorded
- * from the microphone. Then, the results are played back to the speaker,
- * encoded and sent back to each stream.
- */
- public static final int MODE_NORMAL = 2;
-
- /**
- * This mode is similar to {@link #MODE_NORMAL} except the echo suppression
- * is enabled. It should be only used when the speaker phone is on.
- */
- public static final int MODE_ECHO_SUPPRESSION = 3;
-
- private static final int MODE_LAST = 3;
-
- private final Map<AudioStream, Integer> mStreams;
- private int mMode = MODE_ON_HOLD;
-
- private int mNative;
- static {
- System.loadLibrary("rtp_jni");
- }
-
- /**
- * Creates an empty AudioGroup.
- */
- public AudioGroup() {
- mStreams = new HashMap<AudioStream, Integer>();
- }
-
- /**
- * Returns the {@link AudioStream}s in this group.
- */
- public AudioStream[] getStreams() {
- synchronized (this) {
- return mStreams.keySet().toArray(new AudioStream[mStreams.size()]);
- }
- }
-
- /**
- * Returns the current mode.
- */
- public int getMode() {
- return mMode;
- }
-
- /**
- * Changes the current mode. It must be one of {@link #MODE_ON_HOLD},
- * {@link #MODE_MUTED}, {@link #MODE_NORMAL}, and
- * {@link #MODE_ECHO_SUPPRESSION}.
- *
- * @param mode The mode to change to.
- * @throws IllegalArgumentException if the mode is invalid.
- */
- public void setMode(int mode) {
- if (mode < 0 || mode > MODE_LAST) {
- throw new IllegalArgumentException("Invalid mode");
- }
- synchronized (this) {
- nativeSetMode(mode);
- mMode = mode;
- }
- }
-
- private native void nativeSetMode(int mode);
-
- // Package-private method used by AudioStream.join().
- synchronized void add(AudioStream stream) {
- if (!mStreams.containsKey(stream)) {
- try {
- AudioCodec codec = stream.getCodec();
- String codecSpec = String.format(Locale.US, "%d %s %s", codec.type,
- codec.rtpmap, codec.fmtp);
- int id = nativeAdd(stream.getMode(), stream.getSocket(),
- stream.getRemoteAddress().getHostAddress(),
- stream.getRemotePort(), codecSpec, stream.getDtmfType());
- mStreams.put(stream, id);
- } catch (NullPointerException e) {
- throw new IllegalStateException(e);
- }
- }
- }
-
- private native int nativeAdd(int mode, int socket, String remoteAddress,
- int remotePort, String codecSpec, int dtmfType);
-
- // Package-private method used by AudioStream.join().
- synchronized void remove(AudioStream stream) {
- Integer id = mStreams.remove(stream);
- if (id != null) {
- nativeRemove(id);
- }
- }
-
- private native void nativeRemove(int id);
-
- /**
- * Sends a DTMF digit to every {@link AudioStream} in this group. Currently
- * only event {@code 0} to {@code 15} are supported.
- *
- * @throws IllegalArgumentException if the event is invalid.
- */
- public void sendDtmf(int event) {
- if (event < 0 || event > 15) {
- throw new IllegalArgumentException("Invalid event");
- }
- synchronized (this) {
- nativeSendDtmf(event);
- }
- }
-
- private native void nativeSendDtmf(int event);
-
- /**
- * Removes every {@link AudioStream} in this group.
- */
- public void clear() {
- for (AudioStream stream : getStreams()) {
- stream.join(null);
- }
- }
-
- @Override
- protected void finalize() throws Throwable {
- nativeRemove(0);
- super.finalize();
- }
-}