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