PJSip 1.6を iPhone3.2SDKでビルド

macのターミナルを起動しsvnでソースをゲット

cd ~
svn checkout http://svn.pjsip.org/repos/pjproject/trunk pjproject
cd pjproject

aconfigure.acを編集

vi aconfigure.ac
以下のような内容に+が追加-が削除の行。arm-apple-darwin*)が目印。
ac_pjmedia_snd=iphoneを追加する。(PJSip1.5であればarm-apple-darwin*)から存在していない。)
case $target in
  arm-apple-darwin*)
        LIBS=”$LIBS -framework CoreAudio -framework CoreFoundation -framework AudioToolbox”
+        ac_pjmedia_snd=iphone
        AC_MSG_RESULT([Checking sound device backend... AudioQueue])
        ;;
  *darwin*)
        LIBS="$LIBS -framework CoreAudio -framework CoreServices -framework AudioUnit -framework AudioToolbox"

build/rules.makを編集

vi build/rules.mak
$(RANLIB)ではなくlibtoolが正解
$(LIB): $(OBJDIRS) $(OBJS) $($(APP)_EXTRA_DEP)
if test ! -d $(LIBDIR); then $(subst @@,$(subst /,$(HOST_PSEP),$(LIBDIR)),$(HOST_MKDIR); fi
-$(AR) $(LIB) $(OBJS)
-$(RANLIB) $(LIB)
+libtool -static -o $(LIB) $(OBJS)

pjlib/include/pj/config_site.hを作成

vi pjlib/include/pj/config_site.h
#undef PJ_HAS_FLOATING_POINT
#define PJ_HAS_FLOATING_POINT 1

/* SRTP has not been ported to iPhone yet */
#undef PJMEDIA_HAS_SRTP
#define PJMEDIA_HAS_SRTP 0

/* Disable some codecs for now */
#define PJMEDIA_HAS_GSM_CODEC 1
#define PJMEDIA_HAS_L16_CODEC 0
#define PJMEDIA_HAS_ILBC_CODEC 0
#define PJMEDIA_HAS_SPEEX_CODEC 0
#define PJMEDIA_HAS_G722_CODEC 0

#define PJMEDIA_AUDIO_DEV_HAS_PORTAUDIO 0

pjmedia/build/os-auto.mak.inを編集

vi pjmedia/build/os-auto.mak.in
#   - ds:               Win32 DirectSound (dsound.c)
+#   - iphone:           iPhone AudioQueue (iphonesound.c)
#   - null:             Null sound device (nullsound.c)
さらに下の
export CFLAGS += -DPJMEDIA_AUDIO_DEV_HAS_WMME=0
endif

+#
+# iPod/iPhone
+#
+ifeq ($(AC_PJMEDIA_SND),iphone)
+export CFLAGS += -DPJMEDIA_AUDIO_LEG_HAS_AUDIOQUEUE=1 -DPJMEDIA_AUDIO_DEV_HAS_LEGACY_DEVICE=1
+endif
+
#
# Null sound device
を変更

Makefileを編集

vi Makefile
pj-sip-appsを削除
-DIRS = pjlib pjlib-util pjnath third_party pjmedia pjsip pjsip-apps
+DIRS = pjlib pjlib-util pjnath third_party pjmedia pjsip

pjmedia/build/Makefileを編集

vi pjmedia/build/Makefile
sound_legacy.oをiphonesound.oに変えるだけです
export PJMEDIA_OBJS += $(OS_OBJS) $(M_OBJS) $(CC_OBJS) $(HOST_OBJS) \
                        alaw_ulaw.o alaw_ulaw_table.o bidirectional.o clock_thread.o codec.o \
                        conference.o conf_switch.o delaybuf.o echo_common.o \
                        echo_port.o echo_suppress.o endpoint.o errno.o \
                        g711.o jbuf.o master_port.o mem_capture.o mem_player.o \
                        null_port.o plc_common.o port.o splitcomb.o \
                        resample_resample.o resample_libsamplerate.o \
                        resample_port.o rtcp.o rtcp_xr.o rtp.o \
                        sdp.o sdp_cmp.o sdp_neg.o session.o silencedet.o \
-                       sound_legacy.o sound_port.o stereo_port.o \
+                       iphonesound.o sound_port.o stereo_port.o \
                        stream.o tonegen.o transport_adapter_sample.o \
                        transport_ice.o transport_loop.o \
                        transport_srtp.o transport_udp.o \
                        wav_player.o wav_playlist.o wav_writer.o wave.o \
                        wsola.o
さらに下の
# $(TARGET) is defined in os-$(OS_NAME).mak file in current directory.
#
-TARGETS := pjmedia pjmedia-audiodev pjmedia-codec pjsdp pjmedia-test
+TARGETS := pjmedia pjmedia-audiodev pjmedia-codec pjsdp

all: $(TARGETS)

pjmedia/src/pjmedia-audiodev/legacy_dev.cを編集

vi pjmedia/src/pjmedia-audiodev/legacy_dev.c
        return status;
     }
 
   *p_aud_strm = &strm->base;
+  (*p_aud_strm)->op = &stream_op;
     return PJ_SUCCESS;
 }

pjmedia/src/pjmedia-audiodev/audiodev.cを編集

vi pjmedia/src/pjmedia-audiodev/audiodev.c
MAX_DRIVERS のdefineが目印
+#if PJMEDIA_AUDIO_DEV_HAS_LEGACY_DEVICE
+pjmedia_aud_dev_factory* pjmedia_legacy_factory(pj_pool_factory *pf);
+#endif
+
#define MAX_DRIVERS    16
#define MAX_DEVS       64
さらに下の「Initialize each factory and build the device ID list」が目印
+#if PJMEDIA_AUDIO_DEV_HAS_LEGACY_DEVICE
+    aud_subsys.drv[aud_subsys.drv_cnt++].create = &pjmedia_legacy_factory;
+#endif
 
     /* Initialize each factory and build the device ID list */
     for (i=0; i<aud_subsys.drv_cnt; ++i) {

iphonesound.cをDL

Download from http://siphon.googlecode.com/files/iphonesound-20091226.c そして pjmedia/src/pjmedia/iphonesound.c に移動&リネーム

環境変数の設定

export DEV=/Developer/Platforms/iPhoneOS.platform/Developer
export SDK=${DEV}/SDKs/iPhoneOS3.2.sdk
export PATH=${DEV}/usr/bin:${PATH}
export CFLAGS="-O2 -arch armv6 -isysroot ${SDK}"
export LDFLAGS="-O2 -arch armv6 -isysroot ${SDK}"
export CPP="${DEV}/usr/bin/cpp"

コンパイルのためのシンボリックリンクを作成

cd ${DEV}/usr/bin
ln -s arm-apple-darwin9-gcc-4.0.1 arm-apple-darwin9-gcc
ln -s arm-apple-darwin9-g++-4.0.1 arm-apple-darwin9-g++
ln -s ranlib arm-apple-darwin9-ranlib
cd ~/pjproject

設定ファイル生成

autoconf aconfigure.ac > aconfigure

コンパイル開始

数分待ちましょう
./aconfigure --host=arm-apple-darwin9 --disable-speex-aec \
--disable-speex-codec --disable-l16-codec --disable-g722-codec \
--disable-ilbc-codec --disable-ssl

make dep && make clean && make


以上、お疲れ様でした!( - )

本家をみても上手くビルド出来なかったので http://www.piemontewireless.net/PJSip155_and_iPhoneSDK312#How_compile_PJSip_1.x_.28svn_trunk_or_1.5.5.29_with_iPhone_SDK_3.1.2 を参考にさせてもらいました
最終更新:2010年06月10日 21:50
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。