From 72a88f22f00c4567503adf852dd2f3f2938ecf7c Mon Sep 17 00:00:00 2001
From: andyweiqiu <andywei_89@163.COM>
Date: 星期四, 07 九月 2023 15:18:56 +0800
Subject: [PATCH] Delete redundant parts from an iOS project (#922)
---
funasr/runtime/onnxruntime/third_party/glog/src/glog/vlog_is_on.h | 120 +
funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/xcuserdata/qiuwei.xcuserdatad/UserInterfaceState.xcuserstate | 0
funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.m | 140 +
funasr/runtime/ios/paraformer_online/Podfile | 7
funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcschemes/xcschememanagement.plist | 14
funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/Contents.json | 6
funasr/runtime/ios/paraformer_online/paraformer_online/Info.plist | 25
funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AppIcon.appiconset/Contents.json | 13
funasr/runtime/ios/Readme.md | 18
funasr/runtime/onnxruntime/third_party/glog/src/glog/raw_logging.h | 179 ++
funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.mm | 143 +
funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AccentColor.colorset/Contents.json | 11
funasr/runtime/onnxruntime/third_party/glog/src/config.h | 177 ++
funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist | 6
funasr/runtime/onnxruntime/src/precomp.h | 5
funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.m | 45
funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.mm | 279 +++
funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.h | 49
funasr/runtime/onnxruntime/src/audio.cpp | 21
funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.h | 19
funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/contents.xcworkspacedata | 7
funasr/runtime/ios/paraformer_online/paraformer_online/main.m | 18
funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/Main.storyboard | 78
funasr/runtime/onnxruntime/third_party/glog/src/glog/logging.h | 1842 +++++++++++++++++++++++
funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.pbxproj | 1181 ++++++++++++++
funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.h | 30
funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.m | 62
funasr/runtime/onnxruntime/third_party/glog/src/glog/stl_logging.h | 177 ++
funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.h | 19
funasr/runtime/onnxruntime/third_party/glog/src/glog/export.h | 42
funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/LaunchScreen.storyboard | 25
funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.h | 20
32 files changed, 4,775 insertions(+), 3 deletions(-)
diff --git a/funasr/runtime/ios/Readme.md b/funasr/runtime/ios/Readme.md
new file mode 100644
index 0000000..709a0b1
--- /dev/null
+++ b/funasr/runtime/ios/Readme.md
@@ -0,0 +1,18 @@
+# Paraformer online
+
+璇ラ」鐩槸涓�涓熀浜巌OS绔殑Paraformer娴佸紡璇嗗埆鐨刣emo銆傝椤圭洰鏄熀浜巓nnx鐨勬帹鐞哻++鐗堟湰銆備笉闇�瑕佷緷璧栧叾浠栧簱鍜岄澶栫殑閰嶇疆锛岀洿鎺ュ湪xcode涓婄紪璇戣繍琛屽嵆鍙��
+
+## 鑾峰彇妯″瀷
+1. 閫氳繃鍛戒护 `git clone https://www.modelscope.cn/damo/speech_paraformer-large_asr_nat-zh-cn-16k-common-vocab8404-online-onnx.git` 涓嬭浇妯″瀷
+2. 涓嬭浇鐨勬槸閲忓寲鍚庣殑妯″瀷锛岃iOS椤圭洰闇�瑕佺敤鍒板洓涓枃浠讹紝`model_quant.onnx`锛宍decoder_quant.onnx`锛宍am.mvn`鍜宍config.yaml`
+3. 灏嗕笂闈㈠洓涓枃浠舵嫋鍏code椤圭洰涓殑`model`鏂囦欢澶逛笅锛屽缓璁湪鎵撳紑xcode椤圭洰鍚庡啀鎷栧叆銆�
+
+## 璇嗗埆娴佺▼
+1. mac璁惧涓婄‘淇濆畨瑁厁code锛�
+2. 鐢变簬onnx鏄痻code鐨勪竴涓猚ocopod鍖咃紝闇�瑕佸厛渚濊禆onnx鐜锛屾墦寮�缁堢锛屽幓鍒板寘鍚玃odfile鏂囦欢鐨勬枃浠跺す涓嬶紝鎵ц`pod install`锛屾媺鍙杘nnx鐜
+3. mac杩炴帴iPhone璁惧锛屽弻鍑籤paraformer_online.xcworkspace`锛岃嚜鍔ㄦ墦寮�xcode锛岀洿鎺ヨ繍琛岃xcode宸ョ▼銆�
+
+## 鏈潵宸ヤ綔
+* coreml鏀寔
+* 鍔犲叆娴佸紡鏍囩偣
+
diff --git a/funasr/runtime/ios/paraformer_online/Podfile b/funasr/runtime/ios/paraformer_online/Podfile
new file mode 100644
index 0000000..9dd6100
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/Podfile
@@ -0,0 +1,7 @@
+
+platform :ios, '12.0'
+target 'paraformer_online' do
+ use_frameworks!
+
+ pod 'onnxruntime-c'
+end
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.pbxproj b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.pbxproj
new file mode 100644
index 0000000..62b4788
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.pbxproj
@@ -0,0 +1,1181 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 56;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 1A6C93052A84D64E007E36DC /* paraformer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92E02A84D64E007E36DC /* paraformer.cpp */; };
+ 1A6C93062A84D64E007E36DC /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92E52A84D64E007E36DC /* util.cpp */; };
+ 1A6C93072A84D64E007E36DC /* ct-transformer-online.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92E62A84D64E007E36DC /* ct-transformer-online.cpp */; };
+ 1A6C93092A84D64E007E36DC /* fsmn-vad.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92E82A84D64E007E36DC /* fsmn-vad.cpp */; };
+ 1A6C930A2A84D64E007E36DC /* vocab.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92EB2A84D64E007E36DC /* vocab.cpp */; };
+ 1A6C930B2A84D64E007E36DC /* alignedmem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92EC2A84D64E007E36DC /* alignedmem.cpp */; };
+ 1A6C930C2A84D64E007E36DC /* resample.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92ED2A84D64E007E36DC /* resample.cpp */; };
+ 1A6C930D2A84D64E007E36DC /* audio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92EE2A84D64E007E36DC /* audio.cpp */; };
+ 1A6C930E2A84D64E007E36DC /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92F02A84D64E007E36DC /* tokenizer.cpp */; };
+ 1A6C930F2A84D64E007E36DC /* tpass-online-stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92F32A84D64E007E36DC /* tpass-online-stream.cpp */; };
+ 1A6C93102A84D64E007E36DC /* offline-stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92F52A84D64E007E36DC /* offline-stream.cpp */; };
+ 1A6C93112A84D64E007E36DC /* tpass-stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92F62A84D64E007E36DC /* tpass-stream.cpp */; };
+ 1A6C93122A84D64E007E36DC /* fsmn-vad-online.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92F72A84D64E007E36DC /* fsmn-vad-online.cpp */; };
+ 1A6C93132A84D64E007E36DC /* ct-transformer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92FB2A84D64E007E36DC /* ct-transformer.cpp */; };
+ 1A6C93142A84D64E007E36DC /* model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92FC2A84D64E007E36DC /* model.cpp */; };
+ 1A6C93152A84D64E007E36DC /* funasrruntime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C92FF2A84D64E007E36DC /* funasrruntime.cpp */; };
+ 1A6C93162A84D64E007E36DC /* paraformer-online.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93002A84D64E007E36DC /* paraformer-online.cpp */; };
+ 1A6C93172A84D64E007E36DC /* punc-model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93022A84D64E007E36DC /* punc-model.cpp */; };
+ 1A6C93182A84D64E007E36DC /* vad-model.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93042A84D64E007E36DC /* vad-model.cpp */; };
+ 1A6C93D42A84D66E007E36DC /* feature-fbank.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C931D2A84D66D007E36DC /* feature-fbank.cc */; };
+ 1A6C93D52A84D66E007E36DC /* online-feature.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C931F2A84D66D007E36DC /* online-feature.cc */; };
+ 1A6C93DA2A84D66E007E36DC /* rfft.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93262A84D66D007E36DC /* rfft.cc */; };
+ 1A6C93DB2A84D66E007E36DC /* CMakeLists.txt.bak in Resources */ = {isa = PBXBuildFile; fileRef = 1A6C93272A84D66D007E36DC /* CMakeLists.txt.bak */; };
+ 1A6C93DC2A84D66E007E36DC /* feature-window.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93282A84D66D007E36DC /* feature-window.cc */; };
+ 1A6C93DD2A84D66E007E36DC /* mel-computations.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C932A2A84D66D007E36DC /* mel-computations.cc */; };
+ 1A6C93DE2A84D66E007E36DC /* fftsg.c in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C932C2A84D66D007E36DC /* fftsg.c */; };
+ 1A6C93E02A84D66E007E36DC /* feature-functions.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C932E2A84D66D007E36DC /* feature-functions.cc */; };
+ 1A6C93E12A84D66E007E36DC /* log.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93312A84D66D007E36DC /* log.cc */; };
+ 1A6C93F62A84D66E007E36DC /* utilities.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C934D2A84D66D007E36DC /* utilities.cc */; };
+ 1A6C93F72A84D66E007E36DC /* symbolize.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C934E2A84D66D007E36DC /* symbolize.cc */; };
+ 1A6C93F82A84D66E007E36DC /* vlog_is_on.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93522A84D66D007E36DC /* vlog_is_on.cc */; };
+ 1A6C93F92A84D66E007E36DC /* vlog_is_on.h.in in Resources */ = {isa = PBXBuildFile; fileRef = 1A6C93552A84D66D007E36DC /* vlog_is_on.h.in */; };
+ 1A6C93FA2A84D66E007E36DC /* logging.h.in in Resources */ = {isa = PBXBuildFile; fileRef = 1A6C93562A84D66D007E36DC /* logging.h.in */; };
+ 1A6C93FB2A84D66E007E36DC /* stl_logging.h.in in Resources */ = {isa = PBXBuildFile; fileRef = 1A6C93572A84D66D007E36DC /* stl_logging.h.in */; };
+ 1A6C93FC2A84D66E007E36DC /* raw_logging.h.in in Resources */ = {isa = PBXBuildFile; fileRef = 1A6C93582A84D66D007E36DC /* raw_logging.h.in */; };
+ 1A6C93FD2A84D66E007E36DC /* raw_logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C935E2A84D66D007E36DC /* raw_logging.cc */; };
+ 1A6C93FE2A84D66E007E36DC /* config.h.cmake.in in Resources */ = {isa = PBXBuildFile; fileRef = 1A6C93602A84D66D007E36DC /* config.h.cmake.in */; };
+ 1A6C94002A84D66E007E36DC /* signalhandler.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93632A84D66D007E36DC /* signalhandler.cc */; };
+ 1A6C94012A84D66E007E36DC /* logging.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93642A84D66D007E36DC /* logging.cc */; };
+ 1A6C94022A84D66E007E36DC /* demangle.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93652A84D66D007E36DC /* demangle.cc */; };
+ 1A6C94032A84D66E007E36DC /* fuzz_demangle.cc in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93672A84D66D007E36DC /* fuzz_demangle.cc */; };
+ 1A6C94092A84D66E007E36DC /* exceptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C939E2A84D66E007E36DC /* exceptions.cpp */; };
+ 1A6C940A2A84D66E007E36DC /* memory.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C939F2A84D66E007E36DC /* memory.cpp */; };
+ 1A6C940B2A84D66E007E36DC /* ostream_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93A22A84D66E007E36DC /* ostream_wrapper.cpp */; };
+ 1A6C940C2A84D66E007E36DC /* emitfromevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93A42A84D66E007E36DC /* emitfromevents.cpp */; };
+ 1A6C940D2A84D66E007E36DC /* simplekey.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93A52A84D66E007E36DC /* simplekey.cpp */; };
+ 1A6C940E2A84D66E007E36DC /* parse.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93A62A84D66E007E36DC /* parse.cpp */; };
+ 1A6C940F2A84D66E007E36DC /* emitter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93A82A84D66E007E36DC /* emitter.cpp */; };
+ 1A6C94102A84D66E007E36DC /* convert.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93AA2A84D66E007E36DC /* convert.cpp */; };
+ 1A6C94112A84D66E007E36DC /* regex_yaml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93AB2A84D66E007E36DC /* regex_yaml.cpp */; };
+ 1A6C94122A84D66E007E36DC /* scanscalar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93AC2A84D66E007E36DC /* scanscalar.cpp */; };
+ 1A6C94132A84D66E007E36DC /* exp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93AD2A84D66E007E36DC /* exp.cpp */; };
+ 1A6C94142A84D66E007E36DC /* null.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93AE2A84D66E007E36DC /* null.cpp */; };
+ 1A6C94152A84D66E007E36DC /* node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93AF2A84D66E007E36DC /* node.cpp */; };
+ 1A6C94162A84D66E007E36DC /* singledocparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93B02A84D66E007E36DC /* singledocparser.cpp */; };
+ 1A6C94172A84D66E007E36DC /* binary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93B22A84D66E007E36DC /* binary.cpp */; };
+ 1A6C94182A84D66E007E36DC /* nodeevents.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93B42A84D66E007E36DC /* nodeevents.cpp */; };
+ 1A6C94192A84D66E007E36DC /* graphbuilderadapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93B62A84D66E007E36DC /* graphbuilderadapter.cpp */; };
+ 1A6C941A2A84D66E007E36DC /* graphbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93B72A84D66E007E36DC /* graphbuilder.cpp */; };
+ 1A6C941B2A84D66E007E36DC /* scanner.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93BA2A84D66E007E36DC /* scanner.cpp */; };
+ 1A6C941C2A84D66E007E36DC /* emit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93BB2A84D66E007E36DC /* emit.cpp */; };
+ 1A6C941D2A84D66E007E36DC /* tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93BC2A84D66E007E36DC /* tag.cpp */; };
+ 1A6C941E2A84D66E007E36DC /* emitterutils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93BF2A84D66E007E36DC /* emitterutils.cpp */; };
+ 1A6C941F2A84D66E007E36DC /* stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93C12A84D66E007E36DC /* stream.cpp */; };
+ 1A6C94202A84D66E007E36DC /* scantag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93C22A84D66E007E36DC /* scantag.cpp */; };
+ 1A6C94212A84D66E007E36DC /* scantoken.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93C32A84D66E007E36DC /* scantoken.cpp */; };
+ 1A6C94222A84D66E007E36DC /* nodebuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93C52A84D66E007E36DC /* nodebuilder.cpp */; };
+ 1A6C94232A84D66E007E36DC /* directives.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93C72A84D66E007E36DC /* directives.cpp */; };
+ 1A6C94242A84D66E007E36DC /* node_data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93CD2A84D66E007E36DC /* node_data.cpp */; };
+ 1A6C94252A84D66E007E36DC /* emitterstate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93CE2A84D66E007E36DC /* emitterstate.cpp */; };
+ 1A6C94262A84D66E007E36DC /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1A6C93CF2A84D66E007E36DC /* parser.cpp */; };
+ 1A7F0C982A2F1F0000A6EEB7 /* AppDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7F0C972A2F1F0000A6EEB7 /* AppDelegate.m */; };
+ 1A7F0C9B2A2F1F0000A6EEB7 /* SceneDelegate.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7F0C9A2A2F1F0000A6EEB7 /* SceneDelegate.m */; };
+ 1A7F0C9E2A2F1F0000A6EEB7 /* ViewController.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A7F0C9D2A2F1F0000A6EEB7 /* ViewController.mm */; };
+ 1A7F0CA12A2F1F0000A6EEB7 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A7F0C9F2A2F1F0000A6EEB7 /* Main.storyboard */; };
+ 1A7F0CA32A2F1F0200A6EEB7 /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 1A7F0CA22A2F1F0200A6EEB7 /* Assets.xcassets */; };
+ 1A7F0CA62A2F1F0200A6EEB7 /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 1A7F0CA42A2F1F0200A6EEB7 /* LaunchScreen.storyboard */; };
+ 1A7F0CA92A2F1F0200A6EEB7 /* main.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7F0CA82A2F1F0200A6EEB7 /* main.m */; };
+ 1A7F0DB72A2F1FC400A6EEB7 /* Accelerate.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A7F0DB62A2F1FC400A6EEB7 /* Accelerate.framework */; };
+ 1A7F0DB92A2F20B900A6EEB7 /* libc++.1.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 1A7F0DB82A2F20B900A6EEB7 /* libc++.1.tbd */; };
+ 1A7F0DBE2A2F221C00A6EEB7 /* AudioCapture.mm in Sources */ = {isa = PBXBuildFile; fileRef = 1A7F0DBB2A2F221C00A6EEB7 /* AudioCapture.mm */; };
+ 1A7F0DBF2A2F221C00A6EEB7 /* AudioRecorder.m in Sources */ = {isa = PBXBuildFile; fileRef = 1A7F0DBD2A2F221C00A6EEB7 /* AudioRecorder.m */; };
+ 1A7F0DC32A2F312D00A6EEB7 /* model in Resources */ = {isa = PBXBuildFile; fileRef = 1A7F0DC22A2F312D00A6EEB7 /* model */; };
+ 59C4114F365C8D714BD515FB /* Pods_paraformer_online.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = EA7D0713E60886A787BAA0EA /* Pods_paraformer_online.framework */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXFileReference section */
+ 00FB7DEC958626AACE224936 /* Pods-paraformer_online.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-paraformer_online.release.xcconfig"; path = "Target Support Files/Pods-paraformer_online/Pods-paraformer_online.release.xcconfig"; sourceTree = "<group>"; };
+ 1A6C92E02A84D64E007E36DC /* paraformer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = paraformer.cpp; sourceTree = "<group>"; };
+ 1A6C92E12A84D64E007E36DC /* paraformer-online.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "paraformer-online.h"; sourceTree = "<group>"; };
+ 1A6C92E22A84D64E007E36DC /* predefine-coe.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "predefine-coe.h"; sourceTree = "<group>"; };
+ 1A6C92E32A84D64E007E36DC /* resample.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = resample.h; sourceTree = "<group>"; };
+ 1A6C92E42A84D64E007E36DC /* fsmn-vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fsmn-vad.h"; sourceTree = "<group>"; };
+ 1A6C92E52A84D64E007E36DC /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util.cpp; sourceTree = "<group>"; };
+ 1A6C92E62A84D64E007E36DC /* ct-transformer-online.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ct-transformer-online.cpp"; sourceTree = "<group>"; };
+ 1A6C92E82A84D64E007E36DC /* fsmn-vad.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "fsmn-vad.cpp"; sourceTree = "<group>"; };
+ 1A6C92E92A84D64E007E36DC /* fsmn-vad-online.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "fsmn-vad-online.h"; sourceTree = "<group>"; };
+ 1A6C92EA2A84D64E007E36DC /* precomp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = precomp.h; sourceTree = "<group>"; };
+ 1A6C92EB2A84D64E007E36DC /* vocab.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vocab.cpp; sourceTree = "<group>"; };
+ 1A6C92EC2A84D64E007E36DC /* alignedmem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = alignedmem.cpp; sourceTree = "<group>"; };
+ 1A6C92ED2A84D64E007E36DC /* resample.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resample.cpp; sourceTree = "<group>"; };
+ 1A6C92EE2A84D64E007E36DC /* audio.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = audio.cpp; sourceTree = "<group>"; };
+ 1A6C92EF2A84D64E007E36DC /* tokenizer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tokenizer.h; sourceTree = "<group>"; };
+ 1A6C92F02A84D64E007E36DC /* tokenizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tokenizer.cpp; sourceTree = "<group>"; };
+ 1A6C92F12A84D64E007E36DC /* ct-transformer-online.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ct-transformer-online.h"; sourceTree = "<group>"; };
+ 1A6C92F22A84D64E007E36DC /* alignedmem.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = alignedmem.h; sourceTree = "<group>"; };
+ 1A6C92F32A84D64E007E36DC /* tpass-online-stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "tpass-online-stream.cpp"; sourceTree = "<group>"; };
+ 1A6C92F42A84D64E007E36DC /* vocab.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = vocab.h; sourceTree = "<group>"; };
+ 1A6C92F52A84D64E007E36DC /* offline-stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "offline-stream.cpp"; sourceTree = "<group>"; };
+ 1A6C92F62A84D64E007E36DC /* tpass-stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "tpass-stream.cpp"; sourceTree = "<group>"; };
+ 1A6C92F72A84D64E007E36DC /* fsmn-vad-online.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "fsmn-vad-online.cpp"; sourceTree = "<group>"; };
+ 1A6C92F82A84D64E007E36DC /* common-struct.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "common-struct.h"; sourceTree = "<group>"; };
+ 1A6C92F92A84D64E007E36DC /* e2e-vad.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "e2e-vad.h"; sourceTree = "<group>"; };
+ 1A6C92FA2A84D64E007E36DC /* util.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = util.h; sourceTree = "<group>"; };
+ 1A6C92FB2A84D64E007E36DC /* ct-transformer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "ct-transformer.cpp"; sourceTree = "<group>"; };
+ 1A6C92FC2A84D64E007E36DC /* model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = model.cpp; sourceTree = "<group>"; };
+ 1A6C92FD2A84D64E007E36DC /* paraformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = paraformer.h; sourceTree = "<group>"; };
+ 1A6C92FE2A84D64E007E36DC /* commonfunc.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = commonfunc.h; sourceTree = "<group>"; };
+ 1A6C92FF2A84D64E007E36DC /* funasrruntime.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = funasrruntime.cpp; sourceTree = "<group>"; };
+ 1A6C93002A84D64E007E36DC /* paraformer-online.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "paraformer-online.cpp"; sourceTree = "<group>"; };
+ 1A6C93012A84D64E007E36DC /* tensor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tensor.h; sourceTree = "<group>"; };
+ 1A6C93022A84D64E007E36DC /* punc-model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "punc-model.cpp"; sourceTree = "<group>"; };
+ 1A6C93032A84D64E007E36DC /* ct-transformer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "ct-transformer.h"; sourceTree = "<group>"; };
+ 1A6C93042A84D64E007E36DC /* vad-model.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "vad-model.cpp"; sourceTree = "<group>"; };
+ 1A6C931D2A84D66D007E36DC /* feature-fbank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "feature-fbank.cc"; sourceTree = "<group>"; };
+ 1A6C931E2A84D66D007E36DC /* feature-functions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "feature-functions.h"; sourceTree = "<group>"; };
+ 1A6C931F2A84D66D007E36DC /* online-feature.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "online-feature.cc"; sourceTree = "<group>"; };
+ 1A6C93202A84D66D007E36DC /* test-log.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "test-log.cc"; sourceTree = "<group>"; };
+ 1A6C93212A84D66D007E36DC /* online-feature.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "online-feature.h"; sourceTree = "<group>"; };
+ 1A6C93232A84D66D007E36DC /* test-rfft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "test-rfft.cc"; sourceTree = "<group>"; };
+ 1A6C93242A84D66D007E36DC /* test-online-feature.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "test-online-feature.cc"; sourceTree = "<group>"; };
+ 1A6C93252A84D66D007E36DC /* feature-fbank.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "feature-fbank.h"; sourceTree = "<group>"; };
+ 1A6C93262A84D66D007E36DC /* rfft.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = rfft.cc; sourceTree = "<group>"; };
+ 1A6C93272A84D66D007E36DC /* CMakeLists.txt.bak */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CMakeLists.txt.bak; sourceTree = "<group>"; };
+ 1A6C93282A84D66D007E36DC /* feature-window.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "feature-window.cc"; sourceTree = "<group>"; };
+ 1A6C93292A84D66D007E36DC /* log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log.h; sourceTree = "<group>"; };
+ 1A6C932A2A84D66D007E36DC /* mel-computations.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "mel-computations.cc"; sourceTree = "<group>"; };
+ 1A6C932B2A84D66D007E36DC /* rfft.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = rfft.h; sourceTree = "<group>"; };
+ 1A6C932C2A84D66D007E36DC /* fftsg.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = fftsg.c; sourceTree = "<group>"; };
+ 1A6C932D2A84D66D007E36DC /* test-online-fbank.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "test-online-fbank.cc"; sourceTree = "<group>"; };
+ 1A6C932E2A84D66D007E36DC /* feature-functions.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "feature-functions.cc"; sourceTree = "<group>"; };
+ 1A6C932F2A84D66D007E36DC /* feature-window.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "feature-window.h"; sourceTree = "<group>"; };
+ 1A6C93302A84D66D007E36DC /* mel-computations.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mel-computations.h"; sourceTree = "<group>"; };
+ 1A6C93312A84D66D007E36DC /* log.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = log.cc; sourceTree = "<group>"; };
+ 1A6C934C2A84D66D007E36DC /* stacktrace_x86-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stacktrace_x86-inl.h"; sourceTree = "<group>"; };
+ 1A6C934D2A84D66D007E36DC /* utilities.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = utilities.cc; sourceTree = "<group>"; };
+ 1A6C934E2A84D66D007E36DC /* symbolize.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = symbolize.cc; sourceTree = "<group>"; };
+ 1A6C934F2A84D66D007E36DC /* stacktrace.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stacktrace.h; sourceTree = "<group>"; };
+ 1A6C93502A84D66D007E36DC /* demangle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = demangle.h; sourceTree = "<group>"; };
+ 1A6C93512A84D66D007E36DC /* symbolize.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = symbolize.h; sourceTree = "<group>"; };
+ 1A6C93522A84D66D007E36DC /* vlog_is_on.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = vlog_is_on.cc; sourceTree = "<group>"; };
+ 1A6C93532A84D66D007E36DC /* utilities.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = utilities.h; sourceTree = "<group>"; };
+ 1A6C93552A84D66D007E36DC /* vlog_is_on.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = vlog_is_on.h.in; sourceTree = "<group>"; };
+ 1A6C93562A84D66D007E36DC /* logging.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = logging.h.in; sourceTree = "<group>"; };
+ 1A6C93572A84D66D007E36DC /* stl_logging.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = stl_logging.h.in; sourceTree = "<group>"; };
+ 1A6C93582A84D66D007E36DC /* raw_logging.h.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = raw_logging.h.in; sourceTree = "<group>"; };
+ 1A6C93592A84D66D007E36DC /* log_severity.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = log_severity.h; sourceTree = "<group>"; };
+ 1A6C935A2A84D66D007E36DC /* platform.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = platform.h; sourceTree = "<group>"; };
+ 1A6C935B2A84D66D007E36DC /* stacktrace_generic-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stacktrace_generic-inl.h"; sourceTree = "<group>"; };
+ 1A6C935C2A84D66D007E36DC /* stacktrace_powerpc-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stacktrace_powerpc-inl.h"; sourceTree = "<group>"; };
+ 1A6C935D2A84D66D007E36DC /* stacktrace_unwind-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stacktrace_unwind-inl.h"; sourceTree = "<group>"; };
+ 1A6C935E2A84D66D007E36DC /* raw_logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = raw_logging.cc; sourceTree = "<group>"; };
+ 1A6C935F2A84D66D007E36DC /* stacktrace_windows-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stacktrace_windows-inl.h"; sourceTree = "<group>"; };
+ 1A6C93602A84D66D007E36DC /* config.h.cmake.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = config.h.cmake.in; sourceTree = "<group>"; };
+ 1A6C93612A84D66D007E36DC /* mock-log.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "mock-log.h"; sourceTree = "<group>"; };
+ 1A6C93622A84D66D007E36DC /* stacktrace_unittest.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stacktrace_unittest.cc; sourceTree = "<group>"; };
+ 1A6C93632A84D66D007E36DC /* signalhandler.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = signalhandler.cc; sourceTree = "<group>"; };
+ 1A6C93642A84D66D007E36DC /* logging.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = logging.cc; sourceTree = "<group>"; };
+ 1A6C93652A84D66D007E36DC /* demangle.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = demangle.cc; sourceTree = "<group>"; };
+ 1A6C93662A84D66D007E36DC /* stacktrace_libunwind-inl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "stacktrace_libunwind-inl.h"; sourceTree = "<group>"; };
+ 1A6C93672A84D66D007E36DC /* fuzz_demangle.cc */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fuzz_demangle.cc; sourceTree = "<group>"; };
+ 1A6C93692A84D66D007E36DC /* commandlineflags.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = commandlineflags.h; sourceTree = "<group>"; };
+ 1A6C936A2A84D66D007E36DC /* googleinit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = googleinit.h; sourceTree = "<group>"; };
+ 1A6C936B2A84D66D007E36DC /* mutex.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mutex.h; sourceTree = "<group>"; };
+ 1A6C93702A84D66D007E36DC /* traits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = traits.h; sourceTree = "<group>"; };
+ 1A6C93712A84D66D007E36DC /* eventhandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = eventhandler.h; sourceTree = "<group>"; };
+ 1A6C93722A84D66D007E36DC /* emitter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emitter.h; sourceTree = "<group>"; };
+ 1A6C93732A84D66D007E36DC /* anchor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = anchor.h; sourceTree = "<group>"; };
+ 1A6C93742A84D66D007E36DC /* mark.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = mark.h; sourceTree = "<group>"; };
+ 1A6C93752A84D66D007E36DC /* emitterdef.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emitterdef.h; sourceTree = "<group>"; };
+ 1A6C93762A84D66D007E36DC /* parser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parser.h; sourceTree = "<group>"; };
+ 1A6C93772A84D66D007E36DC /* null.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = null.h; sourceTree = "<group>"; };
+ 1A6C93782A84D66D007E36DC /* exceptions.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exceptions.h; sourceTree = "<group>"; };
+ 1A6C93792A84D66D007E36DC /* emitterstyle.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emitterstyle.h; sourceTree = "<group>"; };
+ 1A6C937A2A84D66D007E36DC /* emittermanip.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emittermanip.h; sourceTree = "<group>"; };
+ 1A6C937B2A84D66D007E36DC /* emitfromevents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emitfromevents.h; sourceTree = "<group>"; };
+ 1A6C937C2A84D66D007E36DC /* dll.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = dll.h; sourceTree = "<group>"; };
+ 1A6C937E2A84D66D007E36DC /* graphbuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graphbuilder.h; sourceTree = "<group>"; };
+ 1A6C937F2A84D66D007E36DC /* anchordict.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = anchordict.h; sourceTree = "<group>"; };
+ 1A6C93802A84D66D007E36DC /* noncopyable.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = noncopyable.h; sourceTree = "<group>"; };
+ 1A6C93812A84D66D007E36DC /* yaml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = yaml.h; sourceTree = "<group>"; };
+ 1A6C93832A84D66D007E36DC /* type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = type.h; sourceTree = "<group>"; };
+ 1A6C93842A84D66D007E36DC /* parse.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = parse.h; sourceTree = "<group>"; };
+ 1A6C93852A84D66D007E36DC /* node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node.h; sourceTree = "<group>"; };
+ 1A6C93872A84D66D007E36DC /* node_data.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node_data.h; sourceTree = "<group>"; };
+ 1A6C93882A84D66D007E36DC /* node_ref.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node_ref.h; sourceTree = "<group>"; };
+ 1A6C93892A84D66D007E36DC /* node.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node.h; sourceTree = "<group>"; };
+ 1A6C938A2A84D66D007E36DC /* bool_type.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = bool_type.h; sourceTree = "<group>"; };
+ 1A6C938B2A84D66D007E36DC /* memory.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = memory.h; sourceTree = "<group>"; };
+ 1A6C938C2A84D66D007E36DC /* node_iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = node_iterator.h; sourceTree = "<group>"; };
+ 1A6C938D2A84D66D007E36DC /* impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = impl.h; sourceTree = "<group>"; };
+ 1A6C938E2A84D66D007E36DC /* iterator_fwd.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator_fwd.h; sourceTree = "<group>"; };
+ 1A6C938F2A84D66D007E36DC /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = "<group>"; };
+ 1A6C93902A84D66D007E36DC /* ptr.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ptr.h; sourceTree = "<group>"; };
+ 1A6C93912A84D66D007E36DC /* convert.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = convert.h; sourceTree = "<group>"; };
+ 1A6C93922A84D66D007E36DC /* impl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = impl.h; sourceTree = "<group>"; };
+ 1A6C93932A84D66D007E36DC /* emit.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emit.h; sourceTree = "<group>"; };
+ 1A6C93942A84D66D007E36DC /* iterator.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = iterator.h; sourceTree = "<group>"; };
+ 1A6C93952A84D66D007E36DC /* ostream_wrapper.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ostream_wrapper.h; sourceTree = "<group>"; };
+ 1A6C93962A84D66D007E36DC /* stlemitter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stlemitter.h; sourceTree = "<group>"; };
+ 1A6C93972A84D66D007E36DC /* binary.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = binary.h; sourceTree = "<group>"; };
+ 1A6C939D2A84D66E007E36DC /* scanscalar.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scanscalar.h; sourceTree = "<group>"; };
+ 1A6C939E2A84D66E007E36DC /* exceptions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = exceptions.cpp; sourceTree = "<group>"; };
+ 1A6C939F2A84D66E007E36DC /* memory.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = memory.cpp; sourceTree = "<group>"; };
+ 1A6C93A02A84D66E007E36DC /* scantag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scantag.h; sourceTree = "<group>"; };
+ 1A6C93A12A84D66E007E36DC /* regeximpl.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = regeximpl.h; sourceTree = "<group>"; };
+ 1A6C93A22A84D66E007E36DC /* ostream_wrapper.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = ostream_wrapper.cpp; sourceTree = "<group>"; };
+ 1A6C93A32A84D66E007E36DC /* tag.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = tag.h; sourceTree = "<group>"; };
+ 1A6C93A42A84D66E007E36DC /* emitfromevents.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emitfromevents.cpp; sourceTree = "<group>"; };
+ 1A6C93A52A84D66E007E36DC /* simplekey.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = simplekey.cpp; sourceTree = "<group>"; };
+ 1A6C93A62A84D66E007E36DC /* parse.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parse.cpp; sourceTree = "<group>"; };
+ 1A6C93A72A84D66E007E36DC /* indentation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = indentation.h; sourceTree = "<group>"; };
+ 1A6C93A82A84D66E007E36DC /* emitter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emitter.cpp; sourceTree = "<group>"; };
+ 1A6C93A92A84D66E007E36DC /* nodeevents.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nodeevents.h; sourceTree = "<group>"; };
+ 1A6C93AA2A84D66E007E36DC /* convert.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = convert.cpp; sourceTree = "<group>"; };
+ 1A6C93AB2A84D66E007E36DC /* regex_yaml.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = regex_yaml.cpp; sourceTree = "<group>"; };
+ 1A6C93AC2A84D66E007E36DC /* scanscalar.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanscalar.cpp; sourceTree = "<group>"; };
+ 1A6C93AD2A84D66E007E36DC /* exp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = exp.cpp; sourceTree = "<group>"; };
+ 1A6C93AE2A84D66E007E36DC /* null.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = null.cpp; sourceTree = "<group>"; };
+ 1A6C93AF2A84D66E007E36DC /* node.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node.cpp; sourceTree = "<group>"; };
+ 1A6C93B02A84D66E007E36DC /* singledocparser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = singledocparser.cpp; sourceTree = "<group>"; };
+ 1A6C93B12A84D66E007E36DC /* emitterutils.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emitterutils.h; sourceTree = "<group>"; };
+ 1A6C93B22A84D66E007E36DC /* binary.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary.cpp; sourceTree = "<group>"; };
+ 1A6C93B32A84D66E007E36DC /* stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stream.h; sourceTree = "<group>"; };
+ 1A6C93B42A84D66E007E36DC /* nodeevents.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nodeevents.cpp; sourceTree = "<group>"; };
+ 1A6C93B62A84D66E007E36DC /* graphbuilderadapter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = graphbuilderadapter.cpp; sourceTree = "<group>"; };
+ 1A6C93B72A84D66E007E36DC /* graphbuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = graphbuilder.cpp; sourceTree = "<group>"; };
+ 1A6C93B82A84D66E007E36DC /* graphbuilderadapter.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = graphbuilderadapter.h; sourceTree = "<group>"; };
+ 1A6C93B92A84D66E007E36DC /* nodebuilder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = nodebuilder.h; sourceTree = "<group>"; };
+ 1A6C93BA2A84D66E007E36DC /* scanner.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scanner.cpp; sourceTree = "<group>"; };
+ 1A6C93BB2A84D66E007E36DC /* emit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emit.cpp; sourceTree = "<group>"; };
+ 1A6C93BC2A84D66E007E36DC /* tag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tag.cpp; sourceTree = "<group>"; };
+ 1A6C93BD2A84D66E007E36DC /* streamcharsource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = streamcharsource.h; sourceTree = "<group>"; };
+ 1A6C93BE2A84D66E007E36DC /* stringsource.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = stringsource.h; sourceTree = "<group>"; };
+ 1A6C93BF2A84D66E007E36DC /* emitterutils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emitterutils.cpp; sourceTree = "<group>"; };
+ 1A6C93C02A84D66E007E36DC /* scanner.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = scanner.h; sourceTree = "<group>"; };
+ 1A6C93C12A84D66E007E36DC /* stream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = stream.cpp; sourceTree = "<group>"; };
+ 1A6C93C22A84D66E007E36DC /* scantag.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scantag.cpp; sourceTree = "<group>"; };
+ 1A6C93C32A84D66E007E36DC /* scantoken.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = scantoken.cpp; sourceTree = "<group>"; };
+ 1A6C93C42A84D66E007E36DC /* emitterstate.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = emitterstate.h; sourceTree = "<group>"; };
+ 1A6C93C52A84D66E007E36DC /* nodebuilder.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = nodebuilder.cpp; sourceTree = "<group>"; };
+ 1A6C93C62A84D66E007E36DC /* collectionstack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = collectionstack.h; sourceTree = "<group>"; };
+ 1A6C93C72A84D66E007E36DC /* directives.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = directives.cpp; sourceTree = "<group>"; };
+ 1A6C93C82A84D66E007E36DC /* ptr_vector.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ptr_vector.h; sourceTree = "<group>"; };
+ 1A6C93C92A84D66E007E36DC /* singledocparser.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = singledocparser.h; sourceTree = "<group>"; };
+ 1A6C93CA2A84D66E007E36DC /* exp.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = exp.h; sourceTree = "<group>"; };
+ 1A6C93CB2A84D66E007E36DC /* token.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = token.h; sourceTree = "<group>"; };
+ 1A6C93CC2A84D66E007E36DC /* regex_yaml.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = regex_yaml.h; sourceTree = "<group>"; };
+ 1A6C93CD2A84D66E007E36DC /* node_data.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = node_data.cpp; sourceTree = "<group>"; };
+ 1A6C93CE2A84D66E007E36DC /* emitterstate.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = emitterstate.cpp; sourceTree = "<group>"; };
+ 1A6C93CF2A84D66E007E36DC /* parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser.cpp; sourceTree = "<group>"; };
+ 1A6C93D02A84D66E007E36DC /* setting.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = setting.h; sourceTree = "<group>"; };
+ 1A6C93D12A84D66E007E36DC /* directives.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = directives.h; sourceTree = "<group>"; };
+ 1A7F0C932A2F1F0000A6EEB7 /* paraformer_online.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = paraformer_online.app; sourceTree = BUILT_PRODUCTS_DIR; };
+ 1A7F0C962A2F1F0000A6EEB7 /* AppDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = AppDelegate.h; sourceTree = "<group>"; };
+ 1A7F0C972A2F1F0000A6EEB7 /* AppDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = AppDelegate.m; sourceTree = "<group>"; };
+ 1A7F0C992A2F1F0000A6EEB7 /* SceneDelegate.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = SceneDelegate.h; sourceTree = "<group>"; };
+ 1A7F0C9A2A2F1F0000A6EEB7 /* SceneDelegate.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = SceneDelegate.m; sourceTree = "<group>"; };
+ 1A7F0C9C2A2F1F0000A6EEB7 /* ViewController.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = ViewController.h; sourceTree = "<group>"; };
+ 1A7F0C9D2A2F1F0000A6EEB7 /* ViewController.mm */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.objcpp; path = ViewController.mm; sourceTree = "<group>"; };
+ 1A7F0CA02A2F1F0000A6EEB7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = "<group>"; };
+ 1A7F0CA22A2F1F0200A6EEB7 /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = "<group>"; };
+ 1A7F0CA52A2F1F0200A6EEB7 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = "<group>"; };
+ 1A7F0CA72A2F1F0200A6EEB7 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = "<group>"; };
+ 1A7F0CA82A2F1F0200A6EEB7 /* main.m */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.objc; path = main.m; sourceTree = "<group>"; };
+ 1A7F0DB62A2F1FC400A6EEB7 /* Accelerate.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Accelerate.framework; path = System/Library/Frameworks/Accelerate.framework; sourceTree = SDKROOT; };
+ 1A7F0DB82A2F20B900A6EEB7 /* libc++.1.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = "libc++.1.tbd"; path = "usr/lib/libc++.1.tbd"; sourceTree = SDKROOT; };
+ 1A7F0DBA2A2F221C00A6EEB7 /* AudioRecorder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioRecorder.h; sourceTree = "<group>"; };
+ 1A7F0DBB2A2F221C00A6EEB7 /* AudioCapture.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = AudioCapture.mm; sourceTree = "<group>"; };
+ 1A7F0DBC2A2F221C00A6EEB7 /* AudioCapture.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = AudioCapture.h; sourceTree = "<group>"; };
+ 1A7F0DBD2A2F221C00A6EEB7 /* AudioRecorder.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = AudioRecorder.m; sourceTree = "<group>"; };
+ 1A7F0DC22A2F312D00A6EEB7 /* model */ = {isa = PBXFileReference; lastKnownFileType = folder; path = model; sourceTree = "<group>"; };
+ 1AB8E1CC2AA0851700F4F795 /* config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = config.h; sourceTree = "<group>"; };
+ 1AB8E1CF2AA086F200F4F795 /* CmdLineOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmdLineOutput.h; sourceTree = "<group>"; };
+ 1AB8E1D02AA086F200F4F795 /* ZshCompletionOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ZshCompletionOutput.h; sourceTree = "<group>"; };
+ 1AB8E1D12AA086F200F4F795 /* UnlabeledMultiArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnlabeledMultiArg.h; sourceTree = "<group>"; };
+ 1AB8E1D22AA086F200F4F795 /* sstream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = sstream.h; sourceTree = "<group>"; };
+ 1AB8E1D32AA086F200F4F795 /* MultiArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiArg.h; sourceTree = "<group>"; };
+ 1AB8E1D42AA086F200F4F795 /* IgnoreRestVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = IgnoreRestVisitor.h; sourceTree = "<group>"; };
+ 1AB8E1D52AA086F200F4F795 /* XorHandler.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = XorHandler.h; sourceTree = "<group>"; };
+ 1AB8E1D62AA086F200F4F795 /* Arg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Arg.h; sourceTree = "<group>"; };
+ 1AB8E1D72AA086F200F4F795 /* HelpVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HelpVisitor.h; sourceTree = "<group>"; };
+ 1AB8E1D82AA086F200F4F795 /* StdOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StdOutput.h; sourceTree = "<group>"; };
+ 1AB8E1D92AA086F200F4F795 /* ArgTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArgTraits.h; sourceTree = "<group>"; };
+ 1AB8E1DA2AA086F200F4F795 /* CmdLine.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmdLine.h; sourceTree = "<group>"; };
+ 1AB8E1DB2AA086F200F4F795 /* DocBookOutput.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = DocBookOutput.h; sourceTree = "<group>"; };
+ 1AB8E1DC2AA086F200F4F795 /* StandardTraits.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = StandardTraits.h; sourceTree = "<group>"; };
+ 1AB8E1DD2AA086F200F4F795 /* Visitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Visitor.h; sourceTree = "<group>"; };
+ 1AB8E1DE2AA086F200F4F795 /* VersionVisitor.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = VersionVisitor.h; sourceTree = "<group>"; };
+ 1AB8E1DF2AA086F200F4F795 /* ValueArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ValueArg.h; sourceTree = "<group>"; };
+ 1AB8E1E02AA086F200F4F795 /* ValuesConstraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ValuesConstraint.h; sourceTree = "<group>"; };
+ 1AB8E1E12AA086F200F4F795 /* UnlabeledValueArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = UnlabeledValueArg.h; sourceTree = "<group>"; };
+ 1AB8E1E22AA086F200F4F795 /* Constraint.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Constraint.h; sourceTree = "<group>"; };
+ 1AB8E1E32AA086F200F4F795 /* CmdLineInterface.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CmdLineInterface.h; sourceTree = "<group>"; };
+ 1AB8E1E42AA086F200F4F795 /* SwitchArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = SwitchArg.h; sourceTree = "<group>"; };
+ 1AB8E1E52AA086F200F4F795 /* OptionalUnlabeledTracker.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = OptionalUnlabeledTracker.h; sourceTree = "<group>"; };
+ 1AB8E1E62AA086F200F4F795 /* MultiSwitchArg.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MultiSwitchArg.h; sourceTree = "<group>"; };
+ 1AB8E1E72AA086F200F4F795 /* ArgException.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ArgException.h; sourceTree = "<group>"; };
+ 1AB8E1E82AA086F200F4F795 /* com-define.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "com-define.h"; sourceTree = "<group>"; };
+ 1AB8E1E92AA086F200F4F795 /* funasrruntime.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = funasrruntime.h; sourceTree = "<group>"; };
+ 1AB8E1EA2AA086F200F4F795 /* tpass-online-stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "tpass-online-stream.h"; sourceTree = "<group>"; };
+ 1AB8E1EB2AA086F200F4F795 /* audio.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = audio.h; sourceTree = "<group>"; };
+ 1AB8E1EC2AA086F200F4F795 /* punc-model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "punc-model.h"; sourceTree = "<group>"; };
+ 1AB8E1ED2AA086F200F4F795 /* tpass-stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "tpass-stream.h"; sourceTree = "<group>"; };
+ 1AB8E1EE2AA086F200F4F795 /* model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = model.h; sourceTree = "<group>"; };
+ 1AB8E1EF2AA086F200F4F795 /* offline-stream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "offline-stream.h"; sourceTree = "<group>"; };
+ 1AB8E1F02AA086F200F4F795 /* vad-model.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = "vad-model.h"; sourceTree = "<group>"; };
+ B9ED2A36675364C815C03C96 /* Pods-paraformer_online.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-paraformer_online.debug.xcconfig"; path = "Target Support Files/Pods-paraformer_online/Pods-paraformer_online.debug.xcconfig"; sourceTree = "<group>"; };
+ EA7D0713E60886A787BAA0EA /* Pods_paraformer_online.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_paraformer_online.framework; sourceTree = BUILT_PRODUCTS_DIR; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 1A7F0C902A2F1F0000A6EEB7 /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1A7F0DB92A2F20B900A6EEB7 /* libc++.1.tbd in Frameworks */,
+ 1A7F0DB72A2F1FC400A6EEB7 /* Accelerate.framework in Frameworks */,
+ 59C4114F365C8D714BD515FB /* Pods_paraformer_online.framework in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 1A6C92DF2A84D64E007E36DC /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C92EC2A84D64E007E36DC /* alignedmem.cpp */,
+ 1A6C92F22A84D64E007E36DC /* alignedmem.h */,
+ 1A6C92EE2A84D64E007E36DC /* audio.cpp */,
+ 1A6C92F82A84D64E007E36DC /* common-struct.h */,
+ 1A6C92FE2A84D64E007E36DC /* commonfunc.h */,
+ 1A6C92E62A84D64E007E36DC /* ct-transformer-online.cpp */,
+ 1A6C92F12A84D64E007E36DC /* ct-transformer-online.h */,
+ 1A6C92FB2A84D64E007E36DC /* ct-transformer.cpp */,
+ 1A6C93032A84D64E007E36DC /* ct-transformer.h */,
+ 1A6C92F92A84D64E007E36DC /* e2e-vad.h */,
+ 1A6C92F72A84D64E007E36DC /* fsmn-vad-online.cpp */,
+ 1A6C92E92A84D64E007E36DC /* fsmn-vad-online.h */,
+ 1A6C92E82A84D64E007E36DC /* fsmn-vad.cpp */,
+ 1A6C92E42A84D64E007E36DC /* fsmn-vad.h */,
+ 1A6C92FF2A84D64E007E36DC /* funasrruntime.cpp */,
+ 1A6C92FC2A84D64E007E36DC /* model.cpp */,
+ 1A6C92F52A84D64E007E36DC /* offline-stream.cpp */,
+ 1A6C93002A84D64E007E36DC /* paraformer-online.cpp */,
+ 1A6C92E12A84D64E007E36DC /* paraformer-online.h */,
+ 1A6C92E02A84D64E007E36DC /* paraformer.cpp */,
+ 1A6C92FD2A84D64E007E36DC /* paraformer.h */,
+ 1A6C92EA2A84D64E007E36DC /* precomp.h */,
+ 1A6C92E22A84D64E007E36DC /* predefine-coe.h */,
+ 1A6C93022A84D64E007E36DC /* punc-model.cpp */,
+ 1A6C92ED2A84D64E007E36DC /* resample.cpp */,
+ 1A6C92E32A84D64E007E36DC /* resample.h */,
+ 1A6C93012A84D64E007E36DC /* tensor.h */,
+ 1A6C92F02A84D64E007E36DC /* tokenizer.cpp */,
+ 1A6C92EF2A84D64E007E36DC /* tokenizer.h */,
+ 1A6C92F32A84D64E007E36DC /* tpass-online-stream.cpp */,
+ 1A6C92F62A84D64E007E36DC /* tpass-stream.cpp */,
+ 1A6C92E52A84D64E007E36DC /* util.cpp */,
+ 1A6C92FA2A84D64E007E36DC /* util.h */,
+ 1A6C93042A84D64E007E36DC /* vad-model.cpp */,
+ 1A6C92EB2A84D64E007E36DC /* vocab.cpp */,
+ 1A6C92F42A84D64E007E36DC /* vocab.h */,
+ );
+ name = src;
+ path = ../../../onnxruntime/src;
+ sourceTree = "<group>";
+ };
+ 1A6C93192A84D66D007E36DC /* third_party */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C931A2A84D66D007E36DC /* kaldi-native-fbank */,
+ 1A6C933D2A84D66D007E36DC /* glog */,
+ 1A6C936C2A84D66D007E36DC /* yaml-cpp */,
+ );
+ name = third_party;
+ path = ../../../onnxruntime/third_party;
+ sourceTree = "<group>";
+ };
+ 1A6C931A2A84D66D007E36DC /* kaldi-native-fbank */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C931B2A84D66D007E36DC /* kaldi-native-fbank */,
+ );
+ path = "kaldi-native-fbank";
+ sourceTree = "<group>";
+ };
+ 1A6C931B2A84D66D007E36DC /* kaldi-native-fbank */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C931C2A84D66D007E36DC /* csrc */,
+ );
+ path = "kaldi-native-fbank";
+ sourceTree = "<group>";
+ };
+ 1A6C931C2A84D66D007E36DC /* csrc */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C931D2A84D66D007E36DC /* feature-fbank.cc */,
+ 1A6C931E2A84D66D007E36DC /* feature-functions.h */,
+ 1A6C931F2A84D66D007E36DC /* online-feature.cc */,
+ 1A6C93202A84D66D007E36DC /* test-log.cc */,
+ 1A6C93212A84D66D007E36DC /* online-feature.h */,
+ 1A6C93232A84D66D007E36DC /* test-rfft.cc */,
+ 1A6C93242A84D66D007E36DC /* test-online-feature.cc */,
+ 1A6C93252A84D66D007E36DC /* feature-fbank.h */,
+ 1A6C93262A84D66D007E36DC /* rfft.cc */,
+ 1A6C93272A84D66D007E36DC /* CMakeLists.txt.bak */,
+ 1A6C93282A84D66D007E36DC /* feature-window.cc */,
+ 1A6C93292A84D66D007E36DC /* log.h */,
+ 1A6C932A2A84D66D007E36DC /* mel-computations.cc */,
+ 1A6C932B2A84D66D007E36DC /* rfft.h */,
+ 1A6C932C2A84D66D007E36DC /* fftsg.c */,
+ 1A6C932D2A84D66D007E36DC /* test-online-fbank.cc */,
+ 1A6C932E2A84D66D007E36DC /* feature-functions.cc */,
+ 1A6C932F2A84D66D007E36DC /* feature-window.h */,
+ 1A6C93302A84D66D007E36DC /* mel-computations.h */,
+ 1A6C93312A84D66D007E36DC /* log.cc */,
+ );
+ path = csrc;
+ sourceTree = "<group>";
+ };
+ 1A6C933D2A84D66D007E36DC /* glog */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C934B2A84D66D007E36DC /* src */,
+ );
+ path = glog;
+ sourceTree = "<group>";
+ };
+ 1A6C934B2A84D66D007E36DC /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 1AB8E1CC2AA0851700F4F795 /* config.h */,
+ 1A6C93682A84D66D007E36DC /* base */,
+ 1A6C93602A84D66D007E36DC /* config.h.cmake.in */,
+ 1A6C93652A84D66D007E36DC /* demangle.cc */,
+ 1A6C93502A84D66D007E36DC /* demangle.h */,
+ 1A6C93672A84D66D007E36DC /* fuzz_demangle.cc */,
+ 1A6C93542A84D66D007E36DC /* glog */,
+ 1A6C93642A84D66D007E36DC /* logging.cc */,
+ 1A6C93612A84D66D007E36DC /* mock-log.h */,
+ 1A6C935E2A84D66D007E36DC /* raw_logging.cc */,
+ 1A6C93632A84D66D007E36DC /* signalhandler.cc */,
+ 1A6C935B2A84D66D007E36DC /* stacktrace_generic-inl.h */,
+ 1A6C93662A84D66D007E36DC /* stacktrace_libunwind-inl.h */,
+ 1A6C935C2A84D66D007E36DC /* stacktrace_powerpc-inl.h */,
+ 1A6C93622A84D66D007E36DC /* stacktrace_unittest.cc */,
+ 1A6C935D2A84D66D007E36DC /* stacktrace_unwind-inl.h */,
+ 1A6C935F2A84D66D007E36DC /* stacktrace_windows-inl.h */,
+ 1A6C934C2A84D66D007E36DC /* stacktrace_x86-inl.h */,
+ 1A6C934F2A84D66D007E36DC /* stacktrace.h */,
+ 1A6C934E2A84D66D007E36DC /* symbolize.cc */,
+ 1A6C93512A84D66D007E36DC /* symbolize.h */,
+ 1A6C934D2A84D66D007E36DC /* utilities.cc */,
+ 1A6C93532A84D66D007E36DC /* utilities.h */,
+ 1A6C93522A84D66D007E36DC /* vlog_is_on.cc */,
+ );
+ path = src;
+ sourceTree = "<group>";
+ };
+ 1A6C93542A84D66D007E36DC /* glog */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C93552A84D66D007E36DC /* vlog_is_on.h.in */,
+ 1A6C93562A84D66D007E36DC /* logging.h.in */,
+ 1A6C93572A84D66D007E36DC /* stl_logging.h.in */,
+ 1A6C93582A84D66D007E36DC /* raw_logging.h.in */,
+ 1A6C93592A84D66D007E36DC /* log_severity.h */,
+ 1A6C935A2A84D66D007E36DC /* platform.h */,
+ );
+ path = glog;
+ sourceTree = "<group>";
+ };
+ 1A6C93682A84D66D007E36DC /* base */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C93692A84D66D007E36DC /* commandlineflags.h */,
+ 1A6C936A2A84D66D007E36DC /* googleinit.h */,
+ 1A6C936B2A84D66D007E36DC /* mutex.h */,
+ );
+ path = base;
+ sourceTree = "<group>";
+ };
+ 1A6C936C2A84D66D007E36DC /* yaml-cpp */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C936E2A84D66D007E36DC /* include */,
+ 1A6C939C2A84D66E007E36DC /* src */,
+ );
+ path = "yaml-cpp";
+ sourceTree = "<group>";
+ };
+ 1A6C936E2A84D66D007E36DC /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C936F2A84D66D007E36DC /* yaml-cpp */,
+ );
+ path = include;
+ sourceTree = "<group>";
+ };
+ 1A6C936F2A84D66D007E36DC /* yaml-cpp */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C93702A84D66D007E36DC /* traits.h */,
+ 1A6C93712A84D66D007E36DC /* eventhandler.h */,
+ 1A6C93722A84D66D007E36DC /* emitter.h */,
+ 1A6C93732A84D66D007E36DC /* anchor.h */,
+ 1A6C93742A84D66D007E36DC /* mark.h */,
+ 1A6C93752A84D66D007E36DC /* emitterdef.h */,
+ 1A6C93762A84D66D007E36DC /* parser.h */,
+ 1A6C93772A84D66D007E36DC /* null.h */,
+ 1A6C93782A84D66D007E36DC /* exceptions.h */,
+ 1A6C93792A84D66D007E36DC /* emitterstyle.h */,
+ 1A6C937A2A84D66D007E36DC /* emittermanip.h */,
+ 1A6C937B2A84D66D007E36DC /* emitfromevents.h */,
+ 1A6C937C2A84D66D007E36DC /* dll.h */,
+ 1A6C937D2A84D66D007E36DC /* contrib */,
+ 1A6C93802A84D66D007E36DC /* noncopyable.h */,
+ 1A6C93812A84D66D007E36DC /* yaml.h */,
+ 1A6C93822A84D66D007E36DC /* node */,
+ 1A6C93952A84D66D007E36DC /* ostream_wrapper.h */,
+ 1A6C93962A84D66D007E36DC /* stlemitter.h */,
+ 1A6C93972A84D66D007E36DC /* binary.h */,
+ );
+ path = "yaml-cpp";
+ sourceTree = "<group>";
+ };
+ 1A6C937D2A84D66D007E36DC /* contrib */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C937E2A84D66D007E36DC /* graphbuilder.h */,
+ 1A6C937F2A84D66D007E36DC /* anchordict.h */,
+ );
+ path = contrib;
+ sourceTree = "<group>";
+ };
+ 1A6C93822A84D66D007E36DC /* node */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C93832A84D66D007E36DC /* type.h */,
+ 1A6C93842A84D66D007E36DC /* parse.h */,
+ 1A6C93852A84D66D007E36DC /* node.h */,
+ 1A6C93862A84D66D007E36DC /* detail */,
+ 1A6C93902A84D66D007E36DC /* ptr.h */,
+ 1A6C93912A84D66D007E36DC /* convert.h */,
+ 1A6C93922A84D66D007E36DC /* impl.h */,
+ 1A6C93932A84D66D007E36DC /* emit.h */,
+ 1A6C93942A84D66D007E36DC /* iterator.h */,
+ );
+ path = node;
+ sourceTree = "<group>";
+ };
+ 1A6C93862A84D66D007E36DC /* detail */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C93872A84D66D007E36DC /* node_data.h */,
+ 1A6C93882A84D66D007E36DC /* node_ref.h */,
+ 1A6C93892A84D66D007E36DC /* node.h */,
+ 1A6C938A2A84D66D007E36DC /* bool_type.h */,
+ 1A6C938B2A84D66D007E36DC /* memory.h */,
+ 1A6C938C2A84D66D007E36DC /* node_iterator.h */,
+ 1A6C938D2A84D66D007E36DC /* impl.h */,
+ 1A6C938E2A84D66D007E36DC /* iterator_fwd.h */,
+ 1A6C938F2A84D66D007E36DC /* iterator.h */,
+ );
+ path = detail;
+ sourceTree = "<group>";
+ };
+ 1A6C939C2A84D66E007E36DC /* src */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C939D2A84D66E007E36DC /* scanscalar.h */,
+ 1A6C939E2A84D66E007E36DC /* exceptions.cpp */,
+ 1A6C939F2A84D66E007E36DC /* memory.cpp */,
+ 1A6C93A02A84D66E007E36DC /* scantag.h */,
+ 1A6C93A12A84D66E007E36DC /* regeximpl.h */,
+ 1A6C93A22A84D66E007E36DC /* ostream_wrapper.cpp */,
+ 1A6C93A32A84D66E007E36DC /* tag.h */,
+ 1A6C93A42A84D66E007E36DC /* emitfromevents.cpp */,
+ 1A6C93A52A84D66E007E36DC /* simplekey.cpp */,
+ 1A6C93A62A84D66E007E36DC /* parse.cpp */,
+ 1A6C93A72A84D66E007E36DC /* indentation.h */,
+ 1A6C93A82A84D66E007E36DC /* emitter.cpp */,
+ 1A6C93A92A84D66E007E36DC /* nodeevents.h */,
+ 1A6C93AA2A84D66E007E36DC /* convert.cpp */,
+ 1A6C93AB2A84D66E007E36DC /* regex_yaml.cpp */,
+ 1A6C93AC2A84D66E007E36DC /* scanscalar.cpp */,
+ 1A6C93AD2A84D66E007E36DC /* exp.cpp */,
+ 1A6C93AE2A84D66E007E36DC /* null.cpp */,
+ 1A6C93AF2A84D66E007E36DC /* node.cpp */,
+ 1A6C93B02A84D66E007E36DC /* singledocparser.cpp */,
+ 1A6C93B12A84D66E007E36DC /* emitterutils.h */,
+ 1A6C93B22A84D66E007E36DC /* binary.cpp */,
+ 1A6C93B32A84D66E007E36DC /* stream.h */,
+ 1A6C93B42A84D66E007E36DC /* nodeevents.cpp */,
+ 1A6C93B52A84D66E007E36DC /* contrib */,
+ 1A6C93B92A84D66E007E36DC /* nodebuilder.h */,
+ 1A6C93BA2A84D66E007E36DC /* scanner.cpp */,
+ 1A6C93BB2A84D66E007E36DC /* emit.cpp */,
+ 1A6C93BC2A84D66E007E36DC /* tag.cpp */,
+ 1A6C93BD2A84D66E007E36DC /* streamcharsource.h */,
+ 1A6C93BE2A84D66E007E36DC /* stringsource.h */,
+ 1A6C93BF2A84D66E007E36DC /* emitterutils.cpp */,
+ 1A6C93C02A84D66E007E36DC /* scanner.h */,
+ 1A6C93C12A84D66E007E36DC /* stream.cpp */,
+ 1A6C93C22A84D66E007E36DC /* scantag.cpp */,
+ 1A6C93C32A84D66E007E36DC /* scantoken.cpp */,
+ 1A6C93C42A84D66E007E36DC /* emitterstate.h */,
+ 1A6C93C52A84D66E007E36DC /* nodebuilder.cpp */,
+ 1A6C93C62A84D66E007E36DC /* collectionstack.h */,
+ 1A6C93C72A84D66E007E36DC /* directives.cpp */,
+ 1A6C93C82A84D66E007E36DC /* ptr_vector.h */,
+ 1A6C93C92A84D66E007E36DC /* singledocparser.h */,
+ 1A6C93CA2A84D66E007E36DC /* exp.h */,
+ 1A6C93CB2A84D66E007E36DC /* token.h */,
+ 1A6C93CC2A84D66E007E36DC /* regex_yaml.h */,
+ 1A6C93CD2A84D66E007E36DC /* node_data.cpp */,
+ 1A6C93CE2A84D66E007E36DC /* emitterstate.cpp */,
+ 1A6C93CF2A84D66E007E36DC /* parser.cpp */,
+ 1A6C93D02A84D66E007E36DC /* setting.h */,
+ 1A6C93D12A84D66E007E36DC /* directives.h */,
+ );
+ path = src;
+ sourceTree = "<group>";
+ };
+ 1A6C93B52A84D66E007E36DC /* contrib */ = {
+ isa = PBXGroup;
+ children = (
+ 1A6C93B62A84D66E007E36DC /* graphbuilderadapter.cpp */,
+ 1A6C93B72A84D66E007E36DC /* graphbuilder.cpp */,
+ 1A6C93B82A84D66E007E36DC /* graphbuilderadapter.h */,
+ );
+ path = contrib;
+ sourceTree = "<group>";
+ };
+ 1A7F0C8A2A2F1F0000A6EEB7 = {
+ isa = PBXGroup;
+ children = (
+ 1A7F0C952A2F1F0000A6EEB7 /* paraformer_online */,
+ 1A7F0C942A2F1F0000A6EEB7 /* Products */,
+ 1A7F0DB52A2F1FC400A6EEB7 /* Frameworks */,
+ 1F202C29EAE1D21FD07F8024 /* Pods */,
+ );
+ sourceTree = "<group>";
+ };
+ 1A7F0C942A2F1F0000A6EEB7 /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 1A7F0C932A2F1F0000A6EEB7 /* paraformer_online.app */,
+ );
+ name = Products;
+ sourceTree = "<group>";
+ };
+ 1A7F0C952A2F1F0000A6EEB7 /* paraformer_online */ = {
+ isa = PBXGroup;
+ children = (
+ 1AB8E1CD2AA086F200F4F795 /* include */,
+ 1A6C93192A84D66D007E36DC /* third_party */,
+ 1A6C92DF2A84D64E007E36DC /* src */,
+ 1A7F0DC22A2F312D00A6EEB7 /* model */,
+ 1A7F0C962A2F1F0000A6EEB7 /* AppDelegate.h */,
+ 1A7F0C972A2F1F0000A6EEB7 /* AppDelegate.m */,
+ 1A7F0C992A2F1F0000A6EEB7 /* SceneDelegate.h */,
+ 1A7F0C9A2A2F1F0000A6EEB7 /* SceneDelegate.m */,
+ 1A7F0C9C2A2F1F0000A6EEB7 /* ViewController.h */,
+ 1A7F0C9D2A2F1F0000A6EEB7 /* ViewController.mm */,
+ 1A7F0DBC2A2F221C00A6EEB7 /* AudioCapture.h */,
+ 1A7F0DBB2A2F221C00A6EEB7 /* AudioCapture.mm */,
+ 1A7F0DBA2A2F221C00A6EEB7 /* AudioRecorder.h */,
+ 1A7F0DBD2A2F221C00A6EEB7 /* AudioRecorder.m */,
+ 1A7F0C9F2A2F1F0000A6EEB7 /* Main.storyboard */,
+ 1A7F0CA22A2F1F0200A6EEB7 /* Assets.xcassets */,
+ 1A7F0CA42A2F1F0200A6EEB7 /* LaunchScreen.storyboard */,
+ 1A7F0CA72A2F1F0200A6EEB7 /* Info.plist */,
+ 1A7F0CA82A2F1F0200A6EEB7 /* main.m */,
+ );
+ path = paraformer_online;
+ sourceTree = "<group>";
+ };
+ 1A7F0DB52A2F1FC400A6EEB7 /* Frameworks */ = {
+ isa = PBXGroup;
+ children = (
+ 1A7F0DB82A2F20B900A6EEB7 /* libc++.1.tbd */,
+ 1A7F0DB62A2F1FC400A6EEB7 /* Accelerate.framework */,
+ EA7D0713E60886A787BAA0EA /* Pods_paraformer_online.framework */,
+ );
+ name = Frameworks;
+ sourceTree = "<group>";
+ };
+ 1AB8E1CD2AA086F200F4F795 /* include */ = {
+ isa = PBXGroup;
+ children = (
+ 1AB8E1CE2AA086F200F4F795 /* tclap */,
+ 1AB8E1E82AA086F200F4F795 /* com-define.h */,
+ 1AB8E1E92AA086F200F4F795 /* funasrruntime.h */,
+ 1AB8E1EA2AA086F200F4F795 /* tpass-online-stream.h */,
+ 1AB8E1EB2AA086F200F4F795 /* audio.h */,
+ 1AB8E1EC2AA086F200F4F795 /* punc-model.h */,
+ 1AB8E1ED2AA086F200F4F795 /* tpass-stream.h */,
+ 1AB8E1EE2AA086F200F4F795 /* model.h */,
+ 1AB8E1EF2AA086F200F4F795 /* offline-stream.h */,
+ 1AB8E1F02AA086F200F4F795 /* vad-model.h */,
+ );
+ name = include;
+ path = ../../../onnxruntime/include;
+ sourceTree = "<group>";
+ };
+ 1AB8E1CE2AA086F200F4F795 /* tclap */ = {
+ isa = PBXGroup;
+ children = (
+ 1AB8E1CF2AA086F200F4F795 /* CmdLineOutput.h */,
+ 1AB8E1D02AA086F200F4F795 /* ZshCompletionOutput.h */,
+ 1AB8E1D12AA086F200F4F795 /* UnlabeledMultiArg.h */,
+ 1AB8E1D22AA086F200F4F795 /* sstream.h */,
+ 1AB8E1D32AA086F200F4F795 /* MultiArg.h */,
+ 1AB8E1D42AA086F200F4F795 /* IgnoreRestVisitor.h */,
+ 1AB8E1D52AA086F200F4F795 /* XorHandler.h */,
+ 1AB8E1D62AA086F200F4F795 /* Arg.h */,
+ 1AB8E1D72AA086F200F4F795 /* HelpVisitor.h */,
+ 1AB8E1D82AA086F200F4F795 /* StdOutput.h */,
+ 1AB8E1D92AA086F200F4F795 /* ArgTraits.h */,
+ 1AB8E1DA2AA086F200F4F795 /* CmdLine.h */,
+ 1AB8E1DB2AA086F200F4F795 /* DocBookOutput.h */,
+ 1AB8E1DC2AA086F200F4F795 /* StandardTraits.h */,
+ 1AB8E1DD2AA086F200F4F795 /* Visitor.h */,
+ 1AB8E1DE2AA086F200F4F795 /* VersionVisitor.h */,
+ 1AB8E1DF2AA086F200F4F795 /* ValueArg.h */,
+ 1AB8E1E02AA086F200F4F795 /* ValuesConstraint.h */,
+ 1AB8E1E12AA086F200F4F795 /* UnlabeledValueArg.h */,
+ 1AB8E1E22AA086F200F4F795 /* Constraint.h */,
+ 1AB8E1E32AA086F200F4F795 /* CmdLineInterface.h */,
+ 1AB8E1E42AA086F200F4F795 /* SwitchArg.h */,
+ 1AB8E1E52AA086F200F4F795 /* OptionalUnlabeledTracker.h */,
+ 1AB8E1E62AA086F200F4F795 /* MultiSwitchArg.h */,
+ 1AB8E1E72AA086F200F4F795 /* ArgException.h */,
+ );
+ path = tclap;
+ sourceTree = "<group>";
+ };
+ 1F202C29EAE1D21FD07F8024 /* Pods */ = {
+ isa = PBXGroup;
+ children = (
+ B9ED2A36675364C815C03C96 /* Pods-paraformer_online.debug.xcconfig */,
+ 00FB7DEC958626AACE224936 /* Pods-paraformer_online.release.xcconfig */,
+ );
+ path = Pods;
+ sourceTree = "<group>";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 1A7F0C922A2F1F0000A6EEB7 /* paraformer_online */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 1A7F0CAC2A2F1F0200A6EEB7 /* Build configuration list for PBXNativeTarget "paraformer_online" */;
+ buildPhases = (
+ 03A279E5233947949D415946 /* [CP] Check Pods Manifest.lock */,
+ 1A7F0C8F2A2F1F0000A6EEB7 /* Sources */,
+ 1A7F0C902A2F1F0000A6EEB7 /* Frameworks */,
+ 1A7F0C912A2F1F0000A6EEB7 /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = paraformer_online;
+ productName = paraformer_online;
+ productReference = 1A7F0C932A2F1F0000A6EEB7 /* paraformer_online.app */;
+ productType = "com.apple.product-type.application";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 1A7F0C8B2A2F1F0000A6EEB7 /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastUpgradeCheck = 1430;
+ TargetAttributes = {
+ 1A7F0C922A2F1F0000A6EEB7 = {
+ CreatedOnToolsVersion = 14.3;
+ };
+ };
+ };
+ buildConfigurationList = 1A7F0C8E2A2F1F0000A6EEB7 /* Build configuration list for PBXProject "paraformer_online" */;
+ compatibilityVersion = "Xcode 14.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 1A7F0C8A2A2F1F0000A6EEB7;
+ productRefGroup = 1A7F0C942A2F1F0000A6EEB7 /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 1A7F0C922A2F1F0000A6EEB7 /* paraformer_online */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 1A7F0C912A2F1F0000A6EEB7 /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1A7F0CA62A2F1F0200A6EEB7 /* LaunchScreen.storyboard in Resources */,
+ 1A7F0CA32A2F1F0200A6EEB7 /* Assets.xcassets in Resources */,
+ 1A6C93FA2A84D66E007E36DC /* logging.h.in in Resources */,
+ 1A6C93FB2A84D66E007E36DC /* stl_logging.h.in in Resources */,
+ 1A6C93DB2A84D66E007E36DC /* CMakeLists.txt.bak in Resources */,
+ 1A6C93FE2A84D66E007E36DC /* config.h.cmake.in in Resources */,
+ 1A6C93F92A84D66E007E36DC /* vlog_is_on.h.in in Resources */,
+ 1A7F0DC32A2F312D00A6EEB7 /* model in Resources */,
+ 1A7F0CA12A2F1F0000A6EEB7 /* Main.storyboard in Resources */,
+ 1A6C93FC2A84D66E007E36DC /* raw_logging.h.in in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXShellScriptBuildPhase section */
+ 03A279E5233947949D415946 /* [CP] Check Pods Manifest.lock */ = {
+ isa = PBXShellScriptBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ inputFileListPaths = (
+ );
+ inputPaths = (
+ "${PODS_PODFILE_DIR_PATH}/Podfile.lock",
+ "${PODS_ROOT}/Manifest.lock",
+ );
+ name = "[CP] Check Pods Manifest.lock";
+ outputFileListPaths = (
+ );
+ outputPaths = (
+ "$(DERIVED_FILE_DIR)/Pods-paraformer_online-checkManifestLockResult.txt",
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ shellPath = /bin/sh;
+ shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n";
+ showEnvVarsInLog = 0;
+ };
+/* End PBXShellScriptBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 1A7F0C8F2A2F1F0000A6EEB7 /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 1A6C93052A84D64E007E36DC /* paraformer.cpp in Sources */,
+ 1A6C94022A84D66E007E36DC /* demangle.cc in Sources */,
+ 1A6C94122A84D66E007E36DC /* scanscalar.cpp in Sources */,
+ 1A6C941D2A84D66E007E36DC /* tag.cpp in Sources */,
+ 1A6C94252A84D66E007E36DC /* emitterstate.cpp in Sources */,
+ 1A6C93152A84D64E007E36DC /* funasrruntime.cpp in Sources */,
+ 1A6C93122A84D64E007E36DC /* fsmn-vad-online.cpp in Sources */,
+ 1A6C940D2A84D66E007E36DC /* simplekey.cpp in Sources */,
+ 1A6C94182A84D66E007E36DC /* nodeevents.cpp in Sources */,
+ 1A7F0C9E2A2F1F0000A6EEB7 /* ViewController.mm in Sources */,
+ 1A7F0C982A2F1F0000A6EEB7 /* AppDelegate.m in Sources */,
+ 1A7F0DBE2A2F221C00A6EEB7 /* AudioCapture.mm in Sources */,
+ 1A6C94162A84D66E007E36DC /* singledocparser.cpp in Sources */,
+ 1A6C940C2A84D66E007E36DC /* emitfromevents.cpp in Sources */,
+ 1A6C930D2A84D64E007E36DC /* audio.cpp in Sources */,
+ 1A6C93DD2A84D66E007E36DC /* mel-computations.cc in Sources */,
+ 1A6C94242A84D66E007E36DC /* node_data.cpp in Sources */,
+ 1A7F0CA92A2F1F0200A6EEB7 /* main.m in Sources */,
+ 1A6C930C2A84D64E007E36DC /* resample.cpp in Sources */,
+ 1A6C94002A84D66E007E36DC /* signalhandler.cc in Sources */,
+ 1A6C94262A84D66E007E36DC /* parser.cpp in Sources */,
+ 1A6C93142A84D64E007E36DC /* model.cpp in Sources */,
+ 1A6C941E2A84D66E007E36DC /* emitterutils.cpp in Sources */,
+ 1A6C94112A84D66E007E36DC /* regex_yaml.cpp in Sources */,
+ 1A6C93112A84D64E007E36DC /* tpass-stream.cpp in Sources */,
+ 1A6C93172A84D64E007E36DC /* punc-model.cpp in Sources */,
+ 1A6C93DA2A84D66E007E36DC /* rfft.cc in Sources */,
+ 1A7F0C9B2A2F1F0000A6EEB7 /* SceneDelegate.m in Sources */,
+ 1A6C940A2A84D66E007E36DC /* memory.cpp in Sources */,
+ 1A6C93D52A84D66E007E36DC /* online-feature.cc in Sources */,
+ 1A6C93132A84D64E007E36DC /* ct-transformer.cpp in Sources */,
+ 1A6C930B2A84D64E007E36DC /* alignedmem.cpp in Sources */,
+ 1A7F0DBF2A2F221C00A6EEB7 /* AudioRecorder.m in Sources */,
+ 1A6C930E2A84D64E007E36DC /* tokenizer.cpp in Sources */,
+ 1A6C93DC2A84D66E007E36DC /* feature-window.cc in Sources */,
+ 1A6C940E2A84D66E007E36DC /* parse.cpp in Sources */,
+ 1A6C93F82A84D66E007E36DC /* vlog_is_on.cc in Sources */,
+ 1A6C93F62A84D66E007E36DC /* utilities.cc in Sources */,
+ 1A6C94192A84D66E007E36DC /* graphbuilderadapter.cpp in Sources */,
+ 1A6C94232A84D66E007E36DC /* directives.cpp in Sources */,
+ 1A6C94202A84D66E007E36DC /* scantag.cpp in Sources */,
+ 1A6C93182A84D64E007E36DC /* vad-model.cpp in Sources */,
+ 1A6C93092A84D64E007E36DC /* fsmn-vad.cpp in Sources */,
+ 1A6C93E02A84D66E007E36DC /* feature-functions.cc in Sources */,
+ 1A6C93F72A84D66E007E36DC /* symbolize.cc in Sources */,
+ 1A6C93062A84D64E007E36DC /* util.cpp in Sources */,
+ 1A6C94222A84D66E007E36DC /* nodebuilder.cpp in Sources */,
+ 1A6C94132A84D66E007E36DC /* exp.cpp in Sources */,
+ 1A6C930A2A84D64E007E36DC /* vocab.cpp in Sources */,
+ 1A6C94012A84D66E007E36DC /* logging.cc in Sources */,
+ 1A6C941F2A84D66E007E36DC /* stream.cpp in Sources */,
+ 1A6C94102A84D66E007E36DC /* convert.cpp in Sources */,
+ 1A6C94032A84D66E007E36DC /* fuzz_demangle.cc in Sources */,
+ 1A6C94172A84D66E007E36DC /* binary.cpp in Sources */,
+ 1A6C93102A84D64E007E36DC /* offline-stream.cpp in Sources */,
+ 1A6C94212A84D66E007E36DC /* scantoken.cpp in Sources */,
+ 1A6C930F2A84D64E007E36DC /* tpass-online-stream.cpp in Sources */,
+ 1A6C941C2A84D66E007E36DC /* emit.cpp in Sources */,
+ 1A6C940F2A84D66E007E36DC /* emitter.cpp in Sources */,
+ 1A6C93DE2A84D66E007E36DC /* fftsg.c in Sources */,
+ 1A6C940B2A84D66E007E36DC /* ostream_wrapper.cpp in Sources */,
+ 1A6C93E12A84D66E007E36DC /* log.cc in Sources */,
+ 1A6C94092A84D66E007E36DC /* exceptions.cpp in Sources */,
+ 1A6C94152A84D66E007E36DC /* node.cpp in Sources */,
+ 1A6C94142A84D66E007E36DC /* null.cpp in Sources */,
+ 1A6C941A2A84D66E007E36DC /* graphbuilder.cpp in Sources */,
+ 1A6C941B2A84D66E007E36DC /* scanner.cpp in Sources */,
+ 1A6C93162A84D64E007E36DC /* paraformer-online.cpp in Sources */,
+ 1A6C93072A84D64E007E36DC /* ct-transformer-online.cpp in Sources */,
+ 1A6C93D42A84D66E007E36DC /* feature-fbank.cc in Sources */,
+ 1A6C93FD2A84D66E007E36DC /* raw_logging.cc in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXVariantGroup section */
+ 1A7F0C9F2A2F1F0000A6EEB7 /* Main.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 1A7F0CA02A2F1F0000A6EEB7 /* Base */,
+ );
+ name = Main.storyboard;
+ sourceTree = "<group>";
+ };
+ 1A7F0CA42A2F1F0200A6EEB7 /* LaunchScreen.storyboard */ = {
+ isa = PBXVariantGroup;
+ children = (
+ 1A7F0CA52A2F1F0200A6EEB7 /* Base */,
+ );
+ name = LaunchScreen.storyboard;
+ sourceTree = "<group>";
+ };
+/* End PBXVariantGroup section */
+
+/* Begin XCBuildConfiguration section */
+ 1A7F0CAA2A2F1F0200A6EEB7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.4;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SDKROOT = iphoneos;
+ };
+ name = Debug;
+ };
+ 1A7F0CAB2A2F1F0200A6EEB7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu11;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 16.4;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SDKROOT = iphoneos;
+ VALIDATE_PRODUCT = YES;
+ };
+ name = Release;
+ };
+ 1A7F0CAD2A2F1F0200A6EEB7 /* Debug */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = B9ED2A36675364C815C03C96 /* Pods-paraformer_online.debug.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = 834ZC97578;
+ GCC_PREPROCESSOR_DEFINITIONS = HAVE_CLAPACK;
+ GENERATE_INFOPLIST_FILE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/yaml-cpp/include",
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/kaldi-native-fbank",
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/glog/src",
+ "$(PROJECT_DIR)/paraformer_online/include",
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/",
+ "$(PROJECT_DIR)/paraformer_online/",
+ );
+ INFOPLIST_FILE = paraformer_online/Info.plist;
+ INFOPLIST_KEY_NSMicrophoneUsageDescription = "鎴戣浣跨敤楹﹀厠椋�";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.qiuwei.paraformer-online";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 1A7F0CAE2A2F1F0200A6EEB7 /* Release */ = {
+ isa = XCBuildConfiguration;
+ baseConfigurationReference = 00FB7DEC958626AACE224936 /* Pods-paraformer_online.release.xcconfig */;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_TEAM = 834ZC97578;
+ GCC_PREPROCESSOR_DEFINITIONS = HAVE_CLAPACK;
+ GENERATE_INFOPLIST_FILE = YES;
+ HEADER_SEARCH_PATHS = (
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/yaml-cpp/include",
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/kaldi-native-fbank",
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/glog/src",
+ "$(PROJECT_DIR)/paraformer_online/include",
+ "$(PROJECT_DIR)/../../onnxruntime/third_party/",
+ "$(PROJECT_DIR)/paraformer_online/",
+ );
+ INFOPLIST_FILE = paraformer_online/Info.plist;
+ INFOPLIST_KEY_NSMicrophoneUsageDescription = "鎴戣浣跨敤楹﹀厠椋�";
+ INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents = YES;
+ INFOPLIST_KEY_UILaunchStoryboardName = LaunchScreen;
+ INFOPLIST_KEY_UIMainStoryboardFile = Main;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 14.0;
+ LD_RUNPATH_SEARCH_PATHS = (
+ "$(inherited)",
+ "@executable_path/Frameworks",
+ );
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = "com.qiuwei.paraformer-online";
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 1A7F0C8E2A2F1F0000A6EEB7 /* Build configuration list for PBXProject "paraformer_online" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1A7F0CAA2A2F1F0200A6EEB7 /* Debug */,
+ 1A7F0CAB2A2F1F0200A6EEB7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 1A7F0CAC2A2F1F0200A6EEB7 /* Build configuration list for PBXNativeTarget "paraformer_online" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 1A7F0CAD2A2F1F0200A6EEB7 /* Debug */,
+ 1A7F0CAE2A2F1F0200A6EEB7 /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+ };
+ rootObject = 1A7F0C8B2A2F1F0000A6EEB7 /* Project object */;
+}
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/contents.xcworkspacedata
new file mode 100644
index 0000000..919434a
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/contents.xcworkspacedata
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Workspace
+ version = "1.0">
+ <FileRef
+ location = "self:">
+ </FileRef>
+</Workspace>
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/xcuserdata/qiuwei.xcuserdatad/UserInterfaceState.xcuserstate b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/xcuserdata/qiuwei.xcuserdatad/UserInterfaceState.xcuserstate
new file mode 100644
index 0000000..0eb7aef
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/project.xcworkspace/xcuserdata/qiuwei.xcuserdatad/UserInterfaceState.xcuserstate
Binary files differ
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
new file mode 100644
index 0000000..f7c7588
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Bucket
+ uuid = "A434E096-73C6-4C03-86F5-FAA8A72D79B0"
+ type = "1"
+ version = "2.0">
+</Bucket>
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcschemes/xcschememanagement.plist b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcschemes/xcschememanagement.plist
new file mode 100644
index 0000000..81a245a
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online.xcodeproj/xcuserdata/qiuwei.xcuserdatad/xcschemes/xcschememanagement.plist
@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>SchemeUserState</key>
+ <dict>
+ <key>paraformer_online.xcscheme_^#shared#^_</key>
+ <dict>
+ <key>orderHint</key>
+ <integer>2</integer>
+ </dict>
+ </dict>
+</dict>
+</plist>
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.h b/funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.h
new file mode 100644
index 0000000..0bba555
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.h
@@ -0,0 +1,19 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// AppDelegate.h
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface AppDelegate : UIResponder <UIApplicationDelegate>
+
+
+@end
+
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.m b/funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.m
new file mode 100644
index 0000000..de29bb1
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/AppDelegate.m
@@ -0,0 +1,45 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// AppDelegate.m
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import "AppDelegate.h"
+
+@interface AppDelegate ()
+
+@end
+
+@implementation AppDelegate
+
+
+- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
+ // Override point for customization after application launch.
+ return YES;
+}
+
+
+#pragma mark - UISceneSession lifecycle
+
+
+- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options {
+ // Called when a new scene session is being created.
+ // Use this method to select a configuration to create the new scene with.
+ return [[UISceneConfiguration alloc] initWithName:@"Default Configuration" sessionRole:connectingSceneSession.role];
+}
+
+
+- (void)application:(UIApplication *)application didDiscardSceneSessions:(NSSet<UISceneSession *> *)sceneSessions {
+ // Called when the user discards a scene session.
+ // If any sessions were discarded while the application was not running, this will be called shortly after application:didFinishLaunchingWithOptions.
+ // Use this method to release any resources that were specific to the discarded scenes, as they will not return.
+}
+
+
+@end
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AccentColor.colorset/Contents.json b/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 0000000..eb87897
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AppIcon.appiconset/Contents.json b/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 0000000..13613e3
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,13 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/Contents.json b/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/Contents.json
new file mode 100644
index 0000000..73c0059
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.h b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.h
new file mode 100644
index 0000000..6c4d7c1
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.h
@@ -0,0 +1,30 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// AudioCapture.h
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import <Foundation/Foundation.h>
+
+NS_ASSUME_NONNULL_BEGIN
+
+typedef void (^SpeechRecognitionBlock)(NSString *result);
+
+@interface AudioCapture : NSObject
+
+@property (nonatomic,copy) SpeechRecognitionBlock resultBlock;
+
+- (id)initWithOnnxModel:(BOOL)onnxModel;
+
+- (void)startRecorder;
+- (void)stopRecorder;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.mm b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.mm
new file mode 100644
index 0000000..1917b6b
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioCapture.mm
@@ -0,0 +1,279 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// AudioCapture.m
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import "AudioCapture.h"
+#import <AVFoundation/AVFoundation.h>
+#include <thread>
+
+#import "AudioRecorder.h"
+
+#include "precomp.h"
+
+#define Recorder_Sample_Rate 16000
+#define Samples_Per_Frame (Recorder_Sample_Rate/100)
+
+#define k_input_frames 10
+#define k_left_padding_frames 5
+#define k_right_padding_frames 5
+#define k_input_samples 960 // (60ms)
+
+
+static AudioCapture *selfClass = nil;
+
+@interface AudioCapture ()<AVCaptureAudioDataOutputSampleBufferDelegate>
+
+@property (nonatomic, strong) AVCaptureSession *capture;
+
+@property (nonatomic, copy) NSMutableData *sampleData;
+
+@property (nonatomic, strong) AudioRecorder *audioRecorder;
+
+@property (nonatomic, assign) BOOL isRecording;
+
+@property (nonatomic, strong) NSLock *lock;
+
+@end
+
+using namespace funasr;
+
+@implementation AudioCapture
+{
+ const char* output_path;
+ void* denoiser;
+ void* resampler;
+
+// Paraformer_stream *stream_;
+
+ FUNASR_HANDLE asr_handle_;
+ FUNASR_HANDLE online_handle_;
+
+ bool is_onnx;
+
+ char *speech_buff;
+}
+int packetIndex = 0;
+
+- (id)initWithOnnxModel:(BOOL)onnxModel
+{
+ self = [super init];
+ if (self) {
+ is_onnx = onnxModel ? true : false;
+
+ if (is_onnx) {
+ [self initASROnnx];
+ } else {
+// [self initASR];
+ }
+ self.isRecording = NO;
+
+ NSLog(@"model init done!");
+ }
+ return self;
+}
+
+void S16ToFloatS16_1(const int16_t* src, size_t size, float* dest) {
+ for (size_t i = 0; i < size; ++i)
+ dest[i] = (float)src[i];
+}
+
+void CharToFloat(const char* src, size_t size, float* dst) {
+ const int16_t* sample_data = reinterpret_cast<const int16_t*>(src);
+ S16ToFloatS16_1(sample_data, size/2, dst);
+}
+
+void CharToFloat_1(const char* src, size_t size, float* dst) {
+ const int16_t* sample_data = reinterpret_cast<const int16_t*>(src);
+// length = length/2;
+ float data_f[Samples_Per_Frame] = {0.0};
+ S16ToFloatS16_1(sample_data, size/2, data_f);
+
+// float data_f_norm[480];
+ for (int i = 0; i < Samples_Per_Frame; i++) {
+ dst[i] = data_f[i] / 32767.0;
+ }
+}
+
+void CharToS16(const char* src, size_t src_size, short* dst) {
+ const int16_t* sample_data = reinterpret_cast<const int16_t*>(src);
+ for (int i = 0; i < src_size/2; i++) {
+ dst[i] = sample_data[i];
+ }
+}
+
+- (void)initASROnnx {
+ NSString *model_file_path = [[NSBundle mainBundle] pathForResource:@"config" ofType:@".yaml" inDirectory:@"model"];
+ model_file_path = [model_file_path stringByReplacingOccurrencesOfString:@"config.yaml" withString:@""];
+ const char* model_dir= [model_file_path UTF8String];
+
+ std::map<std::string, std::string> model_path;
+ model_path.insert({MODEL_DIR, model_dir});
+ model_path.insert({QUANTIZE, "true"});
+
+ struct timeval start, end;
+// gettimeofday(&start, NULL);
+ int thread_num = 1;
+ asr_handle_ = FunASRInit(model_path, thread_num, ASR_ONLINE);
+
+ if (!asr_handle_)
+ {
+ std::cout << "FunVad init failed" << std::endl;
+ }
+
+// gettimeofday(&end, NULL);
+ long seconds = (end.tv_sec - start.tv_sec);
+ long modle_init_micros = ((seconds * 1000000) + end.tv_usec) - (start.tv_usec);
+ std::cout << "Model initialization takes " << (double)modle_init_micros / 1000000 << " s" << std::endl;
+
+ string default_id = "wav_default_id";
+
+ // init online features
+ online_handle_ = FunASROnlineInit(asr_handle_);
+
+}
+
+//static FILE *pf_file_out = NULL;
+//int audio_index = 0;
+- (void)startRecorder {
+ selfClass = self;
+
+ __weak __typeof(self) weakSelf = self;
+ [self.sampleData setLength:0];
+ // audio record call-back
+// float speech[10 * 960];
+ speech_buff = (char *)calloc(10*960*2, sizeof(char));
+ __block int speech_idx = 0;
+ self.audioRecorder.inputBlock = ^(NSData *speechData) {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ __strong __typeof(weakSelf) strongSelf = weakSelf;
+ if (weakSelf.isRecording) {
+// [weakSelf appendPCMData:speechData]; // DUBUG USE: append audio data, Memory increment
+ const char* buffer = (const char*)speechData.bytes;
+ int length = (int)speechData.length;
+
+ if (strongSelf->is_onnx) {
+// char speech_buff[9600*2];
+ int step = 9600*2;
+
+ memcpy(speech_buff+length*speech_idx, buffer, length*sizeof(char));
+
+ // FIX: You can change it to a ring buffer
+ if (speech_idx == k_input_frames*6-1) {
+ FUNASR_RESULT result = FunASRInferBuffer(strongSelf->online_handle_, speech_buff, step, RASR_NONE, NULL, false, 16000);
+
+ memset(speech_buff, 0, step * sizeof(char));
+ speech_idx = 0;
+
+ if (result)
+ {
+ string msg = FunASRGetResult(result, 0);
+// std::cout<<msg << std::endl;
+ FunASRFreeResult(result);
+
+ if (strongSelf.resultBlock) {
+ strongSelf.resultBlock([NSString stringWithUTF8String:msg.c_str()]);
+ }
+ }
+
+
+ } else {
+ speech_idx++;
+ }
+
+
+ } else {
+
+
+ }
+ }
+ });
+ };
+ [self.audioRecorder start];
+ self.isRecording = YES;
+}
+
+- (void)pushData {
+}
+
+- (void)stopRecorder {
+ self.isRecording = NO;
+ if (is_onnx) {
+ FunASRUninit(asr_handle_);
+ FunASRUninit(online_handle_);
+ }
+
+ free(speech_buff);
+
+ [self.audioRecorder stop];
+ [self writeData];
+
+ /////
+// const char* buffer = (const char*)self.sampleData.bytes;
+// int length = (int)self.sampleData.length;
+//
+// float *input_data = (float *)malloc(sizeof(float) * (length/2));
+// CharToFloat(buffer, length, input_data);
+//
+// std::string msg = stream_->Process(input_data, length/2);
+// NSString *result = [NSString stringWithUTF8String:msg.c_str()];
+//
+// if (self.resultBlock) {
+// self.resultBlock(result);
+// }
+//
+// free(input_data);
+
+}
+
+- (BOOL)writeData {
+ return [self.sampleData writeToFile:[self getPCMPath] atomically:NO];
+}
+
+- (void)appendPCMData:(NSData *)pcmData {
+ [self audioProcessing:pcmData];
+}
+
+- (void)audioProcessing:(NSData *)data {
+ [self.sampleData appendData:data];
+}
+
+- (NSMutableData *)sampleData {
+ if (!_sampleData) {
+ _sampleData = [NSMutableData data];
+ }
+
+ return _sampleData;
+}
+
+- (AudioRecorder *)audioRecorder {
+ if (!_audioRecorder) {
+ _audioRecorder = [[AudioRecorder alloc] init];
+ }
+
+ return _audioRecorder;
+}
+
+- (NSLock *)lock {
+ if (!_lock) {
+ _lock = [NSLock new];
+ }
+
+ return _lock;
+}
+
+- (NSString *)getPCMPath {
+ NSString *directoryS = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) firstObject];
+ NSString *directory = [directoryS stringByAppendingPathComponent:@"mic_ori.pcm"];
+ return directory;
+}
+
+
+@end
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.h b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.h
new file mode 100644
index 0000000..8d580e0
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.h
@@ -0,0 +1,49 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// AudioRecorder.h
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import <Foundation/Foundation.h>
+#import <AudioToolbox/AudioToolbox.h>
+#import <AVFoundation/AVFoundation.h>
+
+
+NS_ASSUME_NONNULL_BEGIN
+
+#define RECORDER_NOTIFICATION_CALLBACK_NAME @"recorderNotificationCallBackName"
+#define kNumberAudioQueueBuffers 3 //缂撳啿鍖鸿瀹�3涓�
+#define kDefaultSampleRate 16000 //閲囨牱鐜�
+#define kBufferByteSize (kDefaultSampleRate/100*2)//960
+#define kDataSize 2048
+
+typedef void (^AudioRecorder_inputBlock)(NSData *speechData);
+
+@interface AudioRecorder : NSObject
+{
+ AudioQueueRef _audioQueue;
+ AudioStreamBasicDescription audioFormat;
+ AudioQueueBufferRef _audioBuffers[kNumberAudioQueueBuffers];
+ char data[kDataSize];
+ int offset;
+
+}
+
+@property (nonatomic, assign) BOOL isRecording;
+@property (atomic, assign) NSUInteger sampleRate;
+
+@property (nonatomic,copy) AudioRecorder_inputBlock inputBlock;
+
+-(void)start;
+
+-(void)stop;
+
+@end
+
+NS_ASSUME_NONNULL_END
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.m b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.m
new file mode 100644
index 0000000..821b8e0
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/AudioRecorder.m
@@ -0,0 +1,140 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// AudioRecorder.m
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import "AudioRecorder.h"
+
+
+
+@implementation AudioRecorder
+
+- (id)init
+{
+ self = [super init];
+ if (self) {
+
+ self.sampleRate = kDefaultSampleRate;
+
+ //璁剧疆褰曢煶 鍒濆鍖栧綍闊冲弬鏁�
+ [self setupAudioFormat:kAudioFormatLinearPCM SampleRate:(int)self.sampleRate];
+
+ }
+ return self;
+}
+//璁剧疆褰曢煶 鍒濆鍖栧綍闊冲弬鏁�
+- (void)setupAudioFormat:(UInt32)inFormatID SampleRate:(int)sampeleRate
+{
+
+ memset(&audioFormat, 0, sizeof(audioFormat));
+
+ audioFormat.mSampleRate = sampeleRate;//閲囨牱鐜�
+ audioFormat.mChannelsPerFrame = 1;//鍗曞0閬�
+
+ audioFormat.mFormatID = inFormatID;//閲囬泦pcm 鏍煎紡
+ audioFormat.mFormatFlags = kLinearPCMFormatFlagIsSignedInteger | kLinearPCMFormatFlagIsPacked;
+ audioFormat.mBitsPerChannel = 16;//姣忎釜閫氶亾閲囬泦2涓猙yte
+ audioFormat.mBytesPerPacket = audioFormat.mBytesPerFrame = (audioFormat.mBitsPerChannel / 8) * audioFormat.mChannelsPerFrame;
+ audioFormat.mFramesPerPacket = 1;
+
+}
+
+//鍥炶皟鍑芥暟 涓嶆柇閲囬泦澹伴煶銆�
+void inputHandler(void *inUserData, AudioQueueRef inAQ, AudioQueueBufferRef inBuffer, const AudioTimeStamp *inStartTime,UInt32 inNumPackets, const AudioStreamPacketDescription *inPacketDesc)
+{
+
+ AudioRecorder *recorder = (__bridge AudioRecorder*)inUserData;
+
+ int k = 0;
+ if (inBuffer->mAudioDataByteSize > 0) {
+// NSLog(@"size: %d", inBuffer->mAudioDataByteSize);
+ memcpy(recorder->data+recorder->offset,inBuffer->mAudioData,inBuffer->mAudioDataByteSize);//閫氳繃recorder->offset 鍋忕Щ鎶婅闊虫暟鎹瓨鍏ecorder->data
+
+ recorder->offset+=inBuffer->mAudioDataByteSize;//璁板綍璇煶鏁版嵁鐨勫ぇ灏�
+
+ k = recorder->offset/kBufferByteSize;//璁$畻璇煶鏁版嵁鏈夊涓�960涓瓧鑺傝闊�
+
+ for(int i = 0; i <k; i++)
+ {
+
+ NSData *SpeechData = [[NSData alloc]initWithBytes:recorder->data+i*kBufferByteSize length:kBufferByteSize];//鎶妑ecorder->data 鏁版嵁浠�960涓瓧鑺傚垎鍒囨斁鍏� 浼犲嚭鐨勬暟缁勪腑銆�
+ [[NSNotificationCenter defaultCenter] postNotificationName:RECORDER_NOTIFICATION_CALLBACK_NAME object:SpeechData];
+ if (recorder.inputBlock) {
+ recorder.inputBlock(SpeechData);
+ }
+ }
+
+// NSLog(@"sampleRate: %lu", (unsigned long)recorder->_sampleRate);
+ memcpy(recorder->data,recorder->data+k*kBufferByteSize,recorder->offset-(k*kBufferByteSize));//鎶婂墿涓嬬殑璇煶鏁版嵁鏀惧叆鍘熸潵鐨勬暟缁勪腑
+
+ recorder->offset-=(k*kBufferByteSize);//璁$畻鍓╀笅鐨勮闊虫暟鎹ぇ灏�
+
+
+ }
+
+ if (recorder.isRecording) {
+
+ AudioQueueEnqueueBuffer(inAQ, inBuffer, 0, NULL);
+
+ }
+
+}
+//寮�濮嬪綍闊�
+-(void)start
+{
+ NSError *error = nil;
+
+ //褰曢煶鐨勮缃拰鍒濆鍖�
+ BOOL ret = [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategoryPlayAndRecord error:&error];
+ if (!ret) {
+ return;
+ }
+
+ //鍚敤audio session
+ ret = [[AVAudioSession sharedInstance] setActive:YES error:&error];
+ if (!ret)
+ {
+ return;
+ }
+
+
+ //鍒濆鍖栫紦鍐茶闊虫暟鎹暟缁�
+ memset(data,0,kDataSize); // 娓呯┖
+ offset = 0;
+ audioFormat.mSampleRate = self.sampleRate;
+ //鍒濆鍖栭煶棰戣緭鍏ラ槦鍒�
+ AudioQueueNewInput(&audioFormat, inputHandler, (__bridge void *)(self), NULL, NULL, 0, &_audioQueue);
+
+ int bufferByteSize = kBufferByteSize; //璁惧畾閲囬泦涓�甯�960涓瓧鑺�
+
+ //鍒涘缓缂撳啿鍣�
+ for (int i = 0; i < kNumberAudioQueueBuffers; ++i){
+ AudioQueueAllocateBuffer(_audioQueue, bufferByteSize, &_audioBuffers[i]);
+ AudioQueueEnqueueBuffer(_audioQueue, _audioBuffers[i], 0, NULL);
+ }
+
+ //寮�濮嬪綍闊�
+ AudioQueueStart(_audioQueue, NULL);
+ self.isRecording = YES;
+}
+
+//缁撴潫褰曢煶
+-(void)stop
+{
+ if (self.isRecording) {
+ self.isRecording = NO;
+ AudioQueueStop(_audioQueue, true);
+ AudioQueueDispose(_audioQueue, true);
+ [[AVAudioSession sharedInstance] setActive:NO error:nil];
+ [[AVAudioSession sharedInstance] setCategory:AVAudioSessionCategorySoloAmbient error:nil];
+ }
+}
+
+@end
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/LaunchScreen.storyboard b/funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/LaunchScreen.storyboard
new file mode 100644
index 0000000..865e932
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/LaunchScreen.storyboard
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="13122.16" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" launchScreen="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="01J-lp-oVM">
+ <dependencies>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="13104.12"/>
+ <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="EHf-IW-A2E">
+ <objects>
+ <viewController id="01J-lp-oVM" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="Ze5-6b-2t3">
+ <rect key="frame" x="0.0" y="0.0" width="375" height="667"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <color key="backgroundColor" xcode11CocoaTouchSystemColor="systemBackgroundColor" cocoaTouchSystemColor="whiteColor"/>
+ <viewLayoutGuide key="safeArea" id="6Tk-OE-BBY"/>
+ </view>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="iYj-Kq-Ea1" userLabel="First Responder" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="53" y="375"/>
+ </scene>
+ </scenes>
+</document>
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/Main.storyboard b/funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/Main.storyboard
new file mode 100644
index 0000000..ec4b35c
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/Base.lproj/Main.storyboard
@@ -0,0 +1,78 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="21701" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" useSafeAreas="YES" colorMatched="YES" initialViewController="LNx-YM-oyd">
+ <device id="retina6_12" orientation="portrait" appearance="light"/>
+ <dependencies>
+ <deployment identifier="iOS"/>
+ <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="21678"/>
+ <capability name="Safe area layout guides" minToolsVersion="9.0"/>
+ <capability name="System colors in document resources" minToolsVersion="11.0"/>
+ <capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
+ </dependencies>
+ <scenes>
+ <!--View Controller-->
+ <scene sceneID="LKx-p6-aa7">
+ <objects>
+ <viewController id="LNx-YM-oyd" customClass="ViewController" sceneMemberID="viewController">
+ <view key="view" contentMode="scaleToFill" id="f9i-bJ-nwR">
+ <rect key="frame" x="0.0" y="0.0" width="393" height="852"/>
+ <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
+ <subviews>
+ <textView clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="scaleToFill" textAlignment="natural" translatesAutoresizingMaskIntoConstraints="NO" id="a90-mD-VNo">
+ <rect key="frame" x="20" y="79" width="353" height="549"/>
+ <color key="backgroundColor" white="0.0" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <color key="textColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <fontDescription key="fontDescription" type="system" weight="medium" pointSize="22"/>
+ <textInputTraits key="textInputTraits" autocapitalizationType="sentences"/>
+ <connections>
+ <outlet property="delegate" destination="LNx-YM-oyd" id="y7d-6A-9hP"/>
+ </connections>
+ </textView>
+ <button opaque="NO" contentMode="scaleToFill" contentHorizontalAlignment="center" contentVerticalAlignment="center" buttonType="system" lineBreakMode="middleTruncation" translatesAutoresizingMaskIntoConstraints="NO" id="eHG-b8-QrU">
+ <rect key="frame" x="136.66666666666666" y="648" width="119.99999999999997" height="120"/>
+ <color key="backgroundColor" systemColor="systemYellowColor"/>
+ <constraints>
+ <constraint firstAttribute="width" constant="120" id="bNz-tU-Gr3"/>
+ <constraint firstAttribute="height" constant="120" id="juZ-Sc-VF7"/>
+ </constraints>
+ <fontDescription key="fontDescription" type="system" pointSize="22"/>
+ <color key="tintColor" white="0.0" alpha="0.0" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ <inset key="imageEdgeInsets" minX="0.0" minY="0.0" maxX="2.2250738585072014e-308" maxY="0.0"/>
+ <state key="normal" title="寮�濮嬭璇�">
+ <color key="titleColor" white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </state>
+ <state key="selected" title="鍋滄璇磋瘽"/>
+ <connections>
+ <action selector="startButtonClicked:" destination="LNx-YM-oyd" eventType="touchUpInside" id="09b-nJ-q4t"/>
+ </connections>
+ </button>
+ </subviews>
+ <viewLayoutGuide key="safeArea" id="9Vr-PE-hwK"/>
+ <color key="backgroundColor" systemColor="systemBackgroundColor"/>
+ <constraints>
+ <constraint firstItem="a90-mD-VNo" firstAttribute="top" secondItem="9Vr-PE-hwK" secondAttribute="top" constant="20" id="6EP-DI-QiI"/>
+ <constraint firstItem="a90-mD-VNo" firstAttribute="leading" secondItem="9Vr-PE-hwK" secondAttribute="leading" constant="20" id="MyE-dD-mYG"/>
+ <constraint firstItem="9Vr-PE-hwK" firstAttribute="bottom" secondItem="eHG-b8-QrU" secondAttribute="bottom" constant="50" id="gSD-5y-y1j"/>
+ <constraint firstItem="9Vr-PE-hwK" firstAttribute="trailing" secondItem="a90-mD-VNo" secondAttribute="trailing" constant="20" id="psn-ga-kSC"/>
+ <constraint firstItem="eHG-b8-QrU" firstAttribute="top" secondItem="a90-mD-VNo" secondAttribute="bottom" constant="20" id="rvq-Xo-Qv7"/>
+ <constraint firstItem="eHG-b8-QrU" firstAttribute="centerX" secondItem="f9i-bJ-nwR" secondAttribute="centerX" id="vPV-bu-rny"/>
+ </constraints>
+ </view>
+ <connections>
+ <outlet property="resultView" destination="a90-mD-VNo" id="ghN-4g-qXC"/>
+ <outlet property="startButton" destination="eHG-b8-QrU" id="SLc-gU-csB"/>
+ </connections>
+ </viewController>
+ <placeholder placeholderIdentifier="IBFirstResponder" id="vs1-EQ-4px" sceneMemberID="firstResponder"/>
+ </objects>
+ <point key="canvasLocation" x="139.69465648854961" y="3.5211267605633805"/>
+ </scene>
+ </scenes>
+ <resources>
+ <systemColor name="systemBackgroundColor">
+ <color white="1" alpha="1" colorSpace="custom" customColorSpace="genericGamma22GrayColorSpace"/>
+ </systemColor>
+ <systemColor name="systemYellowColor">
+ <color red="1" green="0.80000000000000004" blue="0.0" alpha="1" colorSpace="custom" customColorSpace="sRGB"/>
+ </systemColor>
+ </resources>
+</document>
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/Info.plist b/funasr/runtime/ios/paraformer_online/paraformer_online/Info.plist
new file mode 100644
index 0000000..81ed29b
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/Info.plist
@@ -0,0 +1,25 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
+<plist version="1.0">
+<dict>
+ <key>UIApplicationSceneManifest</key>
+ <dict>
+ <key>UIApplicationSupportsMultipleScenes</key>
+ <false/>
+ <key>UISceneConfigurations</key>
+ <dict>
+ <key>UIWindowSceneSessionRoleApplication</key>
+ <array>
+ <dict>
+ <key>UISceneConfigurationName</key>
+ <string>Default Configuration</string>
+ <key>UISceneDelegateClassName</key>
+ <string>SceneDelegate</string>
+ <key>UISceneStoryboardFile</key>
+ <string>Main</string>
+ </dict>
+ </array>
+ </dict>
+ </dict>
+</dict>
+</plist>
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.h b/funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.h
new file mode 100644
index 0000000..f574d36
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.h
@@ -0,0 +1,20 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// SceneDelegate.h
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface SceneDelegate : UIResponder <UIWindowSceneDelegate>
+
+@property (strong, nonatomic) UIWindow * window;
+
+@end
+
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.m b/funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.m
new file mode 100644
index 0000000..1b7b003
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/SceneDelegate.m
@@ -0,0 +1,62 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// SceneDelegate.m
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import "SceneDelegate.h"
+
+@interface SceneDelegate ()
+
+@end
+
+@implementation SceneDelegate
+
+
+- (void)scene:(UIScene *)scene willConnectToSession:(UISceneSession *)session options:(UISceneConnectionOptions *)connectionOptions {
+ // Use this method to optionally configure and attach the UIWindow `window` to the provided UIWindowScene `scene`.
+ // If using a storyboard, the `window` property will automatically be initialized and attached to the scene.
+ // This delegate does not imply the connecting scene or session are new (see `application:configurationForConnectingSceneSession` instead).
+}
+
+
+- (void)sceneDidDisconnect:(UIScene *)scene {
+ // Called as the scene is being released by the system.
+ // This occurs shortly after the scene enters the background, or when its session is discarded.
+ // Release any resources associated with this scene that can be re-created the next time the scene connects.
+ // The scene may re-connect later, as its session was not necessarily discarded (see `application:didDiscardSceneSessions` instead).
+}
+
+
+- (void)sceneDidBecomeActive:(UIScene *)scene {
+ // Called when the scene has moved from an inactive state to an active state.
+ // Use this method to restart any tasks that were paused (or not yet started) when the scene was inactive.
+}
+
+
+- (void)sceneWillResignActive:(UIScene *)scene {
+ // Called when the scene will move from an active state to an inactive state.
+ // This may occur due to temporary interruptions (ex. an incoming phone call).
+}
+
+
+- (void)sceneWillEnterForeground:(UIScene *)scene {
+ // Called as the scene transitions from the background to the foreground.
+ // Use this method to undo the changes made on entering the background.
+}
+
+
+- (void)sceneDidEnterBackground:(UIScene *)scene {
+ // Called as the scene transitions from the foreground to the background.
+ // Use this method to save data, release shared resources, and store enough scene-specific state information
+ // to restore the scene back to its current state.
+}
+
+
+@end
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.h b/funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.h
new file mode 100644
index 0000000..b35be65
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.h
@@ -0,0 +1,19 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// ViewController.h
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import <UIKit/UIKit.h>
+
+@interface ViewController : UIViewController
+
+
+@end
+
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.mm b/funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.mm
new file mode 100644
index 0000000..9d0f7ca
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/ViewController.mm
@@ -0,0 +1,143 @@
+/**
+ * Copyright FunASR (https://github.com/alibaba-damo-academy/FunASR). All Rights
+ * Reserved. MIT License (https://opensource.org/licenses/MIT)
+ */
+
+//
+// ViewController.m
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import "ViewController.h"
+
+#include "AudioCapture.h"
+
+@interface ViewController ()<UITextViewDelegate>
+
+@property (nonatomic, strong) AudioCapture *audioCapture;
+@property (nonatomic, copy) NSString *pre_partial_text;
+
+@property (weak, nonatomic) IBOutlet UITextView *resultView;
+@property (weak, nonatomic) IBOutlet UIButton *startButton;
+
+@property (strong, nonatomic) UIView *coverView;
+@property (strong, nonatomic) UIButton *launchOnnxButton;
+@property (strong, nonatomic) UIButton *launchButton;
+@property (strong, nonatomic) UIActivityIndicatorView *activityIndicator;
+
+
+@end
+
+@implementation ViewController
+{
+ bool is_mic_;
+}
+
+- (void)viewDidLoad {
+ [super viewDidLoad];
+ // Do any additional setup after loading the view.
+
+ self.startButton.layer.cornerRadius = 60;
+ self.startButton.layer.masksToBounds = YES;
+ self.startButton.selected = NO;
+ self.resultView.editable = NO;
+
+ is_mic_ = true;
+
+ [self.view addSubview:self.coverView];
+ [self initEngine:YES];
+}
+
+- (UIView *)coverView {
+ if (!_coverView) {
+ NSInteger screenWidth = self.view.bounds.size.width;
+ NSInteger screenHeight = self.view.bounds.size.height;
+ _coverView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, screenWidth, screenHeight)];
+ _coverView.backgroundColor = [UIColor whiteColor];
+
+ NSInteger x = 30;
+ NSInteger heigh = 60;
+ NSInteger y = screenHeight/2-120;
+ NSInteger width = (screenWidth-30*2);
+
+ UILabel *tip = [[UILabel alloc] initWithFrame:CGRectMake(x, y, width, heigh)];
+ tip.backgroundColor = [UIColor clearColor];
+ tip.textColor = [UIColor grayColor];
+ tip.font = [UIFont systemFontOfSize:20];
+ tip.textAlignment = NSTextAlignmentCenter;
+ tip.text = @"姝e湪鍒濆鍖栨ā鍨�...";
+ [_coverView addSubview:tip];
+ _coverView.alpha = 0.8;
+ }
+
+ return _coverView;
+}
+
+- (void)initEngine:(BOOL)onnxModel {
+ dispatch_async(dispatch_get_main_queue(), ^{
+ NSInteger screenWidth = self.view.bounds.size.width;
+ NSInteger screenHeight = self.view.bounds.size.height;
+ NSInteger activityIndicatorWith = screenWidth/2;
+ NSInteger activityIndicatorHeight = activityIndicatorWith;
+ // UIActivityIndicatorView *activityIndicator = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake((screenWidth-activityIndicatorWith)/2, (screenHeight-activityIndicatorHeight)/2, activityIndicatorWith, activityIndicatorHeight)];
+ self.activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleLarge];
+ self.activityIndicator.frame = CGRectMake((screenWidth-activityIndicatorWith)/2, (screenHeight-activityIndicatorHeight)/2, activityIndicatorWith, activityIndicatorHeight);
+ [self.view addSubview:self.activityIndicator];
+ [self.activityIndicator startAnimating];
+
+
+ });
+
+ dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
+ [self initASR:onnxModel];
+ });
+}
+
+- (void)initASR:(BOOL)onnxModel {
+ if (is_mic_) {
+ self.pre_partial_text = @"";
+ self.audioCapture = [[AudioCapture alloc] initWithOnnxModel:onnxModel];
+ __weak __typeof(self) weakSelf = self;
+
+ self.audioCapture.resultBlock = ^(NSString *result) {
+ if ([result length] == 0) {
+ return;
+ }
+ NSLog(@"%@", result);
+ NSString *text = nil;
+ text = [NSString stringWithFormat:@"%@%@", weakSelf.pre_partial_text, result];
+ weakSelf.pre_partial_text = text;
+ dispatch_async(dispatch_get_main_queue(), ^{
+ weakSelf.resultView.text = text;
+
+ });
+ };
+ }
+
+ dispatch_async(dispatch_get_main_queue(), ^{
+ [self.activityIndicator stopAnimating];
+ [self.activityIndicator removeFromSuperview];
+ [self.coverView removeFromSuperview];
+ });
+}
+
+- (IBAction)startButtonClicked:(id)sender {
+ self.startButton.enabled = NO;
+ if (!self.startButton.selected) {
+ if (is_mic_) [self.audioCapture startRecorder];
+ } else {
+ if (is_mic_) [self.audioCapture stopRecorder];
+ }
+
+ self.startButton.selected = !self.startButton.selected;
+ self.startButton.enabled = YES;
+}
+
+- (void)textViewDidChange:(UITextView *)textView {
+ [textView scrollRangeToVisible:NSMakeRange([textView.text length] - 1, 1)];
+}
+
+
+@end
diff --git a/funasr/runtime/ios/paraformer_online/paraformer_online/main.m b/funasr/runtime/ios/paraformer_online/paraformer_online/main.m
new file mode 100644
index 0000000..87bf6f7
--- /dev/null
+++ b/funasr/runtime/ios/paraformer_online/paraformer_online/main.m
@@ -0,0 +1,18 @@
+//
+// main.m
+// paraformer_online
+//
+// Created by 閭卞▉ on 2023/6/6.
+//
+
+#import <UIKit/UIKit.h>
+#import "AppDelegate.h"
+
+int main(int argc, char * argv[]) {
+ NSString * appDelegateClassName;
+ @autoreleasepool {
+ // Setup code that might create autoreleased objects goes here.
+ appDelegateClassName = NSStringFromClass([AppDelegate class]);
+ }
+ return UIApplicationMain(argc, argv, nil, appDelegateClassName);
+}
diff --git a/funasr/runtime/onnxruntime/src/audio.cpp b/funasr/runtime/onnxruntime/src/audio.cpp
index 6335f4e..94fcefc 100644
--- a/funasr/runtime/onnxruntime/src/audio.cpp
+++ b/funasr/runtime/onnxruntime/src/audio.cpp
@@ -9,6 +9,11 @@
#include "audio.h"
#include "precomp.h"
+
+#if defined(__APPLE__)
+#include <string.h>
+#else
+
extern "C" {
#include <libavutil/opt.h>
#include <libavcodec/avcodec.h>
@@ -17,6 +22,10 @@
#include <libavutil/samplefmt.h>
#include <libswresample/swresample.h>
}
+
+#endif
+
+
using namespace std;
@@ -245,6 +254,9 @@
}
bool Audio::FfmpegLoad(const char *filename, bool copy2char){
+#if defined(__APPLE__)
+ return false;
+#else
// from file
AVFormatContext* formatContext = avformat_alloc_context();
if (avformat_open_input(&formatContext, filename, NULL, NULL) != 0) {
@@ -403,10 +415,13 @@
}
else
return false;
-
+#endif
}
bool Audio::FfmpegLoad(const char* buf, int n_file_len){
+#if defined(__APPLE__)
+ return false;
+#else
// from buf
char* buf_copy = (char *)malloc(n_file_len);
memcpy(buf_copy, buf, n_file_len);
@@ -577,7 +592,7 @@
}
else
return false;
-
+#endif
}
@@ -1229,4 +1244,4 @@
}
-} // namespace funasr
\ No newline at end of file
+} // namespace funasr
diff --git a/funasr/runtime/onnxruntime/src/precomp.h b/funasr/runtime/onnxruntime/src/precomp.h
index e0fdeb0..cbfcf56 100644
--- a/funasr/runtime/onnxruntime/src/precomp.h
+++ b/funasr/runtime/onnxruntime/src/precomp.h
@@ -19,8 +19,13 @@
using namespace std;
// third part
+#if defined(__APPLE__)
+#include <onnxruntime/onnxruntime_cxx_api.h>
+#else
#include "onnxruntime_run_options_config_keys.h"
#include "onnxruntime_cxx_api.h"
+#endif
+
#include "kaldi-native-fbank/csrc/feature-fbank.h"
#include "kaldi-native-fbank/csrc/online-feature.h"
diff --git a/funasr/runtime/onnxruntime/third_party/glog/src/config.h b/funasr/runtime/onnxruntime/third_party/glog/src/config.h
new file mode 100644
index 0000000..fb17d23
--- /dev/null
+++ b/funasr/runtime/onnxruntime/third_party/glog/src/config.h
@@ -0,0 +1,177 @@
+#ifndef GLOG_CONFIG_H
+#define GLOG_CONFIG_H
+
+/* Namespace for Google classes */
+#define GOOGLE_NAMESPACE google
+
+/* Define if you have the `dladdr' function */
+#define HAVE_DLADDR
+
+/* Define if you have the `snprintf' function */
+#define HAVE_SNPRINTF
+
+/* Define to 1 if you have the <dlfcn.h> header file. */
+#define HAVE_DLFCN_H
+
+/* Define if you have the `backtrace' function in <execinfo.h> */
+#define HAVE_EXECINFO_BACKTRACE
+
+/* Define if you have the `backtrace_symbols' function in <execinfo.h> */
+#define HAVE_EXECINFO_BACKTRACE_SYMBOLS
+
+/* Define if you have the `fcntl' function */
+#define HAVE_FCNTL
+
+/* Define to 1 if you have the <glob.h> header file. */
+#define HAVE_GLOB_H
+
+/* Define to 1 if you have the `pthread' library (-lpthread). */
+/* #undef HAVE_LIBPTHREAD */
+
+/* define if you have google gflags library */
+/* #undef HAVE_LIB_GFLAGS */
+
+/* define if you have google gmock library */
+/* #undef HAVE_LIB_GMOCK */
+
+/* define if you have google gtest library */
+/* #undef HAVE_LIB_GTEST */
+
+/* define if you have dbghelp library */
+/* #undef HAVE_DBGHELP */
+
+/* define if you have libunwind */
+/* #undef HAVE_LIB_UNWIND */
+
+/* Define to 1 if you have the <memory.h> header file. */
+#define HAVE_MEMORY_H
+
+/* define to disable multithreading support. */
+/* #undef NO_THREADS */
+
+/* Define if you have the 'pread' function */
+#define HAVE_PREAD
+
+/* Define if you have POSIX threads libraries and header files. */
+#define HAVE_PTHREAD
+
+/* Define to 1 if you have the <pwd.h> header file. */
+#define HAVE_PWD_H
+
+/* Define if you have the 'pwrite' function */
+#define HAVE_PWRITE
+
+/* define if the compiler implements pthread_rwlock_* */
+#define HAVE_RWLOCK
+
+/* Define if you have the 'sigaction' function */
+#define HAVE_SIGACTION
+
+/* Define if you have the `sigaltstack' function */
+#define HAVE_SIGALTSTACK
+
+/* Define to 1 if you have the <strings.h> header file. */
+#define HAVE_STRINGS_H
+
+/* Define to 1 if you have the <syscall.h> header file. */
+/* #undef HAVE_SYSCALL_H */
+
+/* Define to 1 if you have the <syslog.h> header file. */
+#define HAVE_SYSLOG_H
+
+/* Define to 1 if you have the <sys/stat.h> header file. */
+#define HAVE_SYS_STAT_H
+
+/* Define to 1 if you have the <sys/syscall.h> header file. */
+#define HAVE_SYS_SYSCALL_H
+
+/* Define to 1 if you have the <sys/time.h> header file. */
+#define HAVE_SYS_TIME_H
+
+/* Define to 1 if you have the <sys/types.h> header file. */
+#define HAVE_SYS_TYPES_H 1
+
+/* Define to 1 if you have the <sys/ucontext.h> header file. */
+/* #undef HAVE_SYS_UCONTEXT_H */
+
+/* Define to 1 if you have the <sys/utsname.h> header file. */
+#define HAVE_SYS_UTSNAME_H
+
+/* Define to 1 if you have the <sys/wait.h> header file. */
+#define HAVE_SYS_WAIT_H
+
+/* Define to 1 if you have the <ucontext.h> header file. */
+/* #undef HAVE_UCONTEXT_H */
+
+/* Define to 1 if you have the <unistd.h> header file. */
+#define HAVE_UNISTD_H 1
+
+/* Define if you linking to _Unwind_Backtrace is possible. */
+#define HAVE__UNWIND_BACKTRACE
+
+/* Define if you linking to _Unwind_GetIP is possible. */
+#define HAVE__UNWIND_GETIP
+
+/* define if your compiler has __attribute__ */
+#define HAVE___ATTRIBUTE__
+
+/* define if your compiler has __builtin_expect */
+#define HAVE___BUILTIN_EXPECT 1
+
+/* define if your compiler has __sync_val_compare_and_swap */
+#define HAVE___SYNC_VAL_COMPARE_AND_SWAP
+
+/* define if symbolize support is available */
+/* #undef HAVE_SYMBOLIZE */
+
+/* define if localtime_r is available in time.h */
+#define HAVE_LOCALTIME_R
+
+/* define if gmtime_r is available in time.h */
+/* #undef HAVE_GMTIME_R */
+
+/* Define to the sub-directory in which libtool stores uninstalled libraries.
+ */
+/* #undef LT_OBJDIR */
+
+/* How to access the PC from a struct ucontext */
+/* #undef PC_FROM_UCONTEXT */
+
+/* define if we should print file offsets in traces instead of symbolizing. */
+/* #undef PRINT_UNSYMBOLIZED_STACK_TRACES */
+
+/* Define to necessary symbol if this constant uses a non-standard name on
+ your system. */
+/* #undef PTHREAD_CREATE_JOINABLE */
+
+/* The size of `void *', as computed by sizeof. */
+#define SIZEOF_VOID_P 8
+
+/* location of source code */
+#define TEST_SRC_DIR "/Users/qiuwei/Documents/閭卞▉/璇煶璇嗗埆-asr/to_alibaba-damo-academy/FunASR/funasr/runtime/onnxruntime/third_party/glog"
+
+/* Define if thread-local storage is enabled. */
+#define GLOG_THREAD_LOCAL_STORAGE
+
+#ifdef GLOG_BAZEL_BUILD
+
+/* TODO(rodrigoq): remove this workaround once bazel#3979 is resolved:
+ * https://github.com/bazelbuild/bazel/issues/3979 */
+#define _START_GOOGLE_NAMESPACE_ namespace GOOGLE_NAMESPACE {
+
+#define _END_GOOGLE_NAMESPACE_ }
+
+#else
+
+/* Stops putting the code inside the Google namespace */
+#define _END_GOOGLE_NAMESPACE_ }
+
+/* Puts following code inside the Google namespace */
+#define _START_GOOGLE_NAMESPACE_ namespace google {
+
+#endif
+
+/* Replacement for deprecated syscall(SYS_gettid) on macOS. */
+#define HAVE_PTHREAD_THREADID_NP 1
+
+#endif // GLOG_CONFIG_H
diff --git a/funasr/runtime/onnxruntime/third_party/glog/src/glog/export.h b/funasr/runtime/onnxruntime/third_party/glog/src/glog/export.h
new file mode 100644
index 0000000..6e2691e
--- /dev/null
+++ b/funasr/runtime/onnxruntime/third_party/glog/src/glog/export.h
@@ -0,0 +1,42 @@
+
+#ifndef GLOG_EXPORT_H
+#define GLOG_EXPORT_H
+
+#ifdef GLOG_STATIC_DEFINE
+# define GLOG_EXPORT
+# define GLOG_NO_EXPORT
+#else
+# ifndef GLOG_EXPORT
+# ifdef GOOGLE_GLOG_IS_A_DLL
+ /* We are building this library */
+# define GLOG_EXPORT __attribute__((visibility("default")))
+# else
+ /* We are using this library */
+# define GLOG_EXPORT __attribute__((visibility("default")))
+# endif
+# endif
+
+# ifndef GLOG_NO_EXPORT
+# define GLOG_NO_EXPORT __attribute__((visibility("hidden")))
+# endif
+#endif
+
+#ifndef GLOG_DEPRECATED
+# define GLOG_DEPRECATED __attribute__ ((__deprecated__))
+#endif
+
+#ifndef GLOG_DEPRECATED_EXPORT
+# define GLOG_DEPRECATED_EXPORT GLOG_EXPORT GLOG_DEPRECATED
+#endif
+
+#ifndef GLOG_DEPRECATED_NO_EXPORT
+# define GLOG_DEPRECATED_NO_EXPORT GLOG_NO_EXPORT GLOG_DEPRECATED
+#endif
+
+#if 0 /* DEFINE_NO_DEPRECATED */
+# ifndef GLOG_NO_DEPRECATED
+# define GLOG_NO_DEPRECATED
+# endif
+#endif
+
+#endif /* GLOG_EXPORT_H */
diff --git a/funasr/runtime/onnxruntime/third_party/glog/src/glog/logging.h b/funasr/runtime/onnxruntime/third_party/glog/src/glog/logging.h
new file mode 100644
index 0000000..6f6685a
--- /dev/null
+++ b/funasr/runtime/onnxruntime/third_party/glog/src/glog/logging.h
@@ -0,0 +1,1842 @@
+// Copyright (c) 2023, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Ray Sidney
+//
+// This file contains #include information about logging-related stuff.
+// Pretty much everybody needs to #include this file so that they can
+// log various happenings.
+//
+#ifndef GLOG_LOGGING_H
+#define GLOG_LOGGING_H
+
+#include <cerrno>
+#include <chrono>
+#include <cstddef>
+#include <cstdlib>
+#include <cstring>
+#include <ctime>
+#include <iosfwd>
+#include <ostream>
+#include <sstream>
+#include <string>
+#if 1
+# include <unistd.h>
+#endif
+#include <vector>
+
+#if defined(_MSC_VER)
+#define GLOG_MSVC_PUSH_DISABLE_WARNING(n) __pragma(warning(push)) \
+ __pragma(warning(disable:n))
+#define GLOG_MSVC_POP_WARNING() __pragma(warning(pop))
+#else
+#define GLOG_MSVC_PUSH_DISABLE_WARNING(n)
+#define GLOG_MSVC_POP_WARNING()
+#endif
+
+#include <glog/platform.h>
+
+#if 1
+#include <glog/export.h>
+#endif
+
+// We care a lot about number of bits things take up. Unfortunately,
+// systems define their bit-specific ints in a lot of different ways.
+// We use our own way, and have a typedef to get there.
+// Note: these commands below may look like "#if 1" or "#if 0", but
+// that's because they were constructed that way at ./configure time.
+// Look at logging.h.in to see how they're calculated (based on your config).
+#include <cstdint> // the normal place uint16_t is defined
+#if 1
+#include <sys/types.h> // the normal place u_int16_t is defined
+#endif
+
+#if 0
+#include <gflags/gflags.h>
+#endif
+
+#include <atomic>
+
+namespace google {
+
+ typedef std::int32_t int32;
+typedef std::uint32_t uint32;
+typedef std::int64_t int64;
+typedef std::uint64_t uint64;
+
+#if !(1)
+typedef ptrdiff_t ssize_t;
+#endif
+
+#if !(1)
+typedef int mode_t;
+#endif
+
+typedef double WallTime;
+
+struct GLOG_EXPORT LogMessageTime {
+ LogMessageTime();
+ LogMessageTime(std::tm t);
+ LogMessageTime(std::time_t timestamp, WallTime now);
+
+ const time_t& timestamp() const { return timestamp_; }
+ const int& sec() const { return time_struct_.tm_sec; }
+ const int32_t& usec() const { return usecs_; }
+ const int&(min)() const { return time_struct_.tm_min; }
+ const int& hour() const { return time_struct_.tm_hour; }
+ const int& day() const { return time_struct_.tm_mday; }
+ const int& month() const { return time_struct_.tm_mon; }
+ const int& year() const { return time_struct_.tm_year; }
+ const int& dayOfWeek() const { return time_struct_.tm_wday; }
+ const int& dayInYear() const { return time_struct_.tm_yday; }
+ const int& dst() const { return time_struct_.tm_isdst; }
+ const long int& gmtoff() const { return gmtoffset_; }
+ const std::tm& tm() const { return time_struct_; }
+
+ private:
+ void init(const std::tm& t, std::time_t timestamp, WallTime now);
+ std::tm time_struct_; // Time of creation of LogMessage
+ time_t timestamp_; // Time of creation of LogMessage in seconds
+ int32_t usecs_; // Time of creation of LogMessage - microseconds part
+ long int gmtoffset_;
+
+ void CalcGmtOffset();
+};
+
+struct LogMessageInfo {
+ explicit LogMessageInfo(const char* const severity_,
+ const char* const filename_,
+ const int& line_number_,
+ const int& thread_id_,
+ const LogMessageTime& time_):
+ severity(severity_), filename(filename_), line_number(line_number_),
+ thread_id(thread_id_), time(time_)
+ {}
+
+ const char* const severity;
+ const char* const filename;
+ const int &line_number;
+ const int &thread_id;
+ const LogMessageTime& time;
+};
+
+typedef void(*CustomPrefixCallback)(std::ostream& s, const LogMessageInfo& l, void* data);
+
+}
+
+
+// The global value of GOOGLE_STRIP_LOG. All the messages logged to
+// LOG(XXX) with severity less than GOOGLE_STRIP_LOG will not be displayed.
+// If it can be determined at compile time that the message will not be
+// printed, the statement will be compiled out.
+//
+// Example: to strip out all INFO and WARNING messages, use the value
+// of 2 below. To make an exception for WARNING messages from a single
+// file, add "#define GOOGLE_STRIP_LOG 1" to that file _before_ including
+// base/logging.h
+#ifndef GOOGLE_STRIP_LOG
+#define GOOGLE_STRIP_LOG 0
+#endif
+
+// GCC can be told that a certain branch is not likely to be taken (for
+// instance, a CHECK failure), and use that information in static analysis.
+// Giving it this information can help it optimize for the common case in
+// the absence of better information (ie. -fprofile-arcs).
+//
+#ifndef GOOGLE_PREDICT_BRANCH_NOT_TAKEN
+#if 1
+#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) (__builtin_expect(x, 0))
+#else
+#define GOOGLE_PREDICT_BRANCH_NOT_TAKEN(x) x
+#endif
+#endif
+
+#ifndef GOOGLE_PREDICT_FALSE
+#if 1
+#define GOOGLE_PREDICT_FALSE(x) (__builtin_expect(x, 0))
+#else
+#define GOOGLE_PREDICT_FALSE(x) x
+#endif
+#endif
+
+#ifndef GOOGLE_PREDICT_TRUE
+#if 1
+#define GOOGLE_PREDICT_TRUE(x) (__builtin_expect(!!(x), 1))
+#else
+#define GOOGLE_PREDICT_TRUE(x) x
+#endif
+#endif
+
+
+// Make a bunch of macros for logging. The way to log things is to stream
+// things to LOG(<a particular severity level>). E.g.,
+//
+// LOG(INFO) << "Found " << num_cookies << " cookies";
+//
+// You can capture log messages in a string, rather than reporting them
+// immediately:
+//
+// vector<string> errors;
+// LOG_STRING(ERROR, &errors) << "Couldn't parse cookie #" << cookie_num;
+//
+// This pushes back the new error onto 'errors'; if given a NULL pointer,
+// it reports the error via LOG(ERROR).
+//
+// You can also do conditional logging:
+//
+// LOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
+//
+// You can also do occasional logging (log every n'th occurrence of an
+// event):
+//
+// LOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
+//
+// The above will cause log messages to be output on the 1st, 11th, 21st, ...
+// times it is executed. Note that the special google::COUNTER value is used
+// to identify which repetition is happening.
+//
+// You can also do occasional conditional logging (log every n'th
+// occurrence of an event, when condition is satisfied):
+//
+// LOG_IF_EVERY_N(INFO, (size > 1024), 10) << "Got the " << google::COUNTER
+// << "th big cookie";
+//
+// You can log messages the first N times your code executes a line. E.g.
+//
+// LOG_FIRST_N(INFO, 20) << "Got the " << google::COUNTER << "th cookie";
+//
+// Outputs log messages for the first 20 times it is executed.
+//
+// Analogous SYSLOG, SYSLOG_IF, and SYSLOG_EVERY_N macros are available.
+// These log to syslog as well as to the normal logs. If you use these at
+// all, you need to be aware that syslog can drastically reduce performance,
+// especially if it is configured for remote logging! Don't use these
+// unless you fully understand this and have a concrete need to use them.
+// Even then, try to minimize your use of them.
+//
+// There are also "debug mode" logging macros like the ones above:
+//
+// DLOG(INFO) << "Found cookies";
+//
+// DLOG_IF(INFO, num_cookies > 10) << "Got lots of cookies";
+//
+// DLOG_EVERY_N(INFO, 10) << "Got the " << google::COUNTER << "th cookie";
+//
+// All "debug mode" logging is compiled away to nothing for non-debug mode
+// compiles.
+//
+// We also have
+//
+// LOG_ASSERT(assertion);
+// DLOG_ASSERT(assertion);
+//
+// which is syntactic sugar for {,D}LOG_IF(FATAL, assert fails) << assertion;
+//
+// There are "verbose level" logging macros. They look like
+//
+// VLOG(1) << "I'm printed when you run the program with --v=1 or more";
+// VLOG(2) << "I'm printed when you run the program with --v=2 or more";
+//
+// These always log at the INFO log level (when they log at all).
+// The verbose logging can also be turned on module-by-module. For instance,
+// --vmodule=mapreduce=2,file=1,gfs*=3 --v=0
+// will cause:
+// a. VLOG(2) and lower messages to be printed from mapreduce.{h,cc}
+// b. VLOG(1) and lower messages to be printed from file.{h,cc}
+// c. VLOG(3) and lower messages to be printed from files prefixed with "gfs"
+// d. VLOG(0) and lower messages to be printed from elsewhere
+//
+// The wildcarding functionality shown by (c) supports both '*' (match
+// 0 or more characters) and '?' (match any single character) wildcards.
+//
+// There's also VLOG_IS_ON(n) "verbose level" condition macro. To be used as
+//
+// if (VLOG_IS_ON(2)) {
+// // do some logging preparation and logging
+// // that can't be accomplished with just VLOG(2) << ...;
+// }
+//
+// There are also VLOG_IF, VLOG_EVERY_N and VLOG_IF_EVERY_N "verbose level"
+// condition macros for sample cases, when some extra computation and
+// preparation for logs is not needed.
+// VLOG_IF(1, (size > 1024))
+// << "I'm printed when size is more than 1024 and when you run the "
+// "program with --v=1 or more";
+// VLOG_EVERY_N(1, 10)
+// << "I'm printed every 10th occurrence, and when you run the program "
+// "with --v=1 or more. Present occurence is " << google::COUNTER;
+// VLOG_IF_EVERY_N(1, (size > 1024), 10)
+// << "I'm printed on every 10th occurence of case when size is more "
+// " than 1024, when you run the program with --v=1 or more. ";
+// "Present occurence is " << google::COUNTER;
+//
+// The supported severity levels for macros that allow you to specify one
+// are (in increasing order of severity) INFO, WARNING, ERROR, and FATAL.
+// Note that messages of a given severity are logged not only in the
+// logfile for that severity, but also in all logfiles of lower severity.
+// E.g., a message of severity FATAL will be logged to the logfiles of
+// severity FATAL, ERROR, WARNING, and INFO.
+//
+// There is also the special severity of DFATAL, which logs FATAL in
+// debug mode, ERROR in normal mode.
+//
+// Very important: logging a message at the FATAL severity level causes
+// the program to terminate (after the message is logged).
+//
+// Unless otherwise specified, logs will be written to the filename
+// "<program name>.<hostname>.<user name>.log.<severity level>.", followed
+// by the date, time, and pid (you can't prevent the date, time, and pid
+// from being in the filename).
+//
+// The logging code takes two flags:
+// --v=# set the verbose level
+// --logtostderr log all the messages to stderr instead of to logfiles
+
+// LOG LINE PREFIX FORMAT
+//
+// Log lines have this form:
+//
+// Lyyyymmdd hh:mm:ss.uuuuuu threadid file:line] msg...
+//
+// where the fields are defined as follows:
+//
+// L A single character, representing the log level
+// (eg 'I' for INFO)
+// yyyy The year
+// mm The month (zero padded; ie May is '05')
+// dd The day (zero padded)
+// hh:mm:ss.uuuuuu Time in hours, minutes and fractional seconds
+// threadid The space-padded thread ID as returned by GetTID()
+// (this matches the PID on Linux)
+// file The file name
+// line The line number
+// msg The user-supplied message
+//
+// Example:
+//
+// I1103 11:57:31.739339 24395 google.cc:2341] Command line: ./some_prog
+// I1103 11:57:31.739403 24395 google.cc:2342] Process id 24395
+//
+// NOTE: although the microseconds are useful for comparing events on
+// a single machine, clocks on different machines may not be well
+// synchronized. Hence, use caution when comparing the low bits of
+// timestamps from different machines.
+
+#pragma push_macro("DECLARE_VARIABLE")
+#pragma push_macro("DECLARE_bool")
+#pragma push_macro("DECLARE_string")
+#pragma push_macro("DECLARE_int32")
+#pragma push_macro("DECLARE_uint32")
+
+#ifdef DECLARE_VARIABLE
+#undef DECLARE_VARIABLE
+#endif
+
+#ifdef DECLARE_bool
+#undef DECLARE_bool
+#endif
+
+#ifdef DECLARE_string
+#undef DECLARE_string
+#endif
+
+#ifdef DECLARE_int32
+#undef DECLARE_int32
+#endif
+
+#ifdef DECLARE_uint32
+#undef DECLARE_uint32
+#endif
+
+#ifndef DECLARE_VARIABLE
+#define DECLARE_VARIABLE(type, shorttype, name, tn) \
+ namespace fL##shorttype { \
+ extern GLOG_EXPORT type FLAGS_##name; \
+ } \
+ using fL##shorttype::FLAGS_##name
+
+// bool specialization
+#define DECLARE_bool(name) \
+ DECLARE_VARIABLE(bool, B, name, bool)
+
+// int32 specialization
+#define DECLARE_int32(name) \
+ DECLARE_VARIABLE(google::int32, I, name, int32)
+
+#if !defined(DECLARE_uint32)
+// uint32 specialization
+#define DECLARE_uint32(name) \
+ DECLARE_VARIABLE(google::uint32, U, name, uint32)
+#endif // !defined(DECLARE_uint32) && !(0)
+
+// Special case for string, because we have to specify the namespace
+// std::string, which doesn't play nicely with our FLAG__namespace hackery.
+#define DECLARE_string(name) \
+ namespace fLS { \
+ extern GLOG_EXPORT std::string& FLAGS_##name; \
+ } \
+ using fLS::FLAGS_##name
+#endif
+
+// Set whether appending a timestamp to the log file name
+DECLARE_bool(timestamp_in_logfile_name);
+
+// Set whether log messages go to stdout instead of logfiles
+DECLARE_bool(logtostdout);
+
+// Set color messages logged to stdout (if supported by terminal).
+DECLARE_bool(colorlogtostdout);
+
+// Set whether log messages go to stderr instead of logfiles
+DECLARE_bool(logtostderr);
+
+// Set whether log messages go to stderr in addition to logfiles.
+DECLARE_bool(alsologtostderr);
+
+// Set color messages logged to stderr (if supported by terminal).
+DECLARE_bool(colorlogtostderr);
+
+// Log messages at a level >= this flag are automatically sent to
+// stderr in addition to log files.
+DECLARE_int32(stderrthreshold);
+
+// Set whether the log file header should be written upon creating a file.
+DECLARE_bool(log_file_header);
+
+// Set whether the log prefix should be prepended to each line of output.
+DECLARE_bool(log_prefix);
+
+// Set whether the year should be included in the log prefix.
+DECLARE_bool(log_year_in_prefix);
+
+// Log messages at a level <= this flag are buffered.
+// Log messages at a higher level are flushed immediately.
+DECLARE_int32(logbuflevel);
+
+// Sets the maximum number of seconds which logs may be buffered for.
+DECLARE_int32(logbufsecs);
+
+// Log suppression level: messages logged at a lower level than this
+// are suppressed.
+DECLARE_int32(minloglevel);
+
+// If specified, logfiles are written into this directory instead of the
+// default logging directory.
+DECLARE_string(log_dir);
+
+// Set the log file mode.
+DECLARE_int32(logfile_mode);
+
+// Sets the path of the directory into which to put additional links
+// to the log files.
+DECLARE_string(log_link);
+
+DECLARE_int32(v); // in vlog_is_on.cc
+
+DECLARE_string(vmodule); // also in vlog_is_on.cc
+
+// Sets the maximum log file size (in MB).
+DECLARE_uint32(max_log_size);
+
+// Sets whether to avoid logging to the disk if the disk is full.
+DECLARE_bool(stop_logging_if_full_disk);
+
+// Use UTC time for logging
+DECLARE_bool(log_utc_time);
+
+// Log messages below the GOOGLE_STRIP_LOG level will be compiled away for
+// security reasons. See LOG(severtiy) below.
+
+// A few definitions of macros that don't generate much code. Since
+// LOG(INFO) and its ilk are used all over our code, it's
+// better to have compact code for these operations.
+
+#if GOOGLE_STRIP_LOG == 0
+#define COMPACT_GOOGLE_LOG_INFO google::LogMessage( \
+ __FILE__, __LINE__)
+#define LOG_TO_STRING_INFO(message) google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_INFO, message)
+#else
+#define COMPACT_GOOGLE_LOG_INFO google::NullStream()
+#define LOG_TO_STRING_INFO(message) google::NullStream()
+#endif
+
+#if GOOGLE_STRIP_LOG <= 1
+#define COMPACT_GOOGLE_LOG_WARNING google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_WARNING)
+#define LOG_TO_STRING_WARNING(message) google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_WARNING, message)
+#else
+#define COMPACT_GOOGLE_LOG_WARNING google::NullStream()
+#define LOG_TO_STRING_WARNING(message) google::NullStream()
+#endif
+
+#if GOOGLE_STRIP_LOG <= 2
+#define COMPACT_GOOGLE_LOG_ERROR google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_ERROR)
+#define LOG_TO_STRING_ERROR(message) google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_ERROR, message)
+#else
+#define COMPACT_GOOGLE_LOG_ERROR google::NullStream()
+#define LOG_TO_STRING_ERROR(message) google::NullStream()
+#endif
+
+#if GOOGLE_STRIP_LOG <= 3
+#define COMPACT_GOOGLE_LOG_FATAL google::LogMessageFatal( \
+ __FILE__, __LINE__)
+#define LOG_TO_STRING_FATAL(message) google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_FATAL, message)
+#else
+#define COMPACT_GOOGLE_LOG_FATAL google::NullStreamFatal()
+#define LOG_TO_STRING_FATAL(message) google::NullStreamFatal()
+#endif
+
+#if defined(NDEBUG) && !defined(DCHECK_ALWAYS_ON)
+#define DCHECK_IS_ON() 0
+#else
+#define DCHECK_IS_ON() 1
+#endif
+
+// For DFATAL, we want to use LogMessage (as opposed to
+// LogMessageFatal), to be consistent with the original behavior.
+#if !DCHECK_IS_ON()
+#define COMPACT_GOOGLE_LOG_DFATAL COMPACT_GOOGLE_LOG_ERROR
+#elif GOOGLE_STRIP_LOG <= 3
+#define COMPACT_GOOGLE_LOG_DFATAL google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_FATAL)
+#else
+#define COMPACT_GOOGLE_LOG_DFATAL google::NullStreamFatal()
+#endif
+
+#define GOOGLE_LOG_INFO(counter) google::LogMessage(__FILE__, __LINE__, google::GLOG_INFO, counter, &google::LogMessage::SendToLog)
+#define SYSLOG_INFO(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_INFO, counter, \
+ &google::LogMessage::SendToSyslogAndLog)
+#define GOOGLE_LOG_WARNING(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_WARNING, counter, \
+ &google::LogMessage::SendToLog)
+#define SYSLOG_WARNING(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_WARNING, counter, \
+ &google::LogMessage::SendToSyslogAndLog)
+#define GOOGLE_LOG_ERROR(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_ERROR, counter, \
+ &google::LogMessage::SendToLog)
+#define SYSLOG_ERROR(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_ERROR, counter, \
+ &google::LogMessage::SendToSyslogAndLog)
+#define GOOGLE_LOG_FATAL(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_FATAL, counter, \
+ &google::LogMessage::SendToLog)
+#define SYSLOG_FATAL(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_FATAL, counter, \
+ &google::LogMessage::SendToSyslogAndLog)
+#define GOOGLE_LOG_DFATAL(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \
+ &google::LogMessage::SendToLog)
+#define SYSLOG_DFATAL(counter) \
+ google::LogMessage(__FILE__, __LINE__, google::DFATAL_LEVEL, counter, \
+ &google::LogMessage::SendToSyslogAndLog)
+
+#if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) || defined(__CYGWIN32__)
+// A very useful logging macro to log windows errors:
+#define LOG_SYSRESULT(result) \
+ if (FAILED(HRESULT_FROM_WIN32(result))) { \
+ LPSTR message = NULL; \
+ LPSTR msg = reinterpret_cast<LPSTR>(&message); \
+ DWORD message_length = FormatMessageA(FORMAT_MESSAGE_ALLOCATE_BUFFER | \
+ FORMAT_MESSAGE_FROM_SYSTEM | \
+ FORMAT_MESSAGE_IGNORE_INSERTS, \
+ 0, result, 0, msg, 100, NULL); \
+ if (message_length > 0) { \
+ google::LogMessage(__FILE__, __LINE__, google::GLOG_ERROR, 0, \
+ &google::LogMessage::SendToLog).stream() \
+ << reinterpret_cast<const char*>(message); \
+ LocalFree(message); \
+ } \
+ }
+#endif
+
+// We use the preprocessor's merging operator, "##", so that, e.g.,
+// LOG(INFO) becomes the token GOOGLE_LOG_INFO. There's some funny
+// subtle difference between ostream member streaming functions (e.g.,
+// ostream::operator<<(int) and ostream non-member streaming functions
+// (e.g., ::operator<<(ostream&, string&): it turns out that it's
+// impossible to stream something like a string directly to an unnamed
+// ostream. We employ a neat hack by calling the stream() member
+// function of LogMessage which seems to avoid the problem.
+#define LOG(severity) COMPACT_GOOGLE_LOG_ ## severity.stream()
+#define SYSLOG(severity) SYSLOG_ ## severity(0).stream()
+
+namespace google {
+
+// They need the definitions of integer types.
+#include <glog/log_severity.h>
+#include <glog/vlog_is_on.h>
+
+// Initialize google's logging library. You will see the program name
+// specified by argv0 in log outputs.
+GLOG_EXPORT void InitGoogleLogging(const char* argv0);
+
+GLOG_EXPORT void InitGoogleLogging(const char* argv0,
+ CustomPrefixCallback prefix_callback,
+ void* prefix_callback_data = NULL);
+
+// Check if google's logging library has been initialized.
+GLOG_EXPORT bool IsGoogleLoggingInitialized();
+
+// Shutdown google's logging library.
+GLOG_EXPORT void ShutdownGoogleLogging();
+
+#if defined(__GNUC__)
+typedef void (*logging_fail_func_t)() __attribute__((noreturn));
+#else
+typedef void (*logging_fail_func_t)();
+#endif
+
+// Install a function which will be called after LOG(FATAL).
+GLOG_EXPORT void InstallFailureFunction(logging_fail_func_t fail_func);
+
+// Enable/Disable old log cleaner.
+GLOG_EXPORT void EnableLogCleaner(unsigned int overdue_days);
+GLOG_EXPORT void DisableLogCleaner();
+GLOG_EXPORT void SetApplicationFingerprint(const std::string& fingerprint);
+
+class LogSink; // defined below
+
+// If a non-NULL sink pointer is given, we push this message to that sink.
+// For LOG_TO_SINK we then do normal LOG(severity) logging as well.
+// This is useful for capturing messages and passing/storing them
+// somewhere more specific than the global log of the process.
+// Argument types:
+// LogSink* sink;
+// LogSeverity severity;
+// The cast is to disambiguate NULL arguments.
+#define LOG_TO_SINK(sink, severity) \
+ google::LogMessage( \
+ __FILE__, __LINE__, \
+ google::GLOG_ ## severity, \
+ static_cast<google::LogSink*>(sink), true).stream()
+#define LOG_TO_SINK_BUT_NOT_TO_LOGFILE(sink, severity) \
+ google::LogMessage( \
+ __FILE__, __LINE__, \
+ google::GLOG_ ## severity, \
+ static_cast<google::LogSink*>(sink), false).stream()
+
+// If a non-NULL string pointer is given, we write this message to that string.
+// We then do normal LOG(severity) logging as well.
+// This is useful for capturing messages and storing them somewhere more
+// specific than the global log of the process.
+// Argument types:
+// string* message;
+// LogSeverity severity;
+// The cast is to disambiguate NULL arguments.
+// NOTE: LOG(severity) expands to LogMessage().stream() for the specified
+// severity.
+#define LOG_TO_STRING(severity, message) \
+ LOG_TO_STRING_##severity(static_cast<std::string*>(message)).stream()
+
+// If a non-NULL pointer is given, we push the message onto the end
+// of a vector of strings; otherwise, we report it with LOG(severity).
+// This is handy for capturing messages and perhaps passing them back
+// to the caller, rather than reporting them immediately.
+// Argument types:
+// LogSeverity severity;
+// vector<string> *outvec;
+// The cast is to disambiguate NULL arguments.
+#define LOG_STRING(severity, outvec) \
+ LOG_TO_STRING_##severity(static_cast<std::vector<std::string>*>(outvec)).stream()
+
+#define LOG_IF(severity, condition) \
+ static_cast<void>(0), \
+ !(condition) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
+#define SYSLOG_IF(severity, condition) \
+ static_cast<void>(0), \
+ !(condition) ? (void) 0 : google::LogMessageVoidify() & SYSLOG(severity)
+
+#define LOG_ASSERT(condition) \
+ LOG_IF(FATAL, !(condition)) << "Assert failed: " #condition
+#define SYSLOG_ASSERT(condition) \
+ SYSLOG_IF(FATAL, !(condition)) << "Assert failed: " #condition
+
+// CHECK dies with a fatal error if condition is not true. It is *not*
+// controlled by DCHECK_IS_ON(), so the check will be executed regardless of
+// compilation mode. Therefore, it is safe to do things like:
+// CHECK(fp->Write(x) == 4)
+#define CHECK(condition) \
+ LOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \
+ << "Check failed: " #condition " "
+
+// A container for a string pointer which can be evaluated to a bool -
+// true iff the pointer is NULL.
+struct CheckOpString {
+ CheckOpString(std::string* str) : str_(str) { }
+ // No destructor: if str_ is non-NULL, we're about to LOG(FATAL),
+ // so there's no point in cleaning up str_.
+ operator bool() const {
+ return GOOGLE_PREDICT_BRANCH_NOT_TAKEN(str_ != NULL);
+ }
+ std::string* str_;
+};
+
+// Function is overloaded for integral types to allow static const
+// integrals declared in classes and not defined to be used as arguments to
+// CHECK* macros. It's not encouraged though.
+template <class T>
+inline const T& GetReferenceableValue(const T& t) { return t; }
+inline char GetReferenceableValue(char t) { return t; }
+inline unsigned char GetReferenceableValue(unsigned char t) { return t; }
+inline signed char GetReferenceableValue(signed char t) { return t; }
+inline short GetReferenceableValue(short t) { return t; }
+inline unsigned short GetReferenceableValue(unsigned short t) { return t; }
+inline int GetReferenceableValue(int t) { return t; }
+inline unsigned int GetReferenceableValue(unsigned int t) { return t; }
+inline long GetReferenceableValue(long t) { return t; }
+inline unsigned long GetReferenceableValue(unsigned long t) { return t; }
+inline long long GetReferenceableValue(long long t) { return t; }
+inline unsigned long long GetReferenceableValue(unsigned long long t) {
+ return t;
+}
+
+// This is a dummy class to define the following operator.
+struct DummyClassToDefineOperator {};
+
+}
+
+// Define global operator<< to declare using ::operator<<.
+// This declaration will allow use to use CHECK macros for user
+// defined classes which have operator<< (e.g., stl_logging.h).
+inline std::ostream& operator<<(
+ std::ostream& out, const google::DummyClassToDefineOperator&) {
+ return out;
+}
+
+namespace google {
+
+// This formats a value for a failing CHECK_XX statement. Ordinarily,
+// it uses the definition for operator<<, with a few special cases below.
+template <typename T>
+inline void MakeCheckOpValueString(std::ostream* os, const T& v) {
+ (*os) << v;
+}
+
+// Overrides for char types provide readable values for unprintable
+// characters.
+template <> GLOG_EXPORT
+void MakeCheckOpValueString(std::ostream* os, const char& v);
+template <> GLOG_EXPORT
+void MakeCheckOpValueString(std::ostream* os, const signed char& v);
+template <> GLOG_EXPORT
+void MakeCheckOpValueString(std::ostream* os, const unsigned char& v);
+
+// Provide printable value for nullptr_t
+template <>
+GLOG_EXPORT void MakeCheckOpValueString(std::ostream* os,
+ const std::nullptr_t& v);
+
+// Build the error message string. Specify no inlining for code size.
+template <typename T1, typename T2>
+std::string* MakeCheckOpString(const T1& v1, const T2& v2, const char* exprtext)
+ __attribute__((noinline));
+
+namespace base {
+namespace internal {
+
+// If "s" is less than base_logging::INFO, returns base_logging::INFO.
+// If "s" is greater than base_logging::FATAL, returns
+// base_logging::ERROR. Otherwise, returns "s".
+LogSeverity NormalizeSeverity(LogSeverity s);
+
+} // namespace internal
+
+// A helper class for formatting "expr (V1 vs. V2)" in a CHECK_XX
+// statement. See MakeCheckOpString for sample usage. Other
+// approaches were considered: use of a template method (e.g.,
+// base::BuildCheckOpString(exprtext, base::Print<T1>, &v1,
+// base::Print<T2>, &v2), however this approach has complications
+// related to volatile arguments and function-pointer arguments).
+class GLOG_EXPORT CheckOpMessageBuilder {
+ public:
+ // Inserts "exprtext" and " (" to the stream.
+ explicit CheckOpMessageBuilder(const char *exprtext);
+ // Deletes "stream_".
+ ~CheckOpMessageBuilder();
+ // For inserting the first variable.
+ std::ostream* ForVar1() { return stream_; }
+ // For inserting the second variable (adds an intermediate " vs. ").
+ std::ostream* ForVar2();
+ // Get the result (inserts the closing ")").
+ std::string* NewString();
+
+ private:
+ std::ostringstream *stream_;
+};
+
+} // namespace base
+
+template <typename T1, typename T2>
+std::string* MakeCheckOpString(const T1& v1, const T2& v2, const char* exprtext) {
+ base::CheckOpMessageBuilder comb(exprtext);
+ MakeCheckOpValueString(comb.ForVar1(), v1);
+ MakeCheckOpValueString(comb.ForVar2(), v2);
+ return comb.NewString();
+}
+
+// Helper functions for CHECK_OP macro.
+// The (int, int) specialization works around the issue that the compiler
+// will not instantiate the template version of the function on values of
+// unnamed enum type - see comment below.
+#define DEFINE_CHECK_OP_IMPL(name, op) \
+ template <typename T1, typename T2> \
+ inline std::string* name##Impl(const T1& v1, const T2& v2, \
+ const char* exprtext) { \
+ if (GOOGLE_PREDICT_TRUE(v1 op v2)) return NULL; \
+ else return MakeCheckOpString(v1, v2, exprtext); \
+ } \
+ inline std::string* name##Impl(int v1, int v2, const char* exprtext) { \
+ return name##Impl<int, int>(v1, v2, exprtext); \
+ }
+
+// We use the full name Check_EQ, Check_NE, etc. in case the file including
+// base/logging.h provides its own #defines for the simpler names EQ, NE, etc.
+// This happens if, for example, those are used as token names in a
+// yacc grammar.
+DEFINE_CHECK_OP_IMPL(Check_EQ, ==) // Compilation error with CHECK_EQ(NULL, x)?
+DEFINE_CHECK_OP_IMPL(Check_NE, !=) // Use CHECK(x == NULL) instead.
+DEFINE_CHECK_OP_IMPL(Check_LE, <=)
+DEFINE_CHECK_OP_IMPL(Check_LT, < )
+DEFINE_CHECK_OP_IMPL(Check_GE, >=)
+DEFINE_CHECK_OP_IMPL(Check_GT, > )
+#undef DEFINE_CHECK_OP_IMPL
+
+// Helper macro for binary operators.
+// Don't use this macro directly in your code, use CHECK_EQ et al below.
+
+#if defined(STATIC_ANALYSIS)
+// Only for static analysis tool to know that it is equivalent to assert
+#define CHECK_OP_LOG(name, op, val1, val2, log) CHECK((val1) op (val2))
+#elif DCHECK_IS_ON()
+// In debug mode, avoid constructing CheckOpStrings if possible,
+// to reduce the overhead of CHECK statments by 2x.
+// Real DCHECK-heavy tests have seen 1.5x speedups.
+
+// The meaning of "string" might be different between now and
+// when this macro gets invoked (e.g., if someone is experimenting
+// with other string implementations that get defined after this
+// file is included). Save the current meaning now and use it
+// in the macro.
+typedef std::string _Check_string;
+#define CHECK_OP_LOG(name, op, val1, val2, log) \
+ while (google::_Check_string* _result = \
+ google::Check##name##Impl( \
+ google::GetReferenceableValue(val1), \
+ google::GetReferenceableValue(val2), \
+ #val1 " " #op " " #val2)) \
+ log(__FILE__, __LINE__, \
+ google::CheckOpString(_result)).stream()
+#else
+// In optimized mode, use CheckOpString to hint to compiler that
+// the while condition is unlikely.
+#define CHECK_OP_LOG(name, op, val1, val2, log) \
+ while (google::CheckOpString _result = \
+ google::Check##name##Impl( \
+ google::GetReferenceableValue(val1), \
+ google::GetReferenceableValue(val2), \
+ #val1 " " #op " " #val2)) \
+ log(__FILE__, __LINE__, _result).stream()
+#endif // STATIC_ANALYSIS, DCHECK_IS_ON()
+
+#if GOOGLE_STRIP_LOG <= 3
+#define CHECK_OP(name, op, val1, val2) \
+ CHECK_OP_LOG(name, op, val1, val2, google::LogMessageFatal)
+#else
+#define CHECK_OP(name, op, val1, val2) \
+ CHECK_OP_LOG(name, op, val1, val2, google::NullStreamFatal)
+#endif // STRIP_LOG <= 3
+
+// Equality/Inequality checks - compare two values, and log a FATAL message
+// including the two values when the result is not as expected. The values
+// must have operator<<(ostream, ...) defined.
+//
+// You may append to the error message like so:
+// CHECK_NE(1, 2) << ": The world must be ending!";
+//
+// We are very careful to ensure that each argument is evaluated exactly
+// once, and that anything which is legal to pass as a function argument is
+// legal here. In particular, the arguments may be temporary expressions
+// which will end up being destroyed at the end of the apparent statement,
+// for example:
+// CHECK_EQ(string("abc")[1], 'b');
+//
+// WARNING: These don't compile correctly if one of the arguments is a pointer
+// and the other is NULL. To work around this, simply static_cast NULL to the
+// type of the desired pointer.
+
+#define CHECK_EQ(val1, val2) CHECK_OP(_EQ, ==, val1, val2)
+#define CHECK_NE(val1, val2) CHECK_OP(_NE, !=, val1, val2)
+#define CHECK_LE(val1, val2) CHECK_OP(_LE, <=, val1, val2)
+#define CHECK_LT(val1, val2) CHECK_OP(_LT, < , val1, val2)
+#define CHECK_GE(val1, val2) CHECK_OP(_GE, >=, val1, val2)
+#define CHECK_GT(val1, val2) CHECK_OP(_GT, > , val1, val2)
+
+// Check that the input is non NULL. This very useful in constructor
+// initializer lists.
+
+#define CHECK_NOTNULL(val) \
+ google::CheckNotNull(__FILE__, __LINE__, "'" #val "' Must be non NULL", (val))
+
+// Helper functions for string comparisons.
+// To avoid bloat, the definitions are in logging.cc.
+#define DECLARE_CHECK_STROP_IMPL(func, expected) \
+ GLOG_EXPORT std::string* Check##func##expected##Impl( \
+ const char* s1, const char* s2, const char* names);
+DECLARE_CHECK_STROP_IMPL(strcmp, true)
+DECLARE_CHECK_STROP_IMPL(strcmp, false)
+DECLARE_CHECK_STROP_IMPL(strcasecmp, true)
+DECLARE_CHECK_STROP_IMPL(strcasecmp, false)
+#undef DECLARE_CHECK_STROP_IMPL
+
+// Helper macro for string comparisons.
+// Don't use this macro directly in your code, use CHECK_STREQ et al below.
+#define CHECK_STROP(func, op, expected, s1, s2) \
+ while (google::CheckOpString _result = \
+ google::Check##func##expected##Impl((s1), (s2), \
+ #s1 " " #op " " #s2)) \
+ LOG(FATAL) << *_result.str_
+
+
+// String (char*) equality/inequality checks.
+// CASE versions are case-insensitive.
+//
+// Note that "s1" and "s2" may be temporary strings which are destroyed
+// by the compiler at the end of the current "full expression"
+// (e.g. CHECK_STREQ(Foo().c_str(), Bar().c_str())).
+
+#define CHECK_STREQ(s1, s2) CHECK_STROP(strcmp, ==, true, s1, s2)
+#define CHECK_STRNE(s1, s2) CHECK_STROP(strcmp, !=, false, s1, s2)
+#define CHECK_STRCASEEQ(s1, s2) CHECK_STROP(strcasecmp, ==, true, s1, s2)
+#define CHECK_STRCASENE(s1, s2) CHECK_STROP(strcasecmp, !=, false, s1, s2)
+
+#define CHECK_INDEX(I,A) CHECK(I < (sizeof(A)/sizeof(A[0])))
+#define CHECK_BOUND(B,A) CHECK(B <= (sizeof(A)/sizeof(A[0])))
+
+#define CHECK_DOUBLE_EQ(val1, val2) \
+ do { \
+ CHECK_LE((val1), (val2)+0.000000000000001L); \
+ CHECK_GE((val1), (val2)-0.000000000000001L); \
+ } while (0)
+
+#define CHECK_NEAR(val1, val2, margin) \
+ do { \
+ CHECK_LE((val1), (val2)+(margin)); \
+ CHECK_GE((val1), (val2)-(margin)); \
+ } while (0)
+
+// perror()..googly style!
+//
+// PLOG() and PLOG_IF() and PCHECK() behave exactly like their LOG* and
+// CHECK equivalents with the addition that they postpend a description
+// of the current state of errno to their output lines.
+
+#define PLOG(severity) GOOGLE_PLOG(severity, 0).stream()
+
+#define GOOGLE_PLOG(severity, counter) \
+ google::ErrnoLogMessage( \
+ __FILE__, __LINE__, google::GLOG_ ## severity, counter, \
+ &google::LogMessage::SendToLog)
+
+#define PLOG_IF(severity, condition) \
+ static_cast<void>(0), \
+ !(condition) ? (void) 0 : google::LogMessageVoidify() & PLOG(severity)
+
+// A CHECK() macro that postpends errno if the condition is false. E.g.
+//
+// if (poll(fds, nfds, timeout) == -1) { PCHECK(errno == EINTR); ... }
+#define PCHECK(condition) \
+ PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN(!(condition))) \
+ << "Check failed: " #condition " "
+
+// A CHECK() macro that lets you assert the success of a function that
+// returns -1 and sets errno in case of an error. E.g.
+//
+// CHECK_ERR(mkdir(path, 0700));
+//
+// or
+//
+// int fd = open(filename, flags); CHECK_ERR(fd) << ": open " << filename;
+#define CHECK_ERR(invocation) \
+PLOG_IF(FATAL, GOOGLE_PREDICT_BRANCH_NOT_TAKEN((invocation) == -1)) \
+ << #invocation
+
+// Use macro expansion to create, for each use of LOG_EVERY_N(), static
+// variables with the __LINE__ expansion as part of the variable name.
+#define LOG_EVERY_N_VARNAME(base, line) LOG_EVERY_N_VARNAME_CONCAT(base, line)
+#define LOG_EVERY_N_VARNAME_CONCAT(base, line) base ## line
+
+#define LOG_OCCURRENCES LOG_EVERY_N_VARNAME(occurrences_, __LINE__)
+#define LOG_OCCURRENCES_MOD_N LOG_EVERY_N_VARNAME(occurrences_mod_n_, __LINE__)
+
+#define LOG_TIME_PERIOD LOG_EVERY_N_VARNAME(timePeriod_, __LINE__)
+#define LOG_PREVIOUS_TIME_RAW LOG_EVERY_N_VARNAME(previousTimeRaw_, __LINE__)
+#define LOG_TIME_DELTA LOG_EVERY_N_VARNAME(deltaTime_, __LINE__)
+#define LOG_CURRENT_TIME LOG_EVERY_N_VARNAME(currentTime_, __LINE__)
+#define LOG_PREVIOUS_TIME LOG_EVERY_N_VARNAME(previousTime_, __LINE__)
+
+#if defined(__has_feature)
+# if __has_feature(thread_sanitizer)
+# define GLOG_SANITIZE_THREAD 1
+# endif
+#endif
+
+#if !defined(GLOG_SANITIZE_THREAD) && defined(__SANITIZE_THREAD__) && __SANITIZE_THREAD__
+# define GLOG_SANITIZE_THREAD 1
+#endif
+
+#if defined(GLOG_SANITIZE_THREAD)
+#define GLOG_IFDEF_THREAD_SANITIZER(X) X
+#else
+#define GLOG_IFDEF_THREAD_SANITIZER(X)
+#endif
+
+#if defined(GLOG_SANITIZE_THREAD)
+} // namespace google
+
+// We need to identify the static variables as "benign" races
+// to avoid noisy reports from TSAN.
+extern "C" void AnnotateBenignRaceSized(
+ const char *file,
+ int line,
+ const volatile void *mem,
+ size_t size,
+ const char *description);
+
+namespace google {
+#endif
+
+#define SOME_KIND_OF_LOG_EVERY_T(severity, seconds) \
+ constexpr std::chrono::nanoseconds LOG_TIME_PERIOD = \
+ std::chrono::duration_cast<std::chrono::nanoseconds>( \
+ std::chrono::duration<double>(seconds)); \
+ static std::atomic<google ::int64> LOG_PREVIOUS_TIME_RAW; \
+ GLOG_IFDEF_THREAD_SANITIZER( \
+ AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_TIME_PERIOD, \
+ sizeof(@ac_google_namespace @ ::int64), "")); \
+ GLOG_IFDEF_THREAD_SANITIZER( \
+ AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_PREVIOUS_TIME_RAW, \
+ sizeof(@ac_google_namespace @ ::int64), "")); \
+ const auto LOG_CURRENT_TIME = \
+ std::chrono::duration_cast<std::chrono::nanoseconds>( \
+ std::chrono::steady_clock::now().time_since_epoch()); \
+ const auto LOG_PREVIOUS_TIME = \
+ LOG_PREVIOUS_TIME_RAW.load(std::memory_order_relaxed); \
+ const auto LOG_TIME_DELTA = \
+ LOG_CURRENT_TIME - std::chrono::nanoseconds(LOG_PREVIOUS_TIME); \
+ if (LOG_TIME_DELTA > LOG_TIME_PERIOD) \
+ LOG_PREVIOUS_TIME_RAW.store( \
+ std::chrono::duration_cast<std::chrono::nanoseconds>(LOG_CURRENT_TIME) \
+ .count(), \
+ std::memory_order_relaxed); \
+ if (LOG_TIME_DELTA > LOG_TIME_PERIOD) \
+ google ::LogMessage( \
+ __FILE__, __LINE__, google ::GLOG_##severity) \
+ .stream()
+
+#define SOME_KIND_OF_LOG_EVERY_N(severity, n, what_to_do) \
+ static std::atomic<int> LOG_OCCURRENCES(0), LOG_OCCURRENCES_MOD_N(0); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES, sizeof(int), "")); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES_MOD_N, sizeof(int), "")); \
+ ++LOG_OCCURRENCES; \
+ if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \
+ if (LOG_OCCURRENCES_MOD_N == 1) \
+ google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_ ## severity, LOG_OCCURRENCES, \
+ &what_to_do).stream()
+
+#define SOME_KIND_OF_LOG_IF_EVERY_N(severity, condition, n, what_to_do) \
+ static std::atomic<int> LOG_OCCURRENCES(0), LOG_OCCURRENCES_MOD_N(0); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES, sizeof(int), "")); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES_MOD_N, sizeof(int), "")); \
+ ++LOG_OCCURRENCES; \
+ if ((condition) && \
+ ((LOG_OCCURRENCES_MOD_N=(LOG_OCCURRENCES_MOD_N + 1) % n) == (1 % n))) \
+ google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_ ## severity, LOG_OCCURRENCES, \
+ &what_to_do).stream()
+
+#define SOME_KIND_OF_PLOG_EVERY_N(severity, n, what_to_do) \
+ static std::atomic<int> LOG_OCCURRENCES(0), LOG_OCCURRENCES_MOD_N(0); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES, sizeof(int), "")); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES_MOD_N, sizeof(int), "")); \
+ ++LOG_OCCURRENCES; \
+ if (++LOG_OCCURRENCES_MOD_N > n) LOG_OCCURRENCES_MOD_N -= n; \
+ if (LOG_OCCURRENCES_MOD_N == 1) \
+ google::ErrnoLogMessage( \
+ __FILE__, __LINE__, google::GLOG_ ## severity, LOG_OCCURRENCES, \
+ &what_to_do).stream()
+
+#define SOME_KIND_OF_LOG_FIRST_N(severity, n, what_to_do) \
+ static std::atomic<int> LOG_OCCURRENCES(0); \
+ GLOG_IFDEF_THREAD_SANITIZER(AnnotateBenignRaceSized(__FILE__, __LINE__, &LOG_OCCURRENCES, sizeof(int), "")); \
+ if (LOG_OCCURRENCES <= n) \
+ ++LOG_OCCURRENCES; \
+ if (LOG_OCCURRENCES <= n) \
+ google::LogMessage( \
+ __FILE__, __LINE__, google::GLOG_ ## severity, LOG_OCCURRENCES, \
+ &what_to_do).stream()
+
+namespace glog_internal_namespace_ {
+template <bool>
+struct CompileAssert {
+};
+struct CrashReason;
+
+// Returns true if FailureSignalHandler is installed.
+// Needs to be exported since it's used by the signalhandler_unittest.
+GLOG_EXPORT bool IsFailureSignalHandlerInstalled();
+} // namespace glog_internal_namespace_
+
+#define LOG_EVERY_N(severity, n) \
+ SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToLog)
+
+#define LOG_EVERY_T(severity, T) SOME_KIND_OF_LOG_EVERY_T(severity, (T))
+
+#define SYSLOG_EVERY_N(severity, n) \
+ SOME_KIND_OF_LOG_EVERY_N(severity, (n), google::LogMessage::SendToSyslogAndLog)
+
+#define PLOG_EVERY_N(severity, n) \
+ SOME_KIND_OF_PLOG_EVERY_N(severity, (n), google::LogMessage::SendToLog)
+
+#define LOG_FIRST_N(severity, n) \
+ SOME_KIND_OF_LOG_FIRST_N(severity, (n), google::LogMessage::SendToLog)
+
+#define LOG_IF_EVERY_N(severity, condition, n) \
+ SOME_KIND_OF_LOG_IF_EVERY_N(severity, (condition), (n), google::LogMessage::SendToLog)
+
+// We want the special COUNTER value available for LOG_EVERY_X()'ed messages
+enum PRIVATE_Counter {COUNTER};
+
+#ifdef GLOG_NO_ABBREVIATED_SEVERITIES
+// wingdi.h defines ERROR to be 0. When we call LOG(ERROR), it gets
+// substituted with 0, and it expands to COMPACT_GOOGLE_LOG_0. To allow us
+// to keep using this syntax, we define this macro to do the same thing
+// as COMPACT_GOOGLE_LOG_ERROR.
+#define COMPACT_GOOGLE_LOG_0 COMPACT_GOOGLE_LOG_ERROR
+#define SYSLOG_0 SYSLOG_ERROR
+#define LOG_TO_STRING_0 LOG_TO_STRING_ERROR
+// Needed for LOG_IS_ON(ERROR).
+const LogSeverity GLOG_0 = GLOG_ERROR;
+#else
+// Users may include windows.h after logging.h without
+// GLOG_NO_ABBREVIATED_SEVERITIES nor WIN32_LEAN_AND_MEAN.
+// For this case, we cannot detect if ERROR is defined before users
+// actually use ERROR. Let's make an undefined symbol to warn users.
+# define GLOG_ERROR_MSG ERROR_macro_is_defined_Define_GLOG_NO_ABBREVIATED_SEVERITIES_before_including_logging_h_See_the_document_for_detail
+# define COMPACT_GOOGLE_LOG_0 GLOG_ERROR_MSG
+# define SYSLOG_0 GLOG_ERROR_MSG
+# define LOG_TO_STRING_0 GLOG_ERROR_MSG
+# define GLOG_0 GLOG_ERROR_MSG
+#endif
+
+// Plus some debug-logging macros that get compiled to nothing for production
+
+#if DCHECK_IS_ON()
+
+#define DLOG(severity) LOG(severity)
+#define DVLOG(verboselevel) VLOG(verboselevel)
+#define DLOG_IF(severity, condition) LOG_IF(severity, condition)
+#define DLOG_EVERY_N(severity, n) LOG_EVERY_N(severity, n)
+#define DLOG_IF_EVERY_N(severity, condition, n) \
+ LOG_IF_EVERY_N(severity, condition, n)
+#define DLOG_ASSERT(condition) LOG_ASSERT(condition)
+
+// debug-only checking. executed if DCHECK_IS_ON().
+#define DCHECK(condition) CHECK(condition)
+#define DCHECK_EQ(val1, val2) CHECK_EQ(val1, val2)
+#define DCHECK_NE(val1, val2) CHECK_NE(val1, val2)
+#define DCHECK_LE(val1, val2) CHECK_LE(val1, val2)
+#define DCHECK_LT(val1, val2) CHECK_LT(val1, val2)
+#define DCHECK_GE(val1, val2) CHECK_GE(val1, val2)
+#define DCHECK_GT(val1, val2) CHECK_GT(val1, val2)
+#define DCHECK_NOTNULL(val) CHECK_NOTNULL(val)
+#define DCHECK_STREQ(str1, str2) CHECK_STREQ(str1, str2)
+#define DCHECK_STRCASEEQ(str1, str2) CHECK_STRCASEEQ(str1, str2)
+#define DCHECK_STRNE(str1, str2) CHECK_STRNE(str1, str2)
+#define DCHECK_STRCASENE(str1, str2) CHECK_STRCASENE(str1, str2)
+
+#else // !DCHECK_IS_ON()
+
+#define DLOG(severity) \
+ static_cast<void>(0), \
+ true ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
+
+#define DVLOG(verboselevel) \
+ static_cast<void>(0), \
+ (true || !VLOG_IS_ON(verboselevel)) ? \
+ (void) 0 : google::LogMessageVoidify() & LOG(INFO)
+
+#define DLOG_IF(severity, condition) \
+ static_cast<void>(0), \
+ (true || !(condition)) ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
+
+#define DLOG_EVERY_N(severity, n) \
+ static_cast<void>(0), \
+ true ? (void) 0 : google::LogMessageVoidify() & LOG(severity)
+
+#define DLOG_IF_EVERY_N(severity, condition, n) \
+ static_cast<void>(0), \
+ (true || !(condition))? (void) 0 : google::LogMessageVoidify() & LOG(severity)
+
+#define DLOG_ASSERT(condition) \
+ static_cast<void>(0), \
+ true ? (void) 0 : LOG_ASSERT(condition)
+
+// MSVC warning C4127: conditional expression is constant
+#define DCHECK(condition) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK(condition)
+
+#define DCHECK_EQ(val1, val2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_EQ(val1, val2)
+
+#define DCHECK_NE(val1, val2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_NE(val1, val2)
+
+#define DCHECK_LE(val1, val2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_LE(val1, val2)
+
+#define DCHECK_LT(val1, val2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_LT(val1, val2)
+
+#define DCHECK_GE(val1, val2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_GE(val1, val2)
+
+#define DCHECK_GT(val1, val2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_GT(val1, val2)
+
+// You may see warnings in release mode if you don't use the return
+// value of DCHECK_NOTNULL. Please just use DCHECK for such cases.
+#define DCHECK_NOTNULL(val) (val)
+
+#define DCHECK_STREQ(str1, str2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_STREQ(str1, str2)
+
+#define DCHECK_STRCASEEQ(str1, str2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_STRCASEEQ(str1, str2)
+
+#define DCHECK_STRNE(str1, str2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_STRNE(str1, str2)
+
+#define DCHECK_STRCASENE(str1, str2) \
+ GLOG_MSVC_PUSH_DISABLE_WARNING(4127) \
+ while (false) \
+ GLOG_MSVC_POP_WARNING() CHECK_STRCASENE(str1, str2)
+
+#endif // DCHECK_IS_ON()
+
+// Log only in verbose mode.
+
+#define VLOG(verboselevel) LOG_IF(INFO, VLOG_IS_ON(verboselevel))
+
+#define VLOG_IF(verboselevel, condition) \
+ LOG_IF(INFO, (condition) && VLOG_IS_ON(verboselevel))
+
+#define VLOG_EVERY_N(verboselevel, n) \
+ LOG_IF_EVERY_N(INFO, VLOG_IS_ON(verboselevel), n)
+
+#define VLOG_IF_EVERY_N(verboselevel, condition, n) \
+ LOG_IF_EVERY_N(INFO, (condition) && VLOG_IS_ON(verboselevel), n)
+
+namespace base_logging {
+
+// LogMessage::LogStream is a std::ostream backed by this streambuf.
+// This class ignores overflow and leaves two bytes at the end of the
+// buffer to allow for a '\n' and '\0'.
+class GLOG_EXPORT LogStreamBuf : public std::streambuf {
+ public:
+ // REQUIREMENTS: "len" must be >= 2 to account for the '\n' and '\0'.
+ LogStreamBuf(char *buf, int len) {
+ setp(buf, buf + len - 2);
+ }
+
+ // This effectively ignores overflow.
+ int_type overflow(int_type ch) {
+ return ch;
+ }
+
+ // Legacy public ostrstream method.
+ size_t pcount() const { return static_cast<size_t>(pptr() - pbase()); }
+ char* pbase() const { return std::streambuf::pbase(); }
+};
+
+} // namespace base_logging
+
+//
+// This class more or less represents a particular log message. You
+// create an instance of LogMessage and then stream stuff to it.
+// When you finish streaming to it, ~LogMessage is called and the
+// full message gets streamed to the appropriate destination.
+//
+// You shouldn't actually use LogMessage's constructor to log things,
+// though. You should use the LOG() macro (and variants thereof)
+// above.
+class GLOG_EXPORT LogMessage {
+public:
+ enum {
+ // Passing kNoLogPrefix for the line number disables the
+ // log-message prefix. Useful for using the LogMessage
+ // infrastructure as a printing utility. See also the --log_prefix
+ // flag for controlling the log-message prefix on an
+ // application-wide basis.
+ kNoLogPrefix = -1
+ };
+
+ // LogStream inherit from non-DLL-exported class (std::ostrstream)
+ // and VC++ produces a warning for this situation.
+ // However, MSDN says "C4275 can be ignored in Microsoft Visual C++
+ // 2005 if you are deriving from a type in the Standard C++ Library"
+ // http://msdn.microsoft.com/en-us/library/3tdb471s(VS.80).aspx
+ // Let's just ignore the warning.
+GLOG_MSVC_PUSH_DISABLE_WARNING(4275)
+ class GLOG_EXPORT LogStream : public std::ostream {
+GLOG_MSVC_POP_WARNING()
+ public:
+ LogStream(char *buf, int len, int64 ctr)
+ : std::ostream(NULL),
+ streambuf_(buf, len),
+ ctr_(ctr),
+ self_(this) {
+ rdbuf(&streambuf_);
+ }
+
+ int64 ctr() const { return ctr_; }
+ void set_ctr(int64 ctr) { ctr_ = ctr; }
+ LogStream* self() const { return self_; }
+
+ // Legacy std::streambuf methods.
+ size_t pcount() const { return streambuf_.pcount(); }
+ char* pbase() const { return streambuf_.pbase(); }
+ char* str() const { return pbase(); }
+
+ private:
+ LogStream(const LogStream&);
+ LogStream& operator=(const LogStream&);
+ base_logging::LogStreamBuf streambuf_;
+ int64 ctr_; // Counter hack (for the LOG_EVERY_X() macro)
+ LogStream *self_; // Consistency check hack
+ };
+
+public:
+ // icc 8 requires this typedef to avoid an internal compiler error.
+ typedef void (LogMessage::*SendMethod)();
+
+ LogMessage(const char* file, int line, LogSeverity severity, int64 ctr,
+ SendMethod send_method);
+
+ // Two special constructors that generate reduced amounts of code at
+ // LOG call sites for common cases.
+
+ // Used for LOG(INFO): Implied are:
+ // severity = INFO, ctr = 0, send_method = &LogMessage::SendToLog.
+ //
+ // Using this constructor instead of the more complex constructor above
+ // saves 19 bytes per call site.
+ LogMessage(const char* file, int line);
+
+ // Used for LOG(severity) where severity != INFO. Implied
+ // are: ctr = 0, send_method = &LogMessage::SendToLog
+ //
+ // Using this constructor instead of the more complex constructor above
+ // saves 17 bytes per call site.
+ LogMessage(const char* file, int line, LogSeverity severity);
+
+ // Constructor to log this message to a specified sink (if not NULL).
+ // Implied are: ctr = 0, send_method = &LogMessage::SendToSinkAndLog if
+ // also_send_to_log is true, send_method = &LogMessage::SendToSink otherwise.
+ LogMessage(const char* file, int line, LogSeverity severity, LogSink* sink,
+ bool also_send_to_log);
+
+ // Constructor where we also give a vector<string> pointer
+ // for storing the messages (if the pointer is not NULL).
+ // Implied are: ctr = 0, send_method = &LogMessage::SaveOrSendToLog.
+ LogMessage(const char* file, int line, LogSeverity severity,
+ std::vector<std::string>* outvec);
+
+ // Constructor where we also give a string pointer for storing the
+ // message (if the pointer is not NULL). Implied are: ctr = 0,
+ // send_method = &LogMessage::WriteToStringAndLog.
+ LogMessage(const char* file, int line, LogSeverity severity,
+ std::string* message);
+
+ // A special constructor used for check failures
+ LogMessage(const char* file, int line, const CheckOpString& result);
+
+ ~LogMessage();
+
+ // Flush a buffered message to the sink set in the constructor. Always
+ // called by the destructor, it may also be called from elsewhere if
+ // needed. Only the first call is actioned; any later ones are ignored.
+ void Flush();
+
+ // An arbitrary limit on the length of a single log message. This
+ // is so that streaming can be done more efficiently.
+ static const size_t kMaxLogMessageLen;
+
+ // Theses should not be called directly outside of logging.*,
+ // only passed as SendMethod arguments to other LogMessage methods:
+ void SendToLog(); // Actually dispatch to the logs
+ void SendToSyslogAndLog(); // Actually dispatch to syslog and the logs
+
+ // Call abort() or similar to perform LOG(FATAL) crash.
+ [[noreturn]] static void Fail();
+
+ std::ostream& stream();
+
+ int preserved_errno() const;
+
+ // Must be called without the log_mutex held. (L < log_mutex)
+ static int64 num_messages(int severity);
+
+ const LogMessageTime& getLogMessageTime() const;
+
+ struct LogMessageData;
+
+private:
+ // Fully internal SendMethod cases:
+ void SendToSinkAndLog(); // Send to sink if provided and dispatch to the logs
+ void SendToSink(); // Send to sink if provided, do nothing otherwise.
+
+ // Write to string if provided and dispatch to the logs.
+ void WriteToStringAndLog();
+
+ void SaveOrSendToLog(); // Save to stringvec if provided, else to logs
+
+ void Init(const char* file, int line, LogSeverity severity,
+ void (LogMessage::*send_method)());
+
+ // Used to fill in crash information during LOG(FATAL) failures.
+ void RecordCrashReason(glog_internal_namespace_::CrashReason* reason);
+
+ // Counts of messages sent at each priority:
+ static int64 num_messages_[NUM_SEVERITIES]; // under log_mutex
+
+ // We keep the data in a separate struct so that each instance of
+ // LogMessage uses less stack space.
+ LogMessageData* allocated_;
+ LogMessageData* data_;
+ LogMessageTime logmsgtime_;
+
+ friend class LogDestination;
+
+ LogMessage(const LogMessage&);
+ void operator=(const LogMessage&);
+};
+
+// This class happens to be thread-hostile because all instances share
+// a single data buffer, but since it can only be created just before
+// the process dies, we don't worry so much.
+class GLOG_EXPORT LogMessageFatal : public LogMessage {
+ public:
+ LogMessageFatal(const char* file, int line);
+ LogMessageFatal(const char* file, int line, const CheckOpString& result);
+ [[noreturn]] ~LogMessageFatal();
+};
+
+// A non-macro interface to the log facility; (useful
+// when the logging level is not a compile-time constant).
+inline void LogAtLevel(int const severity, std::string const &msg) {
+ LogMessage(__FILE__, __LINE__, severity).stream() << msg;
+}
+
+// A macro alternative of LogAtLevel. New code may want to use this
+// version since there are two advantages: 1. this version outputs the
+// file name and the line number where this macro is put like other
+// LOG macros, 2. this macro can be used as C++ stream.
+#define LOG_AT_LEVEL(severity) google::LogMessage(__FILE__, __LINE__, severity).stream()
+
+// Helper for CHECK_NOTNULL().
+//
+// In C++11, all cases can be handled by a single function. Since the value
+// category of the argument is preserved (also for rvalue references),
+// member initializer lists like the one below will compile correctly:
+//
+// Foo()
+// : x_(CHECK_NOTNULL(MethodReturningUniquePtr())) {}
+template <typename T>
+T CheckNotNull(const char* file, int line, const char* names, T&& t) {
+ if (t == nullptr) {
+ LogMessageFatal(file, line, new std::string(names));
+ }
+ return std::forward<T>(t);
+}
+
+// Allow folks to put a counter in the LOG_EVERY_X()'ed messages. This
+// only works if ostream is a LogStream. If the ostream is not a
+// LogStream you'll get an assert saying as much at runtime.
+GLOG_EXPORT std::ostream& operator<<(std::ostream &os,
+ const PRIVATE_Counter&);
+
+
+// Derived class for PLOG*() above.
+class GLOG_EXPORT ErrnoLogMessage : public LogMessage {
+ public:
+ ErrnoLogMessage(const char* file, int line, LogSeverity severity, int64 ctr,
+ void (LogMessage::*send_method)());
+
+ // Postpends ": strerror(errno) [errno]".
+ ~ErrnoLogMessage();
+
+ private:
+ ErrnoLogMessage(const ErrnoLogMessage&);
+ void operator=(const ErrnoLogMessage&);
+};
+
+
+// This class is used to explicitly ignore values in the conditional
+// logging macros. This avoids compiler warnings like "value computed
+// is not used" and "statement has no effect".
+
+class GLOG_EXPORT LogMessageVoidify {
+ public:
+ LogMessageVoidify() { }
+ // This has to be an operator with a precedence lower than << but
+ // higher than ?:
+ void operator&(std::ostream&) { }
+};
+
+
+// Flushes all log files that contains messages that are at least of
+// the specified severity level. Thread-safe.
+GLOG_EXPORT void FlushLogFiles(LogSeverity min_severity);
+
+// Flushes all log files that contains messages that are at least of
+// the specified severity level. Thread-hostile because it ignores
+// locking -- used for catastrophic failures.
+GLOG_EXPORT void FlushLogFilesUnsafe(LogSeverity min_severity);
+
+//
+// Set the destination to which a particular severity level of log
+// messages is sent. If base_filename is "", it means "don't log this
+// severity". Thread-safe.
+//
+GLOG_EXPORT void SetLogDestination(LogSeverity severity,
+ const char* base_filename);
+
+//
+// Set the basename of the symlink to the latest log file at a given
+// severity. If symlink_basename is empty, do not make a symlink. If
+// you don't call this function, the symlink basename is the
+// invocation name of the program. Thread-safe.
+//
+GLOG_EXPORT void SetLogSymlink(LogSeverity severity,
+ const char* symlink_basename);
+
+//
+// Used to send logs to some other kind of destination
+// Users should subclass LogSink and override send to do whatever they want.
+// Implementations must be thread-safe because a shared instance will
+// be called from whichever thread ran the LOG(XXX) line.
+class GLOG_EXPORT LogSink {
+ public:
+ virtual ~LogSink();
+
+ // Sink's logging logic (message_len is such as to exclude '\n' at the end).
+ // This method can't use LOG() or CHECK() as logging system mutex(s) are held
+ // during this call.
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line,
+ const LogMessageTime& logmsgtime, const char* message,
+ size_t message_len);
+ // Provide an overload for compatibility purposes
+ GLOG_DEPRECATED
+ virtual void send(LogSeverity severity, const char* full_filename,
+ const char* base_filename, int line, const std::tm* t,
+ const char* message, size_t message_len);
+
+ // Redefine this to implement waiting for
+ // the sink's logging logic to complete.
+ // It will be called after each send() returns,
+ // but before that LogMessage exits or crashes.
+ // By default this function does nothing.
+ // Using this function one can implement complex logic for send()
+ // that itself involves logging; and do all this w/o causing deadlocks and
+ // inconsistent rearrangement of log messages.
+ // E.g. if a LogSink has thread-specific actions, the send() method
+ // can simply add the message to a queue and wake up another thread that
+ // handles real logging while itself making some LOG() calls;
+ // WaitTillSent() can be implemented to wait for that logic to complete.
+ // See our unittest for an example.
+ virtual void WaitTillSent();
+
+ // Returns the normal text output of the log message.
+ // Can be useful to implement send().
+ static std::string ToString(LogSeverity severity, const char* file, int line,
+ const LogMessageTime &logmsgtime,
+ const char* message, size_t message_len);
+};
+
+// Add or remove a LogSink as a consumer of logging data. Thread-safe.
+GLOG_EXPORT void AddLogSink(LogSink *destination);
+GLOG_EXPORT void RemoveLogSink(LogSink *destination);
+
+//
+// Specify an "extension" added to the filename specified via
+// SetLogDestination. This applies to all severity levels. It's
+// often used to append the port we're listening on to the logfile
+// name. Thread-safe.
+//
+GLOG_EXPORT void SetLogFilenameExtension(
+ const char* filename_extension);
+
+//
+// Make it so that all log messages of at least a particular severity
+// are logged to stderr (in addition to logging to the usual log
+// file(s)). Thread-safe.
+//
+GLOG_EXPORT void SetStderrLogging(LogSeverity min_severity);
+
+//
+// Make it so that all log messages go only to stderr. Thread-safe.
+//
+GLOG_EXPORT void LogToStderr();
+
+//
+// Make it so that all log messages of at least a particular severity are
+// logged via email to a list of addresses (in addition to logging to the
+// usual log file(s)). The list of addresses is just a string containing
+// the email addresses to send to (separated by spaces, say). Thread-safe.
+//
+GLOG_EXPORT void SetEmailLogging(LogSeverity min_severity,
+ const char* addresses);
+
+// A simple function that sends email. dest is a commma-separated
+// list of addressess. Thread-safe.
+GLOG_EXPORT bool SendEmail(const char* dest, const char* subject,
+ const char* body);
+
+GLOG_EXPORT const std::vector<std::string>& GetLoggingDirectories();
+
+// For tests only: Clear the internal [cached] list of logging directories to
+// force a refresh the next time GetLoggingDirectories is called.
+// Thread-hostile.
+void TestOnly_ClearLoggingDirectoriesList();
+
+// Returns a set of existing temporary directories, which will be a
+// subset of the directories returned by GetLoggingDirectories().
+// Thread-safe.
+GLOG_EXPORT void GetExistingTempDirectories(
+ std::vector<std::string>* list);
+
+// Print any fatal message again -- useful to call from signal handler
+// so that the last thing in the output is the fatal message.
+// Thread-hostile, but a race is unlikely.
+GLOG_EXPORT void ReprintFatalMessage();
+
+// Truncate a log file that may be the append-only output of multiple
+// processes and hence can't simply be renamed/reopened (typically a
+// stdout/stderr). If the file "path" is > "limit" bytes, copy the
+// last "keep" bytes to offset 0 and truncate the rest. Since we could
+// be racing with other writers, this approach has the potential to
+// lose very small amounts of data. For security, only follow symlinks
+// if the path is /proc/self/fd/*
+GLOG_EXPORT void TruncateLogFile(const char* path, uint64 limit, uint64 keep);
+
+// Truncate stdout and stderr if they are over the value specified by
+// --max_log_size; keep the final 1MB. This function has the same
+// race condition as TruncateLogFile.
+GLOG_EXPORT void TruncateStdoutStderr();
+
+// Return the string representation of the provided LogSeverity level.
+// Thread-safe.
+GLOG_EXPORT const char* GetLogSeverityName(LogSeverity severity);
+
+// ---------------------------------------------------------------------
+// Implementation details that are not useful to most clients
+// ---------------------------------------------------------------------
+
+// A Logger is the interface used by logging modules to emit entries
+// to a log. A typical implementation will dump formatted data to a
+// sequence of files. We also provide interfaces that will forward
+// the data to another thread so that the invoker never blocks.
+// Implementations should be thread-safe since the logging system
+// will write to them from multiple threads.
+
+namespace base {
+
+class GLOG_EXPORT Logger {
+ public:
+ virtual ~Logger();
+
+ // Writes "message[0,message_len-1]" corresponding to an event that
+ // occurred at "timestamp". If "force_flush" is true, the log file
+ // is flushed immediately.
+ //
+ // The input message has already been formatted as deemed
+ // appropriate by the higher level logging facility. For example,
+ // textual log messages already contain timestamps, and the
+ // file:linenumber header.
+ virtual void Write(bool force_flush,
+ time_t timestamp,
+ const char* message,
+ size_t message_len) = 0;
+
+ // Flush any buffered messages
+ virtual void Flush() = 0;
+
+ // Get the current LOG file size.
+ // The returned value is approximate since some
+ // logged data may not have been flushed to disk yet.
+ virtual uint32 LogSize() = 0;
+};
+
+// Get the logger for the specified severity level. The logger
+// remains the property of the logging module and should not be
+// deleted by the caller. Thread-safe.
+extern GLOG_EXPORT Logger* GetLogger(LogSeverity level);
+
+// Set the logger for the specified severity level. The logger
+// becomes the property of the logging module and should not
+// be deleted by the caller. Thread-safe.
+extern GLOG_EXPORT void SetLogger(LogSeverity level, Logger* logger);
+
+}
+
+// glibc has traditionally implemented two incompatible versions of
+// strerror_r(). There is a poorly defined convention for picking the
+// version that we want, but it is not clear whether it even works with
+// all versions of glibc.
+// So, instead, we provide this wrapper that automatically detects the
+// version that is in use, and then implements POSIX semantics.
+// N.B. In addition to what POSIX says, we also guarantee that "buf" will
+// be set to an empty string, if this function failed. This means, in most
+// cases, you do not need to check the error code and you can directly
+// use the value of "buf". It will never have an undefined value.
+// DEPRECATED: Use StrError(int) instead.
+GLOG_EXPORT int posix_strerror_r(int err, char *buf, size_t len);
+
+// A thread-safe replacement for strerror(). Returns a string describing the
+// given POSIX error code.
+GLOG_EXPORT std::string StrError(int err);
+
+// A class for which we define operator<<, which does nothing.
+class GLOG_EXPORT NullStream : public LogMessage::LogStream {
+ public:
+ // Initialize the LogStream so the messages can be written somewhere
+ // (they'll never be actually displayed). This will be needed if a
+ // NullStream& is implicitly converted to LogStream&, in which case
+ // the overloaded NullStream::operator<< will not be invoked.
+ NullStream() : LogMessage::LogStream(message_buffer_, 1, 0) { }
+ NullStream(const char* /*file*/, int /*line*/,
+ const CheckOpString& /*result*/) :
+ LogMessage::LogStream(message_buffer_, 1, 0) { }
+ NullStream &stream() { return *this; }
+ private:
+ // A very short buffer for messages (which we discard anyway). This
+ // will be needed if NullStream& converted to LogStream& (e.g. as a
+ // result of a conditional expression).
+ char message_buffer_[2];
+};
+
+// Do nothing. This operator is inline, allowing the message to be
+// compiled away. The message will not be compiled away if we do
+// something like (flag ? LOG(INFO) : LOG(ERROR)) << message; when
+// SKIP_LOG=WARNING. In those cases, NullStream will be implicitly
+// converted to LogStream and the message will be computed and then
+// quietly discarded.
+template<class T>
+inline NullStream& operator<<(NullStream &str, const T &) { return str; }
+
+// Similar to NullStream, but aborts the program (without stack
+// trace), like LogMessageFatal.
+class GLOG_EXPORT NullStreamFatal : public NullStream {
+ public:
+ NullStreamFatal() { }
+ NullStreamFatal(const char* file, int line, const CheckOpString& result) :
+ NullStream(file, line, result) { }
+#if defined(_MSC_VER)
+#pragma warning(push)
+#pragma warning(disable : 4722)
+#endif // _MSC_VER
+ [[noreturn]] ~NullStreamFatal() throw() { _exit(EXIT_FAILURE); }
+#if defined(_MSC_VER)
+#pragma warning(pop)
+#endif // _MSC_VER
+};
+
+// Install a signal handler that will dump signal information and a stack
+// trace when the program crashes on certain signals. We'll install the
+// signal handler for the following signals.
+//
+// SIGSEGV, SIGILL, SIGFPE, SIGABRT, SIGBUS, and SIGTERM.
+//
+// By default, the signal handler will write the failure dump to the
+// standard error. You can customize the destination by installing your
+// own writer function by InstallFailureWriter() below.
+//
+// Note on threading:
+//
+// The function should be called before threads are created, if you want
+// to use the failure signal handler for all threads. The stack trace
+// will be shown only for the thread that receives the signal. In other
+// words, stack traces of other threads won't be shown.
+GLOG_EXPORT void InstallFailureSignalHandler();
+
+// Installs a function that is used for writing the failure dump. "data"
+// is the pointer to the beginning of a message to be written, and "size"
+// is the size of the message. You should not expect the data is
+// terminated with '\0'.
+GLOG_EXPORT void InstallFailureWriter(
+ void (*writer)(const char* data, size_t size));
+
+}
+
+#pragma pop_macro("DECLARE_VARIABLE")
+#pragma pop_macro("DECLARE_bool")
+#pragma pop_macro("DECLARE_string")
+#pragma pop_macro("DECLARE_int32")
+#pragma pop_macro("DECLARE_uint32")
+
+#endif // GLOG_LOGGING_H
diff --git a/funasr/runtime/onnxruntime/third_party/glog/src/glog/raw_logging.h b/funasr/runtime/onnxruntime/third_party/glog/src/glog/raw_logging.h
new file mode 100644
index 0000000..eda5fb4
--- /dev/null
+++ b/funasr/runtime/onnxruntime/third_party/glog/src/glog/raw_logging.h
@@ -0,0 +1,179 @@
+// Copyright (c) 2006, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Maxim Lifantsev
+//
+// Thread-safe logging routines that do not allocate any memory or
+// acquire any locks, and can therefore be used by low-level memory
+// allocation and synchronization code.
+
+#ifndef GLOG_RAW_LOGGING_H
+#define GLOG_RAW_LOGGING_H
+
+#include <ctime>
+
+namespace google {
+
+#include <glog/log_severity.h>
+#include <glog/logging.h>
+#include <glog/vlog_is_on.h>
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wvariadic-macros"
+#endif
+
+// This is similar to LOG(severity) << format... and VLOG(level) << format..,
+// but
+// * it is to be used ONLY by low-level modules that can't use normal LOG()
+// * it is desiged to be a low-level logger that does not allocate any
+// memory and does not need any locks, hence:
+// * it logs straight and ONLY to STDERR w/o buffering
+// * it uses an explicit format and arguments list
+// * it will silently chop off really long message strings
+// Usage example:
+// RAW_LOG(ERROR, "Failed foo with %i: %s", status, error);
+// RAW_VLOG(3, "status is %i", status);
+// These will print an almost standard log lines like this to stderr only:
+// E20200821 211317 file.cc:123] RAW: Failed foo with 22: bad_file
+// I20200821 211317 file.cc:142] RAW: status is 20
+#define RAW_LOG(severity, ...) \
+ do { \
+ switch (google::GLOG_ ## severity) { \
+ case 0: \
+ RAW_LOG_INFO(__VA_ARGS__); \
+ break; \
+ case 1: \
+ RAW_LOG_WARNING(__VA_ARGS__); \
+ break; \
+ case 2: \
+ RAW_LOG_ERROR(__VA_ARGS__); \
+ break; \
+ case 3: \
+ RAW_LOG_FATAL(__VA_ARGS__); \
+ break; \
+ default: \
+ break; \
+ } \
+ } while (0)
+
+// The following STRIP_LOG testing is performed in the header file so that it's
+// possible to completely compile out the logging code and the log messages.
+#if !defined(STRIP_LOG) || STRIP_LOG == 0
+#define RAW_VLOG(verboselevel, ...) \
+ do { \
+ if (VLOG_IS_ON(verboselevel)) { \
+ RAW_LOG_INFO(__VA_ARGS__); \
+ } \
+ } while (0)
+#else
+#define RAW_VLOG(verboselevel, ...) RawLogStub__(0, __VA_ARGS__)
+#endif // STRIP_LOG == 0
+
+#if !defined(STRIP_LOG) || STRIP_LOG == 0
+#define RAW_LOG_INFO(...) google::RawLog__(google::GLOG_INFO, \
+ __FILE__, __LINE__, __VA_ARGS__)
+#else
+#define RAW_LOG_INFO(...) google::RawLogStub__(0, __VA_ARGS__)
+#endif // STRIP_LOG == 0
+
+#if !defined(STRIP_LOG) || STRIP_LOG <= 1
+#define RAW_LOG_WARNING(...) google::RawLog__(google::GLOG_WARNING, \
+ __FILE__, __LINE__, __VA_ARGS__)
+#else
+#define RAW_LOG_WARNING(...) google::RawLogStub__(0, __VA_ARGS__)
+#endif // STRIP_LOG <= 1
+
+#if !defined(STRIP_LOG) || STRIP_LOG <= 2
+#define RAW_LOG_ERROR(...) google::RawLog__(google::GLOG_ERROR, \
+ __FILE__, __LINE__, __VA_ARGS__)
+#else
+#define RAW_LOG_ERROR(...) google::RawLogStub__(0, __VA_ARGS__)
+#endif // STRIP_LOG <= 2
+
+#if !defined(STRIP_LOG) || STRIP_LOG <= 3
+#define RAW_LOG_FATAL(...) google::RawLog__(google::GLOG_FATAL, \
+ __FILE__, __LINE__, __VA_ARGS__)
+#else
+#define RAW_LOG_FATAL(...) \
+ do { \
+ google::RawLogStub__(0, __VA_ARGS__); \
+ exit(EXIT_FAILURE); \
+ } while (0)
+#endif // STRIP_LOG <= 3
+
+// Similar to CHECK(condition) << message,
+// but for low-level modules: we use only RAW_LOG that does not allocate memory.
+// We do not want to provide args list here to encourage this usage:
+// if (!cond) RAW_LOG(FATAL, "foo ...", hard_to_compute_args);
+// so that the args are not computed when not needed.
+#define RAW_CHECK(condition, message) \
+ do { \
+ if (!(condition)) { \
+ RAW_LOG(FATAL, "Check %s failed: %s", #condition, message); \
+ } \
+ } while (0)
+
+// Debug versions of RAW_LOG and RAW_CHECK
+#ifndef NDEBUG
+
+#define RAW_DLOG(severity, ...) RAW_LOG(severity, __VA_ARGS__)
+#define RAW_DCHECK(condition, message) RAW_CHECK(condition, message)
+
+#else // NDEBUG
+
+#define RAW_DLOG(severity, ...) \
+ while (false) \
+ RAW_LOG(severity, __VA_ARGS__)
+#define RAW_DCHECK(condition, message) \
+ while (false) \
+ RAW_CHECK(condition, message)
+
+#endif // NDEBUG
+
+#if defined(__GNUC__)
+#pragma GCC diagnostic pop
+#endif
+
+// Stub log function used to work around for unused variable warnings when
+// building with STRIP_LOG > 0.
+static inline void RawLogStub__(int /* ignored */, ...) {
+}
+
+// Helper function to implement RAW_LOG and RAW_VLOG
+// Logs format... at "severity" level, reporting it
+// as called from file:line.
+// This does not allocate memory or acquire locks.
+GLOG_EXPORT void RawLog__(LogSeverity severity, const char* file, int line,
+ const char* format, ...)
+ __attribute__((__format__(__printf__, 4, 5)));
+
+}
+
+#endif // GLOG_RAW_LOGGING_H
diff --git a/funasr/runtime/onnxruntime/third_party/glog/src/glog/stl_logging.h b/funasr/runtime/onnxruntime/third_party/glog/src/glog/stl_logging.h
new file mode 100644
index 0000000..96304e5
--- /dev/null
+++ b/funasr/runtime/onnxruntime/third_party/glog/src/glog/stl_logging.h
@@ -0,0 +1,177 @@
+// Copyright (c) 2003, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Stream output operators for STL containers; to be used for logging *only*.
+// Inclusion of this file lets you do:
+//
+// list<string> x;
+// LOG(INFO) << "data: " << x;
+// vector<int> v1, v2;
+// CHECK_EQ(v1, v2);
+//
+// If you want to use this header file with hash maps or slist, you
+// need to define macros before including this file:
+//
+// - GLOG_STL_LOGGING_FOR_UNORDERED - <unordered_map> and <unordered_set>
+// - GLOG_STL_LOGGING_FOR_TR1_UNORDERED - <tr1/unordered_(map|set)>
+// - GLOG_STL_LOGGING_FOR_EXT_HASH - <ext/hash_(map|set)>
+// - GLOG_STL_LOGGING_FOR_EXT_SLIST - <ext/slist>
+//
+
+#ifndef UTIL_GTL_STL_LOGGING_INL_H_
+#define UTIL_GTL_STL_LOGGING_INL_H_
+
+#include <deque>
+#include <list>
+#include <map>
+#include <ostream>
+#include <set>
+#include <unordered_map>
+#include <unordered_set>
+#include <utility>
+#include <vector>
+
+// Forward declare these two, and define them after all the container streams
+// operators so that we can recurse from pair -> container -> container -> pair
+// properly.
+template<class First, class Second>
+std::ostream& operator<<(std::ostream& out, const std::pair<First, Second>& p);
+
+namespace google {
+
+template<class Iter>
+void PrintSequence(std::ostream& out, Iter begin, Iter end);
+
+}
+#define OUTPUT_TWO_ARG_CONTAINER(Sequence) \
+template<class T1, class T2> \
+inline std::ostream& operator<<(std::ostream& out, \
+ const Sequence<T1, T2>& seq) { \
+ google::PrintSequence(out, seq.begin(), seq.end()); \
+ return out; \
+}
+
+ OUTPUT_TWO_ARG_CONTAINER(std::vector) OUTPUT_TWO_ARG_CONTAINER(std::deque)
+ OUTPUT_TWO_ARG_CONTAINER(std::list)
+
+#undef OUTPUT_TWO_ARG_CONTAINER
+
+#define OUTPUT_THREE_ARG_CONTAINER(Sequence) \
+template<class T1, class T2, class T3> \
+inline std::ostream& operator<<(std::ostream& out, \
+ const Sequence<T1, T2, T3>& seq) { \
+ google::PrintSequence(out, seq.begin(), seq.end()); \
+ return out; \
+}
+
+ OUTPUT_THREE_ARG_CONTAINER(std::set) OUTPUT_THREE_ARG_CONTAINER(
+ std::multiset)
+
+#undef OUTPUT_THREE_ARG_CONTAINER
+
+#define OUTPUT_FOUR_ARG_CONTAINER(Sequence) \
+template<class T1, class T2, class T3, class T4> \
+inline std::ostream& operator<<(std::ostream& out, \
+ const Sequence<T1, T2, T3, T4>& seq) { \
+ google::PrintSequence(out, seq.begin(), seq.end()); \
+ return out; \
+}
+
+ OUTPUT_FOUR_ARG_CONTAINER(std::map) OUTPUT_FOUR_ARG_CONTAINER(
+ std::multimap) OUTPUT_FOUR_ARG_CONTAINER(std::unordered_set)
+ OUTPUT_FOUR_ARG_CONTAINER(std::unordered_multiset)
+
+#undef OUTPUT_FOUR_ARG_CONTAINER
+
+#define OUTPUT_FIVE_ARG_CONTAINER(Sequence) \
+template<class T1, class T2, class T3, class T4, class T5> \
+inline std::ostream& operator<<(std::ostream& out, \
+ const Sequence<T1, T2, T3, T4, T5>& seq) { \
+ google::PrintSequence(out, seq.begin(), seq.end()); \
+ return out; \
+}
+
+#if defined(GLOG_STL_LOGGING_FOR_UNORDERED) && __cplusplus >= 201103L
+ OUTPUT_FIVE_ARG_CONTAINER(std::unordered_map)
+ OUTPUT_FIVE_ARG_CONTAINER(std::unordered_multimap)
+#endif
+
+#undef OUTPUT_FIVE_ARG_CONTAINER
+
+ template <class First, class Second>
+ inline std::ostream& operator<<(
+ std::ostream& out,
+ const std::pair<First, Second>& p) {
+ out << '(' << p.first << ", " << p.second << ')';
+ return out;
+}
+
+namespace google {
+
+template<class Iter>
+inline void PrintSequence(std::ostream& out, Iter begin, Iter end) {
+ // Output at most 100 elements -- appropriate if used for logging.
+ for (int i = 0; begin != end && i < 100; ++i, ++begin) {
+ if (i > 0) out << ' ';
+ out << *begin;
+ }
+ if (begin != end) {
+ out << " ...";
+ }
+}
+
+}
+
+// Note that this is technically undefined behavior! We are adding things into
+// the std namespace for a reason though -- we are providing new operations on
+// types which are themselves defined with this namespace. Without this, these
+// operator overloads cannot be found via ADL. If these definitions are not
+// found via ADL, they must be #included before they're used, which requires
+// this header to be included before apparently independent other headers.
+//
+// For example, base/logging.h defines various template functions to implement
+// CHECK_EQ(x, y) and stream x and y into the log in the event the check fails.
+// It does so via the function template MakeCheckOpValueString:
+// template<class T>
+// void MakeCheckOpValueString(strstream* ss, const T& v) {
+// (*ss) << v;
+// }
+// Because 'glog/logging.h' is included before 'glog/stl_logging.h',
+// subsequent CHECK_EQ(v1, v2) for vector<...> typed variable v1 and v2 can only
+// find these operator definitions via ADL.
+//
+// Even this solution has problems -- it may pull unintended operators into the
+// namespace as well, allowing them to also be found via ADL, and creating code
+// that only works with a particular order of includes. Long term, we need to
+// move all of the *definitions* into namespace std, bet we need to ensure no
+// one references them first. This lets us take that step. We cannot define them
+// in both because that would create ambiguous overloads when both are found.
+namespace std { using ::operator<<; }
+
+#endif // UTIL_GTL_STL_LOGGING_INL_H_
diff --git a/funasr/runtime/onnxruntime/third_party/glog/src/glog/vlog_is_on.h b/funasr/runtime/onnxruntime/third_party/glog/src/glog/vlog_is_on.h
new file mode 100644
index 0000000..44c2048
--- /dev/null
+++ b/funasr/runtime/onnxruntime/third_party/glog/src/glog/vlog_is_on.h
@@ -0,0 +1,120 @@
+// Copyright (c) 2023, Google Inc.
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions are
+// met:
+//
+// * Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// * Redistributions in binary form must reproduce the above
+// copyright notice, this list of conditions and the following disclaimer
+// in the documentation and/or other materials provided with the
+// distribution.
+// * Neither the name of Google Inc. nor the names of its
+// contributors may be used to endorse or promote products derived from
+// this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+//
+// Author: Ray Sidney and many others
+//
+// Defines the VLOG_IS_ON macro that controls the variable-verbosity
+// conditional logging.
+//
+// It's used by VLOG and VLOG_IF in logging.h
+// and by RAW_VLOG in raw_logging.h to trigger the logging.
+//
+// It can also be used directly e.g. like this:
+// if (VLOG_IS_ON(2)) {
+// // do some logging preparation and logging
+// // that can't be accomplished e.g. via just VLOG(2) << ...;
+// }
+//
+// The truth value that VLOG_IS_ON(level) returns is determined by
+// the three verbosity level flags:
+// --v=<n> Gives the default maximal active V-logging level;
+// 0 is the default.
+// Normally positive values are used for V-logging levels.
+// --vmodule=<str> Gives the per-module maximal V-logging levels to override
+// the value given by --v.
+// E.g. "my_module=2,foo*=3" would change the logging level
+// for all code in source files "my_module.*" and "foo*.*"
+// ("-inl" suffixes are also disregarded for this matching).
+//
+// SetVLOGLevel helper function is provided to do limited dynamic control over
+// V-logging by overriding the per-module settings given via --vmodule flag.
+//
+// CAVEAT: --vmodule functionality is not available in non gcc compilers.
+//
+
+#ifndef BASE_VLOG_IS_ON_H_
+#define BASE_VLOG_IS_ON_H_
+
+#include <glog/log_severity.h>
+
+#include <cstddef>
+
+#if defined(__GNUC__)
+// We emit an anonymous static int* variable at every VLOG_IS_ON(n) site.
+// (Normally) the first time every VLOG_IS_ON(n) site is hit,
+// we determine what variable will dynamically control logging at this site:
+// it's either FLAGS_v or an appropriate internal variable
+// matching the current source file that represents results of
+// parsing of --vmodule flag and/or SetVLOGLevel calls.
+#define VLOG_IS_ON(verboselevel) \
+ __extension__ \
+ ({ static google::SiteFlag vlocal__ = {NULL, NULL, 0, NULL}; \
+ google::int32 verbose_level__ = (verboselevel); \
+ (vlocal__.level == NULL ? google::InitVLOG3__(&vlocal__, &FLAGS_v, \
+ __FILE__, verbose_level__) : *vlocal__.level >= verbose_level__); \
+ })
+#else
+// GNU extensions not available, so we do not support --vmodule.
+// Dynamic value of FLAGS_v always controls the logging level.
+#define VLOG_IS_ON(verboselevel) (FLAGS_v >= (verboselevel))
+#endif
+
+// Set VLOG(_IS_ON) level for module_pattern to log_level.
+// This lets us dynamically control what is normally set by the --vmodule flag.
+// Returns the level that previously applied to module_pattern.
+// NOTE: To change the log level for VLOG(_IS_ON) sites
+// that have already executed after/during InitGoogleLogging,
+// one needs to supply the exact --vmodule pattern that applied to them.
+// (If no --vmodule pattern applied to them
+// the value of FLAGS_v will continue to control them.)
+extern GLOG_EXPORT int SetVLOGLevel(const char* module_pattern, int log_level);
+
+// Various declarations needed for VLOG_IS_ON above: =========================
+
+struct SiteFlag {
+ google::int32* level;
+ const char* base_name;
+ std::size_t base_len;
+ SiteFlag* next;
+};
+
+// Helper routine which determines the logging info for a particalur VLOG site.
+// site_flag is the address of the site-local pointer to the controlling
+// verbosity level
+// site_default is the default to use for *site_flag
+// fname is the current source file name
+// verbose_level is the argument to VLOG_IS_ON
+// We will return the return value for VLOG_IS_ON
+// and if possible set *site_flag appropriately.
+extern GLOG_EXPORT bool InitVLOG3__(
+ google::SiteFlag* site_flag,
+ google::int32* site_default, const char* fname,
+ google::int32 verbose_level);
+
+#endif // BASE_VLOG_IS_ON_H_
--
Gitblit v1.9.1