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