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