AudioGroup.java revision 98cee0ce2354234e72bafb836864ec10a490ea4d
198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang/* 298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Copyright (C) 2010 The Android Open Source Project 398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * 498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Licensed under the Apache License, Version 2.0 (the "License"); 598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * you may not use this file except in compliance with the License. 698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * You may obtain a copy of the License at 798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * 898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * http://www.apache.org/licenses/LICENSE-2.0 998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * 1098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Unless required by applicable law or agreed to in writing, software 1198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * distributed under the License is distributed on an "AS IS" BASIS, 1298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * See the License for the specific language governing permissions and 1498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * limitations under the License. 1598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang */ 1698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 1798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangpackage android.net.rtp; 1898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 1998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport java.util.HashMap; 2098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangimport java.util.Map; 2198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 2298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang/** 2398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang */ 2498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang/** @hide */ 2598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wangpublic class AudioGroup { 2698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public static final int MODE_ON_HOLD = 0; 2798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public static final int MODE_MUTED = 1; 2898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public static final int MODE_NORMAL = 2; 2998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public static final int MODE_EC_ENABLED = 3; 3098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 3198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang private final Map<AudioStream, Integer> mStreams; 3298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang private int mMode = MODE_ON_HOLD; 3398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 3498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang private int mNative; 3598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang static { 3698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang System.loadLibrary("rtp_jni"); 3798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 3898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 3998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public AudioGroup() { 4098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang mStreams = new HashMap<AudioStream, Integer>(); 4198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 4298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 4398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public int getMode() { 4498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang return mMode; 4598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 4698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 4798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public synchronized native void setMode(int mode); 4898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 4998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang synchronized void add(AudioStream stream, AudioCodec codec, int codecType, int dtmfType) { 5098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang if (!mStreams.containsKey(stream)) { 5198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang try { 5298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang int id = add(stream.getMode(), stream.dup(), 5398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang stream.getRemoteAddress().getHostAddress(), stream.getRemotePort(), 5498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang codec.name, codec.sampleRate, codec.sampleCount, codecType, dtmfType); 5598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang mStreams.put(stream, id); 5698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } catch (NullPointerException e) { 5798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang throw new IllegalStateException(e); 5898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 5998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 6098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 6198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 6298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang private native int add(int mode, int socket, String remoteAddress, int remotePort, 6398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang String codecName, int sampleRate, int sampleCount, int codecType, int dtmfType); 6498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 6598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang synchronized void remove(AudioStream stream) { 6698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang Integer id = mStreams.remove(stream); 6798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang if (id != null) { 6898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang remove(id); 6998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 7098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 7198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 7298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang private native void remove(int id); 7398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 7498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang /** 7598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * Sends a DTMF digit to every {@link AudioStream} in this group. Currently 7698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * only event {@code 0} to {@code 15} are supported. 7798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * 7898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang * @throws IllegalArgumentException if the event is invalid. 7998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang */ 8098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public native synchronized void sendDtmf(int event); 8198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 8298cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang public synchronized void reset() { 8398cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang remove(-1); 8498cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 8598cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang 8698cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang @Override 8798cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang protected void finalize() throws Throwable { 8898cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang reset(); 8998cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang super.finalize(); 9098cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang } 9198cee0ce2354234e72bafb836864ec10a490ea4dChung-yih Wang} 92