STM32F7-ಡಿಸ್ಕವರಿಯಲ್ಲಿ SIP ಫೋನ್

ಎಲ್ಲರಿಗೂ ನಮಸ್ಕಾರ.

ಸ್ವಲ್ಪ ಸಮಯದ ಹಿಂದೆ ನಾವು ಬರೆದರು STM32F4-ಡಿಸ್ಕವರಿಯಲ್ಲಿ 1 MB ROM ಮತ್ತು 192 KB RAM) SIP ಫೋನ್ ಅನ್ನು ನಾವು ಹೇಗೆ ಪ್ರಾರಂಭಿಸಿದ್ದೇವೆ ಎಂಬುದರ ಕುರಿತು ಎಂಬಾಕ್ಸ್. ಇಲ್ಲಿ ಆ ಆವೃತ್ತಿಯು ಕನಿಷ್ಟ ಮತ್ತು ಎರಡು ಫೋನ್‌ಗಳನ್ನು ನೇರವಾಗಿ ಸರ್ವರ್ ಇಲ್ಲದೆ ಮತ್ತು ಒಂದೇ ದಿಕ್ಕಿನಲ್ಲಿ ಧ್ವನಿ ಪ್ರಸರಣದೊಂದಿಗೆ ಸಂಪರ್ಕಿಸಿದೆ ಎಂದು ಹೇಳಬೇಕು. ಆದ್ದರಿಂದ, ಸರ್ವರ್ ಮೂಲಕ ಕರೆಯೊಂದಿಗೆ ಹೆಚ್ಚು ಸಂಪೂರ್ಣ ಫೋನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ನಾವು ನಿರ್ಧರಿಸಿದ್ದೇವೆ, ಎರಡೂ ದಿಕ್ಕುಗಳಲ್ಲಿ ಧ್ವನಿ ಪ್ರಸರಣ, ಆದರೆ ಅದೇ ಸಮಯದಲ್ಲಿ ಸಾಧ್ಯವಾದಷ್ಟು ಚಿಕ್ಕದಾದ ಮೆಮೊರಿ ಗಾತ್ರದಲ್ಲಿ ಇರಿಸಿಕೊಳ್ಳಿ.


ಫೋನ್ಗಾಗಿ, ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಲು ನಿರ್ಧರಿಸಲಾಯಿತು ಸರಳ_pjsua PJSIP ಗ್ರಂಥಾಲಯದ ಭಾಗವಾಗಿ. ಇದು ಸರ್ವರ್‌ನಲ್ಲಿ ನೋಂದಾಯಿಸಲು, ಕರೆಗಳನ್ನು ಸ್ವೀಕರಿಸಲು ಮತ್ತು ಉತ್ತರಿಸಲು ಸಾಧ್ಯವಾಗುವ ಕನಿಷ್ಠ ಅಪ್ಲಿಕೇಶನ್ ಆಗಿದೆ. ಕೆಳಗೆ ನಾನು ತಕ್ಷಣ STM32F7-Discovery ನಲ್ಲಿ ಅದನ್ನು ಹೇಗೆ ಚಲಾಯಿಸಬೇಕು ಎಂಬುದರ ವಿವರಣೆಯನ್ನು ನೀಡುತ್ತೇನೆ.

ಲಾಂಚ್ ಮಾಡುವುದು ಹೇಗೆ

  1. ಎಂಬಾಕ್ಸ್ ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಲಾಗುತ್ತಿದೆ
    make confload-platform/pjsip/stm32f7cube
  2. conf/mods.config ಫೈಲ್‌ನಲ್ಲಿ ಅಗತ್ಯವಿರುವ SIP ಖಾತೆಯನ್ನು ಹೊಂದಿಸಿ.
    
    include platform.pjsip.cmd.simple_pjsua_imported(
        sip_domain="server", 
        sip_user="username",
        sip_passwd="password")
    

    ಅಲ್ಲಿ ಸರ್ವರ್ SIP ಸರ್ವರ್ ಆಗಿದೆ (ಉದಾಹರಣೆಗೆ, sip.linphone.org), ಬಳಕೆದಾರ ಹೆಸರು и ಪಾಸ್ವರ್ಡ್ - ಖಾತೆ ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಪಾಸ್ವರ್ಡ್.

  3. ಎಂಬಾಕ್ಸ್ ಅನ್ನು ತಂಡವಾಗಿ ಜೋಡಿಸುವುದು ಮಾಡಲು. ನಾವು ಹೊಂದಿರುವ ಬೋರ್ಡ್ ಫರ್ಮ್‌ವೇರ್ ಬಗ್ಗೆ ವಿಕಿ ಮತ್ತು ಸೈನ್ ಇನ್ ಲೇಖನ.
  4. ಎಂಬಾಕ್ಸ್ ಕನ್ಸೋಲ್‌ನಲ್ಲಿ “simple_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
    

  5. ಅಂತಿಮವಾಗಿ, ಆಡಿಯೊ ಔಟ್‌ಪುಟ್‌ಗೆ ಸ್ಪೀಕರ್‌ಗಳು ಅಥವಾ ಹೆಡ್‌ಫೋನ್‌ಗಳನ್ನು ಸೇರಿಸಲು ಮತ್ತು ಡಿಸ್ಪ್ಲೇಯ ಪಕ್ಕದಲ್ಲಿರುವ ಎರಡು ಸಣ್ಣ MEMS ಮೈಕ್ರೊಫೋನ್‌ಗಳಲ್ಲಿ ಮಾತನಾಡಲು ಇದು ಉಳಿದಿದೆ. ನಾವು ಸರಳ_pjsua, pjsua ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ Linux ನಿಂದ ಕರೆ ಮಾಡುತ್ತೇವೆ. ಸರಿ, ಅಥವಾ ನೀವು ಯಾವುದೇ ರೀತಿಯ ಲಿನ್‌ಫೋನ್ ಅನ್ನು ಬಳಸಬಹುದು.

ಇದೆಲ್ಲವನ್ನೂ ನಮ್ಮ ಮೇಲೆ ವಿವರಿಸಲಾಗಿದೆ ವಿಕಿ.

ನಾವು ಅಲ್ಲಿಗೆ ಹೇಗೆ ಬಂದೆವು

ಆದ್ದರಿಂದ, ಹಾರ್ಡ್‌ವೇರ್ ಪ್ಲಾಟ್‌ಫಾರ್ಮ್ ಅನ್ನು ಆಯ್ಕೆ ಮಾಡುವ ಬಗ್ಗೆ ಆರಂಭದಲ್ಲಿ ಪ್ರಶ್ನೆ ಉದ್ಭವಿಸಿತು. STM32F4-ಡಿಸ್ಕವರಿ ಮೆಮೊರಿಯಿಂದ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ ಎಂಬುದು ಸ್ಪಷ್ಟವಾದ ಕಾರಣ, STM32F7-ಡಿಸ್ಕವರಿ ಆಯ್ಕೆಮಾಡಲಾಗಿದೆ. ಅವಳು 1 MB ಫ್ಲಾಶ್ ಡ್ರೈವ್ ಮತ್ತು 256 KB RAM ಅನ್ನು ಹೊಂದಿದ್ದಾಳೆ (+ 64 ವಿಶೇಷ ವೇಗದ ಮೆಮೊರಿ, ಅದನ್ನು ನಾವು ಸಹ ಬಳಸುತ್ತೇವೆ). ಸರ್ವರ್ ಮೂಲಕ ಕರೆಗಳಿಗೆ ಸಾಕಷ್ಟು ಅಲ್ಲ, ಆದರೆ ನಾವು ಹೊಂದಿಕೊಳ್ಳಲು ಪ್ರಯತ್ನಿಸಲು ನಿರ್ಧರಿಸಿದ್ದೇವೆ.

ಷರತ್ತುಬದ್ಧವಾಗಿ, ಕಾರ್ಯವನ್ನು ಹಲವಾರು ಹಂತಗಳಾಗಿ ವಿಂಗಡಿಸಲಾಗಿದೆ:

  • QEMU ನಲ್ಲಿ PJSIP ರನ್ ಆಗುತ್ತಿದೆ. ಡೀಬಗ್ ಮಾಡಲು ಇದು ಅನುಕೂಲಕರವಾಗಿತ್ತು, ಜೊತೆಗೆ ನಾವು ಈಗಾಗಲೇ ಅಲ್ಲಿ AC97 ಕೊಡೆಕ್‌ಗೆ ಬೆಂಬಲವನ್ನು ಹೊಂದಿದ್ದೇವೆ.
  • QEMU ಮತ್ತು STM32 ನಲ್ಲಿ ಧ್ವನಿ ರೆಕಾರ್ಡಿಂಗ್ ಮತ್ತು ಪ್ಲೇಬ್ಯಾಕ್.
  • ಅಪ್ಲಿಕೇಶನ್ ಅನ್ನು ಪೋರ್ಟ್ ಮಾಡಲಾಗುತ್ತಿದೆ ಸರಳ_pjsua PJSIP ನಿಂದ. ಇದು SIP ಸರ್ವರ್‌ನಲ್ಲಿ ನೋಂದಾಯಿಸಲು ಮತ್ತು ಕರೆಗಳನ್ನು ಮಾಡಲು ನಿಮಗೆ ಅನುಮತಿಸುತ್ತದೆ.
  • ನಿಮ್ಮ ಸ್ವಂತ ನಕ್ಷತ್ರಾಕಾರದ-ಆಧಾರಿತ ಸರ್ವರ್ ಅನ್ನು ನಿಯೋಜಿಸಿ ಮತ್ತು ಅದರ ಮೇಲೆ ಪರೀಕ್ಷಿಸಿ, ನಂತರ sip.linphone.org ನಂತಹ ಬಾಹ್ಯವನ್ನು ಪ್ರಯತ್ನಿಸಿ

ಎಂಬಾಕ್ಸ್‌ನಲ್ಲಿನ ಧ್ವನಿಯು ಪೋರ್ಟಾಡಿಯೊ ಮೂಲಕ ಕಾರ್ಯನಿರ್ವಹಿಸುತ್ತದೆ, ಇದನ್ನು PISIP ನಲ್ಲಿಯೂ ಬಳಸಲಾಗುತ್ತದೆ. ಮೊದಲ ಸಮಸ್ಯೆಗಳು QEMU ನಲ್ಲಿ ಕಾಣಿಸಿಕೊಂಡವು - WAV 44100 Hz ನಲ್ಲಿ ಚೆನ್ನಾಗಿ ಆಡಿತು, ಆದರೆ 8000 ನಲ್ಲಿ ಏನೋ ಸ್ಪಷ್ಟವಾಗಿ ತಪ್ಪಾಗಿದೆ. ಇದು ಆವರ್ತನವನ್ನು ಹೊಂದಿಸುವ ವಿಷಯ ಎಂದು ಅದು ಬದಲಾಯಿತು - ಪೂರ್ವನಿಯೋಜಿತವಾಗಿ ಇದು ಉಪಕರಣದಲ್ಲಿ 44100 ಆಗಿತ್ತು, ಮತ್ತು ಇದು ಪ್ರೋಗ್ರಾಮಿಕ್ ಆಗಿ ಬದಲಾಗಲಿಲ್ಲ.

ಇಲ್ಲಿ, ಬಹುಶಃ, ಧ್ವನಿಯನ್ನು ಸಾಮಾನ್ಯವಾಗಿ ಹೇಗೆ ಆಡಲಾಗುತ್ತದೆ ಎಂಬುದನ್ನು ಸ್ವಲ್ಪ ವಿವರಿಸುವುದು ಯೋಗ್ಯವಾಗಿದೆ. ನೀವು ಪೂರ್ವನಿರ್ಧರಿತ ಆವರ್ತನದಲ್ಲಿ ಪ್ಲೇ ಮಾಡಲು ಅಥವಾ ರೆಕಾರ್ಡ್ ಮಾಡಲು ಬಯಸುವ ಮೆಮೊರಿಯ ತುಣುಕಿಗೆ ಧ್ವನಿ ಕಾರ್ಡ್ ಅನ್ನು ಕೆಲವು ಪಾಯಿಂಟರ್‌ಗೆ ಹೊಂದಿಸಬಹುದು. ಬಫರ್ ಮುಗಿದ ನಂತರ, ಒಂದು ಅಡಚಣೆ ಉಂಟಾಗುತ್ತದೆ ಮತ್ತು ಮುಂದಿನ ಬಫರ್‌ನೊಂದಿಗೆ ಎಕ್ಸಿಕ್ಯೂಶನ್ ಮುಂದುವರಿಯುತ್ತದೆ. ಹಿಂದಿನದನ್ನು ಪ್ಲೇ ಮಾಡುವಾಗ ಈ ಬಫರ್‌ಗಳನ್ನು ಮುಂಚಿತವಾಗಿ ಭರ್ತಿ ಮಾಡಬೇಕಾಗಿದೆ ಎಂಬುದು ಸತ್ಯ. STM32F7 ನಲ್ಲಿ ನಾವು ಈ ಸಮಸ್ಯೆಯನ್ನು ಮತ್ತಷ್ಟು ಎದುರಿಸುತ್ತೇವೆ.

ಮುಂದೆ, ನಾವು ಸರ್ವರ್ ಅನ್ನು ಬಾಡಿಗೆಗೆ ಪಡೆದುಕೊಂಡಿದ್ದೇವೆ ಮತ್ತು ಅದರ ಮೇಲೆ ನಕ್ಷತ್ರ ಚಿಹ್ನೆಯನ್ನು ನಿಯೋಜಿಸಿದ್ದೇವೆ. ಬಹಳಷ್ಟು ಡೀಬಗ್ ಮಾಡಬೇಕಾಗಿರುವುದರಿಂದ, ಆದರೆ ನಾನು ಮೈಕ್ರೊಫೋನ್‌ನಲ್ಲಿ ಹೆಚ್ಚು ಮಾತನಾಡಲು ಬಯಸದ ಕಾರಣ, ಸ್ವಯಂಚಾಲಿತ ಪ್ಲೇಬ್ಯಾಕ್ ಮತ್ತು ರೆಕಾರ್ಡಿಂಗ್ ಮಾಡುವುದು ಅಗತ್ಯವಾಗಿತ್ತು. ಇದನ್ನು ಮಾಡಲು, ನಾವು ಸರಳ_pjsua ಅನ್ನು ಪ್ಯಾಚ್ ಮಾಡಿದ್ದೇವೆ ಇದರಿಂದ ನೀವು ಆಡಿಯೊ ಸಾಧನಗಳ ಬದಲಿಗೆ ಫೈಲ್‌ಗಳನ್ನು ಸ್ಲಿಪ್ ಮಾಡಬಹುದು. PJSIP ನಲ್ಲಿ, ಇದನ್ನು ಸರಳವಾಗಿ ಮಾಡಲಾಗುತ್ತದೆ, ಏಕೆಂದರೆ ಅವುಗಳು ಪೋರ್ಟ್ನ ಪರಿಕಲ್ಪನೆಯನ್ನು ಹೊಂದಿವೆ, ಅದು ಸಾಧನ ಅಥವಾ ಫೈಲ್ ಆಗಿರಬಹುದು. ಮತ್ತು ಈ ಪೋರ್ಟ್‌ಗಳನ್ನು ಇತರ ಪೋರ್ಟ್‌ಗಳಿಗೆ ಸುಲಭವಾಗಿ ಸಂಪರ್ಕಿಸಬಹುದು. ನಮ್ಮ pjsip ನಲ್ಲಿ ನೀವು ಕೋಡ್ ಅನ್ನು ನೋಡಬಹುದು ಭಂಡಾರಗಳು. ಪರಿಣಾಮವಾಗಿ, ಯೋಜನೆಯು ಈ ಕೆಳಗಿನಂತಿತ್ತು. ಆಸ್ಟರಿಸ್ಕ್ ಸರ್ವರ್‌ನಲ್ಲಿ, ನಾನು ಎರಡು ಖಾತೆಗಳನ್ನು ಪ್ರಾರಂಭಿಸಿದೆ - ಲಿನಕ್ಸ್ ಮತ್ತು ಎಂಬಾಕ್ಸ್‌ಗಾಗಿ. ಮುಂದೆ, ಎಂಬಾಕ್ಸ್‌ನಲ್ಲಿ ಆಜ್ಞೆಯನ್ನು ಕಾರ್ಯಗತಗೊಳಿಸಲಾಗುತ್ತದೆ simple_pjsua_imported, ಎಂಬಾಕ್ಸ್ ಅನ್ನು ಸರ್ವರ್‌ನಲ್ಲಿ ನೋಂದಾಯಿಸಲಾಗಿದೆ, ಅದರ ನಂತರ ನಾವು ಲಿನಕ್ಸ್‌ನಿಂದ ಎಂಬಾಕ್ಸ್ ಅನ್ನು ಕರೆಯುತ್ತೇವೆ. ಸಂಪರ್ಕದ ಕ್ಷಣದಲ್ಲಿ, ಸಂಪರ್ಕವನ್ನು ಸ್ಥಾಪಿಸಲಾಗಿದೆಯೇ ಎಂದು ನಾವು ಆಸ್ಟರಿಸ್ಕ್ ಸರ್ವರ್‌ನಲ್ಲಿ ಪರಿಶೀಲಿಸುತ್ತೇವೆ ಮತ್ತು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ನಾವು ಎಂಬಾಕ್ಸ್‌ನಲ್ಲಿ ಲಿನಕ್ಸ್‌ನಿಂದ ಧ್ವನಿಯನ್ನು ಕೇಳಬೇಕು ಮತ್ತು ಲಿನಕ್ಸ್‌ನಲ್ಲಿ ನಾವು ಎಂಬಾಕ್ಸ್‌ನಿಂದ ಪ್ಲೇ ಮಾಡಲಾದ ಫೈಲ್ ಅನ್ನು ಉಳಿಸುತ್ತೇವೆ.

ಇದು QEMU ನಲ್ಲಿ ಕೆಲಸ ಮಾಡಿದ ನಂತರ, ನಾವು STM32F7-Discovery ಗೆ ಪೋರ್ಟಿಂಗ್‌ಗೆ ತೆರಳಿದ್ದೇವೆ. ಚಿತ್ರದ ಗಾತ್ರಕ್ಕಾಗಿ ಸಕ್ರಿಯಗೊಳಿಸಲಾದ ಕಂಪೈಲರ್ ಆಪ್ಟಿಮೈಸೇಶನ್ "-Os" ಇಲ್ಲದೆ ಅವರು 1 MB ROM ಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ ಎಂಬುದು ಮೊದಲ ಸಮಸ್ಯೆಯಾಗಿದೆ. ಅದಕ್ಕಾಗಿಯೇ ನಾವು "-Os" ಅನ್ನು ಸೇರಿಸಿದ್ದೇವೆ. ಇದಲ್ಲದೆ, ಪ್ಯಾಚ್ C ++ ಗೆ ಬೆಂಬಲವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಿದೆ, ಆದ್ದರಿಂದ ಇದು pjsua ಗೆ ಮಾತ್ರ ಅಗತ್ಯವಿದೆ ಮತ್ತು ನಾವು simple_pjsua ಅನ್ನು ಬಳಸುತ್ತೇವೆ.

ಇರಿಸಿದ ನಂತರ ಸರಳ_pjsua, ಈಗ ಅದನ್ನು ಪ್ರಾರಂಭಿಸಲು ಅವಕಾಶವಿದೆ ಎಂದು ನಿರ್ಧರಿಸಿದರು. ಆದರೆ ಮೊದಲು ಧ್ವನಿಯ ರೆಕಾರ್ಡಿಂಗ್ ಮತ್ತು ಪ್ಲೇಬ್ಯಾಕ್ ಅನ್ನು ಎದುರಿಸಲು ಅಗತ್ಯವಾಗಿತ್ತು. ಎಲ್ಲಿ ಬರೆಯಬೇಕು ಎಂಬುದು ಪ್ರಶ್ನೆ. ನಾವು ಬಾಹ್ಯ ಮೆಮೊರಿಯನ್ನು ಆರಿಸಿದ್ದೇವೆ - SDRAM (128 MB). ನೀವೇ ಇದನ್ನು ಪ್ರಯತ್ನಿಸಬಹುದು:

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 KB ಅಗತ್ಯವಿದೆ, ಮತ್ತು ನಮ್ಮಲ್ಲಿ ಸುಮಾರು 100 KB ಮಾತ್ರ ಉಳಿದಿದೆ. ಇಲ್ಲಿ ನಾನು ಕೆಲವು ಬಾಹ್ಯ ಮೆಮೊರಿಯನ್ನು ಬಳಸಬೇಕಾಗಿತ್ತು - SDRAM (ಸುಮಾರು 128 KB).

ಈ ಎಲ್ಲಾ ಸಂಪಾದನೆಗಳ ನಂತರ, ನಾನು ಲಿನಕ್ಸ್ ಮತ್ತು ಎಂಬಾಕ್ಸ್ ನಡುವಿನ ಮೊದಲ ಪ್ಯಾಕೇಜ್‌ಗಳನ್ನು ನೋಡಿದೆ ಮತ್ತು ನಾನು ಧ್ವನಿಯನ್ನು ಕೇಳಿದೆ! ಆದರೆ ಧ್ವನಿ ಭಯಾನಕವಾಗಿತ್ತು, QEMU ನಲ್ಲಿರುವಂತೆ ಒಂದೇ ಆಗಿಲ್ಲ, ಏನನ್ನೂ ಮಾಡಲು ಅಸಾಧ್ಯವಾಗಿತ್ತು. ನಂತರ ನಾವು ವಿಷಯ ಏನಾಗಬಹುದು ಎಂದು ಯೋಚಿಸಿದೆವು. ಎಂಬಾಕ್ಸ್ ಆಡಿಯೋ ಬಫರ್‌ಗಳನ್ನು ತುಂಬಲು / ಅನ್‌ಲೋಡ್ ಮಾಡಲು ಸಮಯವನ್ನು ಹೊಂದಿಲ್ಲ ಎಂದು ಡೀಬಗ್ ಮಾಡುವಿಕೆ ತೋರಿಸಿದೆ. pjsip ಒಂದು ಫ್ರೇಮ್ ಅನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸುತ್ತಿರುವಾಗ, ಬಫರ್ ಸಂಸ್ಕರಣೆಯನ್ನು ಪೂರ್ಣಗೊಳಿಸುವ ಬಗ್ಗೆ 2 ಅಡಚಣೆಗಳು ಸಂಭವಿಸುತ್ತವೆ, ಅದು ತುಂಬಾ ಹೆಚ್ಚು. ವೇಗದ ಮೊದಲ ಚಿಂತನೆಯು ಕಂಪೈಲರ್ ಆಪ್ಟಿಮೈಸೇಶನ್ ಆಗಿತ್ತು, ಆದರೆ ಇದನ್ನು ಈಗಾಗಲೇ PJSIP ನಲ್ಲಿ ಸೇರಿಸಲಾಗಿದೆ. ಎರಡನೆಯದು ಹಾರ್ಡ್‌ವೇರ್ ಫ್ಲೋಟಿಂಗ್ ಪಾಯಿಂಟ್, ನಾವು ಅದರ ಬಗ್ಗೆ ಮಾತನಾಡಿದ್ದೇವೆ ಲೇಖನ. ಆದರೆ ಅಭ್ಯಾಸವು ತೋರಿಸಿದಂತೆ, FPU ವೇಗದಲ್ಲಿ ಗಮನಾರ್ಹ ಹೆಚ್ಚಳವನ್ನು ನೀಡಲಿಲ್ಲ. ಮುಂದಿನ ಹಂತವು ಎಳೆಗಳಿಗೆ ಆದ್ಯತೆ ನೀಡುವುದು. ಎಂಬಾಕ್ಸ್ ವಿಭಿನ್ನ ಶೆಡ್ಯೂಲಿಂಗ್ ತಂತ್ರಗಳನ್ನು ಹೊಂದಿದೆ, ಮತ್ತು ನಾನು ಆದ್ಯತೆಗಳನ್ನು ಬೆಂಬಲಿಸುವ ಮತ್ತು ಆಡಿಯೊ ಸ್ಟ್ರೀಮ್‌ಗಳನ್ನು ಹೆಚ್ಚಿನ ಆದ್ಯತೆಗೆ ಹೊಂದಿಸುವ ಒಂದನ್ನು ಸೇರಿಸಿದ್ದೇನೆ. ಇದೂ ಸಹ ಸಹಾಯ ಮಾಡಲಿಲ್ಲ.

ಮುಂದಿನ ಆಲೋಚನೆಯೆಂದರೆ ನಾವು ಬಾಹ್ಯ ಮೆಮೊರಿಯೊಂದಿಗೆ ಕೆಲಸ ಮಾಡುತ್ತಿದ್ದೇವೆ ಮತ್ತು ಆಗಾಗ್ಗೆ ಪ್ರವೇಶಿಸಬಹುದಾದ ರಚನೆಗಳನ್ನು ಅಲ್ಲಿಗೆ ಸರಿಸಲು ಚೆನ್ನಾಗಿರುತ್ತದೆ. ಯಾವಾಗ ಮತ್ತು ಯಾವುದರ ಅಡಿಯಲ್ಲಿ ನಾನು ಪ್ರಾಥಮಿಕ ವಿಶ್ಲೇಷಣೆ ಮಾಡಿದ್ದೇನೆ ಸರಳ_pjsua ಮೆಮೊರಿಯನ್ನು ನಿಯೋಜಿಸುತ್ತದೆ. 190 Kb ಯಲ್ಲಿ, ಮೊದಲ 90 Kb ಅನ್ನು PJSIP ನ ಆಂತರಿಕ ಅಗತ್ಯಗಳಿಗಾಗಿ ಹಂಚಲಾಗುತ್ತದೆ ಮತ್ತು ಅವುಗಳನ್ನು ಹೆಚ್ಚಾಗಿ ಪ್ರವೇಶಿಸಲಾಗುವುದಿಲ್ಲ. ಮುಂದೆ, ಒಳಬರುವ ಕರೆ ಸಮಯದಲ್ಲಿ, pjsua_call_answer ಕಾರ್ಯವನ್ನು ಕರೆಯಲಾಗುತ್ತದೆ, ಇದರಲ್ಲಿ ಒಳಬರುವ ಮತ್ತು ಹೊರಹೋಗುವ ಫ್ರೇಮ್‌ಗಳೊಂದಿಗೆ ಕೆಲಸ ಮಾಡಲು ಬಫರ್‌ಗಳನ್ನು ಹಂಚಲಾಗುತ್ತದೆ. ಇದು ಇನ್ನೂ ಸುಮಾರು 100 Kb ಆಗಿತ್ತು. ತದನಂತರ ನಾವು ಈ ಕೆಳಗಿನವುಗಳನ್ನು ಮಾಡಿದ್ದೇವೆ. ಕರೆಯ ಕ್ಷಣದವರೆಗೆ, ನಾವು ಡೇಟಾವನ್ನು ಬಾಹ್ಯ ಮೆಮೊರಿಯಲ್ಲಿ ಇರಿಸುತ್ತೇವೆ. ಕರೆ ಮಾಡಿದ ತಕ್ಷಣ, ನಾವು ತಕ್ಷಣವೇ ರಾಶಿಯನ್ನು ಇನ್ನೊಂದಕ್ಕೆ ಬದಲಾಯಿಸುತ್ತೇವೆ - RAM ನಲ್ಲಿ. ಹೀಗಾಗಿ, ಎಲ್ಲಾ "ಬಿಸಿ" ಡೇಟಾವನ್ನು ವೇಗವಾಗಿ ಮತ್ತು ಹೆಚ್ಚು ಊಹಿಸಬಹುದಾದ ಮೆಮೊರಿಗೆ ವರ್ಗಾಯಿಸಲಾಯಿತು.

ಪರಿಣಾಮವಾಗಿ, ಇದೆಲ್ಲವೂ ಒಟ್ಟಾಗಿ ಪ್ರಾರಂಭಿಸಲು ಸಾಧ್ಯವಾಗಿಸಿತು ಸರಳ_pjsua ಮತ್ತು ನಿಮ್ಮ ಸರ್ವರ್ ಮೂಲಕ ಕರೆ ಮಾಡಿ. ತದನಂತರ sip.linphone.org ನಂತಹ ಇತರ ಸರ್ವರ್‌ಗಳ ಮೂಲಕ.

ಸಂಶೋಧನೆಗಳು

ಪರಿಣಾಮವಾಗಿ, ಉಡಾವಣೆ ಸಾಧ್ಯವಾಯಿತು ಸರಳ_pjsua ಸರ್ವರ್ ಮೂಲಕ ಎರಡೂ ದಿಕ್ಕುಗಳಲ್ಲಿ ಧ್ವನಿ ಪ್ರಸರಣದೊಂದಿಗೆ. ಹೆಚ್ಚುವರಿಯಾಗಿ ಖರ್ಚು ಮಾಡಿದ 128 KB SDRAM ನ ಸಮಸ್ಯೆಯನ್ನು ಸ್ವಲ್ಪ ಹೆಚ್ಚು ಶಕ್ತಿಯುತವಾದ ಕಾರ್ಟೆಕ್ಸ್-M7 (ಉದಾಹರಣೆಗೆ, 32 KB RAM ನೊಂದಿಗೆ STM769F512NI) ಬಳಸಿಕೊಂಡು ಪರಿಹರಿಸಬಹುದು, ಆದರೆ ಅದೇ ಸಮಯದಲ್ಲಿ, ನಾವು ಇನ್ನೂ 256 ಗೆ ಬರಲು ಭರವಸೆಯನ್ನು ಬಿಟ್ಟುಕೊಟ್ಟಿಲ್ಲ. KB 🙂 ಯಾರಾದರೂ ಆಸಕ್ತಿ ಹೊಂದಿದ್ದರೆ ನಾವು ಸಂತೋಷಪಡುತ್ತೇವೆ, ಅಥವಾ ಇನ್ನೂ ಉತ್ತಮವಾಗಿ, ಇದನ್ನು ಪ್ರಯತ್ನಿಸಿ. ಎಲ್ಲಾ ಮೂಲಗಳು, ಎಂದಿನಂತೆ, ನಮ್ಮಲ್ಲಿವೆ ಭಂಡಾರಗಳು.

ಮೂಲ: www.habr.com

ಕಾಮೆಂಟ್ ಅನ್ನು ಸೇರಿಸಿ