ሰላም.
ከጥቂት ጊዜ በፊት እኛ
ለስልክ, ማመልከቻ ለመምረጥ ተወስኗል ቀላል_pjsua እንደ PJSIP ቤተ-መጽሐፍት አካል። ይህ በአገልጋዩ ላይ መመዝገብ ፣ ጥሪዎችን መቀበል እና መመለስ የሚችል አነስተኛ መተግበሪያ ነው። ከዚህ በታች በ STM32F7-Discovery ላይ እንዴት እንደሚሰራ ወዲያውኑ መግለጫ እሰጣለሁ.
እንዴት እንደሚሮጥ
- ኢምቦክስን በማዋቀር ላይ
make confload-platform/pjsip/stm32f7cube
- በ conf/mods.config ፋይል ውስጥ አስፈላጊውን የ SIP መለያ ያዘጋጁ።
include platform.pjsip.cmd.simple_pjsua_imported( sip_domain="server", sip_user="username", sip_passwd="password")
የት አገልጋይ የ SIP አገልጋይ ነው (ለምሳሌ sip.linphone.org)፣ የተጠቃሚ ስም и የይለፍ ቃል - መለያ የተጠቃሚ ስም እና የይለፍ ቃል።
- ኢምቦክስን በቡድን ማሰባሰብ ማድረግ. እኛ ላይ ስላለን የቦርድ firmware
ዊኪ እና ውስጥጽሑፍ . - በኤምቦክስ ኮንሶል ውስጥ "ቀላል_pjsua_imported" የሚለውን ትዕዛዝ ያሂዱ
00:00:12.870 pjsua_acc.c ....SIP outbound status for acc 0 is not active 00:00:12.884 pjsua_acc.c ....sip:[email protected]: registration success, status=200 (Registration succes 00:00:12.911 pjsua_acc.c ....Keep-alive timer started for acc 0, destination:91.121.209.194:5060, interval:15s
- በመጨረሻም ድምጽ ማጉያዎችን ወይም የጆሮ ማዳመጫዎችን በድምጽ ውፅዓት ውስጥ ማስገባት እና ከማሳያው ቀጥሎ ወደ ሁለት ትናንሽ MEMS ማይክሮፎኖች መናገር ይቀራል። ከሊኑክስ በቀላል_pjsua ፣ pjsua አፕሊኬሽኑ እንጠራለን። ደህና፣ ወይም ሌላ ማንኛውንም አይነት ሊንፎን መጠቀም ይችላሉ።
ይህ ሁሉ በእኛ ላይ ተገልጿል
እዚያ እንዴት ደረስን
ስለዚህ, መጀመሪያ ላይ የሃርድዌር መድረክን ስለመምረጥ ጥያቄው ተነሳ. STM32F4-ግኝት ከማህደረ ትውስታ እንደማይገባ ግልጽ ስለነበር፣ STM32F7-ግኝት ተመርጧል። እሷ 1 ሜባ ፍላሽ አንፃፊ እና 256 ኪባ ራም (+ 64 ልዩ ፈጣን ማህደረ ትውስታ, እኛ ደግሞ እንጠቀማለን). እንዲሁም በአገልጋዩ በኩል ለመደወል ብዙ አይደለም, ነገር ግን ለመግባት ለመሞከር ወሰንን.
እንደ ሁኔታው ለራሳቸው ፣ ተግባሩ በበርካታ ደረጃዎች ተከፍሏል-
- በQEMU ላይ PJSIPን በማሄድ ላይ። ለማረም ምቹ ነበር፣ በተጨማሪም እዚያ ለ AC97 ኮድ ድጋፍ አግኝተናል።
- በQEMU እና በSTM32 ላይ የድምጽ ቅጂ እና መልሶ ማጫወት።
- መተግበሪያን በማስተላለፍ ላይ ቀላል_pjsua ከ PJSIP. በ SIP አገልጋይ ላይ እንዲመዘገቡ እና ጥሪዎችን ለማድረግ ያስችልዎታል.
- የእራስዎን በኮከብ ላይ የተመሰረተ አገልጋይ ያሰማሩ እና በላዩ ላይ ይሞክሩት፣ ከዚያ እንደ sip.linphone.org ያሉ ውጫዊዎችን ይሞክሩ።
በEmbox ውስጥ ያለው ድምጽ በPortaudio በኩል ይሰራል፣ እሱም በPISIP ውስጥም ጥቅም ላይ ይውላል። የመጀመሪያዎቹ ችግሮች በ QEMU ላይ ታይተዋል - WAV በ 44100 Hz ጥሩ ተጫውቷል ፣ ግን በ 8000 አንድ ነገር በግልፅ ተሳስቷል። ድግግሞሹን የማዘጋጀት ጉዳይ ሆኖ ተገኝቷል - በነባሪነት በመሳሪያው ውስጥ 44100 ነበር ፣ እና ይህ በፕሮግራም አልተለወጠም።
እዚህ, ምናልባት, ድምጹ በአጠቃላይ እንዴት እንደሚጫወት ትንሽ ማብራራት ጠቃሚ ነው. የድምጽ ካርዱ አስቀድሞ በተወሰነ ፍሪኩዌንሲ ለመጫወት ወይም ለመቅዳት ወደሚፈልጉበት የማህደረ ትውስታ ክፍል አንዳንድ ጠቋሚ ሊዋቀር ይችላል። ቋቱ ካለቀ በኋላ መቆራረጥ ይፈጠራል እና አፈፃፀም በሚቀጥለው ቋት ይቀጥላል። እውነታው ግን ቀዳሚው እየተጫወተ እያለ እነዚህ ቋቶች አስቀድመው መሙላት አለባቸው። ይህንን ችግር በSTM32F7 ላይ የበለጠ እንጋፈጣለን።
በመቀጠል አገልጋይ ተከራይተን አስሪስክን አሰማርተናል። ብዙ ማረም አስፈላጊ ስለነበር ነገር ግን ወደ ማይክሮፎኑ ብዙ መናገር አልፈልግም, አውቶማቲክ መልሶ ማጫወት እና መቅዳት አስፈላጊ ነበር. ይህንን ለማድረግ በድምጽ መሳሪያዎች ምትክ ፋይሎችን ማንሸራተት እንዲችሉ ቀላል_pjsuaን ለጥፈናል። በPJSIP ውስጥ፣ መሣሪያ ወይም ፋይል ሊሆን የሚችል የወደብ ጽንሰ-ሐሳብ ስላላቸው ይህ በቀላሉ ይከናወናል። እና እነዚህ ወደቦች ከሌሎች ወደቦች ጋር በተለዋዋጭ ሊገናኙ ይችላሉ። ኮዱን በእኛ pjsip ውስጥ ማየት ይችላሉ።
በQEMU ላይ ከሰራ በኋላ ወደ STM32F7-Discovery ወደ ማጓጓዝ ሄድን። የመጀመሪያው ችግር ለምስሉ መጠን የነቃው የማጠናከሪያ ማመቻቸት "-Os" ሳይኖር በ 1 ሜባ ROM ውስጥ አልገቡም. ለዚህም ነው "-Os" ያካተትነው። በተጨማሪ፣ patch ለ C ++ ድጋፍን ስለቦዘነ ለ pjsua ብቻ ነው የሚያስፈልገው፣ እና እኛ ቀላል_pjsua እንጠቀማለን።
ከተቀመጠ በኋላ ቀላል_pjsua, አሁን ለማስጀመር እድሉ እንዳለ ወስኗል. ነገር ግን በመጀመሪያ የድምፅ ቅጂውን እና መልሶ ማጫወትን መቋቋም አስፈላጊ ነበር. ጥያቄው የት መጻፍ ነው? ውጫዊ ማህደረ ትውስታን መርጠናል - SDRAM (128 ሜባ)። ይህንን እራስዎ መሞከር ይችላሉ-
የ16000 Hz ድግግሞሽ እና የ10 ሰከንድ ቆይታ ያለው ስቴሪዮ WAV ይፈጥራል፡
record -r 16000 -c 2 -d 10000 -m C0000000
እናጣለን፡-
play -m C0000000
እዚህ ሁለት ችግሮች አሉ. የመጀመሪያው ከኮዴክ ጋር - WM8994 ጥቅም ላይ ይውላል ፣ እና እንደ ማስገቢያ ያለ ነገር አለው ፣ እና ከእነዚህ ውስጥ 4 ቦታዎች አሉ ። ስለዚህ ፣ በነባሪ ፣ ይህ ካልተዋቀረ ድምጽ ሲጫወት ፣ መልሶ ማጫወት በአራቱም ክፍተቶች ውስጥ ይከሰታል። . ስለዚህ, በ 16000 Hz ድግግሞሽ, 8000 Hz ተቀብለናል, ለ 8000 Hz ግን መልሶ ማጫወት በቀላሉ አልሰራም. ቦታዎች 0 እና 2 ብቻ ሲመረጡ, ልክ እንደነበረው ይሰራል. ሌላው ችግር በ STM32Cube ውስጥ ያለው የኦዲዮ በይነገጽ ነበር ፣የድምጽ ውፅዓት በ SAI (ተከታታይ ኦዲዮ በይነገጽ) ከድምጽ ግብዓት ጋር በተመሳሳይ ጊዜ የሚሰራበት (ዝርዝሩን አልገባኝም ፣ ግን አንድ ጊዜ የሚጋሩት የጋራ ሰዓት እና መቼ ነው) የድምጽ ውፅዓት ተጀምሯል፣ ኦዲዮው በሆነ መንገድ ከመግቢያው ጋር ተያይዟል። ማለትም እነሱን ለየብቻ ማሄድ አይችሉም፣ ስለዚህ እኛ የሚከተለውን አድርገናል - የኦዲዮ ግብዓት እና የድምጽ ውፅዓት ሁልጊዜ ይሰራሉ (ማቋረጥን ጨምሮ)። ነገር ግን በሲስተሙ ውስጥ ምንም ነገር በማይጫወትበት ጊዜ፣ በቀላሉ ባዶ ቋት ወደ የድምጽ ውፅዓት እናስገባዋለን፣ እና መልሶ ማጫወት ሲጀመር በትክክል መሙላት እንጀምራለን።
በተጨማሪም በድምፅ ቀረጻ ወቅት ድምፁ በጣም ጸጥ ያለ የመሆኑን እውነታ አጋጥሞናል። ይህ የሆነበት ምክንያት በ STM32F7-Discovery ላይ ያሉ የ MEMS ማይክሮፎኖች ከ 16000 Hz በታች በሆኑ ድግግሞሽዎች ላይ በጥሩ ሁኔታ የማይሰሩ በመሆናቸው ነው። ስለዚህ, 16000 Hz ቢመጣም, 8000 Hz አዘጋጅተናል. ይህንን ለማድረግ ግን የሶፍትዌር ልወጣን የአንድ ድግግሞሽ ወደ ሌላ ማከል አስፈላጊ ነበር።
በመቀጠልም በ RAM ውስጥ የሚገኘውን ክምር መጠን መጨመር ነበረብኝ. እንደእኛ ስሌት፣ pjsip 190 ኪባ ያህል ይፈልጋል፣ እና 100 ኪባ ያህል ብቻ ነው የቀረን። እዚህ አንዳንድ ውጫዊ ማህደረ ትውስታን መጠቀም ነበረብኝ - SDRAM (ወደ 128 ኪባ)።
ከነዚህ ሁሉ አርትዖቶች በኋላ በሊኑክስ እና በኤምቦክስ መካከል የመጀመሪያዎቹን ፓኬጆች አየሁ እና ድምፁን ሰማሁ! ነገር ግን ድምፁ አስፈሪ ነበር፣ በQEMU ላይ ካለው ጋር ተመሳሳይ አይደለም፣ ምንም ነገር ለመስራት አልተቻለም። ከዚያም ጉዳዩ ምን ሊሆን እንደሚችል አሰብን። ማረም Embox በቀላሉ የድምጽ ማቋረጦችን ለመሙላት/ለማውረድ ጊዜ እንደሌለው ያሳያል። pjsip አንድ ፍሬም በማስኬድ ላይ እያለ፣ 2 ማቋረጦች ስለ ቋት ማቀናበሪያ መጠናቀቅ ጊዜ ነበራቸው፣ ይህም በጣም ብዙ ነው። የፍጥነት የመጀመሪያው ሀሳብ የማጠናከሪያ ማመቻቸት ነበር፣ ግን አስቀድሞ በPJSIP ውስጥ ተካቷል። ሁለተኛው የሃርድዌር ተንሳፋፊ ነጥብ ነው ፣ ስለ እሱ ተነጋገርን።
የሚቀጥለው ሀሳብ ከውጫዊ ማህደረ ትውስታ ጋር እየሰራን ነው እና በጣም ብዙ ጊዜ የሚደርሱ መዋቅሮችን ወደዚያ ማንቀሳቀስ ጥሩ ነበር። መቼ እና በምን ስር ቀዳሚ ትንታኔ ሰራሁ ቀላል_pjsua ማህደረ ትውስታን ይመድባል. ከ190 ኪባ የመጀመሪያዎቹ 90 ኪባ የሚመደቡት ለPJSIP የውስጥ ፍላጎቶች ነው እና እነሱ ብዙ ጊዜ አይደርሱባቸውም። በተጨማሪም፣ በገቢ ጥሪ ወቅት፣ የpjsua_call_መልስ ተግባር ይባላል፣ በዚህ ጊዜ ቋቶች ከገቢ እና ወጪ ክፈፎች ጋር ለመስራት ይመደባሉ። አሁንም 100 ኪ.ባ. እና ከዚያ የሚከተለውን አደረግን. እስከ ጥሪው ቅጽበት ድረስ ውሂቡን በውጫዊ ማህደረ ትውስታ ውስጥ እናስቀምጠዋለን። ልክ እንደ ጥሪው ወዲያውኑ ክምሩን በሌላ - በ RAM ውስጥ እንተካለን. ስለዚህ, ሁሉም "ትኩስ" ውሂብ ወደ ፈጣን እና የበለጠ ሊተነበይ የሚችል ማህደረ ትውስታ ተላልፏል.
በውጤቱም, ይህ ሁሉ አንድ ላይ ለመጀመር አስችሏል ቀላል_pjsua እና በአገልጋይዎ በኩል ይደውሉ. እና ከዚያ እንደ sip.linphone.org ባሉ ሌሎች አገልጋዮች በኩል።
ግኝቶች
በውጤቱም, ማስጀመር ተችሏል ቀላል_pjsua በአገልጋዩ በኩል በሁለቱም አቅጣጫዎች በድምጽ ማስተላለፊያ. በተጨማሪም 128 ኪባ ኤስዲራም ወጪ የተደረገበት ችግር በትንሹ የበለጠ ኃይለኛ Cortex-M7 በመጠቀም ሊፈታ ይችላል (ለምሳሌ STM32F769NI ከ 512 ኪባ ራም ጋር) ፣ ግን በተመሳሳይ ጊዜ ፣ አሁንም ወደ 256 ለመግባት ተስፋ አልቆረጥንም ። KB 🙂 አንድ ሰው ፍላጎት ካለው ደስ ይለናል, ወይም የተሻለ, ይሞክሩት. ሁሉም ምንጮች, እንደተለመደው, በእኛ ውስጥ ናቸው
ምንጭ: hab.com