src/org/sipdroid/media/RtpStreamReceiver.java
author nikita@nikita-laptop
Sun, 24 Jan 2010 00:42:29 +0100
changeset 835 4e40f3481f23
parent 834 e8d6255306f8
child 1005 a2cad81f348b
permissions -rw-r--r--
new sipdroid
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
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    22
package org.sipdroid.media;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    23
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    24
import java.io.IOException;
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    25
import java.net.SocketException;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    26
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    27
import com.beem.project.beem.jingle.JingleService;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    28
import com.beem.project.beem.ui.Call;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    29
import org.sipdroid.net.RtpPacket;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    30
import org.sipdroid.net.RtpSocket;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    31
import org.sipdroid.net.SipdroidSocket;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    32
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
    33
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    34
import android.content.ContentResolver;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    35
import android.content.Context;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    36
import android.content.SharedPreferences.Editor;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    37
import android.media.AudioFormat;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    38
import android.media.AudioManager;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    39
import android.media.AudioTrack;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    40
import android.media.ToneGenerator;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    41
import android.os.PowerManager;
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    42
import android.os.RemoteException;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    43
import android.preference.PreferenceManager;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    44
import android.provider.Settings;
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    45
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
 * RtpStreamReceiver is a generic stream receiver. It receives packets from RTP
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    48
 * and writes them into an OutputStream.
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    49
 */
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    50
public class RtpStreamReceiver extends Thread {
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    51
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    52
    /** Whether working in debug mode. */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
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
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    55
    /** Payload type */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    56
    int p_type;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
    57
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    58
    /** Size of the read buffer */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    59
    public static final int BUFFER_SIZE = 1024;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    60
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    61
    /** Maximum blocking time, spent waiting for reading new bytes [milliseconds] */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    62
    public static final int SO_TIMEOUT = 200;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    63
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    64
    /** The RtpSocket */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    65
    private 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
    66
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    67
    /** Whether it is running */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    68
    private boolean running;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    69
    private AudioManager am;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    70
    private ContentResolver cr;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    71
    public static int speakermode;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    72
    private JingleService mJingle;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    73
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    74
    /**
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    75
     * Constructs a RtpStreamReceiver.
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    76
     * 
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    77
     * @param output_stream
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    78
     *            the stream sink
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    79
     * @param socket
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    80
     *            the local receiver SipdroidSocket
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    81
     */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    82
    public RtpStreamReceiver(SipdroidSocket socket, int payload_type) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    83
	init(socket);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    84
	p_type = payload_type;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    85
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    86
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    87
    /** Inits the RtpStreamReceiver */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    88
    private void init(SipdroidSocket socket) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    89
	if (socket != null)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    90
	    rtp_socket = new RtpSocket(socket);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    91
    }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
    92
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    93
    /** Whether is running */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    94
    public boolean isRunning() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    95
	return running;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    96
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    97
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    98
    /** Stops running */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
    99
    public void halt() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   100
	running = false;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   101
    }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   102
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   103
    public int speaker(int mode) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   104
	int old = speakermode;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   105
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   106
	if (Call.headset > 0 && mode == AudioManager.MODE_NORMAL)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   107
	    return old;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   108
	saveVolume();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   109
	setMode(speakermode = mode);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   110
	restoreVolume();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   111
	return old;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   112
    }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   113
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   114
    double smin = 200,s;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   115
    public static int nearend;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   116
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   117
    void calc(short[] lin,int off,int len) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   118
	int i,j;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   119
	double sm = 30000,r;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   120
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   121
	for (i = 0; i < len; i += 5) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   122
	    j = lin[i+off];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   123
	    s = 0.03*Math.abs(j) + 0.97*s;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   124
	    if (s < sm) sm = s;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   125
	    if (s > smin) nearend = 3000/5;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   126
	    else if (nearend > 0) nearend--;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   127
	}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   128
	for (i = 0; i < len; i++) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   129
	    j = lin[i+off];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   130
	    if (j > 6550)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   131
		lin[i+off] = 6550*5;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   132
	    else if (j < -6550)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   133
		lin[i+off] = -6550*5;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   134
	    else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   135
		lin[i+off] = (short)(j*5);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   136
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   137
	r = (double)len/100000;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   138
	smin = sm*r + smin*(1-r);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   139
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   140
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   141
    static void setStreamVolume(final int stream,final int vol,final int flags) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   142
	(new Thread() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   143
	    public void run() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   144
		AudioManager am = (AudioManager) Call.mContext.getSystemService(Context.AUDIO_SERVICE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   145
		am.setStreamVolume(stream, vol, flags);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   146
		if (stream == AudioManager.STREAM_MUSIC) restored = true;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   147
	    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   148
	}).start();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   149
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   150
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   151
    static boolean restored;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   152
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   153
    public static float getEarGain() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   154
	try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   155
	    return Float.valueOf(PreferenceManager.getDefaultSharedPreferences(Call.mContext).getString(Call.headset > 0?"heargain":"eargain", "0.25"));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   156
	} catch (NumberFormatException i) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   157
	    return (float)0.25;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   158
	}			
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   159
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   160
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   161
    void restoreVolume() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   162
	switch (am.getMode()) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   163
	    case AudioManager.MODE_IN_CALL:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   164
		setStreamVolume(AudioManager.STREAM_RING,(int)(
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   165
		    am.getStreamMaxVolume(AudioManager.STREAM_RING)*
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   166
		    getEarGain()), 0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   167
		track.setStereoVolume(AudioTrack.getMaxVolume()*
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   168
		    getEarGain()
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   169
		    ,AudioTrack.getMaxVolume()*
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   170
		    getEarGain());
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   171
		break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   172
	    case AudioManager.MODE_NORMAL:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   173
		track.setStereoVolume(AudioTrack.getMaxVolume(),AudioTrack.getMaxVolume());
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   174
		break;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   175
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   176
	setStreamVolume(AudioManager.STREAM_MUSIC,
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   177
	    PreferenceManager.getDefaultSharedPreferences(Call.mContext).getInt("volume"+speakermode, 
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   178
		am.getStreamMaxVolume(AudioManager.STREAM_MUSIC)*
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   179
		(speakermode == AudioManager.MODE_NORMAL?4:3)/4
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   180
	    ),0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   181
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   182
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   183
    void saveVolume() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   184
	if (restored) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   185
	    Editor edit = PreferenceManager.getDefaultSharedPreferences(Call.mContext).edit();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   186
	    edit.putInt("volume"+speakermode,am.getStreamVolume(AudioManager.STREAM_MUSIC));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   187
	    edit.commit();
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   188
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   189
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   190
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   191
    void saveSettings() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   192
	if (!PreferenceManager.getDefaultSharedPreferences(Call.mContext).getBoolean("oldvalid",false)) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   193
	    int oldvibrate = am.getVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   194
	    int oldvibrate2 = am.getVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   195
	    if (!PreferenceManager.getDefaultSharedPreferences(Call.mContext).contains("oldvibrate2"))
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   196
		oldvibrate2 = AudioManager.VIBRATE_SETTING_ON;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   197
	    int oldpolicy = android.provider.Settings.System.getInt(cr, android.provider.Settings.System.WIFI_SLEEP_POLICY, 
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   198
		Settings.System.WIFI_SLEEP_POLICY_DEFAULT);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   199
	    Editor edit = PreferenceManager.getDefaultSharedPreferences(Call.mContext).edit();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   200
	    edit.putInt("oldvibrate", oldvibrate);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   201
	    edit.putInt("oldvibrate2", oldvibrate2);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   202
	    edit.putInt("oldpolicy", oldpolicy);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   203
	    edit.putInt("oldring",am.getStreamVolume(AudioManager.STREAM_RING));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   204
	    edit.putBoolean("oldvalid", true);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   205
	    edit.commit();
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   206
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   207
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   208
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   209
    public static void setMode(int mode) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   210
	Editor edit = PreferenceManager.getDefaultSharedPreferences(Call.mContext).edit();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   211
	edit.putBoolean("setmode", mode != AudioManager.MODE_NORMAL);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   212
	edit.commit();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   213
	AudioManager am = (AudioManager) Call.mContext.getSystemService(Context.AUDIO_SERVICE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   214
	am.setMode(mode);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   215
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   216
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   217
    public static void restoreMode() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   218
	if (PreferenceManager.getDefaultSharedPreferences(Call.mContext).getBoolean("setmode",true)) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   219
	    setMode(AudioManager.MODE_NORMAL);
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   220
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   221
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   222
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   223
    public static void restoreSettings() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   224
	if (PreferenceManager.getDefaultSharedPreferences(Call.mContext).getBoolean("oldvalid",true)) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   225
	    AudioManager am = (AudioManager) Call.mContext.getSystemService(Context.AUDIO_SERVICE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   226
	    ContentResolver cr = Call.mContext.getContentResolver();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   227
	    int oldvibrate = PreferenceManager.getDefaultSharedPreferences(Call.mContext).getInt("oldvibrate",0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   228
	    int oldvibrate2 = PreferenceManager.getDefaultSharedPreferences(Call.mContext).getInt("oldvibrate2",0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   229
	    int oldpolicy = PreferenceManager.getDefaultSharedPreferences(Call.mContext).getInt("oldpolicy",0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   230
	    am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,oldvibrate);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   231
	    am.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,oldvibrate2);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   232
	    Settings.System.putInt(cr, Settings.System.WIFI_SLEEP_POLICY, oldpolicy);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   233
	    setStreamVolume(AudioManager.STREAM_RING, PreferenceManager.getDefaultSharedPreferences(Call.mContext).getInt("oldring",0), 0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   234
	    Editor edit = PreferenceManager.getDefaultSharedPreferences(Call.mContext).edit();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   235
	    edit.putBoolean("oldvalid", false);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   236
	    edit.commit();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   237
	    PowerManager pm = (PowerManager) Call.mContext.getSystemService(Context.POWER_SERVICE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   238
	    PowerManager.WakeLock wl = pm.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK |
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   239
		PowerManager.ACQUIRE_CAUSES_WAKEUP, "Sipdroid.RtpStreamReceiver");
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   240
	    wl.acquire(1000);
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   241
	}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   242
	restoreMode();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   243
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   244
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   245
    public static float good, late, lost, loss;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   246
    public static int timeout;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   247
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   248
    void empty() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   249
	try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   250
	    rtp_socket.getDatagramSocket().setSoTimeout(1);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   251
	    for (;;)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   252
		rtp_socket.receive(rtp_packet);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   253
	} catch (SocketException e2) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   254
	    e2.printStackTrace();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   255
	} catch (IOException e) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   256
	}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   257
	try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   258
	    rtp_socket.getDatagramSocket().setSoTimeout(1000);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   259
	} catch (SocketException e2) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   260
	    e2.printStackTrace();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   261
	}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   262
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   263
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   264
    RtpPacket rtp_packet;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   265
    AudioTrack track;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   266
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   267
    /** Runs it in a new Thread. */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   268
    public void run() {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   269
	boolean nodata = PreferenceManager.getDefaultSharedPreferences(Call.mContext).getBoolean("nodata",false);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   270
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   271
	if (rtp_socket == null) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   272
	    if (DEBUG)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   273
		println("ERROR: RTP socket is null");
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   274
	    return;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   275
	}
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   276
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   277
	byte[] buffer = new byte[BUFFER_SIZE+12];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   278
	byte[] buffer_gsm = new byte[33+12];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   279
	int i;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   280
	rtp_packet = new RtpPacket(buffer, 0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   281
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   282
	if (DEBUG)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   283
	    println("Reading blocks of max " + buffer.length + " bytes");
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   284
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   285
	running = true;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   286
	speakermode = Call.docked > 0?AudioManager.MODE_NORMAL:AudioManager.MODE_IN_CALL;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   287
	restored = false;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   288
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   289
	android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_AUDIO);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   290
	am = (AudioManager) Call.mContext.getSystemService(Context.AUDIO_SERVICE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   291
	cr = Call.mContext.getContentResolver();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   292
	saveSettings();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   293
	Settings.System.putInt(cr, Settings.System.WIFI_SLEEP_POLICY,Settings.System.WIFI_SLEEP_POLICY_NEVER);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   294
	am.setVibrateSetting(AudioManager.VIBRATE_TYPE_RINGER,AudioManager.VIBRATE_SETTING_OFF);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   295
	am.setVibrateSetting(AudioManager.VIBRATE_TYPE_NOTIFICATION,AudioManager.VIBRATE_SETTING_OFF);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   296
	int oldvol = am.getStreamVolume(AudioManager.STREAM_MUSIC);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   297
	track = new AudioTrack(AudioManager.STREAM_MUSIC, 8000, AudioFormat.CHANNEL_CONFIGURATION_MONO, AudioFormat.ENCODING_PCM_16BIT,
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   298
	    BUFFER_SIZE*2*2, AudioTrack.MODE_STREAM);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   299
	short lin[] = new short[BUFFER_SIZE];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   300
	short lin2[] = new short[BUFFER_SIZE];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   301
	int user, server, lserver, luser, cnt, todo, headroom, len = 0, seq = 0, cnt2 = 0, m = 1,
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   302
	expseq, getseq, vm = 1, gap, gseq;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   303
	timeout = 1;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   304
	boolean islate;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   305
	user = 0;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   306
	lserver = 0;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   307
	luser = -8000;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   308
	cnt = 0;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   309
	switch (p_type) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   310
	    case 3:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   311
		Codec.init();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   312
		break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   313
	    case 0:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   314
	    case 8:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   315
		G711.init();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   316
		break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   317
	}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   318
	ToneGenerator tg = new ToneGenerator(AudioManager.STREAM_MUSIC,(int)(ToneGenerator.MAX_VOLUME*2*0.95));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   319
	track.play();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   320
	if (Call.headset > 0 && Call.oRingtone != null) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   321
	    ToneGenerator tg2 = new ToneGenerator(AudioManager.STREAM_RING,(int)(ToneGenerator.MAX_VOLUME*2*0.95));
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   322
	    tg2.startTone(ToneGenerator.TONE_SUP_RINGTONE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   323
	    System.gc();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   324
	    tg2.stopTone();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   325
	} else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   326
	    System.gc();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   327
	while (running) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   328
	    if (Call.call_state == Call.UA_STATE_HOLD) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   329
		tg.stopTone();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   330
		track.pause();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   331
		while (running && Call.call_state == Call.UA_STATE_HOLD) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   332
		    try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   333
			sleep(1000);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   334
		    } catch (InterruptedException e1) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   335
			e1.printStackTrace();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   336
		    }
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   337
		}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   338
		track.play();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   339
		System.gc();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   340
		timeout = 1;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   341
		seq = 0;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   342
	    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   343
	    try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   344
		rtp_socket.receive(rtp_packet);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   345
		if (timeout != 0) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   346
		    tg.stopTone();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   347
		    track.pause();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   348
		    user += track.write(lin2,0,BUFFER_SIZE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   349
		    user += track.write(lin2,0,BUFFER_SIZE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   350
		    track.play();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   351
		    cnt += 2*BUFFER_SIZE;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   352
		    empty();
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   353
		}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   354
		timeout = 0;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   355
	    } catch (IOException e) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   356
		if (timeout == 0 && nodata) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   357
		    tg.startTone(ToneGenerator.TONE_SUP_RINGTONE);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   358
		}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   359
		rtp_socket.getDatagramSocket().disconnect();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   360
		if (++timeout > 22) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   361
		    try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   362
			mJingle.closeCall();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   363
		    } catch (RemoteException e1) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   364
			e1.printStackTrace();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   365
		    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   366
		    break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   367
		}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   368
	    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   369
	    if (running && timeout == 0) {		
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   370
		gseq = rtp_packet.getSequenceNumber();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   371
		if (seq == gseq) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   372
		    m++;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   373
		    continue;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   374
		}
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   375
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   376
		server = track.getPlaybackHeadPosition();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   377
		headroom = user-server;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   378
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   379
		if (headroom > 1500)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   380
		    cnt += len;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   381
		else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   382
		    cnt = 0;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   383
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   384
		if (lserver == server)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   385
		    cnt2++;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   386
		else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   387
		    cnt2 = 0;
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   388
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   389
		if (cnt <= 500 || cnt2 >= 2 || headroom - 875 < len) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   390
		    switch (rtp_packet.getPayloadType()) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   391
			case 0:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   392
			    len = rtp_packet.getPayloadLength();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   393
			    G711.ulaw2linear(buffer, lin, len);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   394
			    break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   395
			case 8:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   396
			    len = rtp_packet.getPayloadLength();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   397
			    G711.alaw2linear(buffer, lin, len);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   398
			    break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   399
			case 3:
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   400
			    for (i = 12; i < 45; i++)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   401
				buffer_gsm[i] = buffer[i];
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   402
			    len = Codec.decode(buffer_gsm, lin, 0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   403
			    break;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   404
		    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   405
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   406
		    if (speakermode == AudioManager.MODE_NORMAL)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   407
			calc(lin,0,len);
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   408
		}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   409
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   410
		if (headroom < 250) { 
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   411
		    todo = 875 - headroom;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   412
		    println("insert "+todo);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   413
		    islate = true;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   414
		    user += track.write(lin2,0,todo);
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   415
		} else
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   416
		    islate = false;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   417
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   418
		if (cnt > 500 && cnt2 < 2) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   419
		    todo = headroom - 875;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   420
		    println("cut "+todo);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   421
		    if (todo < len)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   422
			user += track.write(lin,todo,len-todo);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   423
		} else
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   424
		    user += track.write(lin,0,len);
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   425
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   426
		seq = gseq;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   427
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   428
		if (user >= luser + 8000 && Call.call_state == Call.UA_STATE_INCALL) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   429
		    if (luser == -8000 || am.getMode() != speakermode) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   430
			saveVolume();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   431
			setMode(speakermode);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   432
			restoreVolume();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   433
		    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   434
		    luser = user;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   435
		}
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   436
		lserver = server;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   437
	    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   438
	}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   439
	track.stop();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   440
	saveVolume();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   441
	setStreamVolume(AudioManager.STREAM_MUSIC,oldvol,0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   442
	restoreSettings();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   443
	setStreamVolume(AudioManager.STREAM_MUSIC,oldvol,0);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   444
	tg.stopTone();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   445
	tg = new ToneGenerator(AudioManager.STREAM_RING,ToneGenerator.MAX_VOLUME/4*3);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   446
	tg.startTone(ToneGenerator.TONE_PROP_PROMPT);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   447
	try {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   448
	    sleep(500);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   449
	} catch (InterruptedException e) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   450
	    e.printStackTrace();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   451
	}
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   452
	tg.stopTone();
834
e8d6255306f8 Sipdroid Basic
nikita@nikita-laptop
parents: 830
diff changeset
   453
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   454
	rtp_socket.close();
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   455
	rtp_socket = null;
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   456
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   457
	if (DEBUG)
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   458
	    println("rtp receiver terminated");
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   459
    }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   460
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   461
    /** Debug output */
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   462
    private static void println(String str) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   463
	System.out.println("RtpStreamReceiver: " + str);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   464
    }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   465
835
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   466
    public static int byte2int(byte b) { // return (b>=0)? b : -((b^0xFF)+1);
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   467
	// return (b>=0)? b : b+0x100;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   468
	return (b + 0x100) % 0x100;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   469
    }
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   470
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   471
    public static int byte2int(byte b1, byte b2) {
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   472
	return (((b1 + 0x100) % 0x100) << 8) + (b2 + 0x100) % 0x100;
4e40f3481f23 new sipdroid
nikita@nikita-laptop
parents: 834
diff changeset
   473
    }
823
2036ebfaccda debut de la gestion de l'audio, faut tester avec des pcs distincts
nikita@jibe-desktop
parents:
diff changeset
   474
}