prepare wince port

This commit is contained in:
Jehan Monnier 2009-12-04 21:12:21 +01:00
parent 798b8e72f1
commit 1896a794b3
18 changed files with 345 additions and 167 deletions

View file

@ -36,7 +36,7 @@ AM_PROG_CC_C_O
case $target_os in
*mingw32ce)
CFLAGS="$CFLAGS -D_WIN32_WCE -DORTP_STATIC -D_WIN32_WINNT=0x0501 -Dstrerror="
CFLAGS="$CFLAGS -D_WIN32_WCE -DORTP_STATIC -D_WIN32_WINNT=0x0501"
CXXFLAGS="$CXXFLAGS -DORTP_STATIC -D_WIN32_WINNT=0x0501"
LIBS="$LIBS -lws2 -liphlpapi"
mingw_found=yes

View file

@ -26,10 +26,12 @@
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#ifndef _WIN32_WCE
#include <errno.h>
#include <unistd.h>
#endif /*_WIN32_WCE*/
#include <limits.h>
#include <ctype.h>
#include <unistd.h>
#include <linphonecore.h>
#include "linphonec.h"
@ -282,7 +284,7 @@ linphonec_command_generator(const char *text, int state)
if (strncmp(name, text, len) == 0)
{
return strdup(name);
return ortp_strdup(name);
}
}
@ -577,10 +579,12 @@ lpc_cmd_friend(LinphoneCore *lc, char *args)
args+=4;
if ( ! *args ) return 0;
friend_num = strtol(args, NULL, 10);
#ifndef _WIN32_WCE
if ( errno == ERANGE ) {
linphonec_out("Invalid friend number\n");
return 0;
}
#endif /*_WIN32_WCE*/
linphonec_friend_call(lc, friend_num);
return 1;
}
@ -597,10 +601,12 @@ lpc_cmd_friend(LinphoneCore *lc, char *args)
else
{
friend_num = strtol(args, NULL, 10);
#ifndef _WIN32_WCE
if ( errno == ERANGE ) {
linphonec_out("Invalid friend number\n");
return 0;
}
#endif /*_WIN32_WCE*/
}
linphonec_friend_delete(lc, friend_num);
return 1;
@ -1401,9 +1407,9 @@ static int lpc_cmd_duration(LinphoneCore *lc, char *args){
static int lpc_cmd_status(LinphoneCore *lc, char *args)
{
if ( ! args ) return 0;
LinphoneProxyConfig *cfg;
if ( ! args ) return 0;
linphone_core_get_default_proxy(lc,&cfg);
if (strstr(args,"register"))
{

View file

@ -23,24 +23,28 @@
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*
****************************************************************************/
#include <errno.h>
#include <string.h>
#ifndef _WIN32_WCE
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>
#include <errno.h>
#include <signal.h>
#include "private.h" /*coreapi/private.h, needed for LINPHONE_VERSION */
#endif /*_WIN32_WCE*/
#include <limits.h>
#include <ctype.h>
#include <linphonecore.h>
#include "private.h" /*coreapi/private.h, needed for LINPHONE_VERSION */
#include "linphonec.h"
#ifdef WIN32
#include <ws2tcpip.h>
#include <ctype.h>
#ifndef _WIN32_WCE
#include <conio.h>
#endif /*_WIN32_WCE*/
#else
#include <sys/socket.h>
#include <netdb.h>
@ -48,6 +52,21 @@
#include <sys/stat.h>
#endif
#if defined(_WIN32_WCE)
#if !defined(PATH_MAX)
#define PATH_MAX 256
#endif /*PATH_MAX*/
#if !defined(strdup)
#define strdup _strdup
#endif /*strdup*/
/*
#if !defined(access)
#define access _access
#endif*/ /*access*/
#endif /*_WIN32_WCE*/
#ifdef HAVE_GETTEXT
#include <libintl.h>
@ -71,14 +90,16 @@ typedef struct {
/***************************************************************************
*
* Forward declarations
* Forward declarations
*
***************************************************************************/
char *lpc_strip_blanks(char *input);
static int handle_configfile_migration(void);
#if !defined(_WIN32_WCE)
static int copy_file(const char *from, const char *to);
#endif /*_WIN32_WCE*/
static int linphonec_parse_cmdline(int argc, char **argv);
static int linphonec_init(int argc, char **argv);
static int linphonec_main_loop (LinphoneCore * opm, char * sipAddr);
@ -111,7 +132,7 @@ static void linphonec_dtmf_received(LinphoneCore *lc, int dtmf);
static void print_prompt(LinphoneCore *opm);
/***************************************************************************
*
* Global variables
* Global variables
*
***************************************************************************/
@ -135,18 +156,25 @@ static int trace_level = 0;
static char *logfile_name = NULL;
static char configfile_name[PATH_MAX];
static char *sipAddr = NULL; /* for autocall */
#if !defined(_WIN32_WCE)
static ortp_pipe_t client_sock=ORTP_PIPE_INVALID;
#endif /*_WIN32_WCE*/
char prompt[PROMPT_MAX_LEN];
#if !defined(_WIN32_WCE)
static ortp_thread_t pipe_reader_th;
static bool_t pipe_reader_run=FALSE;
#endif /*_WIN32_WCE*/
#if !defined(_WIN32_WCE)
static ortp_pipe_t server_sock;
#endif /*_WIN32_WCE*/
LinphoneCoreVTable linphonec_vtable = {
LinphoneCoreVTable linphonec_vtable
#if !defined (_MSC_VER)
= {
.show =(ShowInterfaceCb) stub,
.inv_recv = linphonec_call_received,
.bye_recv = linphonec_bye_received,
.bye_recv = linphonec_bye_received,
.notify_recv = linphonec_notify_received,
.new_unknown_subscriber = linphonec_new_unknown_subscriber,
.auth_info_requested = linphonec_prompt_for_auth,
@ -162,7 +190,9 @@ LinphoneCoreVTable linphonec_vtable = {
.text_received=linphonec_text_received,
.general_state=linphonec_general_state,
.dtmf_received=linphonec_dtmf_received
};
}
#endif /*_WIN32_WCE*/
;
@ -173,7 +203,7 @@ LinphoneCoreVTable linphonec_vtable = {
***************************************************************************/
/*
* Linphone core callback
* Linphone core callback
*/
static void
linphonec_display_something (LinphoneCore * lc, const char *something)
@ -183,7 +213,7 @@ linphonec_display_something (LinphoneCore * lc, const char *something)
}
/*
* Linphone core callback
* Linphone core callback
*/
static void
linphonec_display_status (LinphoneCore * lc, const char *something)
@ -193,7 +223,7 @@ linphonec_display_status (LinphoneCore * lc, const char *something)
}
/*
* Linphone core callback
* Linphone core callback
*/
static void
linphonec_display_warning (LinphoneCore * lc, const char *something)
@ -203,7 +233,7 @@ linphonec_display_warning (LinphoneCore * lc, const char *something)
}
/*
* Linphone core callback
* Linphone core callback
*/
static void
linphonec_display_url (LinphoneCore * lc, const char *something, const char *url)
@ -213,7 +243,7 @@ linphonec_display_url (LinphoneCore * lc, const char *something, const char *url
/*
* Linphone core callback
* Linphone core callback
*/
static void
linphonec_call_received(LinphoneCore *lc, const char *from)
@ -225,7 +255,7 @@ linphonec_call_received(LinphoneCore *lc, const char *from)
}
/*
* Linphone core callback
* Linphone core callback
*/
static void
linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *username)
@ -235,15 +265,15 @@ linphonec_prompt_for_auth(LinphoneCore *lc, const char *realm, const char *usern
linphone_core_abort_authentication(lc,NULL);
}else{
LinphoneAuthInfo *pending_auth;
if ( auth_stack.nitems+1 > MAX_PENDING_AUTH )
{
fprintf(stderr,
"Can't accept another authentication request.\n"
"Consider incrementing MAX_PENDING_AUTH macro.\n");
return;
}
}
pending_auth=linphone_auth_info_new(username,NULL,NULL,NULL,realm);
auth_stack.elem[auth_stack.nitems++]=pending_auth;
}
@ -268,8 +298,8 @@ linphonec_new_unknown_subscriber(LinphoneCore *lc, LinphoneFriend *lf,
const char *url)
{
printf("Friend %s requested subscription "
"(accept/deny is not implemented yet)\n", url);
// This means that this person wishes to be notified
"(accept/deny is not implemented yet)\n", url);
// This means that this person wishes to be notified
// of your presence information (online, busy, away...).
}
@ -304,7 +334,7 @@ static void linphonec_dtmf_received(LinphoneCore *lc, int dtmf){
fflush(stdout);
}
static void
static void
linphonec_general_state (LinphoneCore * lc, LinphoneGeneralState *gstate)
{
if (show_general_state) {
@ -352,11 +382,11 @@ linphonec_general_state (LinphoneCore * lc, LinphoneGeneralState *gstate)
printf("GSTATE_CALL_ERROR");
break;
default:
printf("GSTATE_UNKNOWN_%d",gstate->new_state);
printf("GSTATE_UNKNOWN_%d",gstate->new_state);
}
if (gstate->message) printf(" %s", gstate->message);
printf("\n");
}
}
}
static char received_prompt[PROMPT_MAX_LEN];
@ -380,14 +410,14 @@ static void start_prompt_reader(void){
ms_mutex_init(&prompt_mutex,NULL);
ortp_thread_create(&th,NULL,prompt_reader_thread,NULL);
}
#if !defined(_WIN32_WCE)
static ortp_pipe_t create_server_socket(void){
char path[128];
#ifndef WIN32
snprintf(path,sizeof(path)-1,"linphonec-%i",getuid());
#else
{
char username[128];
TCHAR username[128];
DWORD size=sizeof(username)-1;
GetUserName(username,&size);
snprintf(path,sizeof(path)-1,"linphonec-%s",username);
@ -396,6 +426,7 @@ static ortp_pipe_t create_server_socket(void){
return ortp_server_pipe_create(path);
}
static void *pipe_thread(void*p){
char tmp[250];
server_sock=create_server_socket();
@ -424,7 +455,7 @@ static void *pipe_thread(void*p){
ortp_server_pipe_close_client(client_sock);
client_sock=ORTP_PIPE_INVALID;
}
}else{
if (pipe_reader_run) fprintf(stderr,"accept() failed: %s\n",strerror(errno));
}
@ -446,6 +477,7 @@ static void stop_pipe_reader(void){
ortp_server_pipe_close(server_sock);
ortp_thread_join(pipe_reader_th,NULL);
}
#endif /*_WIN32_WCE*/
#ifdef HAVE_READLINE
#define BOOL_HAVE_READLINE 1
@ -462,8 +494,10 @@ char *linphonec_readline(char *prompt){
prompt_reader_started=TRUE;
}
if (unix_socket && !pipe_reader_started){
#if !defined(_WIN32_WCE)
start_pipe_reader();
pipe_reader_started=TRUE;
#endif /*_WIN32_WCE*/
}
fprintf(stdout,"%s",prompt);
fflush(stdout);
@ -498,19 +532,23 @@ void linphonec_out(const char *fmt,...){
va_end (args);
printf("%s",res);
fflush(stdout);
#if !defined(_WIN32_WCE)
if (client_sock!=ORTP_PIPE_INVALID){
if (ortp_pipe_write(client_sock,(uint8_t*)res,strlen(res))==-1){
fprintf(stderr,"Fail to send output via pipe: %s",strerror(errno));
}
}
#endif /*_WIN32_WCE*/
ortp_free(res);
}
void linphonec_command_finished(void){
#if !defined(_WIN32_WCE)
if (client_sock!=ORTP_PIPE_INVALID){
ortp_server_pipe_close_client(client_sock);
client_sock=ORTP_PIPE_INVALID;
}
#endif /*_WIN32_WCE*/
}
void linphonec_set_autoanswer(bool_t enabled){
@ -530,9 +568,35 @@ bool_t linphonec_get_autoanswer(){
* - char *histfile_name
* - FILE *mylogfile
*/
#if defined (_MSC_VER)
int _tmain(int argc, _TCHAR* argv[]) {
trace_level=1;
linphonec_vtable.show =(ShowInterfaceCb) stub;
linphonec_vtable.inv_recv = linphonec_call_received;
linphonec_vtable.bye_recv = linphonec_bye_received;
linphonec_vtable.notify_recv = linphonec_notify_received;
linphonec_vtable.new_unknown_subscriber = linphonec_new_unknown_subscriber;
linphonec_vtable.auth_info_requested = linphonec_prompt_for_auth;
linphonec_vtable.display_status = linphonec_display_status;
linphonec_vtable.display_message=linphonec_display_something;
#ifdef VINCENT_MAURY_RSVP
/* the yes/no dialog box */
linphonec_vtable.display_yes_no= (DisplayMessageCb) stub;
#endif
linphonec_vtable.display_warning=linphonec_display_warning;
linphonec_vtable.display_url=linphonec_display_url;
linphonec_vtable.display_question=(DisplayQuestionCb)stub;
linphonec_vtable.text_received=linphonec_text_received;
linphonec_vtable.general_state=linphonec_general_state;
linphonec_vtable.dtmf_received=linphonec_dtmf_received;
#else
int
main (int argc, char *argv[])
{
main (int argc, char *argv[]) {
#endif
if (! linphonec_init(argc, argv) ) exit(EXIT_FAILURE);
@ -556,9 +620,13 @@ linphonec_init(int argc, char **argv)
* Set initial values for global variables
*/
mylogfile = NULL;
snprintf(configfile_name, PATH_MAX, "%s/.linphonerc",
getenv("HOME"));
snprintf(configfile_name, PATH_MAX, "%s/.linphonerc",
#if !defined(_WIN32_WCE)
getenv("HOME"));
#else
".");
#endif /*_WIN32_WCE*/
/* Handle configuration filename changes */
switch (handle_configfile_migration())
@ -623,12 +691,13 @@ linphonec_init(int argc, char **argv)
*/
linphonec_initialize_readline();
#endif
#if !defined(_WIN32_WCE)
/*
* Initialize signal handlers
*/
signal(SIGTERM, linphonec_finish);
signal(SIGINT, linphonec_finish);
signal(SIGTERM, linphonec_finish);
signal(SIGINT, linphonec_finish);
#endif /*_WIN32_WCE*/
return 1;
}
@ -645,16 +714,17 @@ void
linphonec_finish(int exit_status)
{
printf("Terminating...\n");
/* Terminate any pending call */
linphonec_parse_command_line(&linphonec, "terminate");
linphonec_command_finished();
#ifdef HAVE_READLINE
linphonec_finish_readline();
#endif
#if !defined(_WIN32_WCE)
if (pipe_reader_run)
stop_pipe_reader();
#endif /*_WIN32_WCE*/
linphone_core_uninit (&linphonec);
@ -672,7 +742,7 @@ linphonec_finish(int exit_status)
* pending_auth != NULL.
*
* It prompts user for a password.
* Hitting ^D (EOF) would make this function
* Hitting ^D (EOF) would make this function
* return 0 (Cancel).
* Any other input would try to set linphone core
* auth_password for the pending_auth, add the auth_info
@ -715,7 +785,7 @@ linphonec_prompt_for_auth_final(LinphoneCore *lc)
*/
if ( ! input )
{
printf("Cancel requested, but not implemented.\n");
printf("Cancel requested, but not implemented.\n");
continue;
}
@ -834,7 +904,7 @@ linphonec_initialize_readline()
rl_readline_name = "linphonec";
/* Call idle_call() every second */
rl_set_keyboard_input_timeout(LPC_READLINE_TIMEOUT);
rl_set_keyboard_input_timeout(LPC_READLINE_TIMEOUT);
rl_event_hook=linphonec_idle_call;
/* Set history file and read it */
@ -849,7 +919,7 @@ linphonec_initialize_readline()
rl_attempted_completion_function = linephonec_readline_completion;
/* printf("Readline initialized.\n"); */
setlinebuf(stdout);
setlinebuf(stdout);
return 0;
}
@ -976,7 +1046,7 @@ linphonec_parse_cmdline(int argc, char **argv)
else if (strncmp ("-c", argv[arg_num], 2) == 0)
{
if ( ++arg_num >= argc ) print_usage(EXIT_FAILURE);
#if !defined(_WIN32_WCE)
if (access(argv[arg_num],F_OK)!=0 )
{
fprintf (stderr,
@ -984,6 +1054,7 @@ linphonec_parse_cmdline(int argc, char **argv)
argv[arg_num]);
exit(EXIT_FAILURE);
}
#endif /*_WIN32_WCE*/
snprintf(configfile_name, PATH_MAX, "%s", argv[arg_num]);
}
else if (strncmp ("-s", argv[arg_num], 2) == 0)
@ -1016,7 +1087,9 @@ linphonec_parse_cmdline(int argc, char **argv)
("--version", argv[arg_num],
strlen ("--version")) == 0))
{
#if !defined(_WIN32_WCE)
printf ("version: " LINPHONE_VERSION "\n");
#endif
exit (EXIT_SUCCESS);
}
else if (strncmp ("-S", argv[arg_num], 2) == 0)
@ -1053,16 +1126,20 @@ linphonec_parse_cmdline(int argc, char **argv)
* Returns:
* 0 if it did nothing
* 1 if it migrated successfully
* -1 on error
* -1 on error
*/
static int
handle_configfile_migration()
{
#if !defined(_WIN32_WCE)
char *old_cfg_gui;
char *old_cfg_cli;
char *old_cfg_cli;
char *new_cfg;
#if !defined(_WIN32_WCE)
const char *home = getenv("HOME");
#else
const char *home = ".";
#endif /*_WIN32_WCE*/
new_cfg = ms_strdup_printf("%s/.linphonerc", home);
/*
@ -1119,9 +1196,10 @@ handle_configfile_migration()
free(old_cfg_gui);
free(new_cfg);
#endif /*_WIN32_WCE*/
return 0;
}
#if !defined(_WIN32_WCE)
/*
* Copy file "from" to file "to".
* Destination file is truncated if existing.
@ -1162,13 +1240,14 @@ copy_file(const char *from, const char *to)
{
return 0;
}
}
}
fclose(in);
fclose(out);
return 1;
}
#endif /*_WIN32_WCE*/
#ifdef HAVE_READLINE
static char **
@ -1332,3 +1411,4 @@ lpc_strip_blanks(char *input)
*
*
****************************************************************************/

View file

@ -46,6 +46,7 @@
#endif
#endif
/**************************************************************************
*
* Compile-time defines
@ -98,7 +99,7 @@ typedef struct {
/***************************************************************************
*
* Forward declarations
* Forward declarations
*
***************************************************************************/

View file

@ -42,9 +42,9 @@ endif
AM_CFLAGS=$(STRICT_OPTIONS) -DIN_LINPHONE \
$(ORTP_CFLAGS) \
$(OSIP_CFLAGS) \
$(EXOSIP_CFLAGS) \
$(ORTP_CFLAGS) \
-DENABLE_TRACE \
-DLOG_DOMAIN=\"LinphoneCore\" \
$(IPV6_CFLAGS) \

View file

@ -116,7 +116,7 @@ int linphone_call_terminated(LinphoneCore *lc, eXosip_event_t *ev)
return 0;
}
}
ms_message("Current call terminated...");
if (lc->ringstream!=NULL) {
ring_stop(lc->ringstream);
@ -143,7 +143,7 @@ int linphone_call_terminated(LinphoneCore *lc, eXosip_event_t *ev)
int linphone_call_released(LinphoneCore *lc, int cid){
LinphoneCall *call=lc->call;
if (call!=NULL && call->cid==cid){
linphone_call_destroy(lc->call);
lc->call=NULL;
lc->vtable.display_status(lc,_("Could not reach destination."));
@ -178,7 +178,7 @@ int linphone_call_failure(LinphoneCore *lc, eXosip_event_t *ev)
reason=osip_message_get_reason_phrase(ev->response);
}else code=-110;
lc->vtable.show(lc);
switch(code)
{
case 401:
@ -211,12 +211,12 @@ int linphone_call_failure(LinphoneCore *lc, eXosip_event_t *ev)
sprintf(umsg,retrymsg,tmpmsg,atoi(retry->hvalue)/60);
lc->vtable.display_message(lc,umsg);
ms_free(umsg);
}*/
}*/
lc->vtable.display_message(lc,tmpmsg);
break;
case 487:
lc->vtable.display_status(lc,msg487);
break;
break;
case 600:
lc->vtable.display_message(lc,msg600);
break;
@ -229,13 +229,13 @@ int linphone_call_failure(LinphoneCore *lc, eXosip_event_t *ev)
case -111:
lc->vtable.display_status(lc,_("Remote host was found but refused connection."));
break;
default:
if (code>0)
{
lc->vtable.display_status(lc,reason);
}
else ms_warning("failure_cb unknown code=%i\n",code);
else ms_warning("failure_cb unknown code=%i\n",code);
}
if (lc->ringstream!=NULL) {
ring_stop(lc->ringstream);
@ -255,7 +255,7 @@ extern sdp_handler_t linphone_sdphandler;
static int linphone_answer_sdp(LinphoneCore *lc, eXosip_event_t *ev, sdp_message_t *sdp){
int status=200;
sdp_context_t *ctx=NULL;
ctx=lc->call->sdpctx;
/* get the result of the negociation */
sdp_context_get_answer(ctx,sdp);
@ -280,8 +280,8 @@ int linphone_inc_new_call(LinphoneCore *lc, eXosip_event_t *ev)
int err;
osip_from_to_str(ev->request->from,&from);
osip_to_to_str(ev->request->to,&to);
osip_to_to_str(ev->request->to,&to);
/* first check if we can answer successfully to this invite */
if (lc->presence_mode!=LINPHONE_STATUS_ONLINE){
ms_message("Not present !! presence mode : %d\n",lc->presence_mode);
@ -322,7 +322,7 @@ int linphone_inc_new_call(LinphoneCore *lc, eXosip_event_t *ev)
goto end;
}
lc->call=linphone_call_new_incoming(lc,from,to,ev);
sdp=eXosip_get_sdp_info(ev->request);
if (sdp==NULL){
ms_message("No sdp body in invite, 200-ack scheme");
@ -352,7 +352,7 @@ int linphone_inc_new_call(LinphoneCore *lc, eXosip_event_t *ev)
lc->vtable.inv_recv(lc,tmp);
ms_free(barmesg);
osip_free(tmp);
osip_free(tmp);
}else{
ms_error("Error during sdp negociation. ");
eXosip_lock();
@ -459,8 +459,8 @@ int linphone_set_audio_offer(sdp_context_t *ctx)
PayloadType *codec;
MSList *elem;
sdp_payload_t payload;
elem=lc->codecs_conf.audio_codecs;
while(elem!=NULL){
codec=(PayloadType*) elem->data;
@ -468,7 +468,7 @@ int linphone_set_audio_offer(sdp_context_t *ctx)
sdp_payload_init(&payload);
payload.a_rtpmap=ortp_strdup_printf("%s/%i/1",codec->mime_type,codec->clock_rate);
payload.pt=rtp_profile_get_payload_number_from_rtpmap(lc->local_profile,payload.a_rtpmap);
payload.localport=call->audio_params.natd_port > 0 ?
payload.localport=call->audio_params.natd_port > 0 ?
call->audio_params.natd_port : lc->rtp_conf.audio_rtp_port;
if (strcasecmp(codec->mime_type,"iLBC")==0){
/* prefer the 30 ms mode */
@ -494,7 +494,7 @@ static int find_payload_type_number(RtpProfile *prof, PayloadType *pt){
PayloadType *it;
for(i=0;i<127;++i){
it=rtp_profile_get_payload(prof,i);
if (it!=NULL && strcasecmp(pt->mime_type,it->mime_type)==0
if (it!=NULL && strcasecmp(pt->mime_type,it->mime_type)==0
&& (pt->clock_rate==it->clock_rate || pt->clock_rate<=0) ){
if ( (pt->recv_fmtp && it->recv_fmtp && strcasecmp(pt->recv_fmtp,it->recv_fmtp)==0) ||
(pt->recv_fmtp==NULL && it->recv_fmtp==NULL) ){
@ -533,7 +533,7 @@ int linphone_set_video_offer(sdp_context_t *ctx)
LinphoneCore *lc=call->core;
PayloadType *codec;
MSList *elem;
bool_t firsttime=TRUE;
bool_t firsttime=TRUE;
if (!linphone_core_video_enabled(lc)) return -1;
@ -544,7 +544,7 @@ int linphone_set_video_offer(sdp_context_t *ctx)
sdp_payload_init(&payload);
payload.line=1;
payload.a_rtpmap=ortp_strdup_printf("%s/%i",codec->mime_type,codec->clock_rate);
payload.localport=call->video_params.natd_port>0 ?
payload.localport=call->video_params.natd_port>0 ?
call->video_params.natd_port : lc->rtp_conf.video_rtp_port;
payload.pt=find_payload_type_number(lc->local_profile,codec);
payload.a_fmtp=codec->recv_fmtp;
@ -576,7 +576,7 @@ SupportLevel linphone_payload_is_supported(LinphoneCore *lc, sdp_payload_t *payl
localpt=payload->pt;
ms_warning("payload has no rtpmap.");
}
if (localpt>=0 && localpt <128 ){
/* this payload is understood, but does the user want to use it ?? */
PayloadType *rtppayload;
@ -610,7 +610,7 @@ SupportLevel linphone_payload_is_supported(LinphoneCore *lc, sdp_payload_t *payl
if (rtppayload->type==PAYLOAD_VIDEO){
dbw=lc->dw_video_bw;
ubw=lc->up_video_bw;
}else{
}else{
dbw=lc->dw_audio_bw;
ubw=lc->up_audio_bw;
}
@ -665,11 +665,11 @@ int linphone_accept_audio_offer(sdp_context_t *ctx,sdp_payload_t *payload)
ms_message("Only one codec has to be accepted.");
return -1;
}
if (supported==SupportedAndValid) {
if (supported==SupportedAndValid) {
if (params->initialized==0){
/* this is the first codec we accept, it is going to be used*/
params->localport=lc->rtp_conf.audio_rtp_port;
payload->localport=params->natd_port>0 ?
payload->localport=params->natd_port>0 ?
params->natd_port : lc->rtp_conf.audio_rtp_port;
params->line=payload->line;
params->pt=payload->pt; /* remember the first payload accepted */
@ -692,7 +692,9 @@ int linphone_accept_audio_offer(sdp_context_t *ctx,sdp_payload_t *payload)
/* refuse all other audio lines*/
if(params->line!=payload->line) {
ms_message("Only one audio line can be accepted.");
#if !defined(_WIN32_WCE)
abort();
#endif /*_WIN32_WCE*/
return -1;
}
}
@ -761,7 +763,7 @@ int linphone_read_audio_answer(sdp_context_t *ctx,sdp_payload_t *payload)
StreamParams *params;
SupportLevel supported;
PayloadType *lpt=NULL;
/* paranoid check: see if this codec is supported in our local rtp profile*/
supported=linphone_payload_is_supported(lc, payload,lc->local_profile,call->profile,FALSE,&lpt);
if (supported==Unsupported) {
@ -801,7 +803,7 @@ int linphone_read_video_answer(sdp_context_t *ctx,sdp_payload_t *payload)
StreamParams *params;
SupportLevel supported;
PayloadType *lpt=NULL;
/* paranoid check: see if this codec is supported in our local rtp profile*/
supported=linphone_payload_is_supported(lc, payload,lc->local_profile,call->profile,FALSE,&lpt);
if (supported==Unsupported) {
@ -834,7 +836,7 @@ int linphone_read_video_answer(sdp_context_t *ctx,sdp_payload_t *payload)
void linphone_call_ringing(LinphoneCore *lc, eXosip_event_t *ev){
sdp_message_t *sdp=eXosip_get_sdp_info(ev->response);
LinphoneCall *call=lc->call;
linphone_call_proceeding(lc,ev);
if (call==NULL) return;
if (sdp==NULL){
@ -909,7 +911,7 @@ static void linphone_process_dtmf_relay(LinphoneCore *lc, eXosip_event_t *ev){
lc->vtable.dtmf_received(lc, tmp[0]);
}
}
eXosip_call_build_answer(ev->tid,200,&ans);
if (ans)
eXosip_call_send_answer(ev->tid,200,ans);
@ -951,7 +953,7 @@ void linphone_registration_faillure(LinphoneCore *lc, eXosip_event_t *ev){
osip_uri_t *requri=osip_message_get_uri(ev->request);
char *ru;
LinphoneProxyConfig *cfg;
if (ev->response){
status_code=osip_message_get_status_code(ev->response);
reason=osip_message_get_reason_phrase(ev->response);
@ -993,7 +995,7 @@ void linphone_registration_success(LinphoneCore *lc,eXosip_event_t *ev){
cfg->registered=TRUE;
linphone_proxy_config_register_again_with_updated_contact(cfg,ev->request,ev->response);
}else cfg->registered=FALSE;
osip_uri_to_str(requri,&ru);
if (cfg->registered) msg=ms_strdup_printf(_("Registration on %s successful."),ru);
else msg=ms_strdup_printf(_("Unregistration on %s done."),ru);
@ -1012,7 +1014,7 @@ static bool_t comes_from_local_if(osip_message_t *msg){
osip_generic_param_t *param=NULL;
osip_via_param_get_byname(via,"received",&param);
if (param==NULL) return TRUE;
if (param->gvalue &&
if (param->gvalue &&
(strcmp(param->gvalue,"127.0.0.1")==0 || strcmp(param->gvalue,"::1")==0)){
return TRUE;
}
@ -1056,10 +1058,10 @@ static void linphone_other_request(LinphoneCore *lc, eXosip_event_t *ev){
osip_message_header_get_byname(ev->request,"Refer-To",0,&h);
eXosip_message_send_answer(ev->tid,200,NULL);
if (h){
if (lc->vtable.refer_received)
if (lc->vtable.refer_received)
lc->vtable.refer_received(lc,h->hvalue);
}
}else ms_warning("Ignored REFER not coming from this local loopback interface.");
}else if (strncmp(ev->request->sip_method, "UPDATE", 6) == 0){
linphone_inc_update(lc,ev);
@ -1102,7 +1104,7 @@ void linphone_core_process_event(LinphoneCore *lc,eXosip_event_t *ev)
break;
case EXOSIP_CALL_INVITE:
ms_message("CALL_NEW\n");
/* CALL_NEW is used twice in qos mode :
/* CALL_NEW is used twice in qos mode :
* when you receive invite (textinfo = "With QoS" or "Without QoS")
* and when you receive update (textinfo = "New Call") */
linphone_inc_new_call(lc,ev);
@ -1131,7 +1133,7 @@ void linphone_core_process_event(LinphoneCore *lc,eXosip_event_t *ev)
linphone_call_message_new(lc,ev);
break;
case EXOSIP_CALL_MESSAGE_REQUESTFAILURE:
if (ev->did<0 && ev->response &&
if (ev->did<0 && ev->response &&
(ev->response->status_code==407 || ev->response->status_code==401)){
eXosip_default_action(ev);
}

View file

@ -163,7 +163,12 @@ void linphone_call_destroy(LinphoneCall *obj)
/*prevent a gcc bug with %c*/
static size_t my_strftime(char *s, size_t max, const char *fmt, const struct tm *tm){
#if !defined(_WIN32_WCE)
return strftime(s, max, fmt, tm);
#else
return 0;
/*FIXME*/
#endif /*_WIN32_WCE*/
}
LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, char *from, char *to){
@ -171,7 +176,10 @@ LinphoneCallLog * linphone_call_log_new(LinphoneCall *call, char *from, char *to
struct tm loctime;
cl->dir=call->dir;
#ifdef WIN32
#if !defined(_WIN32_WCE)
loctime=*localtime(&call->start_time);
/*FIXME*/
#endif /*_WIN32_WCE*/
#else
localtime_r(&call->start_time,&loctime);
#endif
@ -396,7 +404,7 @@ void sound_config_read(LinphoneCore *lc)
tmpbuf=PACKAGE_SOUND_DIR "/" LOCAL_RING;
tmpbuf=lp_config_get_string(lc->config,"sound","local_ring",tmpbuf);
if (access(tmpbuf,F_OK)==-1) {
if (ortp_file_exist(tmpbuf)==-1) {
tmpbuf=PACKAGE_SOUND_DIR "/" LOCAL_RING;
}
if (strstr(tmpbuf,".wav")==NULL){
@ -408,7 +416,7 @@ void sound_config_read(LinphoneCore *lc)
tmpbuf=PACKAGE_SOUND_DIR "/" REMOTE_RING;
tmpbuf=lp_config_get_string(lc->config,"sound","remote_ring",tmpbuf);
if (access(tmpbuf,F_OK)==-1){
if (ortp_file_exist(tmpbuf)==-1){
tmpbuf=PACKAGE_SOUND_DIR "/" REMOTE_RING;
}
if (strstr(tmpbuf,".wav")==NULL){

View file

@ -30,7 +30,9 @@
#include <stdlib.h>
#include <string.h>
#include <assert.h>
#if !defined(_WIN32_WCE)
#include <errno.h>
#endif /*_WIN32_WCE*/
#include <sys/types.h>
#include <sys/stat.h>
@ -76,8 +78,8 @@ void list_node_foreach(ListNode *head, ListNodeForEachFunc func){
#define LIST_PREPEND(e1,e2) ( (e2)->_prev=NULL,(e2)->_next=(e1),(e1)->_prev=(e2),(e2) )
#define LIST_APPEND(head,elem) ((head)==0 ? (elem) : (list_node_append((ListNode*)(head),(ListNode*)(elem)), (head)) )
#define LIST_REMOVE(head,elem)
#define LIST_APPEND(head,elem) ((head)==0 ? (elem) : (list_node_append((ListNode*)(head),(ListNode*)(elem)), (head)) )
#define LIST_REMOVE(head,elem)
/* returns void */
#define LIST_FOREACH(head) list_node_foreach((ListNode*)head)
@ -102,14 +104,14 @@ struct _LpConfig{
LpItem * lp_item_new(const char *key, const char *value){
LpItem *item=lp_new0(LpItem,1);
item->key=strdup(key);
item->value=strdup(value);
item->key=ortp_strdup(key);
item->value=ortp_strdup(value);
return item;
}
LpSection *lp_section_new(const char *name){
LpSection *sec=lp_new0(LpSection,1);
sec->name=strdup(name);
sec->name=ortp_strdup(name);
return sec;
}
@ -151,9 +153,9 @@ static bool_t is_first_char(const char *start, const char *pos){
void lp_config_parse(LpConfig *lpconfig){
char tmp[MAX_LEN];
LpSection *cur=NULL;
if (lpconfig->file==NULL) return;
while(fgets(tmp,MAX_LEN,lpconfig->file)!=NULL){
char *pos1,*pos2;
pos1=strchr(tmp,'[');
@ -180,10 +182,10 @@ void lp_config_parse(LpConfig *lpconfig){
if (pos1!=NULL){
char key[MAX_LEN];
key[0]='\0';
*pos1='\0';
if (sscanf(tmp,"%s",key)>0){
pos1++;
pos2=strchr(pos1,'\n');
if (pos2==NULL) pos2=pos1+strlen(pos1);
@ -211,16 +213,18 @@ void lp_config_parse(LpConfig *lpconfig){
LpConfig * lp_config_new(const char *filename){
LpConfig *lpconfig=lp_new0(LpConfig,1);
if (filename!=NULL){
lpconfig->filename=strdup(filename);
lpconfig->filename=ortp_strdup(filename);
lpconfig->file=fopen(filename,"rw");
if (lpconfig->file!=NULL){
lp_config_parse(lpconfig);
fclose(lpconfig->file);
#if !defined(_WIN32_WCE)
/* make existing configuration files non-group/world-accessible */
if (chmod(filename, S_IRUSR | S_IWUSR) == -1)
ms_warning("unable to correct permissions on "
"configuration file: %s",
strerror(errno));
#endif /*_WIN32_WCE*/
lpconfig->file=NULL;
lpconfig->modified=0;
}
@ -230,7 +234,7 @@ LpConfig * lp_config_new(const char *filename){
void lp_item_set_value(LpItem *item, const char *value){
free(item->value);
item->value=strdup(value);
item->value=ortp_strdup(value);
}

View file

@ -30,7 +30,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <unistd.h>
#include <fcntl.h>
#include <strings.h>
#if !defined(_WIN32_WCE)
#include <errno.h>
#endif /*_WIN32_WCE*/
#undef snprintf
#include <ortp/stun.h>
@ -100,15 +102,17 @@ char *int2str(int number)
void check_sound_device(LinphoneCore *lc)
{
int fd,len;
int fd=0;
int len;
int a;
char *file=NULL;
char *i810_audio=NULL;
char *snd_pcm_oss=NULL;
char *snd_mixer_oss=NULL;
char *snd_pcm=NULL;
#if !defined(_WIN32_WCE)
fd=open("/proc/modules",O_RDONLY);
#endif /*_WIN32_WCE*/
if (fd>0){
/* read the entire /proc/modules file and check if sound conf seems correct */
/*a=fstat(fd,&statbuf);
@ -158,7 +162,9 @@ void check_sound_device(LinphoneCore *lc)
*/
end:
if (file!=NULL) ms_free(file);
#if !defined(_WIN32_WCE)
if (fd>0) close(fd);
#endif /*_WIN32_WCE*/
}
#define UDP_HDR_SZ 8
@ -353,12 +359,10 @@ void linphone_core_setup_local_rtp_profile(LinphoneCore *lc)
PayloadType *payload;
bool_t prepend;
lc->local_profile=rtp_profile_clone_full(&av_profile);
/* first look at the list given by configuration file to see if
it is correct */
audiopt=fix_codec_list(lc->local_profile,lc->codecs_conf.audio_codecs);
videopt=fix_codec_list(lc->local_profile,lc->codecs_conf.video_codecs);
/* now find and add payloads that are not listed in the configuration
codec list */
for (i=0;i<127;i++)
@ -798,7 +802,7 @@ int linphone_core_get_local_ip_for(const char *dest, char *result){
if (err<0) {
ms_error("Error in connect: %s",strerror(errno));
freeaddrinfo(res);
close(sock);
close_socket(sock);
return -1;
}
freeaddrinfo(res);
@ -807,14 +811,14 @@ int linphone_core_get_local_ip_for(const char *dest, char *result){
err=getsockname(sock,(struct sockaddr*)&addr,&s);
if (err!=0) {
ms_error("Error in getsockname: %s",strerror(errno));
close(sock);
close_socket(sock);
return -1;
}
err=getnameinfo((struct sockaddr *)&addr,s,result,LINPHONE_IPADDR_SIZE,NULL,0,NI_NUMERICHOST);
if (err!=0){
ms_error("getnameinfo error: %s",strerror(errno));
}
close(sock);
close_socket(sock);
ms_message("Local interface to reach %s is %s.",dest,result);
return 0;
}

View file

@ -174,7 +174,7 @@ sdp_context_generate_template (sdp_context_t * ctx)
}
static void add_relay_info(sdp_message_t *sdp, int mline, const char *relay, const char *relay_session_id){
if (relay) sdp_message_a_attribute_add(sdp, mline,
osip_strdup ("relay-addr"),osip_strdup(relay));
if (relay_session_id) sdp_message_a_attribute_add(sdp, mline,
@ -191,7 +191,12 @@ sdp_context_add_payload (sdp_context_t * ctx, sdp_payload_t * payload, char *med
{
eXosip_trace (OSIP_ERROR,
("You must not call sdp_context_add_*_payload outside the write_offer callback\n"));
abort ();
#if !defined(_WIN32_WCE)
abort();
#else
exit(-1);
#endif /*_WIN32_WCE*/
}
if (payload->proto == NULL)
payload->proto = "RTP/AVP";
@ -225,7 +230,7 @@ sdp_context_add_payload (sdp_context_t * ctx, sdp_payload_t * payload, char *med
attr_field);
}
if (payload->b_as_bandwidth != 0)
{
{
if (sdp_message_bandwidth_get(offer,payload->line,0)==NULL){
attr_field =
sstrdup_sprintf ("%i", payload->b_as_bandwidth);
@ -326,7 +331,7 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
else eXosip_trace(OSIP_INFO1,("Using firewall address in sdp."));
answer = sdp_context_generate_template (ctx);
/* for each m= line */
for (i = 0; !sdp_message_endof_media (remote, i); i++){
sdp_payload_init(&init_payload);
@ -373,7 +378,7 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
sdp_message_a_attr_value_get_with_pt
(remote, i, payload.pt,
"fmtp");
/* ask the application if this codec is supported */
err = sdph->accept_audio_codecs (ctx,
&payload);
@ -447,7 +452,7 @@ sdp_context_get_answer ( sdp_context_t *ctx,sdp_message_t *remote)
{
/* refuse the line */
refuse_mline(answer,mtype,proto,i);
}
else
m_lines_accepted++;

View file

@ -125,6 +125,7 @@ if test $GCC = yes && test $wall_werror = yes; then
fi
macosx_found=no
mingw32ce_found=no
dnl add thread flags
case $target_os in
@ -138,8 +139,9 @@ case $target_os in
CFLAGS="$CFLAGS -DINET6 -DORTP_INET6 -D_WIN32_WINNT=0x0501 -D_WIN32_WCE -DORTP_STATIC"
CXXFLAGS="$CXXFLAGS -DINET6 -DORTP_INET6 -D_WIN32_WINNT=0x0501 -DORTP_STATIC -D_WIN32_WCE"
dnl ORTP_STATIC to tell ortp not to export its variable with dllexport, as if we were building statically, or dynamically on linux
LIBS="$LIBS -lws2"
LIBS="$LIBS -lws2"
mingw_found=yes
mingw32ce_found=yes
build_tests=no
;;
*mingw*)
@ -480,6 +482,7 @@ MS_CHECK_VIDEO
AM_CONDITIONAL(BUILD_VIDEO, test "$video" = "true")
AM_CONDITIONAL(BUILD_THEORA, test "$have_theora" = "yes")
AM_CONDITIONAL(BUILD_WIN32, test "$mingw_found" = "yes")
AM_CONDITIONAL(BUILD_WIN32_WCE, test "$mingw32ce_found" = "yes")
dnl *********************************************
dnl setup oRTP dependency

View file

@ -30,6 +30,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include "ortp/event.h"
#include <time.h>
#if defined(_WIN32_WCE)
#define time ms_time
time_t ms_time (time_t *t);
#endif /*_WIN32_WCE*/
typedef enum EchoLimiterType{
ELInactive,
ELControlMic,
@ -100,7 +105,7 @@ void audio_stream_set_rtcp_information(AudioStream *st, const char *cname, const
void audio_stream_play_received_dtmfs(AudioStream *st, bool_t yesno);
/* those two function do the same as audio_stream_start() but in two steps
this is useful to make sure that sockets are open before sending an invite;
this is useful to make sure that sockets are open before sending an invite;
or to start to stream only after receiving an ack.*/
AudioStream *audio_stream_new(int locport, bool_t ipv6);
int audio_stream_start_now(AudioStream * stream, RtpProfile * prof, const char *remip, int remport, int rem_rtcp_port, int payload_type, int jitt_comp,MSSndCard *playcard, MSSndCard *captcard, bool_t echo_cancel);

View file

@ -162,7 +162,9 @@ libmediastreamer_la_LIBADD+= -lole32 \
endif
endif
if BUILD_WIN32_WCE
libmediastreamer_la_LIBADD+= -lmmtimer
endif
AM_CFLAGS= -I$(top_srcdir) \
$(ORTP_CFLAGS) \

View file

@ -95,7 +95,7 @@ bool_t ms_is_ipv6(const char *remote){
bool_t ret=FALSE;
#ifdef INET6
struct addrinfo hints, *res0;
int err;
memset(&hints, 0, sizeof(hints));
hints.ai_family = PF_UNSPEC;
@ -105,7 +105,7 @@ bool_t ms_is_ipv6(const char *remote){
ms_warning ("get_local_addr_for: %s", gai_strerror(err));
return FALSE;
}
ret=(res0->ai_addr->sa_family==AF_INET6);
ret=(res0->ai_addr->sa_family==AF_INET6);
freeaddrinfo(res0);
#endif
return ret;
@ -127,7 +127,7 @@ RtpSession * create_duplex_rtpsession( int locport, bool_t ipv6){
#if defined(_WIN32_WCE)
time_t
time (time_t *t)
ms_time (time_t *t)
{
DWORD timemillis = GetTickCount();
if (timemillis>0)
@ -179,7 +179,7 @@ void audio_stream_change_decoder(AudioStream *stream, int payload){
ms_filter_link (stream->rtprecv, 0, stream->decoder, 0);
ms_filter_link (stream->decoder,0 , stream->dtmfgen, 0);
ms_filter_preprocess(stream->decoder,stream->ticker);
}else{
ms_warning("No decoder found for %s",pt->mime_type);
}
@ -208,17 +208,17 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
if (remport>0) rtp_session_set_remote_addr_full(rtps,remip,remport,rem_rtcp_port);
rtp_session_set_payload_type(rtps,payload);
rtp_session_set_jitter_compensation(rtps,jitt_comp);
if (remport>0)
ms_filter_call_method(stream->rtpsend,MS_RTP_SEND_SET_SESSION,rtps);
stream->rtprecv=ms_filter_new(MS_RTP_RECV_ID);
ms_filter_call_method(stream->rtprecv,MS_RTP_RECV_SET_SESSION,rtps);
stream->session=rtps;
stream->dtmfgen=ms_filter_new(MS_DTMF_GEN_ID);
rtp_session_signal_connect(rtps,"telephone-event",(RtpCallback)on_dtmf_received,(unsigned long)stream);
rtp_session_signal_connect(rtps,"payload_type_changed",(RtpCallback)payload_type_changed,(unsigned long)stream);
/* creates the local part */
if (captcard!=NULL) stream->soundread=ms_snd_card_create_reader(captcard);
else {
@ -231,7 +231,7 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
stream->soundwrite=ms_filter_new(MS_FILE_REC_ID);
if (outfile!=NULL) audio_stream_record(stream,outfile);
}
/* creates the couple of encoder/decoder */
pt=rtp_profile_get_payload(profile,payload);
if (pt==NULL){
@ -245,7 +245,7 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
ms_error("mediastream.c: No decoder available for payload %i.",payload);
return -1;
}
if (use_ec) {
stream->ec=ms_filter_new(MS_SPEEX_EC_ID);
ms_filter_call_method(stream->ec,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate);
@ -283,7 +283,7 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
ms_filter_call_method(stream->soundwrite,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate);
tmp=1;
ms_filter_call_method(stream->soundwrite,MS_FILTER_SET_NCHANNELS, &tmp);
/* give the encoder/decoder some parameters*/
ms_filter_call_method(stream->encoder,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate);
ms_message("Payload's bitrate is %i",pt->normal_bitrate);
@ -292,10 +292,10 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
ms_filter_call_method(stream->encoder,MS_FILTER_SET_BITRATE,&pt->normal_bitrate);
}
ms_filter_call_method(stream->decoder,MS_FILTER_SET_SAMPLE_RATE,&pt->clock_rate);
if (pt->send_fmtp!=NULL) ms_filter_call_method(stream->encoder,MS_FILTER_ADD_FMTP, (void*)pt->send_fmtp);
if (pt->recv_fmtp!=NULL) ms_filter_call_method(stream->decoder,MS_FILTER_ADD_FMTP,(void*)pt->recv_fmtp);
/*create the equalizer*/
stream->equalizer=ms_filter_new(MS_EQUALIZER_ID);
tmp=stream->eq_active;
@ -303,7 +303,7 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
/* and then connect all */
/* tip: draw yourself the picture if you don't understand */
/*sending graph*/
ms_connection_helper_start(&h);
ms_connection_helper_link(&h,stream->soundread,-1,0);
@ -328,13 +328,13 @@ int audio_stream_start_full(AudioStream *stream, RtpProfile *profile, const char
if (stream->ec)
ms_connection_helper_link(&h,stream->ec,0,0);
ms_connection_helper_link(&h,stream->soundwrite,0,-1);
/* create ticker */
stream->ticker=ms_ticker_new();
ms_ticker_set_name(stream->ticker,"Audio MSTicker");
ms_ticker_attach(stream->ticker,stream->soundread);
ms_ticker_attach(stream->ticker,stream->rtprecv);
return 0;
}
@ -490,9 +490,9 @@ void audio_stream_stop(AudioStream * stream)
MSConnectionHelper h;
ms_ticker_detach(stream->ticker,stream->soundread);
ms_ticker_detach(stream->ticker,stream->rtprecv);
rtp_stats_display(rtp_session_get_stats(stream->session),"Audio session's RTP statistics");
/*dismantle the outgoing graph*/
ms_connection_helper_start(&h);
ms_connection_helper_unlink(&h,stream->soundread,-1,0);

View file

@ -103,7 +103,7 @@ static void volume_uninit(MSFilter *f){
static int volume_get(MSFilter *f, void *arg){
float *farg=(float*)arg;
Volume *v=(Volume*)f->data;
*farg=10*log10f((v->energy+1)/max_e);
*farg=10*ortp_log10f((v->energy+1)/max_e);
return 0;
}
@ -138,10 +138,10 @@ static inline float compute_gain(float static_gain, float energy, float weight){
}
/*
The principle of this algorithm is that we apply a gain to the input signal which is opposite to the
The principle of this algorithm is that we apply a gain to the input signal which is opposite to the
energy measured by the peer MSVolume.
For example if some noise is played by the speaker, then the signal captured by the microphone will be lowered.
The gain changes smoothly when the peer energy is decreasing, but is immediately changed when the peer energy is
The gain changes smoothly when the peer energy is decreasing, but is immediately changed when the peer energy is
increasing.
*/
@ -340,7 +340,7 @@ static void volume_process(MSFilter *f){
om->b_wptr+=nbytes;
en=update_energy((int16_t*)om->b_rptr,v->nsamples,en);
volume_agc_process(v,om);
if (v->peer){
volume_echo_avoider_process(v,f->ticker->time);
}else v->target_gain=v->static_gain;
@ -355,7 +355,7 @@ static void volume_process(MSFilter *f){
while((m=ms_queue_get(f->inputs[0]))!=NULL){
en=update_energy((int16_t*)m->b_rptr,(m->b_wptr-m->b_rptr)/2,en);
if (v->peer){
volume_echo_avoider_process(v,f->ticker->time);
volume_echo_avoider_process(v,f->ticker->time);
}else v->target_gain=v->static_gain;
if (v->noise_gate_enabled)

View file

@ -147,7 +147,7 @@ typedef HANDLE ortp_thread_t;
#define ortp_thread_create WIN_thread_create
#define ortp_thread_join WIN_thread_join
#define ortp_thread_exit(arg)
#define ortp_thread_exit(arg)
#define ortp_mutex_init WIN_mutex_init
#define ortp_mutex_lock WIN_mutex_lock
#define ortp_mutex_unlock WIN_mutex_unlock
@ -163,12 +163,12 @@ typedef HANDLE ortp_thread_t;
extern "C"
{
#endif
int WIN_mutex_init(ortp_mutex_t *m, void *attr_unused);
int WIN_mutex_lock(ortp_mutex_t *mutex);
int WIN_mutex_unlock(ortp_mutex_t *mutex);
int WIN_mutex_destroy(ortp_mutex_t *mutex);
int WIN_thread_create(ortp_thread_t *t, void *attr_unused, void *(*func)(void*), void *arg);
int WIN_thread_create(ortp_thread_t *t, void *attr_unused, void *(*func)(void*), void *arg);
int WIN_thread_join(ortp_thread_t thread, void **unused);
int WIN_cond_init(ortp_cond_t *cond, void *attr_unused);
int WIN_cond_wait(ortp_cond_t * cond, ortp_mutex_t * mutex);
@ -183,6 +183,28 @@ int WIN_cond_destroy(ortp_cond_t * cond);
#define SOCKET_OPTION_VALUE char *
#define inline __inline
#if defined(_WIN32_WCE)
#define ortp_log10f(x) (float)log10 ((double)x)
#ifdef assert
#undef assert
#endif /*assert*/
#define assert(exp) ((void)0)
#ifdef errno
#undef errno
#endif /*errno*/
#define errno GetLastError()
#ifdef strerror
#undef strerror
#endif /*strerror*/
const char * ortp_strerror(DWORD value);
#define strerror ortp_strerror
#endif /*_WIN32_WCE*/
const char *getWinSocketError(int error);
#define getSocketErrorCode() WSAGetLastError()
#define getSocketError() getWinSocketError(WSAGetLastError())
@ -240,6 +262,8 @@ char *ortp_strndup(const char *str,int n);
char *ortp_strdup_printf(const char *fmt,...);
char *ortp_strdup_vprintf(const char *fmt, va_list ap);
int ortp_file_exist(const char *pathname);
/* portable named pipes */
#if !defined(_WIN32_WCE)
#ifdef WIN32
@ -269,6 +293,7 @@ int ortp_pipe_write(ortp_pipe_t p, const uint8_t *buf, int len);
#ifdef __cplusplus
}
#endif

View file

@ -60,7 +60,7 @@
#include <assert.h>
#include <string.h>
#include "ortp/port.h"
/* /////////////////////////////////////////////////////////////////////////////
* Constants and definitions
*/

View file

@ -100,7 +100,7 @@ char * ortp_strdup(const char *tmp){
*/
int set_non_blocking_socket (ortp_socket_t sock)
{
#if !defined(_WIN32) && !defined(_WIN32_WCE)
return fcntl (sock, F_SETFL, O_NONBLOCK);
@ -124,7 +124,23 @@ int close_socket(ortp_socket_t sock){
#endif
}
#if defined (_WIN32_WCE)
int ortp_file_exist(const char *pathname) {
FILE* fd;
if (pathname==NULL) return -1;
fd=fopen(pathname,"r");
if (fd==NULL) {
return -1;
} else {
fclose(fd);
return 0;
}
}
#else
int ortp_file_exist(const char *pathname) {
return access(pathname,F_OK);
}
#endif /*_WIN32_WCE*/
#if !defined(_WIN32) && !defined(_WIN32_WCE)
/* Use UNIX inet_aton method */
@ -132,10 +148,10 @@ int close_socket(ortp_socket_t sock){
int inet_aton (const char * cp, struct in_addr * addr)
{
unsigned long retval;
retval = inet_addr (cp);
if (retval == INADDR_NONE)
if (retval == INADDR_NONE)
{
return -1;
}
@ -180,7 +196,7 @@ int __ortp_thread_create(pthread_t *thread, pthread_attr_t *attr, void * (*routi
#if defined(_WIN32) || defined(_WIN32_WCE)
int WIN_mutex_init(ortp_mutex_t *mutex, void *attr)
{
{
*mutex=CreateMutex(NULL, FALSE, NULL);
return 0;
}
@ -248,7 +264,7 @@ int WIN_cond_init(ortp_cond_t *cond, void *attr)
int WIN_cond_wait(ortp_cond_t* hCond, ortp_mutex_t * hMutex)
{
//gulp: this is not very atomic ! bug here ?
WIN_mutex_unlock(hMutex);
WIN_mutex_unlock(hMutex);
WaitForSingleObject(*hCond, INFINITE);
WIN_mutex_lock(hMutex);
return 0;
@ -276,6 +292,21 @@ int WIN_cond_destroy(ortp_cond_t * hCond)
#if defined(_WIN32_WCE)
#include <time.h>
const char * ortp_strerror(DWORD value) {
static TCHAR msgBuf[256];
FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
value,
0, // Default language
(LPTSTR) &msgBuf,
0,
NULL
);
return (const char *)msgBuf;
}
int
gettimeofday (struct timeval *tv, void *tz)
{
@ -287,19 +318,19 @@ gettimeofday (struct timeval *tv, void *tz)
#else
int gettimeofday (struct timeval *tv, void* tz)
{
union
{
__int64 ns100; /*time since 1 Jan 1601 in 100ns units */
FILETIME fileTime;
} now;
int gettimeofday (struct timeval *tv, void* tz)
{
union
{
__int64 ns100; /*time since 1 Jan 1601 in 100ns units */
FILETIME fileTime;
} now;
GetSystemTimeAsFileTime (&now.fileTime);
tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);
return (0);
}
GetSystemTimeAsFileTime (&now.fileTime);
tv->tv_usec = (long) ((now.ns100 / 10LL) % 1000000LL);
tv->tv_sec = (long) ((now.ns100 - 116444736000000000LL) / 10000000LL);
return (0);
}
#endif
@ -405,6 +436,7 @@ int ortp_client_pipe_close(ortp_socket_t sock){
return close(sock);
}
#elif defined(WIN32) && !defined(_WIN32_WCE)
static char *make_pipe_name(const char *name){
@ -462,15 +494,15 @@ int ortp_server_pipe_close(ortp_pipe_t spipe){
ortp_pipe_t ortp_client_pipe_connect(const char *name){
char *pipename=make_pipe_name(name);
ortp_pipe_t hpipe = CreateFile(
pipename, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
ortp_pipe_t hpipe = CreateFile(
pipename, // pipe name
GENERIC_READ | // read and write access
GENERIC_WRITE,
0, // no sharing
NULL, // default security attributes
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL); // no template file
OPEN_EXISTING, // opens existing pipe
0, // default attributes
NULL); // no template file
ortp_free(pipename);
return hpipe;
}
@ -496,4 +528,5 @@ int ortp_client_pipe_close(ortp_pipe_t sock){
return CloseHandle(sock);
}
#endif