/* * 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 java.net.InetAddress; import java.net.SocketException; /** * AudioStream represents a RTP stream carrying audio payloads. */ /** @hide */ public class AudioStream extends RtpStream { private AudioCodec mCodec; private int mCodecType = -1; private int mDtmfType = -1; private AudioGroup mGroup; /** * Creates an AudioStream on the given local address. Note that the local * port is assigned automatically to conform with RFC 3550. * * @param address The network address of the local host to bind to. * @throws SocketException if the address cannot be bound or a problem * occurs during binding. */ public AudioStream(InetAddress address) throws SocketException { super(address); } /** * Returns {@code true} if the stream already joined an {@link AudioGroup}. */ @Override public final boolean isBusy() { return mGroup != null; } /** * Returns the joined {@link AudioGroup}. */ public AudioGroup getAudioGroup() { return mGroup; } /** * Joins an {@link AudioGroup}. Each stream can join only one group at a * time. The group can be changed by passing a different one or removed * by calling this method with {@code null}. * * @param group The AudioGroup to join or {@code null} to leave. * @throws IllegalStateException if the stream is not properly configured. * @see AudioGroup */ public void join(AudioGroup group) { if (mGroup == group) { return; } if (mGroup != null) { mGroup.remove(this); mGroup = null; } if (group != null) { group.add(this, mCodec, mCodecType, mDtmfType); mGroup = group; } } /** * Sets the {@link AudioCodec} and its RTP payload type. According to RFC * 3551, the type must be in the range of 0 and 127, where 96 and above are * dynamic types. For codecs with static mappings (non-negative * {@link AudioCodec#defaultType}), assigning a different non-dynamic type * is disallowed. * * @param codec The AudioCodec to be used. * @param type The RTP payload type. * @throws IllegalArgumentException if the type is invalid or used by DTMF. * @throws IllegalStateException if the stream is busy. */ public void setCodec(AudioCodec codec, int type) { if (isBusy()) { throw new IllegalStateException("Busy"); } if (type < 0 || type > 127 || (type != codec.defaultType && type < 96)) { throw new IllegalArgumentException("Invalid type"); } if (type == mDtmfType) { throw new IllegalArgumentException("The type is used by DTMF"); } mCodec = codec; mCodecType = type; } /** * Sets the RTP payload type for dual-tone multi-frequency (DTMF) digits. * The primary usage is to send digits to the remote gateway to perform * certain tasks, such as second-stage dialing. According to RFC 2833, the * RTP payload type for DTMF is assigned dynamically, so it must be in the * range of 96 and 127. One can use {@code -1} to disable DTMF and free up * the previous assigned value. This method cannot be called when the stream * already joined an {@link AudioGroup}. * * @param type The RTP payload type to be used or {@code -1} to disable it. * @throws IllegalArgumentException if the type is invalid or used by codec. * @throws IllegalStateException if the stream is busy. * @see AudioGroup#sendDtmf(int) */ public void setDtmfType(int type) { if (isBusy()) { throw new IllegalStateException("Busy"); } if (type != -1) { if (type < 96 || type > 127) { throw new IllegalArgumentException("Invalid type"); } if (type == mCodecType) { throw new IllegalArgumentException("The type is used by codec"); } } mDtmfType = type; } }