*/
package org.linphone.core;
+import static android.media.AudioManager.MODE_IN_CALL;
+import static android.media.AudioManager.MODE_RINGTONE;
+
import java.io.File;
import java.io.IOException;
+import org.linphone.core.LinphoneCall.State;
+import org.linphone.mediastream.Log;
+import org.linphone.mediastream.video.capture.hwconf.Hacks;
+
+import android.content.Context;
+import android.media.AudioManager;
+
class LinphoneCoreImpl implements LinphoneCore {
private final LinphoneCoreListener mListener; //to make sure to keep a reference on this object
private long nativePtr = 0;
+ private Context mContext = null;
+ private AudioManager mAudioManager = null;
+ private boolean mSpeakerEnabled = false;
private native long newLinphoneCore(LinphoneCoreListener listener,String userConfig,String factoryConfig,Object userdata);
private native void iterate(long nativePtr);
private native long getDefaultProxyConfig(long nativePtr);
private native void setVideoPortRange(long nativePtr, int minPort, int maxPort);
private native void setIncomingTimeout(long nativePtr, int timeout);
private native void setInCallTimeout(long nativePtr, int timeout);
+ private native void setPrimaryContact(long nativePtr, String displayName, String username);
LinphoneCoreImpl(LinphoneCoreListener listener, File userConfig,File factoryConfig,Object userdata) throws IOException {
mListener=listener;
protected void finalize() throws Throwable {
}
-
+
+ private boolean contextInitialized() {
+ if (mContext == null) {
+ Log.e("Context of LinphoneCore has not been initialized, call setContext() after creating LinphoneCore.");
+ return false;
+ }
+ return true;
+ }
+ public void setContext(Object context) {
+ mContext = (Context)context;
+ mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
+ }
+
public synchronized void addAuthInfo(LinphoneAuthInfo info) {
isValid();
addAuthInfo(nativePtr,((LinphoneAuthInfoImpl)info).nativePtr);
}
-
-
public synchronized LinphoneProxyConfig getDefaultProxyConfig() {
isValid();
long lNativePtr = getDefaultProxyConfig(nativePtr);
public synchronized void acceptCall(LinphoneCall aCall) {
isValid();
acceptCall(nativePtr,((LinphoneCallImpl)aCall).nativePtr);
-
}
public synchronized LinphoneCallLog[] getCallLogs() {
isValid();
public synchronized void muteMic(boolean isMuted) {
muteMic(nativePtr,isMuted);
}
+
public synchronized LinphoneAddress interpretUrl(String destination) throws LinphoneCoreException {
long lAddress = interpretUrl(nativePtr,destination);
if (lAddress != 0) {
// TODO Auto-generated method stub
}
+
+ private void applyAudioHacks() {
+ if (Hacks.needGalaxySAudioHack()) {
+ /* The microphone gain is way too high on the Galaxy S so correct it here. */
+ setMicrophoneGain(-9.0f);
+ }
+ }
+ private void setAudioModeIncallForGalaxyS() {
+ if (!contextInitialized()) return;
+ mAudioManager.setMode(MODE_IN_CALL);
+ }
+ public void routeAudioToSpeakerHelper(boolean speakerOn) {
+ if (!contextInitialized()) return;
+ if (Hacks.needGalaxySAudioHack())
+ setAudioModeIncallForGalaxyS();
+ mAudioManager.setSpeakerphoneOn(speakerOn);
+ }
+ private native void forceSpeakerState(long nativePtr, boolean speakerOn);
public void enableSpeaker(boolean value) {
- // TODO Auto-generated method stub
-
+ final LinphoneCall call = getCurrentCall();
+ mSpeakerEnabled = value;
+ applyAudioHacks();
+ if (call != null && call.getState() == State.StreamsRunning && Hacks.needGalaxySAudioHack()) {
+ Log.d("Hack to have speaker=", value, " while on call");
+ forceSpeakerState(nativePtr, value);
+ } else {
+ routeAudioToSpeakerHelper(value);
+ }
}
public boolean isSpeakerEnabled() {
- // TODO Auto-generated method stub
- return false;
+ return mSpeakerEnabled;
}
public synchronized void playDtmf(char number, int duration) {
playDtmf(nativePtr,number, duration);
throws LinphoneCoreException {
deferCallUpdate(nativePtr, getCallPtr(aCall));
}
+
private native void setVideoPolicy(long nativePtr, boolean autoInitiate, boolean autoAccept);
public synchronized void setVideoPolicy(boolean autoInitiate, boolean autoAccept) {
setVideoPolicy(nativePtr, autoInitiate, autoAccept);
}
+ private native void setStaticPicture(long nativePtr, String path);
+ public synchronized void setStaticPicture(String path) {
+ setStaticPicture(nativePtr, path);
+ }
private native void setUserAgent(long nativePtr, String name, String version);
@Override
- public void setUserAgent(String name, String version) {
+ public synchronized void setUserAgent(String name, String version) {
setUserAgent(nativePtr,name,version);
}
private native void setCpuCountNative(int count);
- public void setCpuCount(int count)
+ public synchronized void setCpuCount(int count)
{
setCpuCountNative(count);
}
- public int getMissedCallsCount() {
+ public synchronized int getMissedCallsCount() {
return getMissedCallsCount(nativePtr);
}
- public void removeCallLog(LinphoneCallLog log) {
+ public synchronized void removeCallLog(LinphoneCallLog log) {
removeCallLog(nativePtr, ((LinphoneCallLogImpl) log).getNativePtr());
}
- public void resetMissedCallsCount() {
+ public synchronized void resetMissedCallsCount() {
resetMissedCallsCount(nativePtr);
}
}
private native void refreshRegisters(long nativePtr);
- public void refreshRegisters() {
+ public synchronized void refreshRegisters() {
refreshRegisters(nativePtr);
}
public String getVersion() {
return getVersion(nativePtr);
}
-
+ /**
+ * Wildcard value used by #linphone_core_find_payload_type to ignore rate in search algorithm
+ */
+ static int FIND_PAYLOAD_IGNORE_RATE = -1;
+ /**
+ * Wildcard value used by #linphone_core_find_payload_type to ignore channel in search algorithm
+ */
+ static int FIND_PAYLOAD_IGNORE_CHANNELS = -1;
@Override
- public PayloadType findPayloadType(String mime, int clockRate) {
- return findPayloadType(mime, clockRate, 1);
+ public synchronized PayloadType findPayloadType(String mime, int clockRate) {
+ return findPayloadType(mime, clockRate, FIND_PAYLOAD_IGNORE_CHANNELS);
}
private native void removeFriend(long ptr, long lf);
@Override
- public void removeFriend(LinphoneFriend lf) {
+ public synchronized void removeFriend(LinphoneFriend lf) {
removeFriend(nativePtr, lf.getNativePtr());
}
private native long getFriendByAddress(long ptr, String sipUri);
@Override
- public LinphoneFriend findFriendByAddress(String sipUri) {
+ public synchronized LinphoneFriend findFriendByAddress(String sipUri) {
long ptr = getFriendByAddress(nativePtr, sipUri);
if (ptr == 0) {
return null;
return new LinphoneFriendImpl(ptr);
}
- public void setAudioPort(int port) {
+ public synchronized void setAudioPort(int port) {
setAudioPort(nativePtr, port);
}
- public void setVideoPort(int port) {
+ public synchronized void setVideoPort(int port) {
setVideoPort(nativePtr, port);
}
- public void setAudioPortRange(int minPort, int maxPort) {
+ public synchronized void setAudioPortRange(int minPort, int maxPort) {
setAudioPortRange(nativePtr, minPort, maxPort);
}
- public void setVideoPortRange(int minPort, int maxPort) {
+ public synchronized void setVideoPortRange(int minPort, int maxPort) {
setVideoPortRange(nativePtr, minPort, maxPort);
}
- public void setIncomingTimeout(int timeout) {
+ public synchronized void setIncomingTimeout(int timeout) {
setIncomingTimeout(nativePtr, timeout);
}
- public void setInCallTimeout(int timeout)
+ public synchronized void setInCallTimeout(int timeout)
{
setInCallTimeout(nativePtr, timeout);
}
private native void setMicrophoneGain(long ptr, float gain);
- public void setMicrophoneGain(float gain) {
+ public synchronized void setMicrophoneGain(float gain) {
setMicrophoneGain(nativePtr, gain);
}
+
+ public synchronized void setPrimaryContact(String displayName, String username) {
+ setPrimaryContact(nativePtr, displayName, username);
+ }
+
+ private native void setUseSipInfoForDtmfs(long ptr, boolean use);
+ public synchronized void setUseSipInfoForDtmfs(boolean use) {
+ setUseSipInfoForDtmfs(nativePtr, use);
+ }
+
+ private native void setUseRfc2833ForDtmfs(long ptr, boolean use);
+ public synchronized void setUseRfc2833ForDtmfs(boolean use) {
+ setUseRfc2833ForDtmfs(nativePtr, use);
+ }
+
+ private native long getConfig(long ptr);
+ public synchronized LpConfig getConfig() {
+ long configPtr=getConfig(nativePtr);
+ return new LpConfigImpl(configPtr);
+ }
+ private native boolean needsEchoCalibration(long ptr);
+ @Override
+ public synchronized boolean needsEchoCalibration() {
+ return needsEchoCalibration(nativePtr);
+ }
+ private native void declineCall(long coreptr, long callptr, int reason);
+ @Override
+ public synchronized void declineCall(LinphoneCall aCall, Reason reason) {
+ declineCall(nativePtr,((LinphoneCallImpl)aCall).nativePtr,reason.mValue);
+ }
+
+ private native boolean upnpAvailable(long ptr);
+ public boolean upnpAvailable() {
+ return upnpAvailable(nativePtr);
+ }
+
+ private native int getUpnpState(long ptr);
+ public UpnpState getUpnpState() {
+ return UpnpState.fromInt(getUpnpState(nativePtr));
+ }
+
+ private native String getUpnpExternalIpaddress(long ptr);
+ public String getUpnpExternalIpaddress() {
+ return getUpnpExternalIpaddress(nativePtr);
+ }
+ private native int startConferenceRecording(long nativePtr, String path);
+ @Override
+ public void startConferenceRecording(String path) {
+ startConferenceRecording(nativePtr,path);
+ }
+
+ private native int stopConferenceRecording(long nativePtr);
+ @Override
+ public void stopConferenceRecording() {
+ stopConferenceRecording(nativePtr);
+ }
+ @Override
+ public PayloadType findPayloadType(String mime) {
+ return findPayloadType(mime, FIND_PAYLOAD_IGNORE_RATE);
+ }
+
+ private native void setSipDscp(long nativePtr, int dscp);
+ @Override
+ public void setSipDscp(int dscp) {
+ setSipDscp(nativePtr,dscp);
+ }
+
+ private native int getSipDscp(long nativePtr);
+ @Override
+ public int getSipDscp() {
+ return getSipDscp(nativePtr);
+ }
+ private native void setAudioDscp(long nativePtr, int dscp);
+ @Override
+ public void setAudioDscp(int dscp) {
+ setAudioDscp(nativePtr, dscp);
+ }
+
+ private native int getAudioDscp(long nativePtr);
+ @Override
+ public int getAudioDscp() {
+ return getAudioDscp(nativePtr);
+ }
+
+ private native void setVideoDscp(long nativePtr, int dscp);
+ @Override
+ public void setVideoDscp(int dscp) {
+ setVideoDscp(nativePtr,dscp);
+ }
+
+ private native int getVideoDscp(long nativePtr);
+ @Override
+ public int getVideoDscp() {
+ return getVideoDscp(nativePtr);
+ }
}