src/org/sipdroid/media/RtpStreamSender.java
author nikita@nikita-laptop
Sat, 23 Jan 2010 22:19:43 +0100
changeset 834 e8d6255306f8
parent 830 c8b4ace735ea
child 835 4e40f3481f23
permissions -rw-r--r--
Sipdroid Basic
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     1
/*
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     2
 * Copyright (C) 2009 The Sipdroid Open Source Project
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     3
 * Copyright (C) 2005 Luca Veltri - University of Parma - Italy
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     4
 * 
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     5
 * This file is part of Sipdroid (http://www.sipdroid.org)
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     6
 * 
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     7
 * Sipdroid is free software; you can redistribute it and/or modify
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     8
 * it under the terms of the GNU General Public License as published by
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
     9
 * the Free Software Foundation; either version 3 of the License, or
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    10
 * (at your option) any later version.
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    11
 * 
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    12
 * This source code is distributed in the hope that it will be useful,
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    13
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    14
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    15
 * GNU General Public License for more details.
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    16
 * 
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    17
 * You should have received a copy of the GNU General Public License
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    18
 * along with this source code; if not, write to the Free Software
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    19
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    20
 */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    21
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    22
package src.org.sipdroid.media;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    23
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    24
import java.io.IOException;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    25
import java.io.InputStream;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    26
import java.net.InetAddress;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    27
import java.util.Random;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    28
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    29
import org.sipdroid.sipua.UserAgent;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    30
import org.sipdroid.sipua.ui.Receiver;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    31
import org.sipdroid.sipua.ui.Settings;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    32
import org.sipdroid.sipua.ui.Sipdroid;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    33
import org.sipdroid.pjlib.Codec;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    34
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    35
import src.org.sipdroid.net.RtpPacket;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    36
import src.org.sipdroid.net.RtpSocket;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    37
import src.org.sipdroid.net.SipdroidSocket;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    38
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    39
import android.content.Context;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    40
import android.media.AudioFormat;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    41
import android.media.AudioManager;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    42
import android.media.AudioRecord;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    43
import android.media.MediaRecorder;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    44
import android.preference.PreferenceManager;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    45
import android.telephony.TelephonyManager;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    46
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    47
/**
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    48
 * RtpStreamSender is a generic stream sender. It takes an InputStream and sends
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    49
 * it through RTP.
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    50
 */
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    51
public class RtpStreamSender extends Thread {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    52
	/** Whether working in debug mode. */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    53
	public static boolean DEBUG = true;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    54
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    55
	/** The RtpSocket */
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    56
	RtpSocket rtp_socket = null;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    57
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    58
	/** Payload type */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    59
	int p_type;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    60
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    61
	/** Number of frame per second */
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    62
	long frame_rate;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    63
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    64
	/** Number of bytes per frame */
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    65
	int frame_size;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    66
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    67
	/**
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    68
	 * Whether it works synchronously with a local clock, or it it acts as slave
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    69
	 * of the InputStream
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    70
	 */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    71
	boolean do_sync = true;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    72
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    73
	/**
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    74
	 * Synchronization correction value, in milliseconds. It accellarates the
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    75
	 * sending rate respect to the nominal value, in order to compensate program
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    76
	 * latencies.
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    77
	 */
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    78
	int sync_adj = 0;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    79
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    80
	/** Whether it is running */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    81
	boolean running = false;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    82
	boolean muted = false;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    83
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    84
	/**
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    85
	 * Constructs a RtpStreamSender.
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    86
	 * 
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    87
	 * @param input_stream
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    88
	 *            the stream to be sent
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    89
	 * @param do_sync
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    90
	 *            whether time synchronization must be performed by the
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    91
	 *            RtpStreamSender, or it is performed by the InputStream (e.g.
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    92
	 *            the system audio input)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    93
	 * @param payload_type
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    94
	 *            the payload type
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    95
	 * @param frame_rate
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    96
	 *            the frame rate, i.e. the number of frames that should be sent
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    97
	 *            per second; it is used to calculate the nominal packet time
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    98
	 *            and,in case of do_sync==true, the next departure time
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    99
	 * @param frame_size
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   100
	 *            the size of the payload
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   101
	 * @param src_socket
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   102
	 *            the socket used to send the RTP packet
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   103
	 * @param dest_addr
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   104
	 *            the destination address
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   105
	 * @param dest_port
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   106
	 *            the destination port
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   107
	 */
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   108
	public RtpStreamSender(boolean do_sync,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   109
			int payload_type, long frame_rate, int frame_size,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   110
			SipdroidSocket src_socket, String dest_addr, int dest_port) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   111
		init(do_sync, payload_type, frame_rate, frame_size,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   112
				src_socket, dest_addr, dest_port);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   113
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   114
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   115
	/** Inits the RtpStreamSender */
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   116
	private void init(boolean do_sync,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   117
			int payload_type, long frame_rate, int frame_size,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   118
			SipdroidSocket src_socket, String dest_addr,
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   119
			int dest_port) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   120
		this.p_type = payload_type;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   121
		this.frame_rate = frame_rate;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   122
		this.frame_size = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).getString("server","").equals("pbxes.org")?
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   123
				(payload_type == 3?960:1024):frame_size; //15
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   124
		this.do_sync = do_sync;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   125
		try {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   126
			rtp_socket = new RtpSocket(src_socket, InetAddress
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   127
					.getByName(dest_addr), dest_port);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   128
		} catch (Exception e) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   129
			if (!Sipdroid.release) e.printStackTrace();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   130
		}
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   131
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   132
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   133
	/** Sets the synchronization adjustment time (in milliseconds). */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   134
	public void setSyncAdj(int millisecs) {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   135
		sync_adj = millisecs;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   136
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   137
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   138
	/** Whether is running */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   139
	public boolean isRunning() {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   140
		return running;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   141
	}
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   142
	
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   143
	public boolean mute() {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   144
		return muted = !muted;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   145
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   146
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   147
	public static int delay = 0;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   148
	
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   149
	/** Stops running */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   150
	public void halt() {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   151
		running = false;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   152
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   153
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   154
	Random random;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   155
	double smin = 200,s;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   156
	int nearend;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   157
	
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   158
	void calc(short[] lin,int off,int len) {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   159
		int i,j;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   160
		double sm = 30000,r;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   161
		
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   162
		for (i = 0; i < len; i += 5) {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   163
			j = lin[i+off];
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   164
			s = 0.03*Math.abs(j) + 0.97*s;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   165
			if (s < sm) sm = s;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   166
			if (s > smin) nearend = 3000/5;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   167
			else if (nearend > 0) nearend--;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   168
		}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   169
		for (i = 0; i < len; i++) {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   170
			j = lin[i+off];
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   171
			if (j > 6550)
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   172
				lin[i+off] = 6550*5;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   173
			else if (j < -6550)
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   174
				lin[i+off] = -6550*5;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   175
			else
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   176
				lin[i+off] = (short)(j*5);
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   177
		}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   178
		r = (double)len/100000;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   179
		smin = sm*r + smin*(1-r);
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   180
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   181
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   182
	void calc1(short[] lin,int off,int len) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   183
		int i,j;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   184
		
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   185
		for (i = 0; i < len; i++) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   186
			j = lin[i+off];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   187
			lin[i+off] = (short)(j>>1);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   188
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   189
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   190
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   191
	void calc5(short[] lin,int off,int len) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   192
		int i,j;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   193
		
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   194
		for (i = 0; i < len; i++) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   195
			j = lin[i+off];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   196
			if (j > 16350)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   197
				lin[i+off] = 16350<<1;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   198
			else if (j < -16350)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   199
				lin[i+off] = -16350<<1;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   200
			else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   201
				lin[i+off] = (short)(j<<1);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   202
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   203
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   204
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   205
	void calc10(short[] lin,int off,int len) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   206
		int i,j;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   207
		
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   208
		for (i = 0; i < len; i++) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   209
			j = lin[i+off];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   210
			if (j > 8150)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   211
				lin[i+off] = 8150<<2;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   212
			else if (j < -8150)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   213
				lin[i+off] = -8150<<2;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   214
			else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   215
				lin[i+off] = (short)(j<<2);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   216
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   217
	}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   218
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   219
	void noise(short[] lin,int off,int len,double power) {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   220
		int i,r = (int)(power*2);
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   221
		short ran;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   222
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   223
		if (r == 0) r = 1;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   224
		for (i = 0; i < len; i += 4) {
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   225
			ran = (short)(random.nextInt(r*2)-r);
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   226
			lin[i+off] = ran;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   227
			lin[i+off+1] = ran;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   228
			lin[i+off+2] = ran;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   229
			lin[i+off+3] = ran;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   230
		}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   231
	}
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   232
	
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   233
	public static int m;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   234
	
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   235
	/** Runs it in a new Thread. */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   236
	public void run() {
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   237
		if (rtp_socket == null)
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   238
			return;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   239
		byte[] buffer = new byte[frame_size + 12];
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   240
		RtpPacket rtp_packet = new RtpPacket(buffer, 0);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   241
		rtp_packet.setPayloadType(p_type);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   242
		int seqn = 0;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   243
		long time = 0;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   244
		double p = 0;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   245
		TelephonyManager tm = (TelephonyManager) Receiver.mContext.getSystemService(Context.TELEPHONY_SERVICE);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   246
		boolean improve = PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).getBoolean("improve",false);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   247
		boolean useGSM = !PreferenceManager.getDefaultSharedPreferences(Receiver.mContext).getString("compression","edge").equals("never");
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   248
		int micgain = (int)(Settings.getMicGain()*10);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   249
		running = true;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   250
		m = 1;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   251
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   252
		if (DEBUG)
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   253
			println("Reading blocks of " + buffer.length + " bytes");
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   254
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   255
		android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_URGENT_AUDIO);
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   256
		AudioRecord record = new AudioRecord(MediaRecorder.AudioSource.MIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT, 
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   257
				AudioRecord.getMinBufferSize(8000, 
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   258
						AudioFormat.CHANNEL_CONFIGURATION_MONO, 
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   259
						AudioFormat.ENCODING_PCM_16BIT)*3/2);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   260
		short[] lin = new short[frame_size*11];
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   261
		int num,ring = 0;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   262
		random = new Random();
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   263
		InputStream alerting = null;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   264
		try {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   265
			alerting = Receiver.mContext.getAssets().open("alerting");
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   266
		} catch (IOException e2) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   267
			if (!Sipdroid.release) e2.printStackTrace();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   268
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   269
		switch (p_type) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   270
		case 3:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   271
			Codec.init();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   272
			break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   273
		case 0:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   274
		case 8:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   275
			G711.init();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   276
			break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   277
		}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   278
		record.startRecording();
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   279
		while (running) {
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   280
			 if (muted || Receiver.call_state == UserAgent.UA_STATE_HOLD) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   281
				record.stop();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   282
				while (running && (muted || Receiver.call_state == UserAgent.UA_STATE_HOLD)) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   283
					try {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   284
						sleep(1000);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   285
					} catch (InterruptedException e1) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   286
					}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   287
				}
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   288
				record.startRecording();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   289
			 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   290
			 num = record.read(lin,(ring+delay)%(frame_size*11),frame_size);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   291
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   292
			 if (RtpStreamReceiver.speakermode == AudioManager.MODE_NORMAL) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   293
 				 calc(lin,(ring+delay)%(frame_size*11),num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   294
 	 			 if (RtpStreamReceiver.nearend != 0)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   295
	 				 noise(lin,(ring+delay)%(frame_size*11),num,p);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   296
	 			 else if (nearend == 0)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   297
	 				 p = 0.9*p + 0.1*s;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   298
 			 } else switch (micgain) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   299
 			 case 1:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   300
 				 calc1(lin,(ring+delay)%(frame_size*11),num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   301
 				 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   302
 			 case 5:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   303
 				 calc5(lin,(ring+delay)%(frame_size*11),num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   304
 				 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   305
 			 case 10:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   306
 				 calc10(lin,(ring+delay)%(frame_size*11),num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   307
 				 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   308
 			 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   309
			 if (Receiver.call_state != UserAgent.UA_STATE_INCALL && alerting != null) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   310
				 try {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   311
					if (alerting.available() < num)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   312
						alerting.reset();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   313
					alerting.read(buffer,12,num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   314
				 } catch (IOException e) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   315
					if (!Sipdroid.release) e.printStackTrace();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   316
				 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   317
				 switch (p_type) {// have to add ulaw case?
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   318
				 case 3:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   319
					 G711.alaw2linear(buffer, lin, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   320
					 num = Codec.encode(lin, 0, buffer, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   321
					 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   322
				 case 0:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   323
					 G711.alaw2linear(buffer, lin, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   324
					 G711.linear2ulaw(lin, 0, buffer, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   325
					 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   326
				 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   327
			 } else {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   328
				 switch (p_type) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   329
				 case 3:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   330
					 num = Codec.encode(lin, ring%(frame_size*11), buffer, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   331
					 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   332
				 case 0:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   333
					 G711.linear2ulaw(lin, ring%(frame_size*11), buffer, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   334
					 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   335
				 case 8:
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   336
					 G711.linear2alaw(lin, ring%(frame_size*11), buffer, num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   337
					 break;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   338
				 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   339
			 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   340
 			 ring += frame_size;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   341
 			 rtp_packet.setSequenceNumber(seqn++);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   342
 			 rtp_packet.setTimestamp(time);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   343
 			 rtp_packet.setPayloadLength(num);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   344
 			 try {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   345
 				 rtp_socket.send(rtp_packet);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   346
 				 if (m == 2)
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   347
 					 rtp_socket.send(rtp_packet);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   348
 			 } catch (IOException e) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   349
 			 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   350
			 time += frame_size;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   351
 			 if (improve && RtpStreamReceiver.good != 0 &&
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   352
 					 RtpStreamReceiver.loss/RtpStreamReceiver.good > 0.01 &&
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   353
 					 (Receiver.on_wlan || tm.getNetworkType() != TelephonyManager.NETWORK_TYPE_EDGE))        	
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   354
 				 m = 2;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   355
 			 else
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   356
 				 m = 1;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   357
 			 if (useGSM && p_type == 8 && !Receiver.on_wlan && tm.getNetworkType() == TelephonyManager.NETWORK_TYPE_EDGE) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   358
 				 rtp_packet.setPayloadType(p_type = 3);
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   359
 				 if (frame_size == 1024) {
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   360
 					 frame_size = 960;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   361
 					 ring = 0;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   362
 				 }
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   363
 			 }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   364
		}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   365
		record.stop();
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   366
		
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   367
		rtp_socket.close();
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   368
		rtp_socket = null;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   369
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   370
		if (DEBUG)
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   371
			println("rtp sender terminated");
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   372
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   373
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   374
	/** Debug output */
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   375
	private static void println(String str) {
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   376
		if (!Sipdroid.release) System.out.println("RtpStreamSender: " + str);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   377
	}
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   378
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   379
}