Added misc flags and modify Makefiles to allow exclusion of PortAudio and specific codec during compilation

git-svn-id: https://svn.pjsip.org/repos/pjproject/trunk@320 74dad513-b988-da41-8d7b-12977e46ad98
diff --git a/pjlib/include/pj/log.h b/pjlib/include/pj/log.h
index 2c706f9..eeb9000 100644
--- a/pjlib/include/pj/log.h
+++ b/pjlib/include/pj/log.h
@@ -228,6 +228,21 @@
  */
 #  define pj_log_set_decor(decor)
 
+/**
+ * Get current maximum log verbositylevel.
+ *
+ * @return	    Current log maximum level.
+ */
+#  define pj_log_get_level()	0
+
+/**
+ * Get current log decoration flag.
+ *
+ * @return	    Log decoration flag.
+ */
+#  define pj_log_get_decor()	0
+
+
 #endif	/* #if PJ_LOG_MAX_LEVEL >= 1 */
 
 /** 
diff --git a/pjmedia/build/Makefile b/pjmedia/build/Makefile
index 06308c1..5bf38b1 100644
--- a/pjmedia/build/Makefile
+++ b/pjmedia/build/Makefile
@@ -1,3 +1,19 @@
+
+# Before we include local os-mak, set default sound framework to use
+# PortAudio.
+export SOUND_OBJS = $(PORTAUDIO_OBJS)
+
+# Also set default codec files to be included
+# If these codecs are to be excluded, then the appropriate PJMEDIA_HAS_XXX_CODEC macros 
+# MUST be set too in pj/config_site.h, to inform applications about the codec 
+# availability.
+#
+# E.g., to exclude Speex, we need to exclude SPEEX_OBJS from CODEC_OBJS, AND specify
+#       "#define PJMEDIA_HAS_SPEEX_CODEC 0" in pj/config_site.h.
+#
+export CODEC_OBJS = $(GSM_OBJS) $(SPEEX_OBJS)
+
+
 include ../../build/common.mak
 
 RULES_MAK := ../../build/rules.mak
@@ -9,6 +25,26 @@
 export PJMEDIA_CODEC_LIB:=../lib/libpjmedia-codec-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)$(LIBEXT)
 
 ###############################################################################
+# Sound frameworks
+# These are activated by setting SOUND_OBJS var, e.g.:
+#  export SOUND_OBJS = $(PORTAUDIO_OBJS), or
+#  export SOUND_OBJS = $(NULLSOUND_OBJS)
+#
+PA_DIR:=portaudio
+PORTAUDIO_OBJS := pasound.o \
+		  $(PA_DIR)/pa_allocation.o \
+		  $(PA_DIR)/pa_converters.o \
+		  $(PA_DIR)/pa_cpuload.o \
+		  $(PA_DIR)/pa_dither.o \
+		  $(PA_DIR)/pa_front.o \
+		  $(PA_DIR)/pa_process.o \
+		  $(PA_DIR)/pa_skeleton.o \
+		  $(PA_DIR)/pa_stream.o \
+		  $(PA_DIR)/pa_trace.o
+
+NULLSOUND_OBJS := nullsound.o
+
+###############################################################################
 # Gather all flags.
 #
 export _CFLAGS 	:= $(CC_CFLAGS) $(OS_CFLAGS) $(HOST_CFLAGS) $(M_CFLAGS) \
@@ -26,22 +62,12 @@
 ###############################################################################
 # Defines for building PJMEDIA library
 #
-PA_DIR:=portaudio
 export PJMEDIA_SRCDIR = ../src/pjmedia
 export PJMEDIA_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
 			codec.o conference.o endpoint.o errno.o file_port.o \
-			g711.o jbuf.o pasound.o port.o resample.o rtcp.o \
+			g711.o jbuf.o null_port.o pasound.o port.o resample.o rtcp.o \
 			rtp.o sdp.o sdp_cmp.o sdp_neg.o session.o silencedet.o \
-			stream.o \
-		      	$(PA_DIR)/pa_allocation.o \
-			$(PA_DIR)/pa_converters.o \
-			$(PA_DIR)/pa_cpuload.o \
-			$(PA_DIR)/pa_dither.o \
-			$(PA_DIR)/pa_front.o \
-			$(PA_DIR)/pa_process.o \
-			$(PA_DIR)/pa_skeleton.o \
-			$(PA_DIR)/pa_stream.o \
-			$(PA_DIR)/pa_trace.o
+			stream.o $(SOUND_OBJS)
 
 export PJMEDIA_CFLAGS += $(_CFLAGS)
 
@@ -49,7 +75,8 @@
 ###############################################################################
 # Defines for building PJMEDIA-Codec library
 #
-GSM_OBJS := 	gsm/add.o gsm/code.o gsm/decode.o \
+GSM_OBJS := 	gsm.o \
+		gsm/add.o gsm/code.o gsm/decode.o \
 		gsm/gsm_create.o gsm/gsm_decode.o gsm/gsm_destroy.o \
 		gsm/gsm_encode.o gsm/gsm_explode.o gsm/gsm_implode.o \
 		gsm/gsm_option.o gsm/long_term.o \
@@ -57,7 +84,8 @@
 		gsm/table.o
 GSM_CFLAGS :=
 
-SPEEX_OBJS :=	speex/bits.o speex/cb_search.o speex/exc_10_16_table.o  \
+SPEEX_OBJS :=	speex_codec.o \
+		speex/bits.o speex/cb_search.o speex/exc_10_16_table.o  \
 		speex/exc_10_32_table.o speex/exc_20_32_table.o speex/exc_5_256_table.o \
 		speex/exc_5_64_table.o speex/exc_8_128_table.o speex/filters.o \
 		speex/gain_table.o speex/gain_table_lbr.o speex/hexc_10_32_table.o \
@@ -71,8 +99,7 @@
 
 export PJMEDIA_CODEC_SRCDIR = ../src/pjmedia-codec
 export PJMEDIA_CODEC_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
-			gsm.o speex_codec.o pjmedia-codec-lib.o \
-			$(GSM_OBJS) $(SPEEX_OBJS)
+			$(CODEC_OBJS)
 export PJMEDIA_CODEC_CFLAGS += $(_CFLAGS) $(GSM_CFLAGS) $(SPEEX_CFLAGS)
 
 
@@ -134,7 +161,9 @@
 	$(MAKE) -f $(RULES_MAK) APP=PJMEDIA_TEST app=pjmedia-test $@
 	$(MAKE) -f $(RULES_MAK) APP=PJMEDIA_CODEC app=pjmedia-codec $@
 	@if test "$@" == "depend"; then \
-	  echo '$(PJMEDIA_TEST_EXE): $(PJMEDIA_LIB)' >> .pjmedia-test-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
+	  echo '$(PJMEDIA_LIB): .pjmedia-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend' >> .pjmedia-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
+	  echo '$(PJMEDIA_CODEC_LIB): .pjmedia-codec-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend' >> .pjmedia-codec-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
+	  echo '$(PJMEDIA_TEST_EXE): $(PJMEDIA_LIB) $(PJMEDIA_CODEC_LIB)' >> .pjmedia-test-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
 	fi
 
 
diff --git a/pjmedia/build/os-win32.mak b/pjmedia/build/os-win32.mak
index 1832cd6..ffd043b 100644
--- a/pjmedia/build/os-win32.mak
+++ b/pjmedia/build/os-win32.mak
@@ -11,3 +11,14 @@
 		       $(PA_DIR)/pa_win_wmme.o
 
 export OS_CFLAGS += -DPA_NO_ASIO -DPA_NO_DS
+
+# Example:
+#  to activate Null sound, uncomment this line below.
+#export SOUND_OBJS = $(NULLSOUND_OBJS)
+
+# Example:
+#  to include only GSM and exclude Speex codec, uncomment the "export" line below.
+#  Note that you'll need to put "#define PJMEDIA_HAS_SPEEX_CODEC 0" in
+#  <pj/config_site.h>
+#export CODEC_OBJS = $(GSM_OBJS)
+
diff --git a/pjmedia/build/pjmedia.dsp b/pjmedia/build/pjmedia.dsp
index dfd675c..a4bbbbb 100644
--- a/pjmedia/build/pjmedia.dsp
+++ b/pjmedia/build/pjmedia.dsp
@@ -41,7 +41,7 @@
 # PROP Intermediate_Dir ".\output\pjmedia-i386-win32-vc6-release"

 # PROP Target_Dir ""

 # ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c

-# ADD CPP /nologo /MD /W4 /GX /O2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../src/pjmedia/portaudio" /D "NDEBUG" /D "PA_NO_ASIO" /D "WIN32" /D "_MBCS" /D "_LIB" /D PJ_WIN32=1 /D PJ_M_I386=1 /FD /c

+# ADD CPP /nologo /MD /W4 /GX /O2 /I "../include" /I "../../pjlib/include" /I "../../pjlib-util/include" /I "../src/pjmedia/portaudio" /D "NDEBUG" /D "PA_NO_ASIO" /D "WIN32" /D "_MBCS" /D "_LIB" /D PJ_WIN32=1 /D PJ_M_I386=1 /FR /FD /c

 # SUBTRACT CPP /YX

 # ADD BASE RSC /l 0x409 /d "NDEBUG"

 # ADD RSC /l 0x409 /d "NDEBUG"

@@ -125,7 +125,6 @@
 # Begin Source File

 

 SOURCE=..\src\pjmedia\nullsound.c

-# PROP Exclude_From_Build 1

 # End Source File

 # Begin Source File

 

diff --git a/pjmedia/build/pjmedia_codec.dsp b/pjmedia/build/pjmedia_codec.dsp
index df1737d..7c2e1ed 100644
--- a/pjmedia/build/pjmedia_codec.dsp
+++ b/pjmedia/build/pjmedia_codec.dsp
@@ -91,10 +91,6 @@
 # End Source File
 # Begin Source File
 
-SOURCE="..\src\pjmedia-codec\pjmedia-codec-lib.c"
-# End Source File
-# Begin Source File
-
 SOURCE="..\src\pjmedia-codec\speex_codec.c"
 # End Source File
 # End Group
diff --git a/pjmedia/include/pjmedia-codec.h b/pjmedia/include/pjmedia-codec.h
index c37fc5c..8b97583 100644
--- a/pjmedia/include/pjmedia-codec.h
+++ b/pjmedia/include/pjmedia-codec.h
@@ -16,40 +16,12 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  */
-#ifndef __PJMEDIA_CODEC1_H__
-#define __PJMEDIA_CODEC1_H__
+#ifndef __PJMEDIA_CODEC_PJMEDIA_CODEC_H__
+#define __PJMEDIA_CODEC_PJMEDIA_CODEC_H__
 
 #include <pjmedia-codec/gsm.h>
 #include <pjmedia-codec/speex.h>
 
 
-PJ_BEGIN_DECL
-
-
-/**
- * Initialize pjmedia-codec library, and register all codec factories
- * in this library. If application wants to controll the order of
- * the codec, it MUST NOT call this function, but instead register
- * each codec individually.
- *
- * @param endpt	    The pjmedia endpoint.
- *
- * @return	    PJ_SUCCESS on success.
- */
-PJ_DECL(pj_status_t) pjmedia_codec_init(pjmedia_endpt *endpt);
-
-
-/**
- * Deinitialize pjmedia-codec library, and unregister all codec factories
- * in this library.
- *
- * @return	    PJ_SUCCESS on success.
- */
-PJ_DECL(pj_status_t) pjmedia_codec_deinit(void);
-
-
-PJ_END_DECL
-
-
-#endif	/* __PJMEDIA_CODEC_H__ */
+#endif	/* __PJMEDIA_CODEC_PJMEDIA_CODEC_H__ */
 
diff --git a/pjmedia/include/pjmedia-codec/config.h b/pjmedia/include/pjmedia-codec/config.h
index 9b93c5a..a9cdbfa 100644
--- a/pjmedia/include/pjmedia-codec/config.h
+++ b/pjmedia/include/pjmedia-codec/config.h
@@ -22,19 +22,19 @@
 #include <pjmedia/types.h>
 
 
-/*
- * Include GSM codec?
+/**
+ * Unless specified otherwise, GSM codec is included by default.
  */
-#ifndef PJMEDIA_CODEC_HAS_GSM
-#   define PJMEDIA_CODEC_HAS_GSM    1
+#ifndef PJMEDIA_HAS_GSM_CODEC
+#   define PJMEDIA_HAS_GSM_CODEC    1
 #endif
 
 
-/*
- * Include Speex codec?
+/**
+ * Unless specified otherwise, Speex codec is included by default.
  */
-#ifndef PJMEDIA_CODEC_HAS_SPEEX
-#   define PJMEDIA_CODEC_HAS_SPEEX    1
+#ifndef PJMEDIA_HAS_SPEEX_CODEC
+#   define PJMEDIA_HAS_SPEEX_CODEC    1
 #endif
 
 
diff --git a/pjmedia/include/pjmedia-codec/types.h b/pjmedia/include/pjmedia-codec/types.h
index ce5c258..af84754 100644
--- a/pjmedia/include/pjmedia-codec/types.h
+++ b/pjmedia/include/pjmedia-codec/types.h
@@ -19,7 +19,7 @@
 #ifndef __PJMEDIA_CODEC_TYPES_H__
 #define __PJMEDIA_CODEC_TYPES_H__
 
-#include <pjmedia/types.h>
+#include <pjmedia-codec/config.h>
 
 
 #endif	/* __PJMEDIA_CODEC_TYPES_H__ */
diff --git a/pjmedia/include/pjmedia/config.h b/pjmedia/include/pjmedia/config.h
index 236d011..66f42d5 100644
--- a/pjmedia/include/pjmedia/config.h
+++ b/pjmedia/include/pjmedia/config.h
@@ -16,8 +16,35 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
  */
-#ifndef __PJMED_CONFIG_H__
-#define __PJMED_CONFIG_H__
+#ifndef __PJMEDIA_CONFIG_H__
+#define __PJMEDIA_CONFIG_H__
+
+#include <pj/config.h>
+
+/**
+ * Unless specified otherwise, PortAudio is enabled by default.
+ */
+#ifndef PJMEDIA_HAS_PORTAUDIO_SOUND
+#   define PJMEDIA_HAS_PORTAUDIO_SOUND	    1
+#endif
 
 
-#endif	/* __PJMED_CONFIG_H__ */
+/**
+ * Unless specified otherwise, Null sound is disabled.
+ * This option is mutually exclusive with PortAudio sound, or otherwise
+ * duplicate symbols error will occur.
+ */
+#ifndef PJMEDIA_HAS_NULL_SOUND
+#   define PJMEDIA_HAS_NULL_SOUND	    0
+#endif
+
+
+/**
+ * Unless specified otherwise, G711 codec is included by default.
+ */
+#ifndef PJMEDIA_HAS_G711_CODEC
+#   define PJMEDIA_HAS_G711_CODEC	    1
+#endif
+
+
+#endif	/* __PJMEDIA_CONFIG_H__ */
diff --git a/pjmedia/include/pjmedia/sound.h b/pjmedia/include/pjmedia/sound.h
index ec7564f..5719c0f 100644
--- a/pjmedia/include/pjmedia/sound.h
+++ b/pjmedia/include/pjmedia/sound.h
@@ -24,7 +24,7 @@
  * @file sound.h
  * @brief Sound player and recorder device framework.
  */
-
+#include <pjmedia/types.h>
 #include <pj/pool.h>
 
 PJ_BEGIN_DECL
diff --git a/pjmedia/include/pjmedia/types.h b/pjmedia/include/pjmedia/types.h
index b0bda7e..ac3af4e 100644
--- a/pjmedia/include/pjmedia/types.h
+++ b/pjmedia/include/pjmedia/types.h
@@ -19,10 +19,9 @@
 #ifndef __PJMEDIA_TYPES_H__
 #define __PJMEDIA_TYPES_H__
 
-#include <pj/types.h>
+#include <pjmedia/config.h>
 #include <pj/sock.h>
 
-
 /** 
  * Top most media type. 
  */
diff --git a/pjmedia/src/pjmedia-codec/gsm.c b/pjmedia/src/pjmedia-codec/gsm.c
index 46c49f0..55d207a 100644
--- a/pjmedia/src/pjmedia-codec/gsm.c
+++ b/pjmedia/src/pjmedia-codec/gsm.c
@@ -27,6 +27,12 @@
 #include <pj/os.h>
 #include "gsm/gsm.h"
 
+/*
+ * Only build this file if PJMEDIA_HAS_GSM_CODEC != 0
+ */
+#if defined(PJMEDIA_HAS_GSM_CODEC) && PJMEDIA_HAS_GSM_CODEC != 0
+
+
 /* Prototypes for GSM factory */
 static pj_status_t gsm_test_alloc( pjmedia_codec_factory *factory, 
 				   const pjmedia_codec_info *id );
@@ -473,3 +479,7 @@
 
     return PJ_SUCCESS;
 }
+
+
+#endif	/* PJMEDIA_HAS_GSM_CODEC */
+
diff --git a/pjmedia/src/pjmedia-codec/pjmedia-codec-lib.c b/pjmedia/src/pjmedia-codec/pjmedia-codec-lib.c
deleted file mode 100644
index 8a20103..0000000
--- a/pjmedia/src/pjmedia-codec/pjmedia-codec-lib.c
+++ /dev/null
@@ -1,86 +0,0 @@
-/* $Id$ */
-/* 
- * Copyright (C)2003-2006 Benny Prijono <benny@prijono.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 
- */
-#include <pjmedia-codec.h>
-
-/* Include factories: */
-#include <pjmedia-codec/config.h>
-#include <pjmedia-codec/gsm.h>
-#include <pjmedia-codec/speex.h>
-
-
-static pjmedia_endpt *the_endpt;
-static struct codec_list
-{
-    pj_status_t (*init)(pjmedia_endpt*);
-    pj_status_t (*deinit)(void);
-} codec_list[] = 
-{
-
-#if PJMEDIA_CODEC_HAS_GSM
-    { &pjmedia_codec_gsm_init, &pjmedia_codec_gsm_deinit},
-#endif
-
-#if PJMEDIA_CODEC_HAS_SPEEX
-    { &pjmedia_codec_speex_init_default, &pjmedia_codec_speex_deinit},
-#endif
-
-    { NULL, NULL }
-};
-
-/*
- * Initialize pjmedia-codec library, and register all codec factories
- * in this library.
- */
-PJ_DEF(pj_status_t) pjmedia_codec_init(pjmedia_endpt *endpt)
-{
-    pj_status_t status;
-    unsigned i;
-
-    the_endpt = endpt;
-
-    for (i=0; codec_list[i].init; ++i) {
-	status = (*codec_list[i].init)(the_endpt);
-	if (status != PJ_SUCCESS)
-	    return status;
-    }
-    return PJ_SUCCESS;
-}
-
-
-/*
- * Deinitialize pjmedia-codec library, and unregister all codec factories
- * in this library.
- */
-PJ_DEF(pj_status_t) pjmedia_codec_deinit(void)
-{
-    pj_status_t status;
-    unsigned i;
-
-    for (i=0; codec_list[i].init; ++i) {
-	status = (*codec_list[i].deinit)();
-	if (status != PJ_SUCCESS)
-	    return status;
-    }
-
-    return PJ_SUCCESS;
-}
-
-
-
-
diff --git a/pjmedia/src/pjmedia-codec/speex_codec.c b/pjmedia/src/pjmedia-codec/speex_codec.c
index e8b9d0a..840737e 100644
--- a/pjmedia/src/pjmedia-codec/speex_codec.c
+++ b/pjmedia/src/pjmedia-codec/speex_codec.c
@@ -29,6 +29,12 @@
 #include <pj/string.h>
 #include <pj/os.h>
 
+/*
+ * Only build this file if PJMEDIA_HAS_SPEEX_CODEC != 0
+ */
+#if defined(PJMEDIA_HAS_SPEEX_CODEC) && PJMEDIA_HAS_SPEEX_CODEC!=0
+
+
 #define THIS_FILE   "speex_codec.c"
 
 #define DEFAULT_QUALITY	    4
@@ -777,3 +783,6 @@
 
     return PJ_SUCCESS;
 }
+
+
+#endif	/* PJMEDIA_HAS_SPEEX_CODEC */
diff --git a/pjmedia/src/pjmedia/g711.c b/pjmedia/src/pjmedia/g711.c
index ad8bb7e..d921bdd 100644
--- a/pjmedia/src/pjmedia/g711.c
+++ b/pjmedia/src/pjmedia/g711.c
@@ -27,6 +27,8 @@
 #include <pj/string.h>
 #include <pj/assert.h>
 
+#if defined(PJMEDIA_HAS_G711_CODEC) && PJMEDIA_HAS_G711_CODEC!=0
+
 
 #define G711_BPS	64000
 #define G711_CODEC_CNT	0	/* number of codec to preallocate in memory */
@@ -472,6 +474,9 @@
 }
 
 
+#endif	/* PJMEDIA_HAS_G711_CODEC */
+
+
 /*
  * This source code is a product of Sun Microsystems, Inc. and is provided
  * for unrestricted use.  Users may copy or modify this source code without
@@ -764,3 +769,4 @@
 
 
 
+
diff --git a/pjmedia/src/pjmedia/nullsound.c b/pjmedia/src/pjmedia/nullsound.c
index fcda578..ff4e92e 100644
--- a/pjmedia/src/pjmedia/nullsound.c
+++ b/pjmedia/src/pjmedia/nullsound.c
@@ -19,6 +19,8 @@
 #include <pjmedia/sound.h>
 #include <pj/assert.h>
 
+#if defined(PJMEDIA_HAS_NULL_SOUND) && PJMEDIA_HAS_NULL_SOUND!=0
+
 static pj_snd_dev_info null_info = 
 {
     "Null Device",
@@ -45,28 +47,48 @@
     return &null_info;
 }
 
-PJ_DEF(pj_snd_stream*) pj_snd_open_recorder( int index,
-					     const pj_snd_stream_info *param,
-					     pj_snd_rec_cb rec_cb,
-					     void *user_data)
+PJ_DEF(pj_status_t) pj_snd_open_recorder( int index,
+					  unsigned clock_rate,
+					  unsigned channel_count,
+					  unsigned samples_per_frame,
+					  unsigned bits_per_sample,
+					  pj_snd_rec_cb rec_cb,
+					  void *user_data,
+					  pj_snd_stream **p_snd_strm)
 {
     PJ_UNUSED_ARG(index);
-    PJ_UNUSED_ARG(param);
+    PJ_UNUSED_ARG(clock_rate);
+    PJ_UNUSED_ARG(channel_count);
+    PJ_UNUSED_ARG(samples_per_frame);
+    PJ_UNUSED_ARG(bits_per_sample);
     PJ_UNUSED_ARG(rec_cb);
     PJ_UNUSED_ARG(user_data);
-    return (void*)1;
+
+    *p_snd_strm = (void*)1;
+
+    return PJ_SUCCESS;
 }
 
-PJ_DEF(pj_snd_stream*) pj_snd_open_player( int index,
-					   const pj_snd_stream_info *param,
-					   pj_snd_play_cb play_cb,
-					   void *user_data)
+PJ_DEF(pj_status_t) pj_snd_open_player( int index,
+					unsigned clock_rate,
+					unsigned channel_count,
+					unsigned samples_per_frame,
+					unsigned bits_per_sample,
+					pj_snd_play_cb play_cb,
+					void *user_data,
+					pj_snd_stream **p_snd_strm )
 {
     PJ_UNUSED_ARG(index);
-    PJ_UNUSED_ARG(param);
+    PJ_UNUSED_ARG(clock_rate);
+    PJ_UNUSED_ARG(channel_count);
+    PJ_UNUSED_ARG(samples_per_frame);
+    PJ_UNUSED_ARG(bits_per_sample);
     PJ_UNUSED_ARG(play_cb);
     PJ_UNUSED_ARG(user_data);
-    return (void*)1;
+
+    *p_snd_strm = (void*)1;
+
+    return PJ_SUCCESS;
 }
 
 PJ_DEF(pj_status_t) pj_snd_stream_start(pj_snd_stream *stream)
@@ -91,3 +113,6 @@
 {
     return PJ_SUCCESS;
 }
+
+
+#endif	/* PJMEDIA_HAS_NULL_SOUND */
diff --git a/pjmedia/src/pjmedia/pasound.c b/pjmedia/src/pjmedia/pasound.c
index 176f98e..76b8d1b 100644
--- a/pjmedia/src/pjmedia/pasound.c
+++ b/pjmedia/src/pjmedia/pasound.c
@@ -23,6 +23,8 @@
 #include <pj/string.h>
 #include <portaudio.h>
 
+#if defined(PJMEDIA_HAS_PORTAUDIO_SOUND) && PJMEDIA_HAS_PORTAUDIO_SOUND!=0
+
 #define THIS_FILE	"pasound.c"
 
 static struct snd_mgr
@@ -434,3 +436,5 @@
     return Pa_Terminate();
 }
 
+
+#endif	/* PJMEDIA_HAS_PORTAUDIO_SOUND */
diff --git a/pjsip-apps/build/Makefile b/pjsip-apps/build/Makefile
index 826cad0..44a41d9 100644
--- a/pjsip-apps/build/Makefile
+++ b/pjsip-apps/build/Makefile
@@ -44,12 +44,24 @@
 
 
 
+###############################################################################
+# Defines for building PJSIP-PERF
+#
+export PJSIPPERF_SRCDIR = ../src/pjsip-perf
+export PJSIPPERF_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
+			 handler_call.o handler_options.o main.o
+export PJSIPPERF_CFLAGS += $(_CFLAGS)
+export PJSIPPERF_LDFLAGS += $(_LDFLAGS)
+export PJSIPPERF_EXE:=../bin/pjsip-perf-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME)$(HOST_EXE)
+
+
+
 export CC_OUT CC AR RANLIB HOST_MV HOST_RM HOST_RMDIR HOST_MKDIR OBJEXT LD LDOUT 
 ###############################################################################
 # Main entry
 #
 #
-TARGETS := pjsua
+TARGETS := pjsua pjsip-perf
 
 .PHONY: $(TARGETS)
 
@@ -66,14 +78,20 @@
 pjsua:
 	$(MAKE) -f $(RULES_MAK) APP=PJSUA app=pjsua $(PJSUA_EXE)
 
+pjsip-perf:
+	$(MAKE) -f $(RULES_MAK) APP=PJSIPPERF app=pjsip-perf $(PJSUA_EXE)
+
+
 .PHONY: ../lib/pjsua.ko
 ../lib/pjsua.ko:
 	$(MAKE) -f $(RULES_MAK) APP=PJSUA app=pjsua $@
 
 clean depend realclean:
 	$(MAKE) -f $(RULES_MAK) APP=PJSUA app=pjsua $@
+	$(MAKE) -f $(RULES_MAK) APP=PJSIPPERF app=pjsip-perf $@
 	@if test "$@" == "depend"; then \
-	  echo '$(PJSUA_EXE): $(PJSIP_LIB) $(PJSIP_UA_LIB) $(PJSIP_SIMPLE) $(PJSUA_LIB_LIB) $(PJLIB_LIB) $(PJLIB_UTIL_LIB) $(PJMEDIA_LIB) $(PJMEDIA_CODEC_LIB)' >> .pjsua-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
+	  echo '$(PJSUA_EXE): $(PJSIP_LIB) $(PJSIP_UA_LIB) $(PJSIP_SIMPLE) $(PJSUA_LIB_LIB) $(PJLIB_LIB) $(PJLIB_UTIL_LIB) $(PJMEDIA_LIB) $(PJMEDIA_CODEC_LIB) Makefile' >> .pjsua-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
+	  echo '$(PJSIPPERF_EXE): $(PJSIP_LIB) $(PJSIP_UA_LIB) $(PJSIP_SIMPLE) $(PJSUA_LIB_LIB) $(PJLIB_LIB) $(PJLIB_UTIL_LIB) $(PJMEDIA_LIB) $(PJMEDIA_CODEC_LIB)' >> .pjsip-perf-$(MACHINE_NAME)-$(OS_NAME)-$(CC_NAME).depend; \
 	fi
 
 
diff --git a/pjsip-apps/build/pjsip_apps.dsw b/pjsip-apps/build/pjsip_apps.dsw
index 8b95ede..2164507 100644
--- a/pjsip-apps/build/pjsip_apps.dsw
+++ b/pjsip-apps/build/pjsip_apps.dsw
@@ -78,12 +78,6 @@
     Project_Dep_Name pjlib_util
     End Project Dependency
     Begin Project Dependency
-    Project_Dep_Name pjmedia
-    End Project Dependency
-    Begin Project Dependency
-    Project_Dep_Name pjmedia_codec
-    End Project Dependency
-    Begin Project Dependency
     Project_Dep_Name pjsip_core
     End Project Dependency
     Begin Project Dependency
@@ -95,6 +89,9 @@
     Begin Project Dependency
     Project_Dep_Name pjsua_lib
     End Project Dependency
+    Begin Project Dependency
+    Project_Dep_Name pjmedia
+    End Project Dependency
 }}}
 
 ###############################################################################
diff --git a/pjsip-apps/build/pjsip_perf.dsp b/pjsip-apps/build/pjsip_perf.dsp
index 1d4c4c2..c640206 100644
--- a/pjsip-apps/build/pjsip_perf.dsp
+++ b/pjsip-apps/build/pjsip_perf.dsp
@@ -50,7 +50,7 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386
-# ADD LINK32 ole32.lib user32.lib netapi32.lib mswsock.lib ws2_32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\bin\pjsip-perf-i386-win32-vc6d.exe"
+# ADD LINK32 ole32.lib user32.lib netapi32.lib mswsock.lib ws2_32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386 /out:"..\bin\pjsip-perf-i386-win32-vc6.exe"
 
 !ELSEIF  "$(CFG)" == "pjsip_perf - Win32 Debug"
 
diff --git a/pjsip-apps/build/pjsua.dsp b/pjsip-apps/build/pjsua.dsp
index 8e80b35..2d92582 100644
--- a/pjsip-apps/build/pjsua.dsp
+++ b/pjsip-apps/build/pjsua.dsp
@@ -51,7 +51,7 @@
 # ADD BSC32 /nologo

 LINK32=link.exe

 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /machine:I386

-# ADD LINK32 ole32.lib user32.lib dsound.lib dxguid.lib netapi32.lib mswsock.lib ws2_32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /map /machine:I386 /out:"../bin/pjsua_vc6.exe" /fixed:no

+# ADD LINK32 ole32.lib user32.lib dsound.lib dxguid.lib netapi32.lib mswsock.lib ws2_32.lib kernel32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:console /map:"..\bin\pjsua_vc6.map" /machine:I386 /out:"../bin/pjsua_vc6.exe" /fixed:no

 # SUBTRACT LINK32 /pdb:none /debug

 

 !ELSEIF  "$(CFG)" == "pjsua - Win32 Debug"

diff --git a/pjsip/src/pjsua-lib/pjsua_core.c b/pjsip/src/pjsua-lib/pjsua_core.c
index c8188fc..dd71f13 100644
--- a/pjsip/src/pjsua-lib/pjsua_core.c
+++ b/pjsip/src/pjsua-lib/pjsua_core.c
@@ -617,6 +617,7 @@
     /* If user doesn't specify any codecs, register all of them. */
     if (pjsua.codec_cnt == 0) {
 
+#if PJMEDIA_HAS_SPEEX_CODEC
 	unsigned option = PJMEDIA_SPEEX_NO_WB | PJMEDIA_SPEEX_NO_UWB;
 
 	/* Register speex. */
@@ -636,7 +637,9 @@
 	pjsua.codec_arg[pjsua.codec_cnt] = pj_str("speex");
 	pjsua.codec_deinit[pjsua.codec_cnt] = &pjmedia_codec_speex_deinit;
 	pjsua.codec_cnt++;
+#endif /* PJMEDIA_HAS_SPEEX_CODEC */
 
+#if PJMEDIA_HAS_GSM_CODEC
 	/* Register GSM */
 	status = pjmedia_codec_gsm_init(pjsua.med_endpt);
 	if (status != PJ_SUCCESS) {
@@ -648,7 +651,9 @@
 	pjsua.codec_arg[pjsua.codec_cnt] = pj_str("gsm");
 	pjsua.codec_deinit[pjsua.codec_cnt] = &pjmedia_codec_gsm_deinit;
 	pjsua.codec_cnt++;
+#endif /* PJMEDIA_HAS_GSM_CODEC */
 
+#if PJMEDIA_HAS_G711_CODEC
 	/* Register PCMA and PCMU */
 	status = pjmedia_codec_g711_init(pjsua.med_endpt);
 	if (status != PJ_SUCCESS) {
@@ -663,6 +668,7 @@
 	pjsua.codec_arg[pjsua.codec_cnt] = pj_str("pcma");
 	pjsua.codec_deinit[pjsua.codec_cnt] = &pjmedia_codec_g711_deinit;
 	pjsua.codec_cnt++;
+#endif	/* PJMEDIA_HAS_G711_CODEC */
 
     } else {
 
@@ -673,8 +679,12 @@
 
 	for (i=0; i<pjsua.codec_cnt; ++i) {
 	
+	    if (0) {
+		/* Dummy */
+	    }
+#if PJMEDIA_HAS_SPEEX_CODEC
 	    /* Is it speex? */
-	    if (!pj_stricmp2(&pjsua.codec_arg[i], "speex")) {
+	    else if (!pj_stricmp2(&pjsua.codec_arg[i], "speex")) {
 
 		unsigned option = PJMEDIA_SPEEX_NO_WB | PJMEDIA_SPEEX_NO_UWB;
 
@@ -694,6 +704,9 @@
 
 		pjsua.codec_deinit[i] = &pjmedia_codec_speex_deinit;
 	    }
+#endif	/* PJMEDIA_HAS_SPEEX_CODEC */
+
+#if PJMEDIA_HAS_GSM_CODEC
 	    /* Is it gsm? */
 	    else if (!pj_stricmp2(&pjsua.codec_arg[i], "gsm")) {
 
@@ -707,6 +720,9 @@
 		pjsua.codec_deinit[i] = &pjmedia_codec_gsm_deinit;
 
 	    }
+#endif	/* PJMEDIA_HAS_GSM_CODEC */
+
+#if PJMEDIA_HAS_G711_CODEC
 	    /* Is it pcma/pcmu? */
 	    else if (!pj_stricmp2(&pjsua.codec_arg[i], "pcmu") ||
 		     !pj_stricmp2(&pjsua.codec_arg[i], "pcma"))
@@ -722,6 +738,8 @@
 		pjsua.codec_deinit[i] = &pjmedia_codec_g711_deinit;
 
 	    }
+#endif	/* PJMEDIA_HAS_G711_CODEC */
+
 	    /* Don't know about this codec... */
 	    else {
 
@@ -1058,10 +1076,12 @@
 	pjmedia_conf_destroy(pjsua.mconf);
 
     /* Destroy file port */
-    pjmedia_port_destroy(pjsua.file_port);
+    if (pjsua.file_port)
+	pjmedia_port_destroy(pjsua.file_port);
 
     /* Destroy null port. */
-    pjmedia_port_destroy(pjsua.null_port);
+    if (pjsua.null_port)
+	pjmedia_port_destroy(pjsua.null_port);
 
 
     /* Destroy sound framework: