ç§ã®ãããžã§ã¯ãã¯2ã€ã®éšåã«åããããšãã§ããŸãã1ã€ç®ã¯é»è©±ã§ãããã§ããã ãå°ãªããªãœãŒã¹ã«åããããšæããŸãã2ã€ç®ã¯ãé»è©±ãåããŠéä¿¡ã§ããæå°éã®ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã®éçºã§ãã
STM32F769Iã«æèŒãããé»è©±-çºèŠ
Emboxã¯ãçµã¿èŸŒã¿ã·ã¹ãã çšã«æ§æå¯èœãªOSã§ããç¹åŸŽçãªæ©èœã¯ããªãœãŒã¹ãéãããŠããã·ã¹ãã ã§ãœãŒã¹ã³ãŒãã倿Žããã«LinuxãœãããŠã§ã¢ã䜿çšã§ããããšã§ãã
æã人æ°ã®ããVOIPé»è©±ãããžã§ã¯ãã®1ã€ã¯ PJSIPã§ããç®çã«äœ¿çšããŸãã
Linuxã§ã®PJSIPã®æ§ç¯
ãŸããäž»èŠéšåã§ãããªãŒãã³ãœãŒã¹ã®SIPã¹ã¿ãã¯ã§ããPJSIPãããŠã³ããŒãããã«ããå®è¡ããå¿ èŠããããŸãã ææ°ããŒãžã§ã³ãããŠã³ããŒãããŸããçŸæç¹ã§ã¯ãããã¯ããŒãžã§ã³2.10ã§ãã
次ã«ããããžã§ã¯ãããã«ãããå¿ èŠããããŸãããã¹ãOSã§è¡ãã®ã¯ç°¡åã§ããç§ã®å Žåãããã¯Linuxã§ãã
$ ./configure --prefix=~/pj_build
ããã§ã¯ããã¬ãã£ãã¯ã¹ãã³ã³ãã€ã«ãããã©ã€ãã©ãªãšããããŒãã¡ã€ã«ãã€ã³ã¹ããŒã«ããããã¹ä»¥å€ã®ãªãã·ã§ã³ãæå®ããŸããã§ãããããã¯ããã€ã¯ãã³ã³ãããŒã©ãŒã«å«ãŸããå¯èœæ§ã®ãããã®ãåæããããã«å¿ èŠã§ãã
次ã«å®è¡ããŸã
$ make dep $ make
Linuxã§ã®PJSIPã®å®è¡
ãã¹ãŠãæ£åžžã«å®äºããããPJSIPãšãã¢ã¢ããªã±ãŒã·ã§ã³ãã³ã³ãã€ã«ããŸããã
ã·ã³ãã«ã§ãããªããæ©èœçãªãã®ããå§ããŸããããäž¡æ¹åã®åŒã³åºããå¿ èŠã§ããpjsip-apps/ src / samples /simple_pjsua.cãååŸããŸããããã¯ãèªåé話å¿çæ©èœãåããã·ã³ãã«ãªã¢ããªã±ãŒã·ã§ã³ã§ããSIPã¢ã«ãŠã³ããæå®ããããã«ãéžæããäŸsimple_pjsua.cãç·šéããŠã¿ãŸããããæ¬¡ã®è¡ãããã«é¢äžããŠããŸãã
#define SIP_DOMAIN "example.com"
#define SIP_USER "alice"
#define SIP_PASSWD "secret"
åæ§ç¯ããŠå®è¡ããŸãã
$ ./pjsip-apps/bin/samples/x86_64-unknown-linux-gnu/simple_pjsua
åæ§ã®äœãã衚瀺ãããã¯ãã§ãïŒ
15:21:22.181 pjsua_acc.c ....SIP outbound status for acc 0 is not active 15:21:22.181 pjsua_acc.c ....sip:bob@sip.linphone.org: registration success, status=200 (Registration successful), will re-register in 300 seconds 15:21:22.181 pjsua_acc.c ....Keep-alive timer started for acc 0, destination:91.121.209.194:5060, interval:15s
ããã§ãçä¿¡ãåä¿¡ã§ããŸãã
Emboxã§ã®PJSIPã®æ§ç¯
åãããšãEmboxã«ãŸãšããŸãããããŸããã¡ã¢ãªéãæ°ã«ããªãããã«ãQemuãšãã¥ã¬ãŒã¿ãŒçšã®ã¢ã»ã³ããªãäœæããŸãã
Emboxã«ã¯ãå€éšãããžã§ã¯ããæ¥ç¶ããããã®ã¡ã«ããºã ããããŸãããããžã§ã¯ããããŠã³ããŒãããããã®ãªã³ã¯ãèšå®ããå¿ èŠã«å¿ããŠããããé©çšããæ§æããã«ããã€ã³ã¹ããŒã«ã®3ã€ã®æ®µéã®ã«ãŒã«ãèšå®ã§ããŸãã
ãã®ã¡ã«ããºã ã䜿çšããã«ã¯ãã¢ãããŒã·ã§ã³ã@Buildãã§ãscript = $ïŒEXTERNAL_MAKEïŒãã䜿çšããå¿ èŠãããããšã瀺ãã ãã§ååã§ãã
@Build(stage=2,script="$(EXTERNAL_MAKE) PJSIP_ENABLE_CXX=false") @BuildArtifactPath(cppflags="-I$(abspath $(EXTERNAL_BUILD_DIR))/third_party/pjproject/core/install/include/") module core_c extends core { depends pjsip_dependencies }
ããã¯ãã¢ã»ã³ããªãEmboxã«ç§»æ€ããããã«äœ¿çšãããMakefileã§ãã
PKG_NAME := pjproject
PKG_VER := 2.10
PKG_SOURCES := https://github.com/pjsip/pjproject/archive/$(PKG_VER).tar.gz
PKG_MD5 := 13e5c418008ae46c4ce0c1e27cdfe9b5
include $(EXTBLD_LIB)
PKG_PATCHES := pjproject-$(PKG_VER).patch \
sha256_error_fix-$(PKG_VER).patch \
addr_resolv_sock-$(PKG_VER).patch
âŠ
DISABLE_FEATURES := \
l16-codec \
ilbc-codec \
speex-codec \
speex-aec \
gsm-codec \
g722-codec \
g7221-codec \
libyuv \
libwebrtc
$(CONFIGURE) :
export EMBOX_GCC_LINK=full; \
cd $(BUILD_ROOT) && ( \
./configure \
CC=$(EMBOX_GCC) \
CXX=$(EMBOX_GXX) \
--host=$(AUTOCONF_TARGET_TRIPLET) \
--target=$(AUTOCONF_TARGET_TRIPLET) \
--prefix=$(PJSIP_INSTALL_DIR) \
$(DISABLE_FEATURES:%=--disable-%) \
--with-external-pa; \
)
touch $@
$(BUILD) :
cd $(BUILD_ROOT) && ( \
$(MAKE) dep; \
$(MAKE) MAKEFLAGS='$(EMBOX_IMPORTED_MAKEFLAGS)'; \
)
touch $@
$(INSTALL) :
...
ã芧ã®ãšããããããã¯Linuxã®å Žåãšåãconfigureãmake depãmakeã§ãããã¡ãããæ§æãããšãã¯ãã¿ãŒã²ãããã©ãããã©ãŒã ã«ã¯ãã¹ã³ã³ãã€ã«ïŒ--hostã-targetãCCãCXXïŒã䜿çšããå¿ èŠãããããšã瀺ããŠããŸãã
ããã«ãå¥ã®éãã«æ°ä»ãããšãã§ããŸãã --with-external-paãæå®ããŸããã€ãŸãããªãŒãã£ãªã«ã¯Emboxã®ãã©ã€ããŒã䜿çšããå¿ èŠããããšèšããŸãã Emboxã®ãªãŒãã£ãªãã©ã€ããŒã¯portaudioã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããŸããããã¯Linuxã§ãå©çšã§ããŸãã
ã芧ã®ãšãããlibyuvã©ã€ãã©ãªãšlibwebrtcã©ã€ãã©ãªã®æ§ç¯ãç¡å¹ã«ããŸããããŸããPCMA / PCMUãé€ããã¹ãŠã®äžèŠãªãªãŒãã£ãªã³ãŒããã¯ãäºåã«ç¡å¹ã«ããŸãã Linuxã§ã®æ§æã®æ£ç¢ºãã確èªããŸãã
$ ./configure \
--prefix=$PREFIX \
--disable-l16-codec \
--disable-ilbc-codec \
--disable-speex-codec \
--disable-speex-aec \
--disable-gsm-codec \
--disable-g722-codec \
--disable-g7221-codec \
--disable-libyuv \
--disable-libwebrtc
$ make dep && make
simple_pjsuaã¢ããªã±ãŒã·ã§ã³ãç°¡åã«æäœã§ããããã«ãã³ãŒããEmboxã«ç§»åããŸãããã倿ŽãããSIPã¢ã«ãŠã³ããã©ã¡ãŒã¿ãŒã®èšå®ãC-shnyã³ãŒããããã¡ã€ã« 'simple_pjsua_sip_account.inc'ã«è»¢éããã ãã§ãæ§æãã¡ã€ã«ã«é 眮ããŸããã€ãŸããå¥ã®ã¢ã«ãŠã³ãã§ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããã«ã¯ããã®ãã¡ã€ã«ã倿Žããã ãã§æžã¿ãŸããå 容ã¯åããŸãŸã§ãïŒ
#define SIP_DOMAIN <sip_domain>
#define SIP_USER <sip_user>
#define SIP_PASSWD <sip_passwd>
Linuxã§ä»¥åãšåãããã«simple_pjsuaã¢ããªã±ãŒã·ã§ã³ãå®è¡ããŸãããããæ©èœããå ŽåãPJSIPã¯æ£ããæ§æãããŠããŸãããããã®æ§æãªãã·ã§ã³ã¯ãEmboxã®Makefileã«ç°¡åã«ç§»æ€ã§ããŸãã
ã¹ãã€ã©ãŒã®äžã®æçµçãªMakefile
PKG_NAME := pjproject
PKG_VER := 2.10
PKG_SOURCES := https://github.com/pjsip/pjproject/archive/$(PKG_VER).tar.gz
PKG_MD5 := 13e5c418008ae46c4ce0c1e27cdfe9b5
include $(EXTBLD_LIB)
PKG_PATCHES := pjproject-$(PKG_VER).patch \
sha256_error_fix-$(PKG_VER).patch \
addr_resolv_sock-$(PKG_VER).patch
ifeq ($(PJSIP_ENABLE_CXX),false)
PKG_PATCHES += pjsua2_disable-$(PKG_VER).patch
endif
DISABLE_FEATURES := \
l16-codec \
ilbc-codec \
speex-codec \
speex-aec \
gsm-codec \
g722-codec \
g7221-codec \
libyuv \
libwebrtc \
#g711-codec
BUILD_ROOT := $(BUILD_DIR)/$(PKG_NAME)-$(PKG_VER)
PJSIP_INSTALL_DIR := $(EXTERNAL_BUILD_DIR)/third_party/pjproject/core/install
$(CONFIGURE) :
export EMBOX_GCC_LINK=full; \
cd $(BUILD_ROOT) && ( \
./configure \
CC=$(EMBOX_GCC) \
CXX=$(EMBOX_GXX) \
--host=$(AUTOCONF_TARGET_TRIPLET) \
--target=$(AUTOCONF_TARGET_TRIPLET) \
--prefix=$(PJSIP_INSTALL_DIR) \
$(DISABLE_FEATURES:%=--disable-%) \
--with-external-pa; \
)
cp ./config_site.h $(BUILD_ROOT)/pjlib/include/pj/config_site.h
touch $@
$(BUILD) :
cd $(BUILD_ROOT) && ( \
$(MAKE) -j1 dep; \
$(MAKE) -j1 MAKEFLAGS='$(EMBOX_IMPORTED_MAKEFLAGS)'; \
)
touch $@
$(INSTALL) :
cd $(BUILD_ROOT) && $(MAKE) install
# Remove AUTOCONF_TARGET_TRIPLET from file names to use them in Mybuild
for f in $(PJSIP_INSTALL_DIR)/lib/*-$(AUTOCONF_TARGET_TRIPLET).a; do \
fn=$$(basename $$f); \
cp $$f $(PJSIP_INSTALL_DIR)/lib/$${fn%-$(AUTOCONF_TARGET_TRIPLET).a}.a; \
done
# Copy binaries and
# remove AUTOCONF_TARGET_TRIPLET from file names to use them in Mybuild
for f in $(BUILD_ROOT)/pjsip-apps/bin/samples/$(AUTOCONF_TARGET_TRIPLET)/*; do \
cp $$f $(PJSIP_INSTALL_DIR)/$$(basename $$f).o; \
done
for f in $(BUILD_ROOT)/pjsip-apps/bin/*-$(AUTOCONF_TARGET_TRIPLET); do \
fn=$$(basename $$f); \
cp $$f $(PJSIP_INSTALL_DIR)/$${fn%-$(AUTOCONF_TARGET_TRIPLET)}.o; \
done
touch $@
ã¹ãã€ã©ãŒã®äžã®æçµçãªMybuild
package third_party.pjproject module pjsip_dependencies { depends embox.net.lib.getifaddrs depends embox.compat.posix.pthreads depends embox.compat.posix.pthread_key depends embox.compat.posix.pthread_rwlock depends embox.compat.posix.semaphore depends embox.compat.posix.fs.fsop depends embox.compat.posix.idx.select depends embox.compat.posix.net.getaddrinfo depends embox.compat.posix.net.gethostbyname depends embox.compat.posix.util.gethostname depends embox.compat.posix.proc.pid depends embox.compat.posix.proc.exit depends embox.compat.libc.stdio.fseek depends embox.compat.posix.time.time depends embox.kernel.thread.thread_local_heap depends embox.driver.audio.portaudio_api } @DefaultImpl(core_c) abstract module core { } @Build(stage=2,script="$(EXTERNAL_MAKE) PJSIP_ENABLE_CXX=false") @BuildArtifactPath(cppflags="-I$(abspath $(EXTERNAL_BUILD_DIR))/third_party/pjproject/core/install/include/") module core_c extends core { depends pjsip_dependencies } /* Currently not used. It will be used for PJSUA2 if required. */ @Build(stage=2,script="$(EXTERNAL_MAKE) PJSIP_ENABLE_CXX=true") @BuildArtifactPath(cppflags="-I$(abspath $(EXTERNAL_BUILD_DIR))/third_party/pjproject/core/install/include/") @BuildDepends(third_party.STLport.libstlportg) module core_cxx extends core { depends pjsip_dependencies depends third_party.STLport.libstlportg } @BuildDepends(core) @Build(stage=2,script="true") static module libpjsip { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libpjsip.a", "libpjsip-simple.a", "libpjsip-ua.a" @NoRuntime depends core } @BuildDepends(core) @Build(stage=2,script="true") static module libpjsua { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libpjsua.a" @NoRuntime depends core } @BuildDepends(core) @Build(stage=2,script="true") static module libpjlib_util { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libpjlib-util.a" @NoRuntime depends core } @BuildDepends(core) @Build(stage=2,script="true") static module libpj { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libpj.a" @NoRuntime depends core } @BuildDepends(core) @Build(stage=2,script="true") static module libpjmedia { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libpjmedia.a", "libpjmedia-codec.a", "libpjmedia-audiodev.a" @NoRuntime depends core } @BuildDepends(core) @Build(stage=2,script="true") static module libpjnath { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libpjnath.a" @NoRuntime depends core } @BuildDepends(core) @Build(stage=2,script="true") static module libpj_third_party { @AddPrefix("^BUILD/extbld/third_party/pjproject/core/install/lib") source "libresample.a", "libsrtp.a" @NoRuntime depends core } @BuildDepends(libpjsua) @BuildDepends(libpjsip) @BuildDepends(libpjmedia) @BuildDepends(libpj) @BuildDepends(libpjlib_util) @BuildDepends(libpjnath) @BuildDepends(libpj_third_party) @Build(stage=2,script="true") static module libpj_all { @NoRuntime depends libpjsua, libpjsip, libpjmedia, libpj, libpjlib_util, libpjnath, libpj_third_party } @AutoCmd @Cmd(name="streamutil", help="", man="") @BuildDepends(core) @Build(stage=2,script="true") module streamutil { source "^BUILD/extbld/third_party/pjproject/core/install/streamutil.o" depends core } @AutoCmd @Cmd(name="pjsua", help="", man="") @BuildDepends(core) @Build(stage=2,script="true") module pjsua { source "^BUILD/extbld/third_party/pjproject/core/install/pjsua.o" } @AutoCmd @Cmd(name="pjsip_simpleua", help="", man="") @BuildDepends(core) @Build(stage=2,script="true") module simpleua { source "^BUILD/extbld/third_party/pjproject/core/install/simpleua.o" depends core }
ããã§ãEmboxã§çä¿¡ãåä¿¡ã§ããŸãã
STM32F769Iã§ã®PJSIPã®èµ·å-ãã£ã¹ã«ããªãŒ
Emboxã®æ§æãQEMUã®PJSIPããç¹å®ã®ããŒãã®æ§æïŒSTM32F769I-DiscoveryïŒã«å€æŽããå¿ èŠããããŸããEmboxãæ§æããã«ã¯ãããã€ãã®ã³ã³ããŒãã³ããå¿ èŠã§ãã
- ã³ã³ãã€ã«ãã©ã°ãã¡ã€ã«ïŒbuild.confïŒã
- 䜿çšå¯èœãªã¡ã¢ãªãšããããã®ã¡ã¢ãªã«æçµçãªã€ã¡ãŒãžïŒlds.confïŒãã©ã®ããã«é 眮ãããããèšè¿°ãããªã³ã«ãŒãã¡ã€ã«ã
- Emboxã¢ãžã¥ãŒã«æ§æãã¡ã€ã«ïŒmods.confïŒã
- PJSIPæ§æã
éåžžãæåã®2ã€ã®ãã€ã³ãã¯ç°¡åã«çè§£ã§ããŸãããããã¯ã³ã³ãã€ã©ãšãªã³ã«ã®ãªãã·ã§ã³ã§ãããåãããŒãã®ãããžã§ã¯ãéã§å€æŽãããããšã¯ãã£ãã«ãããŸãããããããã³ã³ãã€ã«ãã©ã°ãé€ããŠãæçµã·ã¹ãã ã®ç¹æ§ãèšå®ããããã®äž»ãªäœæ¥ã¯ã3çªç®ãš4çªç®ã®æ®µèœã§è¡ãããŸãã
ãŸããEmboxã®æ§æãèŠãŠã¿ãŸãããã Linuxã§å®è¡ããå Žåãšã®éãã¯äœã§ããïŒ Linuxã§ã¯ãã»ãŒç¡éã®éã®ã¡ã¢ãªããããã¿ã¹ã¯ã®æ°ãå²ãåœãŠãããã¡ã¢ãªã®éãªã©ã¯æ°ã«ããŸããã§ãããããã§ãå€éšã¡ã¢ãªãé€ããŠã2MBã®ROMãš512MBã®RAMãããããŸããããããã£ãŠãç¹å®ã®ããŒãºã«å¿ èŠãªãªãœãŒã¹ã®æ°ãèšå®ããå¿ èŠããããŸãã
ããšãã°ãPJSIPã¯ç¬èªã®ã¹ã¬ããã§å®è¡ãããŸããæ°ããæ¥ç¶ããšã«ãå¥ã®ã¹ããªãŒã ããããŸãããããŠããªãŒãã£ãªãæäœããããã®ãã1ã€ã®ã¹ã¬ããããããã£ãŠã1ã€ã®æ¥ç¶ã§ããå°ãªããšã3ã€ã®ã¹ã¬ãããå¿ èŠã§ããæ¬¡ã«ãDHCPã远å ããŸãããã1ã€ã®ã¹ããªãŒã ãéžæããŸããåèšã§ããã§ã«4ã€ã§ããããã¯ãã¹ãŠèªç¶ã«æ§æã«è»¢éãããŸãã
include embox.kernel.thread.core(thread_pool_size=5,thread_stack_size=12000)
ã¹ã¿ãã¯ãåºå®ãµã€ãºã«èšå®ããŸãããããªãã¯ããŸããŸãªããšãå°ããããšãã§ããŸããããã¯ãã¹ãŠã¿ã¹ã¯ã«äŸåããŸãã
次ã«ãå¿ èŠãªããã±ãŒãžã®æ°ãéžæããŸãã
include embox.net.skbuff(amount_skb=28) include embox.net.skbuff_data(amount_skb_data=28)
ããŒããµã€ãºãèšå®ããŸãïŒmallocïŒïŒãæ©èœããå ŽæïŒïŒ
include embox.mem.heap_bm include embox.mem.static_heap(heap_size=0x3C000)
ãã以å€ã®å Žåãæ§æã¯QEMUãšåããŸãŸã§ãã
ããŒããµã€ãºã調ã¹ã
æ§æãäœæãããšãã«çºçããäž»ãªè³ªåã¯ãå¿ èŠãªãã©ã¡ãŒã¿ãŒãã©ã®ããã«éžæãããã§ããããšãã°ãããŒãã0x3C000ããããã¯ãŒã¯ãã±ããã®æ°ã28ãã¹ã¿ãã¯ã12Kbã§ããã®ã¯ãªãã§ããïŒç§ã¯ããæ¬¡ã®ãããªã¢ãããŒããåããŸããæåã®ã¹ãããã¯ãã¹ã¿ãã¯ãšããŒããåŠçããããšã§ããValgrindã䜿çšããŠLinuxã§éå§ããããã«ãããŸããŸãªããšã調ã¹ãããšãã§ããŸããããã«ã¯ãValgrind-Massifãããã¡ã€ã©ãŒã䜿çšã§ããŸããç¹å®ã®æç¹ã§ã®ãã¹ãããã·ã§ãããã§æ©èœããã©ã®é¢æ°ãã©ã®ãããã®ã¡ã¢ãªãèŠæ±ãããã瀺ããŸãã
ã¢ããªã±ãŒã·ã§ã³ã§valgrindãèµ·åããŸãã
$ valgrind --tool=massif --time-unit=B --massif-out-file=pjsip.massif ./pjsip-apps/bin/samples/x86_64-unknown-linux-gnu/simple_pjsua
ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããåŸãmassif-visualizerã䜿çšããŠããŒã¿ãèŠèŠåããŸãã
$ massif-visualizer pjsip.massif
ããã§ã¯ãã¡ã¢ãªãPJSIPã ãã§ãªããæšæºã©ã€ãã©ãªãlibasoundïŒããã¯ãã¹ããµãŠã³ã-ALSAïŒã«ãè²»ããããŠããããšãããããŸãã PJSIPèªäœã¯ãäžã®èµ€ããµããããããã寞æ³ãèŠæ±ããŸããããã¯600Kbã®ããŒã¯ã§ãããæ¥ç¶äžã¯çŽ320Kbã§ããç§ãã¡ã®ããŒãã«ã¯512kBã®RAMãæèŒãããŠããŸãããããã£ãŠãPJSIPãæ§æããŠãã¡ã¢ãªæ¶è²»éãåæžããããšããŠããŸã...
æ¬¡ã®æ§æãè¡ããŸããã
#define PJ_LOG_USE_STACK_BUFFER 0
#define PJ_LOG_MAX_LEVEL 6
#define PJ_POOL_DEBUG 0
#define PJ_HAS_POOL_ALT_API 0
/* make PJSUA slim */
#define PJSUA_MAX_ACC 3
#define PJSUA_MAX_CALLS 1
#define PJSUA_MAX_VID_WINS 0
#define PJSUA_MAX_BUDDIES 1
#define PJSUA_MAX_CONF_PORTS 4
#define PJSUA_MAX_PLAYERS 1
#define PJSUA_MAX_RECORDERS 1
/* Changing to #if 0 will increase memory consumption
* but insreases communication speed. */
#if 1
/* This sample derived from pjlib/include/pj/config_site_sample.h: */
#define PJ_OS_HAS_CHECK_STACK 0
#define PJ_ENABLE_EXTRA_CHECK 0
#define PJ_HAS_ERROR_STRING 0
#undef PJ_IOQUEUE_MAX_HANDLES
#define PJ_IOQUEUE_MAX_HANDLES 8
#define PJ_CRC32_HAS_TABLES 0
#define PJSIP_MAX_TSX_COUNT 15
#define PJSIP_MAX_DIALOG_COUNT 15
#define PJSIP_UDP_SO_SNDBUF_SIZE 4000
#define PJSIP_UDP_SO_RCVBUF_SIZE 4000
#define PJMEDIA_HAS_ALAW_ULAW_TABLE 0
#endif
ãããPJSIPã®pjlib / include / pj /config_site.hãã¡ã€ã«ã«ã³ããŒããŸããåæ§ç¯ããŠå®è¡ããŸããçµæã®åæïŒ
ããŒã¯æã«ã¯ãã§ã«çŽ300 KBã§ãããããŒãã«åãŸããŸãã
次ã«ãçŽ300 KBã®ããŒããEmboxã«é 眮ãããããã°ããŒã«ãèšå®ããŠãäœãããªãŒããŒãããŒãããã©ããã確èªããŸãïŒãã®çµæãããŒããµã€ãºã240 KBã«æžå°ããããšã«æ³šæããŠãã ããïŒãããŒã«ã®ãããã°ã¯ã次ã®ãªãã·ã§ã³ã§æå¹ã«ãªããŸãã
#define PJ_POOL_DEBUG 1
åãpjlib / include / pj /config_site.hå ã
ããŠãæ®ã£ãŠããã®ã¯ã¹ã¬ããã¹ã¿ãã¯ãšãããã¯ãŒã¯ãã±ããã®æ°ãèšå®ããããšã ãã§ããããã§ã¯ãæ®ãã®ãªãœãŒã¹ãæ£ãã忣ããå¿ èŠããããŸããããšãã°ããããã¯ãŒã¯ãã±ãããå°ãªãããå ŽåããµãŠã³ãã¯åã«ããã§ãŒã¯ãããŸããå²ãåœãŠãããã±ãŒãžãå€ããããšãã¹ã¿ãã¯ã«äœãæ®ããŸããããã¡ãããåªå é äœã¯ã¹ã¿ãã¯ã§ããã¹ã¿ãã¯ãæªããªããšããã¹ãŠã倱ãããŸãã
ãããã£ãŠãå¯èœãªæå€§ã¹ã¿ãã¯ãµã€ãºããå§ããŠããœãããŠã§ã¢ãè² è·ã®äžã§å®è¡ããããŸã§ãããæžãããŸããã¹ã¿ãã¯ã«ãã¡ãŒãžãäžããã忢ããŸããäºæž¬äžå¯èœæ§ãæå°éã«æããããã«ãå²ã蟌ã¿ãå¥ã®ã¹ã¿ãã¯ã«é 眮ããŸããã€ãŸããã¹ã¿ãã¯ã¯ããã°ã©ã å°çšã§ãã
@Runlevel(0) include embox.arch.arm.armmlib.exception_entry(irq_stack_size=1024)
ãã®åŸãæ®ãã®ãªãœãŒã¹ããããã¯ãŒã¯ãã±ããã«å²ãåœãŠãŸããäžã§è¿°ã¹ãããã«ã28åå ¥æããŸããã
ãã¹ãŠãæåã®éšåã¯æ£åžžã«å®äºããŸãããSimple_pjsiaã¢ããªã±ãŒã·ã§ã³ã¯ãSTM32F769Iã§æ£åžžã«å®è¡ãããŸã-512KBã®å éšã¡ã¢ãªã§ã®æ€åºã
SIPé»è©±ã宿ãããŠããŸãããŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã远å ããŸãã
ã³ã³ãœãŒã«ããŒãžã§ã³ãæ£åžžã«èµ·åããåŸãäœããã®æ¹æ³ã§ãŠãŒã¶ãŒã€ã³ã¿ãŒãã§ã€ã¹ã远å ããå¿ èŠããããŸããç°¡åã«ããããã«ã以äžãå«ãŸããŠãããšä»®å®ããŸããã¢ããªã±ãŒã·ã§ã³ãèµ·åãããšãç»é¢ã«ãªãããã®èª¬ææã衚瀺ãããŸããããšãã°ããPJSIPDEMOããçä¿¡ãããå Žåã¯ãçºä¿¡å ãç»é¢ã«è¡šç€ºããããæ¿è«ŸããèŸéãã®ã¢ã€ã³ã³ãä»ãã2ã€ã®ãã¿ã³ã衚瀺ãããŸããéè©±ã¯æ¿èªãŸãã¯æåŠã§ããŸããé話ãåãå ¥ãããããšãäŒè©±ãå§ãŸããå å ¥è ã®é£çµ¡å æ å ±ã衚瀺ãããç»é¢ã«ããã³ã°ããšãã1ã€ã®ãã¿ã³ãæ®ããŸããåŒã³åºããæåã«æåŠãããå ŽåïŒããã§ã¯ãã¹ãŠãäºçްãªããšã§ãïŒããPJSIPDEMOãã§æåã®ç»åã«æ»ããŸãã
ãããã©ã®ããã«èŠãããã®äŸã§ãã
Linuxã§ã®ãããã¿ã€ãã®éçº
Emboxã¯ãã§ã«NuklearããµããŒãããŠããã®ã§ããã®ãããžã§ã¯ãã䜿çšããããšã«ããŸããããã€ã¯ãã³ã³ãããŒã©ãŒã«ã¯ãã§ã«æ©èœããŠããã³ã³ãœãŒã«ããŒãžã§ã³ã®é»è©±ããããŸãããããã§ã¯ãäžèšã®PJSIPèšå®ã䜿çšããŠãããããLinuxã§UIã倿Žããæ¹ãã¯ããã«ç°¡åã§ããããšãéèŠã§ãã
ãããè¡ãããã«ã2ã€ã®äŸãèŠãŠã¿ãŸããããæåã®äŸã¯ãPJSIPã®simple_pjsuaã§ãã 2çªç®ã®äŸã¯ãNuklearã®demo / x11_rawfb /ã§ããä»ãç§ãã¡ã®ä»äºã¯ãLinuxã®äžã§ããããäžç·ã«åäœãããããšã§ãã
ç§ãæåã«ããããšã¯ãèªåPJSIPåŒã³åºãå¿çãå€éšã€ãã³ãïŒãã¿ã³ã®æŒäžãªã©ïŒã«çœ®ãæããããšã§ãããæ¬¡ã«ãNuklearã§ããžãã¯ãäœæããŸããã
ãã®éçšã§ãäœããã®çç±ã§ãã¿ã³ã®å åŽã«ã¢ã€ã³ã³ãæãããŠããªãããšã倿ããŸãããäžã®åçã§ã¯ãç·ãšèµ€ã®ãã¿ã³ã®å åŽã«é»è©±ã®ã¢ã€ã³ã³ã衚瀺ãããŠããŸãããããã¯æ®éã®åçã§ãå話åšãé€ããŠãã¹ãŠã100ïŒ éæã§ããåæã«ãæåã¯çœãåè§ã ããæãããŠããŸãããããã¯rawfbãã©ã°ã€ã³ã®å®è£ ã«é¢ãããã®ã§ãããã©ãããããŸã人æ°ããªãã®ã§ãã«ãŒãœã«ã ããæãããŠããŸããç»åã®å å®¹ãæ£ããNuklearã¡ã¢ãªé åã«ã³ããŒããã ãã®ã³ãŒãã远å ããŸããã
ãã®çµæããããžã§ã¯ãã§1æ¥äœæ¥ããåŸã次ã®ããã«ãªããŸããã
STM32F76I-Discoveryã®ç»é¢ãµã€ãºã¯800x480ã§ãããQEMU 800x600ã§ã¯ãå¿ èŠãªãµã€ãºãNuklearã§ããã«èšå®ããŠãåçãªã©ãã«ããã¿ã³ãç°¡åã«äœæã§ããããã«ããŸãããçµæã®ã³ãŒãã¯æ¬¡ã®ãšããã§ãã
if (nk_begin(ctx, "Demo", nk_rect(0, 0, WIN_WIDTH, WIN_HEIGHT),
NK_WINDOW_NO_SCROLLBAR)) {
int answer_pressed = 0, decline_pressed = 0;
if (!draw_mouse) {
nk_style_hide_cursor(ctx);
}
nk_layout_row_static(ctx,
(WIN_HEIGHT - CALL_BTN_HEIGHT - 2 * CALL_INFO_TEXTBOX_HEIGHT - WIN_HEIGHT / 4), 15, 1);
nk_layout_row_dynamic(ctx, CALL_INFO_TEXTBOX_HEIGHT, 1);
nk_style_set_font(ctx, &rawfb_fonts[RAWFB_FONT_DEFAULT]->handle);
switch (call_info->state) {
case CALL_INACTIVE:
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 56;
nk_label(ctx, "PJSIP demo", NK_TEXT_CENTERED);
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 32;
break;
case CALL_INCOMING:
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 32;
nk_label(ctx, "Incoming call from:", NK_TEXT_CENTERED);
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 38;
nk_label(ctx, call_info->incoming, NK_TEXT_CENTERED);
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 32;
break;
case CALL_ACTIVE:
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 32;
nk_label(ctx, "Active call:", NK_TEXT_CENTERED);
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 38;
nk_label(ctx, call_info->remote_uri, NK_TEXT_CENTERED);
rawfb_fonts[RAWFB_FONT_DEFAULT]->handle.height = 32;
break;
}
if (call_info->state != CALL_INACTIVE) {
nk_layout_row_static(ctx, (WIN_WIDTH - 9 * 4) / 9, (WIN_WIDTH - 9 * 4) / 9, 9);
switch (call_info->state) {
case CALL_INCOMING:
nk_spacing(ctx, 2);
demo_nk_accept_btn(ctx, im_accept, &answer_pressed);
nk_spacing(ctx, 3);
demo_nk_decline_btn(ctx, im_decline, &decline_pressed);
nk_spacing(ctx, 2);
break;
case CALL_ACTIVE:
nk_spacing(ctx, 4);
demo_nk_decline_btn(ctx, im_decline, &decline_pressed);
nk_spacing(ctx, 4);
break;
default:
break;
}
}
if (answer_pressed && call_info->state == CALL_INCOMING) {
demo_pj_answer();
}
if (decline_pressed) {
demo_pj_hang();
}
}
nk_end(ctx);
æ©å ã§èµ·å
ãããžã§ã¯ããæåã«QEMUã«è»¢éããæ¬¡ã«åç· åœ¹äŒã«è»¢éããå¿ èŠããããŸããã³ã³ãœãŒã«ããŒãžã§ã³ã®æºåã¯ãã¹ãŠæŽã£ãŠããã®ã§ãLinuxããæ°ããã¢ããªã±ãŒã·ã§ã³ã転éããã ãã§ãããããè¡ãã«ã¯ãEmboxãã«ãã·ã¹ãã ã§Mybuildãã¡ã€ã«ãäœæããã ãã§ãã
@AutoCmd @Cmd(name="sip_nuklear", help="", man="") @BuildDepends(third_party.pjproject.libpj_all) @BuildDepends(third_party.lib.nuklear) @Build(stage=2) module sip_nuklear { @InitFS source "icons/phone-accept-80.png", "icons/phone-decline-80.png", "fonts/Roboto-Regular.ttf" source "main.c" source "nuklear_main.c" @IncludePath("$(CONF_DIR)") @DefineMacro("PJ_AUTOCONF=1") source "pjsua.c" @NoRuntime depends third_party.pjproject.libpj_all @NoRuntime depends third_party.lib.nuklear depends embox.driver.input.core depends rawfb_api }
ã芧ã®ãšããããœãŒã¹ãäžèŠ§è¡šç€ºãããŠããŸããã¢ã€ã³ã³ãšãã©ã³ãã¯å éšãã¡ã€ã«ã·ã¹ãã ã«ãããéåžžã®èªã¿åãå°çšãã¡ã€ã«ãšããŠå©çšã§ããŸãããŸããpjsipããã³nuklearã©ã€ãã©ãªãžã®äŸåé¢ä¿ã远å ããŸããã
ããŒãäžã§ã¢ããªã±ãŒã·ã§ã³ãå®è¡ããåŸãNuclearã®ããã©ã«ããã©ã³ããSTM32F769Iç»é¢ã§ã²ã©ãããã«èŠããããšã«æ°ä»ããŸãããæçŽã®ããã€ãã¯åã«å€±ãããŸãããããšãã°ãã1ãã¯ã|ãã®ããã«èŠãããmãã¯ãnãã®ããã«èŠããŸããã ttfãã¡ã€ã«ïŒRoboto-Regular.ttfïŒãããã©ã³ããæ¥ç¶ããå¿ èŠããããŸããããã®ãã©ã³ãã¯çŽ150KBã®ãã©ãã·ã¥ã¡ã¢ãªã䜿çšããŸãããããã¹ãã¯èªã¿ããããªã£ãŠããŸãã
Linuxããã§ãã¯ãããšãããå°é¡ã®æéã ãšæããŸããããããŠãç°ãªããã©ã³ããµã€ãº32ãš38ã䜿çšããããšããŸãããããããã»ã°ã¡ã³ããŒã·ã§ã³éåãçºçããŸãããçµå±ãç§ã¯ãã¡ã€ã«ããè€æ°ã®ãã©ã³ããµã€ãºãããŒããããšããã¢ã€ãã¢ãããããã32çªç®ã®ãã©ã³ãã®ã¿ãããŒãããŠã¹ã±ãŒãªã³ã°ããŸããã
ããŒããŠã§ã¢ã§ã®èµ·åã®æ©èœ
ããŒãã®ç«ã¡äžãã«æ»ããŸããããããã§çè§£ããŠããã¹ãéèŠãªããšã¯ãUIã®å Žåããã¬ãŒã ãããã¡ãŒãå¿ èŠã§ãããšããããšã§ãããã«ã¹ã¯ãªãŒã³ã¢ãŒããå¿ èŠã§ãç»é¢ã800x480ã§ããããã1ãã€ãã®RGBãã¬ããã䜿çšããŠãã800 * 480 * 1 = 384000ãã€ããã€ãŸã375KBãå¿ èŠã§ãããPJSIPã®ããŒãºã®ããã«512KBã®å éšã¡ã¢ãªã®ã»ãŒå šäœããã§ã«å æããŠããããšãèãããšããã¬ãŒã ãããã¡ã®å ŽæãèŠã€ããããšã¯ã§ããŸããããã®ãããSDRAMã䜿çšããŸãã16MBã¯STM32F76I-Discoveryã§å©çšã§ããŸãããã§ã«å€éšã¡ã¢ãªã䜿çšããŠããã®ã§ãããŸãç¯çŽãããRGBA32ããããé 眮ããŸãããããã£ãŠããã¬ãŒã ãããã¡ã¯800 * 480 * 4 = 1536000ãã€ããŸãã¯1.5MBã«ãªããŸãã
ãã®æ§æã§ã¯ãSDRAMã¯ã¢ãã¬ã¹0x60000000ã«ãããŸãããã¬ãŒã ãããã¡ã®ã¢ãã¬ã¹ãšããŠæå®ããŸãã
@Runlevel(1) include embox.driver.video.stm32f7_lcd( fb_base=0x60000000, width=800, height=480, ltdc_irq=88, bpp=32 ) include embox.driver.video.fb
ãããããã¡ãå¥ã®èšäºã§äœ¿çšããå Žåã®ã¡ãã€ãã®åœ±é¿ã«ã€ããŠã¯ããã§ã«èª¬æããŸããããããã£ãŠãã·ã¹ãã ãããã«ãããã¡ãªã³ã°ã䜿çšããããšãèæ ®ããŸãããããã£ãŠãå¥ã®1.5MBãããã¡çšã«è¿œå ã®ã¡ã¢ãªãå¿ èŠã§ããããã«ããã©ã³ãã«ã¯ããã«256KBãå¿ èŠã§ããåèšã§ãããŒãã2MBå¢ããå¿ èŠããããŸãããŸããå€éšã¡ã¢ãªã«é 眮ããŸãã
@Runlevel(2) include embox.driver.input.touchscreen.stm32f7cube_ts @Runlevel(2) include embox.driver.input.input_dev_devfs
ããã§ãã¿ããã¹ã¯ãªãŒã³ã¯Emboxã®devfsãã¡ã€ã«ã·ã¹ãã ã®/ dev / stm32-tsããã€ã¹ã«ãªããéåžžã®openïŒïŒ/ readïŒïŒã䜿çšããŠæäœã§ããŸãã
ããã§èšå®ã¯å®äºã§ãããªãã»ãšãã©ïŒå®éãç§ãã¡ã¯èšæ¶ããã®ãã¹ãŠã®ãã¥ã¢ã³ã¹ãèæ ®ã«å ¥ããŸããããããã©ãŒãã³ã¹ã¯èæ ®ããŠããŸããã§ããã PJSIPã®å ŽåããµãŠã³ããããŸãéä¿¡ãããå Žåãã°ã©ãã£ãã¯ã¹ã䜿çšããŠèµ·åããããšãããšããã§ãŒã¯ãçºçããŸãããã¡ããããã®å¹æãLinuxã§ãããã°ããããšã¯éåžžã«å°é£ã§ããããããããŒãäžã®ãã£ãã·ã¥ãæå¹ã«ããã ãã§ååã§ããããšã倿ããŸããã
@Runlevel(0) include embox.arch.arm.armmlib.armv7m_cpu_cache( log_level=4, sram_nocache_section_size=0x10000 )
Emboxã§ã¯ããããã¯ãŒã¯ãã±ããèšè¿°åãšããŒã¿ãããã³DMAãæ©èœãããªãŒãã£ãªãããã¡ã¯ãMPUã§ãã£ãã·ã¥äžå¯ã¡ã¢ãªãšããŠããŒã¯ãããã¡ã¢ãªã®ç¹å¥ãªã»ã¯ã·ã§ã³ã«é 眮ãããŸããããã¯ããã®ã¡ã¢ãªå ã®ãªããžã§ã¯ãã®ç¶æ ãCPUãšDMAã®äž¡æ¹ã§åžžã«æ£ããããã«å¿ èŠã§ãã
ãã®çµæãéåžžã«ããŸãæ©èœãããã¿ã³ä»ãã®UIãåããéåžžã«ã·ã³ãã«ãªSIPé»è©±ãåŸãããŸãã
以äžã«ãæçµçãªã¡ã¢ãªå²ãåœãŠã瀺ããŸãã
ãã¹ãã·ã¹ãã ã§ã®éçº
ç§ã®éçºããã»ã¹ã¯ãå³ã«ç€ºãããŠãããã®ã«èŠçŽãããŸãã
ãããŠãããã¯ã»ãšãã©æéãããããŸããã§ãããLinuxäžã®ã¢ããªã±ãŒã·ã§ã³ã®å Žåã¯1æ¥ãéžæãããã©ãããã©ãŒã ã®æ¹åã®ããã®1æ¥ãã¯ããEmboxã«ã¯ãã§ã«ãã®ã«ãŒãçšã®ãã£ã¹ãã¬ã€ããããã¯ãŒã¯ã«ãŒãããªãŒãã£ãªãã©ã€ããŒããããŸããããããããããã®éšåã®éçºã«ãå°ãæéããããããã©ã€ããŒããšã«1é±éãããããŸããããã®ãããªæ©èœãããŒãäžã§çŽæ¥éçºããã«ã¯ãã¯ããã«æéãããããŸããç§ãã¡ã®å Žåãã»ãšãã©ã®æ©èœã¯äŸ¿å©ãªãã¹ãã·ã¹ãã ç°å¢ã§éçºãããŠããŸããããã«ãããéçºæéãå€§å¹ ã«ççž®ããããšãã§ããŸããã
èšäºã®åé ã«çµæã®ãããªããããŸããå¿ èŠã«å¿ããŠãwikiã®æç€ºã«åŸã£ãŠãã¹ãŠãèªåã§è€è£œããããšãã§ã ãŸãã