Fix issue 75, issue 79 and issue 80

This commit is contained in:
bossiel 2011-10-26 00:32:57 +00:00
parent 78be530041
commit 546fe46f0c
41 changed files with 510 additions and 56 deletions

View File

@ -171,6 +171,16 @@ tmedia_bandwidth_level_t MediaSessionMgr::defaultsGetBandwidthLevel()
return tmedia_defaults_get_bl();
}
bool MediaSessionMgr::defaultsSetJbMargin(uint32_t jb_margin_ms)
{
return tmedia_defaults_set_jb_margin(jb_margin_ms) == 0;
}
bool MediaSessionMgr::defaultsSetJbMaxLateRate(uint32_t jb_late_rate_percent)
{
return tmedia_defaults_set_jb_max_late_rate(jb_late_rate_percent) == 0;
}
bool MediaSessionMgr::defaultsSetEchoTail(uint32_t echo_tail)
{
return tmedia_defaults_set_echo_tail(echo_tail) == 0;

View File

@ -60,6 +60,8 @@ public:
// Defaults
static bool defaultsSetBandwidthLevel(tmedia_bandwidth_level_t bl);
static tmedia_bandwidth_level_t defaultsGetBandwidthLevel();
static bool defaultsSetJbMargin(uint32_t jb_margin_ms);
static bool defaultsSetJbMaxLateRate(uint32_t jb_late_rate_percent);
static bool defaultsSetEchoTail(uint32_t echo_tail);
static uint32_t defaultsGetEchoTail();
static bool defaultsSetEchoSkew(uint32_t echo_skew);

View File

@ -91,6 +91,16 @@ public class MediaSessionMgr : IDisposable {
return ret;
}
public static bool defaultsSetJbMargin(uint jb_margin_ms) {
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms);
return ret;
}
public static bool defaultsSetJbMaxLateRate(uint jb_late_rate_percent) {
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetJbMaxLateRate(jb_late_rate_percent);
return ret;
}
public static bool defaultsSetEchoTail(uint echo_tail) {
bool ret = tinyWRAPPINVOKE.MediaSessionMgr_defaultsSetEchoTail(echo_tail);
return ret;

View File

@ -287,6 +287,12 @@ class tinyWRAPPINVOKE {
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsGetBandwidthLevel")]
public static extern int MediaSessionMgr_defaultsGetBandwidthLevel();
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetJbMargin")]
public static extern bool MediaSessionMgr_defaultsSetJbMargin(uint jarg1);
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetJbMaxLateRate")]
public static extern bool MediaSessionMgr_defaultsSetJbMaxLateRate(uint jarg1);
[DllImport("tinyWRAP", EntryPoint="CSharp_MediaSessionMgr_defaultsSetEchoTail")]
public static extern bool MediaSessionMgr_defaultsSetEchoTail(uint jarg1);

View File

@ -1558,6 +1558,30 @@ SWIGEXPORT int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsGetBandwidthLevel() {
}
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetJbMargin(unsigned int jarg1) {
unsigned int jresult ;
uint32_t arg1 ;
bool result;
arg1 = (uint32_t)jarg1;
result = (bool)MediaSessionMgr::defaultsSetJbMargin(arg1);
jresult = result;
return jresult;
}
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetJbMaxLateRate(unsigned int jarg1) {
unsigned int jresult ;
uint32_t arg1 ;
bool result;
arg1 = (uint32_t)jarg1;
result = (bool)MediaSessionMgr::defaultsSetJbMaxLateRate(arg1);
jresult = result;
return jresult;
}
SWIGEXPORT unsigned int SWIGSTDCALL CSharp_MediaSessionMgr_defaultsSetEchoTail(unsigned int jarg1) {
unsigned int jresult ;
uint32_t arg1 ;

View File

@ -75,6 +75,14 @@ public class MediaSessionMgr {
return tmedia_bandwidth_level_t.swigToEnum(tinyWRAPJNI.MediaSessionMgr_defaultsGetBandwidthLevel());
}
public static boolean defaultsSetJbMargin(long jb_margin_ms) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms);
}
public static boolean defaultsSetJbMaxLateRate(long jb_late_rate_percent) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetJbMaxLateRate(jb_late_rate_percent);
}
public static boolean defaultsSetEchoTail(long echo_tail) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetEchoTail(echo_tail);
}

View File

@ -75,6 +75,14 @@ public class MediaSessionMgr {
return tmedia_bandwidth_level_t.swigToEnum(tinyWRAPJNI.MediaSessionMgr_defaultsGetBandwidthLevel());
}
public static boolean defaultsSetJbMargin(long jb_margin_ms) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms);
}
public static boolean defaultsSetJbMaxLateRate(long jb_late_rate_percent) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetJbMaxLateRate(jb_late_rate_percent);
}
public static boolean defaultsSetEchoTail(long echo_tail) {
return tinyWRAPJNI.MediaSessionMgr_defaultsSetEchoTail(echo_tail);
}

View File

@ -44,6 +44,8 @@ class tinyWRAPJNI {
public final static native java.math.BigInteger MediaSessionMgr_getSessionId(long jarg1, MediaSessionMgr jarg1_, int jarg2);
public final static native boolean MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1);
public final static native int MediaSessionMgr_defaultsGetBandwidthLevel();
public final static native boolean MediaSessionMgr_defaultsSetJbMargin(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetJbMaxLateRate(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetEchoTail(long jarg1);
public final static native long MediaSessionMgr_defaultsGetEchoTail();
public final static native boolean MediaSessionMgr_defaultsSetEchoSkew(long jarg1);

View File

@ -2471,6 +2471,34 @@ SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetJbMargin(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;
bool result;
(void)jenv;
(void)jcls;
arg1 = (uint32_t)jarg1;
result = (bool)MediaSessionMgr::defaultsSetJbMargin(arg1);
jresult = (jboolean)result;
return jresult;
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetJbMaxLateRate(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;
bool result;
(void)jenv;
(void)jcls;
arg1 = (uint32_t)jarg1;
result = (bool)MediaSessionMgr::defaultsSetJbMaxLateRate(arg1);
jresult = (jboolean)result;
return jresult;
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetEchoTail(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;

View File

@ -44,6 +44,8 @@ class tinyWRAPJNI {
public final static native java.math.BigInteger MediaSessionMgr_getSessionId(long jarg1, MediaSessionMgr jarg1_, int jarg2);
public final static native boolean MediaSessionMgr_defaultsSetBandwidthLevel(int jarg1);
public final static native int MediaSessionMgr_defaultsGetBandwidthLevel();
public final static native boolean MediaSessionMgr_defaultsSetJbMargin(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetJbMaxLateRate(long jarg1);
public final static native boolean MediaSessionMgr_defaultsSetEchoTail(long jarg1);
public final static native long MediaSessionMgr_defaultsGetEchoTail();
public final static native boolean MediaSessionMgr_defaultsSetEchoSkew(long jarg1);

View File

@ -2471,6 +2471,34 @@ SWIGEXPORT jint JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetJbMargin(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;
bool result;
(void)jenv;
(void)jcls;
arg1 = (uint32_t)jarg1;
result = (bool)MediaSessionMgr::defaultsSetJbMargin(arg1);
jresult = (jboolean)result;
return jresult;
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetJbMaxLateRate(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;
bool result;
(void)jenv;
(void)jcls;
arg1 = (uint32_t)jarg1;
result = (bool)MediaSessionMgr::defaultsSetJbMaxLateRate(arg1);
jresult = (jboolean)result;
return jresult;
}
SWIGEXPORT jboolean JNICALL Java_org_doubango_tinyWRAP_tinyWRAPJNI_MediaSessionMgr_1defaultsSetEchoTail(JNIEnv *jenv, jclass jcls, jlong jarg1) {
jboolean jresult = 0 ;
uint32_t arg1 ;

View File

@ -201,6 +201,8 @@ sub DESTROY {
*getSessionId = *tinyWRAPc::MediaSessionMgr_getSessionId;
*defaultsSetBandwidthLevel = *tinyWRAPc::MediaSessionMgr_defaultsSetBandwidthLevel;
*defaultsGetBandwidthLevel = *tinyWRAPc::MediaSessionMgr_defaultsGetBandwidthLevel;
*defaultsSetJbMargin = *tinyWRAPc::MediaSessionMgr_defaultsSetJbMargin;
*defaultsSetJbMaxLateRate = *tinyWRAPc::MediaSessionMgr_defaultsSetJbMaxLateRate;
*defaultsSetEchoTail = *tinyWRAPc::MediaSessionMgr_defaultsSetEchoTail;
*defaultsGetEchoTail = *tinyWRAPc::MediaSessionMgr_defaultsGetEchoTail;
*defaultsSetEchoSkew = *tinyWRAPc::MediaSessionMgr_defaultsSetEchoSkew;

View File

@ -3447,6 +3447,62 @@ XS(_wrap_MediaSessionMgr_defaultsGetBandwidthLevel) {
}
XS(_wrap_MediaSessionMgr_defaultsSetJbMargin) {
{
uint32_t arg1 ;
unsigned int val1 ;
int ecode1 = 0 ;
int argvi = 0;
bool result;
dXSARGS;
if ((items < 1) || (items > 1)) {
SWIG_croak("Usage: MediaSessionMgr_defaultsSetJbMargin(jb_margin_ms);");
}
ecode1 = SWIG_AsVal_unsigned_SS_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetJbMargin" "', argument " "1"" of type '" "uint32_t""'");
}
arg1 = static_cast< uint32_t >(val1);
result = (bool)MediaSessionMgr::defaultsSetJbMargin(arg1);
ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ;
XSRETURN(argvi);
fail:
SWIG_croak_null();
}
}
XS(_wrap_MediaSessionMgr_defaultsSetJbMaxLateRate) {
{
uint32_t arg1 ;
unsigned int val1 ;
int ecode1 = 0 ;
int argvi = 0;
bool result;
dXSARGS;
if ((items < 1) || (items > 1)) {
SWIG_croak("Usage: MediaSessionMgr_defaultsSetJbMaxLateRate(jb_late_rate_percent);");
}
ecode1 = SWIG_AsVal_unsigned_SS_int SWIG_PERL_CALL_ARGS_2(ST(0), &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetJbMaxLateRate" "', argument " "1"" of type '" "uint32_t""'");
}
arg1 = static_cast< uint32_t >(val1);
result = (bool)MediaSessionMgr::defaultsSetJbMaxLateRate(arg1);
ST(argvi) = SWIG_From_bool SWIG_PERL_CALL_ARGS_1(static_cast< bool >(result)); argvi++ ;
XSRETURN(argvi);
fail:
SWIG_croak_null();
}
}
XS(_wrap_MediaSessionMgr_defaultsSetEchoTail) {
{
uint32_t arg1 ;
@ -21652,6 +21708,8 @@ static swig_command_info swig_commands[] = {
{"tinyWRAPc::MediaSessionMgr_getSessionId", _wrap_MediaSessionMgr_getSessionId},
{"tinyWRAPc::MediaSessionMgr_defaultsSetBandwidthLevel", _wrap_MediaSessionMgr_defaultsSetBandwidthLevel},
{"tinyWRAPc::MediaSessionMgr_defaultsGetBandwidthLevel", _wrap_MediaSessionMgr_defaultsGetBandwidthLevel},
{"tinyWRAPc::MediaSessionMgr_defaultsSetJbMargin", _wrap_MediaSessionMgr_defaultsSetJbMargin},
{"tinyWRAPc::MediaSessionMgr_defaultsSetJbMaxLateRate", _wrap_MediaSessionMgr_defaultsSetJbMaxLateRate},
{"tinyWRAPc::MediaSessionMgr_defaultsSetEchoTail", _wrap_MediaSessionMgr_defaultsSetEchoTail},
{"tinyWRAPc::MediaSessionMgr_defaultsGetEchoTail", _wrap_MediaSessionMgr_defaultsGetEchoTail},
{"tinyWRAPc::MediaSessionMgr_defaultsSetEchoSkew", _wrap_MediaSessionMgr_defaultsSetEchoSkew},

View File

@ -158,6 +158,10 @@ class MediaSessionMgr(_object):
if _newclass:defaultsSetBandwidthLevel = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetBandwidthLevel)
__swig_getmethods__["defaultsGetBandwidthLevel"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel
if _newclass:defaultsGetBandwidthLevel = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel)
__swig_getmethods__["defaultsSetJbMargin"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetJbMargin
if _newclass:defaultsSetJbMargin = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetJbMargin)
__swig_getmethods__["defaultsSetJbMaxLateRate"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetJbMaxLateRate
if _newclass:defaultsSetJbMaxLateRate = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetJbMaxLateRate)
__swig_getmethods__["defaultsSetEchoTail"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsSetEchoTail
if _newclass:defaultsSetEchoTail = staticmethod(_tinyWRAP.MediaSessionMgr_defaultsSetEchoTail)
__swig_getmethods__["defaultsGetEchoTail"] = lambda x: _tinyWRAP.MediaSessionMgr_defaultsGetEchoTail
@ -211,6 +215,14 @@ def MediaSessionMgr_defaultsGetBandwidthLevel():
return _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel()
MediaSessionMgr_defaultsGetBandwidthLevel = _tinyWRAP.MediaSessionMgr_defaultsGetBandwidthLevel
def MediaSessionMgr_defaultsSetJbMargin(*args):
return _tinyWRAP.MediaSessionMgr_defaultsSetJbMargin(*args)
MediaSessionMgr_defaultsSetJbMargin = _tinyWRAP.MediaSessionMgr_defaultsSetJbMargin
def MediaSessionMgr_defaultsSetJbMaxLateRate(*args):
return _tinyWRAP.MediaSessionMgr_defaultsSetJbMaxLateRate(*args)
MediaSessionMgr_defaultsSetJbMaxLateRate = _tinyWRAP.MediaSessionMgr_defaultsSetJbMaxLateRate
def MediaSessionMgr_defaultsSetEchoTail(*args):
return _tinyWRAP.MediaSessionMgr_defaultsSetEchoTail(*args)
MediaSessionMgr_defaultsSetEchoTail = _tinyWRAP.MediaSessionMgr_defaultsSetEchoTail

View File

@ -6155,6 +6155,50 @@ fail:
}
SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetJbMargin(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
uint32_t arg1 ;
unsigned int val1 ;
int ecode1 = 0 ;
PyObject * obj0 = 0 ;
bool result;
if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetJbMargin",&obj0)) SWIG_fail;
ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetJbMargin" "', argument " "1"" of type '" "uint32_t""'");
}
arg1 = static_cast< uint32_t >(val1);
result = (bool)MediaSessionMgr::defaultsSetJbMargin(arg1);
resultobj = SWIG_From_bool(static_cast< bool >(result));
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetJbMaxLateRate(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
uint32_t arg1 ;
unsigned int val1 ;
int ecode1 = 0 ;
PyObject * obj0 = 0 ;
bool result;
if (!PyArg_ParseTuple(args,(char *)"O:MediaSessionMgr_defaultsSetJbMaxLateRate",&obj0)) SWIG_fail;
ecode1 = SWIG_AsVal_unsigned_SS_int(obj0, &val1);
if (!SWIG_IsOK(ecode1)) {
SWIG_exception_fail(SWIG_ArgError(ecode1), "in method '" "MediaSessionMgr_defaultsSetJbMaxLateRate" "', argument " "1"" of type '" "uint32_t""'");
}
arg1 = static_cast< uint32_t >(val1);
result = (bool)MediaSessionMgr::defaultsSetJbMaxLateRate(arg1);
resultobj = SWIG_From_bool(static_cast< bool >(result));
return resultobj;
fail:
return NULL;
}
SWIGINTERN PyObject *_wrap_MediaSessionMgr_defaultsSetEchoTail(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
uint32_t arg1 ;
@ -21069,6 +21113,8 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"MediaSessionMgr_getSessionId", _wrap_MediaSessionMgr_getSessionId, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetBandwidthLevel", _wrap_MediaSessionMgr_defaultsSetBandwidthLevel, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsGetBandwidthLevel", _wrap_MediaSessionMgr_defaultsGetBandwidthLevel, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetJbMargin", _wrap_MediaSessionMgr_defaultsSetJbMargin, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetJbMaxLateRate", _wrap_MediaSessionMgr_defaultsSetJbMaxLateRate, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetEchoTail", _wrap_MediaSessionMgr_defaultsSetEchoTail, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsGetEchoTail", _wrap_MediaSessionMgr_defaultsGetEchoTail, METH_VARARGS, NULL},
{ (char *)"MediaSessionMgr_defaultsSetEchoSkew", _wrap_MediaSessionMgr_defaultsSetEchoSkew, METH_VARARGS, NULL},

View File

@ -47,6 +47,7 @@ typedef struct tdav_producer_dsound_s
TDAV_DECLARE_PRODUCER_AUDIO;
tsk_bool_t started;
tsk_bool_t mute;
tsk_size_t bytes_per_notif;
void* tid[1];

View File

@ -105,12 +105,12 @@ next:
/* ============ Media Consumer Interface ================= */
int tdav_consumer_dsound_set(tmedia_consumer_t* self, const tmedia_param_t* params)
static int tdav_consumer_dsound_set(tmedia_consumer_t* self, const tmedia_param_t* params)
{
return tdav_consumer_audio_set(TDAV_CONSUMER_AUDIO(self), params);
}
int tdav_consumer_dsound_prepare(tmedia_consumer_t* self, const tmedia_codec_t* codec)
static int tdav_consumer_dsound_prepare(tmedia_consumer_t* self, const tmedia_codec_t* codec)
{
HRESULT hr;
HWND hWnd;
@ -186,7 +186,7 @@ int tdav_consumer_dsound_prepare(tmedia_consumer_t* self, const tmedia_codec_t*
return 0;
}
int tdav_consumer_dsound_start(tmedia_consumer_t* self)
static int tdav_consumer_dsound_start(tmedia_consumer_t* self)
{
tdav_consumer_dsound_t* dsound = (tdav_consumer_dsound_t*)self;
@ -245,7 +245,7 @@ int tdav_consumer_dsound_start(tmedia_consumer_t* self)
return 0;
}
int tdav_consumer_dsound_consume(tmedia_consumer_t* self, const void* buffer, tsk_size_t size, const tsk_object_t* proto_hdr)
static int tdav_consumer_dsound_consume(tmedia_consumer_t* self, const void* buffer, tsk_size_t size, const tsk_object_t* proto_hdr)
{
tdav_consumer_dsound_t* dsound = (tdav_consumer_dsound_t*)self;
@ -257,12 +257,12 @@ int tdav_consumer_dsound_consume(tmedia_consumer_t* self, const void* buffer, ts
return tdav_consumer_audio_put(TDAV_CONSUMER_AUDIO(dsound), buffer, size, proto_hdr);
}
int tdav_consumer_dsound_pause(tmedia_consumer_t* self)
static int tdav_consumer_dsound_pause(tmedia_consumer_t* self)
{
return 0;
}
int tdav_consumer_dsound_stop(tmedia_consumer_t* self)
static int tdav_consumer_dsound_stop(tmedia_consumer_t* self)
{
tdav_consumer_dsound_t* dsound = (tdav_consumer_dsound_t*)self;

View File

@ -98,12 +98,28 @@ next:;
/* ============ Media Producer Interface ================= */
int tdav_producer_dsound_set(tmedia_producer_t* self, const tmedia_param_t* params)
{
return tdav_producer_audio_set(TDAV_PRODUCER_AUDIO(self), params);
static int tdav_producer_dsound_set(tmedia_producer_t* self, const tmedia_param_t* param)
{
tdav_producer_dsound_t* dsound = (tdav_producer_dsound_t*)self;
if(param->plugin_type == tmedia_ppt_producer){
if(param->value_type == tmedia_pvt_int32){
if(tsk_striequals(param->key, "mute")){
dsound->mute = (TSK_TO_INT32((uint8_t*)param->value) != 0);
if(dsound->started){
if(dsound->mute){
IDirectSoundCaptureBuffer_Stop(dsound->captureBuffer);
}
else{
IDirectSoundCaptureBuffer_Start(dsound->captureBuffer, DSBPLAY_LOOPING);
}
}
return 0;
}
}
}
return tdav_producer_audio_set(TDAV_PRODUCER_AUDIO(self), param);
}
int tdav_producer_dsound_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec)
static int tdav_producer_dsound_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec)
{
HRESULT hr;
@ -155,7 +171,7 @@ int tdav_producer_dsound_prepare(tmedia_producer_t* self, const tmedia_codec_t*
return 0;
}
int tdav_producer_dsound_start(tmedia_producer_t* self)
static int tdav_producer_dsound_start(tmedia_producer_t* self)
{
tdav_producer_dsound_t* dsound = (tdav_producer_dsound_t*)self;
@ -214,12 +230,12 @@ int tdav_producer_dsound_start(tmedia_producer_t* self)
return 0;
}
int tdav_producer_dsound_pause(tmedia_producer_t* self)
static int tdav_producer_dsound_pause(tmedia_producer_t* self)
{
return 0;
}
int tdav_producer_dsound_stop(tmedia_producer_t* self)
static int tdav_producer_dsound_stop(tmedia_producer_t* self)
{
tdav_producer_dsound_t* dsound = (tdav_producer_dsound_t*)self;

View File

@ -126,6 +126,17 @@ static int tdav_session_audio_producer_enc_cb(const void* callback_data, const v
tdav_session_audio_t* audio = (tdav_session_audio_t*)callback_data;
if(!audio){
TSK_DEBUG_ERROR("Null session");
return 0;
}
// do nothing if session is held
// when the session is held the end user will get feedback he also has possibilities to put the consumer and producer on pause
if(TMEDIA_SESSION(audio)->lo_held){
return 0;
}
if(audio->rtp_manager){
/* encode */
tsk_size_t out_size = 0;

View File

@ -31,6 +31,8 @@
#if HAVE_SPEEX_DSP && HAVE_SPEEX_JB
#include "tinymedia/tmedia_defaults.h"
#include "tsk_memory.h"
#include "tsk_debug.h"
@ -43,6 +45,8 @@ static int tdav_speex_jitterbuffer_set(tmedia_jitterbuffer_t *self, const tmedia
static int tdav_speex_jitterbuffer_open(tmedia_jitterbuffer_t* self, uint32_t frame_duration, uint32_t rate)
{
tdav_speex_jitterbuffer_t *jitterbuffer = (tdav_speex_jitterbuffer_t *)self;
spx_int32_t tmp;
if(!(jitterbuffer->state = jitter_buffer_init((int)frame_duration))){
TSK_DEBUG_ERROR("jitter_buffer_init() failed");
return -2;
@ -50,6 +54,20 @@ static int tdav_speex_jitterbuffer_open(tmedia_jitterbuffer_t* self, uint32_t fr
jitterbuffer->rate = rate;
jitterbuffer->frame_duration = frame_duration;
jitter_buffer_ctl(jitterbuffer->state, JITTER_BUFFER_GET_MARGIN, &tmp);
TSK_DEBUG_INFO("Default Jitter buffer margin=%d", tmp);
jitter_buffer_ctl(jitterbuffer->state, JITTER_BUFFER_GET_MAX_LATE_RATE, &tmp);
TSK_DEBUG_INFO("Default Jitter max late rate=%d", tmp);
if((tmp = tmedia_defaults_get_jb_margin()) >= 0){
jitter_buffer_ctl(jitterbuffer->state, JITTER_BUFFER_SET_MARGIN, &tmp);
TSK_DEBUG_INFO("New Jitter buffer margin=%d", tmp);
}
if((tmp = tmedia_defaults_get_jb_max_late_rate()) >= 0){
jitter_buffer_ctl(jitterbuffer->state, JITTER_BUFFER_SET_MAX_LATE_RATE, &tmp);
TSK_DEBUG_INFO("New Jitter buffer max late rate=%d", tmp);
}
return 0;
}

View File

@ -163,7 +163,16 @@ static int tdav_session_video_producer_enc_cb(const void* callback_data, const v
tsk_size_t yuv420p_size = 0;
int ret = 0;
if(session && session->rtp_manager){
if(!session){
TSK_DEBUG_ERROR("Null session");
return 0;
}
if(TMEDIA_SESSION(session)->lo_held){
return 0;
}
if(session->rtp_manager){
/* encode */
tsk_size_t out_size = 0;
tmedia_codec_t* codec = tsk_null;

View File

@ -57,7 +57,9 @@ public:
HRESULT start();
HRESULT stop();
HRESULT pause();
bool isRunning();
bool isPaused();
std::string getDeviceId() const { return this->deviceId; };
@ -101,6 +103,7 @@ private:
DSCaptureFormat *captureFormat;
bool running;
bool paused;
std::string deviceId;
};

View File

@ -41,6 +41,7 @@ public:
virtual bool isAttached();
virtual void start();
virtual void pause();
virtual void stop();
virtual int getWidth();

View File

@ -52,8 +52,10 @@ public:
HRESULT disconnect();
HRESULT start();
HRESULT pause();
HRESULT stop();
bool isRunning();
bool isPaused();
IMediaEventEx *getMediaEvent() { return this->mediaEvent; };
IVideoWindow *getVideoWindow() { return this->videoWindow; };
@ -101,6 +103,7 @@ private:
bool connected;
bool running;
bool paused;
int fps;
};

View File

@ -53,6 +53,7 @@ public:
void setCaptureDevice(const std::string &devicePath);
virtual void start();
virtual void pause();
virtual void stop();
virtual bool setCaptureParameters(int format, int f);

View File

@ -58,6 +58,7 @@ DSCaptureGraph::DSCaptureGraph(ISampleGrabberCB* callback, HRESULT *hr)
this->streamConfiguration = NULL;
this->running = FALSE;
this->paused = FALSE;
this->deviceId = "";
*hr = this->createCaptureGraph();
@ -267,7 +268,9 @@ HRESULT DSCaptureGraph::start()
{
HRESULT hr;
if(this->running) return S_OK;
if(isRunning() && !isPaused()){
return S_OK;
}
//this->mediaController->Stop();
@ -292,6 +295,18 @@ HRESULT DSCaptureGraph::start()
return hr;
}
HRESULT DSCaptureGraph::pause()
{
HRESULT hr = S_OK;
if(isRunning()){
hr = this->mediaController->Pause();
if(SUCCEEDED(hr)){
this->paused = TRUE;
}
}
return hr;
}
HRESULT DSCaptureGraph::stop()
{
HRESULT hr;
@ -308,6 +323,7 @@ HRESULT DSCaptureGraph::stop()
TSK_DEBUG_ERROR("DSCaptureGraph::mediaController->Stop() has failed with %ld", hr);
}
this->running = false;
this->paused = false;
return hr;
}
@ -316,6 +332,11 @@ bool DSCaptureGraph::isRunning()
return this->running;
}
bool DSCaptureGraph::isPaused()
{
return this->paused;
}
HRESULT DSCaptureGraph::getConnectedMediaType(AM_MEDIA_TYPE *mediaType)
{
#ifdef _WIN32_WCE

View File

@ -114,11 +114,18 @@ void DSDisplay::start()
{
if (!this->graph->isRunning()){
this->hook();
}
if (!this->graph->isRunning() || this->graph->isPaused()){
this->graph->start();
}
this->graph->getVideoWindow()->put_Visible(OATRUE);
}
void DSDisplay::pause()
{
this->graph->pause();
}
void DSDisplay::stop()
{
if (this->graph->isRunning()){

View File

@ -36,6 +36,7 @@ using namespace std;
DSDisplayGraph::DSDisplayGraph(HRESULT *hr)
{
this->running = FALSE;
this->paused = FALSE;
this->fps = 15;
this->graphBuilder = NULL;
@ -168,7 +169,7 @@ HRESULT DSDisplayGraph::start()
{
HRESULT hr;
this->running = true;
this->sourceFilter->reset();
this->sourceFilter->reset();
hr = this->mediaController->Run();
if (!SUCCEEDED(hr)){
@ -177,6 +178,18 @@ HRESULT DSDisplayGraph::start()
return hr;
}
HRESULT DSDisplayGraph::pause()
{
HRESULT hr = S_OK;
if(isRunning() && !isPaused()){
hr = this->mediaController->Pause();
if(SUCCEEDED(hr)){
this->paused = true;
}
}
return hr;
}
HRESULT DSDisplayGraph::stop()
{
HRESULT hr;
@ -194,6 +207,7 @@ HRESULT DSDisplayGraph::stop()
}
this->running = false;
this->paused = false;
return hr;
}
@ -203,6 +217,11 @@ bool DSDisplayGraph::isRunning()
return this->running;
}
bool DSDisplayGraph::isPaused()
{
return this->paused;
}
void DSDisplayGraph::handleFrame(const void* data, int w, int h)
{
HRESULT hr;

View File

@ -86,6 +86,12 @@ void DSGrabber::setCallback(tmedia_producer_enc_cb_f callback, const void* callb
void DSGrabber::start()
{
if(this->graph->isPaused()){
this->graph->start();
this->preview->start();
return;
}
if (!this->graph->isRunning()){
first_buffer = true;
@ -96,6 +102,15 @@ void DSGrabber::start()
this->graph->start();
}
}
void DSGrabber::pause()
{
if(this->graph && this->graph->isRunning()){
this->graph->pause();
this->preview->pause();
}
}
void DSGrabber::stop()
{
if (this->graph->isRunning()){

View File

@ -27,7 +27,6 @@
#include "tsk_debug.h"
#define DSPRODUCER(self) ((tdshow_producer_t*)(self))
typedef struct tdshow_producer_s
@ -38,6 +37,7 @@ typedef struct tdshow_producer_s
INT64 previewHwnd;
tsk_bool_t started;
tsk_bool_t mute;
}
tdshow_producer_t;
@ -55,30 +55,44 @@ static int tdshow_plugin_cb(const void* callback_data, const void* buffer, tsk_s
/* ============ Media Producer Interface ================= */
int tdshow_producer_set(tmedia_producer_t *self, const tmedia_param_t* param)
static int tdshow_producer_set(tmedia_producer_t *self, const tmedia_param_t* param)
{
int ret = 0;
tdshow_producer_t* producer = (tdshow_producer_t*)self;
if(!self || !param){
if(!producer || !param){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
if(param->value_type == tmedia_pvt_int64){
if(tsk_striequals(param->key, "local-hwnd")){
if(DSPRODUCER(self)->grabber && DSPRODUCER(self)->grabber->preview){
DSPRODUCER(self)->grabber->preview->attach((INT64)*((int64_t*)param->value));
if(DSPRODUCER(producer)->grabber && DSPRODUCER(self)->grabber->preview){
DSPRODUCER(producer)->grabber->preview->attach((INT64)*((int64_t*)param->value));
}
else{
DSPRODUCER(self)->previewHwnd = (INT64)*((int64_t*)param->value);
DSPRODUCER(producer)->previewHwnd = (INT64)*((int64_t*)param->value);
}
}
}
else if(param->value_type == tmedia_pvt_int32){
if(tsk_striequals(param->key, "mute")){
producer->mute = (TSK_TO_INT32((uint8_t*)param->value) != 0);
if(producer->started){
if(producer->mute){
producer->grabber->pause();
}
else{
producer->grabber->start();
}
}
}
}
return ret;
}
int tdshow_producer_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec)
static int tdshow_producer_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec)
{
tdshow_producer_t* producer = (tdshow_producer_t*)self;
@ -94,7 +108,7 @@ int tdshow_producer_prepare(tmedia_producer_t* self, const tmedia_codec_t* codec
return 0;
}
int tdshow_producer_start(tmedia_producer_t* self)
static int tdshow_producer_start(tmedia_producer_t* self)
{
tdshow_producer_t* producer = (tdshow_producer_t*)self;
HRESULT hr;
@ -140,14 +154,16 @@ int tdshow_producer_start(tmedia_producer_t* self)
// start grabber
TSK_DEBUG_INFO("Before starting DirectShow producer");
producer->grabber->start();
if(!producer->mute){
producer->grabber->start();
}
producer->started = tsk_true;
TSK_DEBUG_INFO("After starting DirectShow producer");
return 0;
}
int tdshow_producer_pause(tmedia_producer_t* self)
static int tdshow_producer_pause(tmedia_producer_t* self)
{
tdshow_producer_t* producer = (tdshow_producer_t*)self;
@ -161,12 +177,12 @@ int tdshow_producer_pause(tmedia_producer_t* self)
return -2;
}
//producer->grabber->pause();
producer->grabber->pause();
return 0;
}
int tdshow_producer_stop(tmedia_producer_t* self)
static int tdshow_producer_stop(tmedia_producer_t* self)
{
tdshow_producer_t* producer = (tdshow_producer_t*)self;

View File

@ -37,6 +37,10 @@ TINYMEDIA_API tmedia_bandwidth_level_t tmedia_defaults_get_bl();
//
// Denoiser: Echo suppression, AEC, Noise redution, AGC, ...
//
TINYMEDIA_API int tmedia_defaults_set_jb_margin(int32_t jb_margin_ms);
TINYMEDIA_API int32_t tmedia_defaults_get_jb_margin();
TINYMEDIA_API int tmedia_defaults_set_jb_max_late_rate(int32_t jb_max_late_rate_percent);
TINYMEDIA_API int32_t tmedia_defaults_get_jb_max_late_rate();
TINYMEDIA_API int tmedia_defaults_set_echo_tail(uint32_t echo_tail);
TINYMEDIA_API int tmedia_defaults_set_echo_skew(uint32_t echo_skew);
TINYMEDIA_API uint32_t tmedia_defaults_get_echo_tail();

View File

@ -71,6 +71,10 @@ typedef struct tmedia_session_s
tsk_bool_t initialized;
//! whether the session have been prepared (up to the manager to update the value)
tsk_bool_t prepared;
//! whether the session is localy held
tsk_bool_t lo_held;
//! whether the session is remotely held
tsk_bool_t ro_held;
//! QoS
tmedia_qos_tline_t* qos;
//! bandwidth level

View File

@ -45,6 +45,8 @@ tmedia_bandwidth_level_t tmedia_defaults_get_bl()
//
// Denoiser: Echo suppression, AEC, Noise redution, AGC, ...
//
static int32_t __jb_margin_ms = -1; // disable
static int32_t __jb_max_late_rate_percent = -1; // -1: disable 4: default for speex
static uint32_t __echo_tail = 20;
static uint32_t __echo_skew = 0;
static tsk_bool_t __echo_supp_enabled;
@ -62,6 +64,28 @@ static uint16_t __rtp_port_range_start = 1024;
static uint16_t __rtp_port_range_stop = 65535;
static tmedia_type_t __media_type = tmedia_audio;
int tmedia_defaults_set_jb_margin(int32_t jb_margin_ms)
{
__jb_margin_ms = jb_margin_ms;
return __jb_margin_ms;
}
int32_t tmedia_defaults_get_jb_margin()
{
return __jb_margin_ms;
}
int tmedia_defaults_set_jb_max_late_rate(int32_t jb_max_late_rate_percent)
{
__jb_max_late_rate_percent = jb_max_late_rate_percent;
return 0;
}
int32_t tmedia_defaults_get_jb_max_late_rate()
{
return __jb_max_late_rate_percent;
}
int tmedia_defaults_set_echo_tail(uint32_t echo_tail)
{
__echo_tail = echo_tail;

View File

@ -279,6 +279,7 @@ int _tmedia_session_set_ro(tmedia_session_t* self, const tsdp_header_M_t* m)
}
if(!(ret = self->plugin->set_remote_offer(self, m))){
self->ro_changed = tsk_true;
self->ro_held = tsdp_header_M_is_held(m, tsk_false);
}
return ret;
}
@ -962,8 +963,9 @@ int tmedia_session_mgr_hold(tmedia_session_mgr_t* self, tmedia_type_t type)
tsk_list_foreach(item, self->sessions){
tmedia_session_t* session = TMEDIA_SESSION(item->data);
if(((session->type & type) == session->type) && session->M.lo){
if(!tsdp_header_M_hold(session->M.lo, tsk_true)){
if(tsdp_header_M_hold(session->M.lo, tsk_true) == 0){
self->state_changed = tsk_true;
session->lo_held = tsk_true;
}
}
}
@ -1029,6 +1031,7 @@ int tmedia_session_mgr_resume(tmedia_session_mgr_t* self, tmedia_type_t type)
if(((session->type & type) == session->type) && session->M.lo){
if(!tsdp_header_M_resume(session->M.lo, tsk_true)){
self->state_changed = tsk_true;
session->lo_held = tsk_false;
}
}
}

View File

@ -282,7 +282,7 @@ tnet_fd_t tnet_transport_connectto(const tnet_transport_handle_t *handle, const
*/
if(TNET_SOCKET_TYPE_IS_STREAM(type)){
/* Create client socket descriptor. */
if(status = tnet_sockfd_init(transport->local_ip, TNET_SOCKET_PORT_ANY, type, &fd)){
if(status = tnet_sockfd_init(transport->local_host, TNET_SOCKET_PORT_ANY, type, &fd)){
TSK_DEBUG_ERROR("Failed to create new sockfd.");
goto bail;
}
@ -398,31 +398,28 @@ static tsk_object_t* tnet_transport_ctor(tsk_object_t * self, va_list * app)
{
tnet_transport_t *transport = self;
if(transport){
const char *host = va_arg(*app, const char*);
const char *local_host = va_arg(*app, const char*);
#if defined(__GNUC__)
tnet_port_t port = (uint16_t)va_arg(*app, unsigned);
tnet_port_t req_local_port = (uint16_t)va_arg(*app, unsigned);
#else
tnet_port_t port = (tnet_port_t)va_arg(*app, tnet_port_t);
tnet_port_t req_local_port = (tnet_port_t)va_arg(*app, tnet_port_t);
#endif
tnet_socket_type_t type = va_arg(*app, tnet_socket_type_t);
const char *description = va_arg(*app, const char*);
if(description){
transport->description = tsk_strdup(description);
}
transport->description = tsk_strdup(description);
transport->local_host = tsk_strdup(local_host);
transport->req_local_port = req_local_port;
transport->type = type;
transport->master = tnet_socket_create(host, port, type);
transport->context = tnet_transport_context_create();
if(TNET_SOCKET_TYPE_IS_IPV46(transport->type)){
transport->local_ip = tsk_strdup(host); /* FQDN */
if((transport->master = tnet_socket_create(local_host, req_local_port, type))){
transport->local_ip = tsk_strdup(transport->master->ip);
transport->bind_local_port = transport->master->port;
}
else{
transport->local_ip = tsk_strdup(transport->master->ip); /* IP address */
TSK_DEBUG_ERROR("Failed to create master socket");
return tsk_null;
}
}
return self;
@ -438,6 +435,7 @@ static tsk_object_t* tnet_transport_dtor(tsk_object_t * self)
TSK_OBJECT_SAFE_FREE(transport->natt_ctx);
TSK_FREE(transport->description);
TSK_FREE(transport->local_ip);
TSK_FREE(transport->local_host);
// tls
TSK_FREE(transport->tls.ca);

View File

@ -105,6 +105,9 @@ typedef struct tnet_transport_s
tnet_socket_type_t type;
char* local_ip;
char* local_host;
tnet_port_t req_local_port; // user requested local port
tnet_port_t bind_local_port; // local port on which we are listening (same as master socket)
tnet_nat_context_handle_t* natt_ctx;
tnet_socket_t *master;

View File

@ -496,6 +496,18 @@ int tnet_transport_prepare(tnet_transport_t *transport)
TSK_DEBUG_ERROR("Transport already prepared.");
return -2;
}
/* Prepare master */
if(!transport->master){
if((transport->master = tnet_socket_create(transport->local_host, transport->req_local_port, transport->type))){
tsk_strupdate(&transport->local_ip, transport->master->ip);
transport->bind_local_port = transport->master->port;
}
else{
TSK_DEBUG_ERROR("Failed to create master socket");
return -3;
}
}
/* set events */
context->events = TNET_POLLIN | TNET_POLLNVAL | TNET_POLLERR;
@ -569,6 +581,9 @@ int tnet_transport_unprepare(tnet_transport_t *transport)
removeSocket(0, context); // safe
}
// destroy master as it has been close by removeSocket()
TSK_OBJECT_SAFE_FREE(transport->master);
return 0;
}

View File

@ -64,7 +64,7 @@ typedef struct transport_context_s
transport_context_t;
static transport_socket_t* getSocket(transport_context_t *context, tnet_fd_t fd);
static int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport, int take_ownership, int is_client);
static int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport, tsk_bool_t take_ownership, tsk_bool_t is_client);
static int removeSocket(int index, transport_context_t *context);
/* Checks if socket is connected */
@ -342,7 +342,7 @@ static transport_socket_t* getSocket(transport_context_t *context, tnet_fd_t fd)
}
/*== Add new socket ==*/
static int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport, int take_ownership, int is_client)
static int addSocket(tnet_fd_t fd, tnet_socket_type_t type, tnet_transport_t *transport, tsk_bool_t take_ownership, tsk_bool_t is_client)
{
transport_context_t *context = transport?transport->context:0;
@ -448,6 +448,18 @@ int tnet_transport_prepare(tnet_transport_t *transport)
TSK_DEBUG_ERROR("Transport already prepared.");
return -2;
}
/* Prepare master */
if(!transport->master){
if((transport->master = tnet_socket_create(transport->local_host, transport->req_local_port, transport->type))){
tsk_strupdate(&transport->local_ip, transport->master->ip);
transport->bind_local_port = transport->master->port;
}
else{
TSK_DEBUG_ERROR("Failed to create master socket");
return -3;
}
}
/* Start listening */
if(TNET_SOCKET_TYPE_IS_STREAM(transport->master->type)){
@ -497,6 +509,8 @@ int tnet_transport_unprepare(tnet_transport_t *transport)
while(context->count){
removeSocket(0, context); // safe
}
// destroy master as it has been close by removeSocket()
TSK_OBJECT_SAFE_FREE(transport->master);
return 0;
}

View File

@ -1247,9 +1247,10 @@ int tnet_sockfd_sendto(tnet_fd_t fd, const struct sockaddr *to, const void* buf,
DWORD numberOfBytesSent = 0;
wsaBuffer.buf = ((CHAR*)buf) + sent;
wsaBuffer.len = (size-sent);
ret = WSASendTo(fd, &wsaBuffer, 1, &numberOfBytesSent, 0, to, tnet_get_sockaddr_size(to), 0, 0);
ret = WSASendTo(fd, &wsaBuffer, 1, &numberOfBytesSent, 0, to, tnet_get_sockaddr_size(to), 0, 0); // returns zero if succeed
if(ret == 0) ret = numberOfBytesSent;
#else
ret = sendto(fd, (((const uint8_t*)buf)+sent), (size-sent), 0, to, tnet_get_sockaddr_size(to));
ret = sendto(fd, (((const uint8_t*)buf)+sent), (size-sent), 0, to, tnet_get_sockaddr_size(to)); // returns number of sent bytes if succeed
#endif
if(ret <= 0){
goto bail;

View File

@ -328,13 +328,13 @@ int trtp_manager_start(trtp_manager_t* self)
return 0;
}
if(!self->transport || !self->transport->master){
if(!self->transport){
TSK_DEBUG_ERROR("RTP/RTCP manager not prepared");
return -2;
}
/* Flush buffers and re-enable sockets */
{
if(self->transport->master){
char buff[2048];
// re-enable sockets
@ -409,12 +409,12 @@ int trtp_manager_send_rtp(trtp_manager_t* self, const void* data, tsk_size_t siz
tsk_buffer_t* buffer;
int ret = -1;
if(!self || !data || !size){
if(!self || !self->transport || !data || !size){
TSK_DEBUG_ERROR("Invalid parameter");
return -1;
}
if(!self->started){
if(!self->started || !self->transport->master){
//--TSK_DEBUG_ERROR("RTP/RTCP manager should be started before trying to send data");
return -2;
}

View File

@ -527,6 +527,7 @@ int x0000_Connected_2_Connected_X_iINVITEorUPDATE(va_list *app)
tsk_bool_t bodiless_invite;
tmedia_type_t old_media_type = self->msession_mgr ? self->msession_mgr->type : tmedia_none;
tmedia_type_t new_media_type;
static tsk_bool_t force_sdp = tsk_true; // This is a hack: many client fail to handle 200 Ok without sdp after reINVITE (e.g. hold/resume)
/* process remote offer */
if((ret = tsip_dialog_invite_process_ro(self, rINVITEorUPDATE))){
@ -555,7 +556,7 @@ int x0000_Connected_2_Connected_X_iINVITEorUPDATE(va_list *app)
// send the response
ret = send_RESPONSE(self, rINVITEorUPDATE, 200, "OK",
(self->msession_mgr && (bodiless_invite || self->msession_mgr->ro_changed || self->msession_mgr->state_changed || (old_media_type != new_media_type))));
(self->msession_mgr && (force_sdp || bodiless_invite || self->msession_mgr->ro_changed || self->msession_mgr->state_changed || (old_media_type != new_media_type))));
/* session timers */
if(self->stimers.timer.timeout){