STM32F7-ਡਿਸਕਵਰੀ 'ਤੇ SIP ਫ਼ੋਨ

ਹਾਈ ਹਰ ਕੋਈ

ਕੁਝ ਸਮਾਂ ਪਹਿਲਾਂ ਅਸੀਂ ਲਿਖੀ ਇਸ ਬਾਰੇ ਕਿ ਅਸੀਂ STM32F4-ਡਿਸਕਵਰੀ 'ਤੇ 1 MB ROM ਅਤੇ 192 KB RAM ਦੇ ਨਾਲ ਇੱਕ SIP ਫ਼ੋਨ ਨੂੰ ਕਿਵੇਂ ਲਾਂਚ ਕਰਨ ਵਿੱਚ ਕਾਮਯਾਬ ਹੋਏ) ਦੇ ਆਧਾਰ 'ਤੇ ਐਮਬਾਕਸ. ਇੱਥੇ ਇਹ ਕਿਹਾ ਜਾਣਾ ਚਾਹੀਦਾ ਹੈ ਕਿ ਉਹ ਸੰਸਕਰਣ ਘੱਟ ਤੋਂ ਘੱਟ ਸੀ ਅਤੇ ਬਿਨਾਂ ਸਰਵਰ ਦੇ ਅਤੇ ਸਿਰਫ ਇੱਕ ਦਿਸ਼ਾ ਵਿੱਚ ਵੌਇਸ ਟ੍ਰਾਂਸਮਿਸ਼ਨ ਦੇ ਨਾਲ ਦੋ ਫੋਨਾਂ ਨੂੰ ਸਿੱਧਾ ਕਨੈਕਟ ਕੀਤਾ ਗਿਆ ਸੀ। ਇਸ ਲਈ, ਅਸੀਂ ਸਰਵਰ ਦੁਆਰਾ ਇੱਕ ਕਾਲ ਦੇ ਨਾਲ ਇੱਕ ਹੋਰ ਸੰਪੂਰਨ ਫ਼ੋਨ ਲਾਂਚ ਕਰਨ ਦਾ ਫੈਸਲਾ ਕੀਤਾ ਹੈ, ਦੋਵਾਂ ਦਿਸ਼ਾਵਾਂ ਵਿੱਚ ਵੌਇਸ ਟ੍ਰਾਂਸਮਿਸ਼ਨ, ਪਰ ਉਸੇ ਸਮੇਂ ਸਭ ਤੋਂ ਛੋਟੇ ਸੰਭਵ ਮੈਮੋਰੀ ਆਕਾਰ ਦੇ ਅੰਦਰ ਰੱਖੋ।


ਫੋਨ ਲਈ, ਇੱਕ ਐਪਲੀਕੇਸ਼ਨ ਦੀ ਚੋਣ ਕਰਨ ਦਾ ਫੈਸਲਾ ਕੀਤਾ ਗਿਆ ਸੀ ਸਧਾਰਨ_pjsua PJSIP ਲਾਇਬ੍ਰੇਰੀ ਦੇ ਹਿੱਸੇ ਵਜੋਂ। ਇਹ ਇੱਕ ਨਿਊਨਤਮ ਐਪਲੀਕੇਸ਼ਨ ਹੈ ਜੋ ਸਰਵਰ 'ਤੇ ਰਜਿਸਟਰ ਕਰ ਸਕਦੀ ਹੈ, ਕਾਲਾਂ ਪ੍ਰਾਪਤ ਕਰ ਸਕਦੀ ਹੈ ਅਤੇ ਜਵਾਬ ਦੇ ਸਕਦੀ ਹੈ। ਹੇਠਾਂ ਮੈਂ ਤੁਰੰਤ ਇਸ ਦਾ ਵੇਰਵਾ ਦੇਵਾਂਗਾ ਕਿ ਇਸਨੂੰ STM32F7-ਡਿਸਕਵਰੀ 'ਤੇ ਕਿਵੇਂ ਚਲਾਉਣਾ ਹੈ।

ਕਿਵੇਂ ਚਲਾਉਣਾ ਹੈ

  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. Embox ਕੰਸੋਲ ਵਿੱਚ “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 ਮਾਈਕ੍ਰੋਫੋਨਾਂ ਵਿੱਚ ਬੋਲਦਾ ਹੈ। ਅਸੀਂ ਲੀਨਕਸ ਤੋਂ ਐਪਲੀਕੇਸ਼ਨ simple_pjsua, pjsua ਰਾਹੀਂ ਕਾਲ ਕਰਦੇ ਹਾਂ। ਖੈਰ, ਜਾਂ ਤੁਸੀਂ ਕਿਸੇ ਹੋਰ ਕਿਸਮ ਦੇ ਲਿਨਫੋਨ ਦੀ ਵਰਤੋਂ ਕਰ ਸਕਦੇ ਹੋ।

ਇਹ ਸਭ ਸਾਡੇ 'ਤੇ ਵਰਣਨ ਕੀਤਾ ਗਿਆ ਹੈ ਵਿਕੀ.

ਅਸੀਂ ਉੱਥੇ ਕਿਵੇਂ ਪਹੁੰਚੇ

ਇਸ ਲਈ, ਸ਼ੁਰੂ ਵਿੱਚ ਇੱਕ ਹਾਰਡਵੇਅਰ ਪਲੇਟਫਾਰਮ ਦੀ ਚੋਣ ਕਰਨ ਬਾਰੇ ਸਵਾਲ ਉੱਠਿਆ. ਕਿਉਂਕਿ ਇਹ ਸਪੱਸ਼ਟ ਸੀ ਕਿ 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 ਵਿੱਚ ਕੋਡ ਦੇਖ ਸਕਦੇ ਹੋ ਰਿਪੋਜ਼ਟਰੀਆਂ. ਨਤੀਜੇ ਵਜੋਂ, ਸਕੀਮ ਹੇਠ ਲਿਖੇ ਅਨੁਸਾਰ ਸੀ. Asterisk ਸਰਵਰ 'ਤੇ, ਮੈਂ ਦੋ ਖਾਤੇ ਸ਼ੁਰੂ ਕੀਤੇ - Linux ਅਤੇ Embox ਲਈ। ਅੱਗੇ, ਕਮਾਂਡ Embox ਉੱਤੇ ਚਲਾਈ ਜਾਂਦੀ ਹੈ simple_pjsua_imported, Embox ਸਰਵਰ 'ਤੇ ਰਜਿਸਟਰ ਕਰਦਾ ਹੈ, ਜਿਸ ਤੋਂ ਬਾਅਦ ਅਸੀਂ ਲੀਨਕਸ ਤੋਂ Embox ਨੂੰ ਕਾਲ ਕਰਦੇ ਹਾਂ। ਕੁਨੈਕਸ਼ਨ ਦੇ ਪਲ 'ਤੇ, ਅਸੀਂ Asterisk ਸਰਵਰ 'ਤੇ ਜਾਂਚ ਕਰਦੇ ਹਾਂ ਕਿ ਕੁਨੈਕਸ਼ਨ ਸਥਾਪਿਤ ਹੋ ਗਿਆ ਹੈ, ਅਤੇ ਕੁਝ ਸਮੇਂ ਬਾਅਦ ਸਾਨੂੰ Embox ਵਿੱਚ Linux ਤੋਂ ਆਵਾਜ਼ ਸੁਣਾਈ ਦੇਣੀ ਚਾਹੀਦੀ ਹੈ, ਅਤੇ Linux ਵਿੱਚ ਅਸੀਂ Embox ਤੋਂ ਚਲਾਏ ਜਾਣ ਵਾਲੀ ਫਾਈਲ ਨੂੰ ਸੁਰੱਖਿਅਤ ਕਰਦੇ ਹਾਂ।

QEMU 'ਤੇ ਕੰਮ ਕਰਨ ਤੋਂ ਬਾਅਦ, ਅਸੀਂ STM32F7-ਡਿਸਕਵਰੀ 'ਤੇ ਪੋਰਟ ਕਰਨ ਲਈ ਅੱਗੇ ਵਧੇ। ਪਹਿਲੀ ਸਮੱਸਿਆ ਇਹ ਹੈ ਕਿ ਉਹ ਚਿੱਤਰ ਦੇ ਆਕਾਰ ਲਈ ਸਮਰੱਥ ਕੰਪਾਈਲਰ ਓਪਟੀਮਾਈਜੇਸ਼ਨ "-Os" ਤੋਂ ਬਿਨਾਂ 1 MB ROM ਵਿੱਚ ਫਿੱਟ ਨਹੀਂ ਹੋਏ। ਇਸ ਲਈ ਅਸੀਂ "-Os" ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਹੈ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਪੈਚ ਨੇ C++ ਲਈ ਸਹਿਯੋਗ ਨੂੰ ਅਯੋਗ ਕਰ ਦਿੱਤਾ ਹੈ, ਇਸ ਲਈ ਇਹ ਸਿਰਫ਼ pjsua ਲਈ ਲੋੜੀਂਦਾ ਹੈ, ਅਤੇ ਅਸੀਂ ਸਧਾਰਨ_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-ਡਿਸਕਵਰੀ 'ਤੇ MEMS ਮਾਈਕ੍ਰੋਫੋਨ ਕਿਸੇ ਤਰ੍ਹਾਂ 16000 Hz ਤੋਂ ਘੱਟ ਫ੍ਰੀਕੁਐਂਸੀ 'ਤੇ ਵਧੀਆ ਕੰਮ ਨਹੀਂ ਕਰਦੇ ਹਨ। ਇਸ ਲਈ, ਅਸੀਂ 16000 Hz ਸੈਟ ਕਰਦੇ ਹਾਂ, ਭਾਵੇਂ 8000 Hz ਆਉਂਦਾ ਹੈ। ਅਜਿਹਾ ਕਰਨ ਲਈ, ਹਾਲਾਂਕਿ, ਇੱਕ ਫ੍ਰੀਕੁਐਂਸੀ ਨੂੰ ਦੂਜੀ ਵਿੱਚ ਇੱਕ ਸੌਫਟਵੇਅਰ ਪਰਿਵਰਤਨ ਜੋੜਨਾ ਜ਼ਰੂਰੀ ਸੀ।

ਅੱਗੇ, ਮੈਨੂੰ ਹੀਪ ਦਾ ਆਕਾਰ ਵਧਾਉਣਾ ਪਿਆ, ਜੋ ਕਿ RAM ਵਿੱਚ ਸਥਿਤ ਹੈ. ਸਾਡੀਆਂ ਗਣਨਾਵਾਂ ਦੇ ਅਨੁਸਾਰ, pjsip ਨੂੰ ਲਗਭਗ 190 KB ਦੀ ਲੋੜ ਹੈ, ਅਤੇ ਸਾਡੇ ਕੋਲ ਸਿਰਫ 100 KB ਬਚਿਆ ਹੈ। ਇੱਥੇ ਮੈਨੂੰ ਕੁਝ ਬਾਹਰੀ ਮੈਮੋਰੀ ਵਰਤਣੀ ਪਈ - SDRAM (ਲਗਭਗ 128 KB)।

ਇਹਨਾਂ ਸਾਰੇ ਸੰਪਾਦਨਾਂ ਤੋਂ ਬਾਅਦ, ਮੈਂ ਲੀਨਕਸ ਅਤੇ ਐਮਬਾਕਸ ਦੇ ਵਿਚਕਾਰ ਪਹਿਲੇ ਪੈਕੇਜ ਦੇਖੇ, ਅਤੇ ਮੈਂ ਆਵਾਜ਼ ਸੁਣੀ! ਪਰ ਆਵਾਜ਼ ਬਹੁਤ ਭਿਆਨਕ ਸੀ, ਕਿਊਮਯੂ ਵਾਂਗ ਬਿਲਕੁਲ ਨਹੀਂ, ਕੁਝ ਵੀ ਬਣਾਉਣਾ ਅਸੰਭਵ ਸੀ। ਫਿਰ ਅਸੀਂ ਸੋਚਿਆ ਕਿ ਮਾਮਲਾ ਕੀ ਹੋ ਸਕਦਾ ਹੈ। ਡੀਬੱਗਿੰਗ ਨੇ ਦਿਖਾਇਆ ਕਿ Embox ਕੋਲ ਆਡੀਓ ਬਫਰਾਂ ਨੂੰ ਭਰਨ / ਅਨਲੋਡ ਕਰਨ ਲਈ ਸਮਾਂ ਨਹੀਂ ਹੈ। ਜਦੋਂ pjsip ਇੱਕ ਫਰੇਮ ਦੀ ਪ੍ਰਕਿਰਿਆ ਕਰ ਰਿਹਾ ਸੀ, 2 ਰੁਕਾਵਟਾਂ ਨੂੰ ਬਫਰ ਪ੍ਰੋਸੈਸਿੰਗ ਦੇ ਪੂਰਾ ਹੋਣ ਬਾਰੇ ਸਮਾਂ ਸੀ, ਜੋ ਕਿ ਬਹੁਤ ਜ਼ਿਆਦਾ ਹੈ। ਗਤੀ ਵਧਾਉਣ ਲਈ ਪਹਿਲਾ ਵਿਚਾਰ ਕੰਪਾਈਲਰ ਓਪਟੀਮਾਈਜੇਸ਼ਨ ਸੀ, ਪਰ ਇਹ ਪਹਿਲਾਂ ਹੀ PJSIP ਵਿੱਚ ਸ਼ਾਮਲ ਕੀਤਾ ਗਿਆ ਸੀ। ਦੂਜਾ ਇੱਕ ਹਾਰਡਵੇਅਰ ਫਲੋਟਿੰਗ ਪੁਆਇੰਟ ਹੈ, ਅਸੀਂ ਇਸ ਬਾਰੇ ਗੱਲ ਕੀਤੀ ਹੈ ਲੇਖ. ਪਰ ਜਿਵੇਂ ਕਿ ਅਭਿਆਸ ਨੇ ਦਿਖਾਇਆ ਹੈ, FPU ਨੇ ਗਤੀ ਵਿੱਚ ਮਹੱਤਵਪੂਰਨ ਵਾਧਾ ਨਹੀਂ ਕੀਤਾ. ਅਗਲਾ ਕਦਮ ਥਰਿੱਡਾਂ ਨੂੰ ਤਰਜੀਹ ਦੇਣਾ ਸੀ। Embox ਦੀਆਂ ਵੱਖ-ਵੱਖ ਸਮਾਂ-ਸਾਰਣੀ ਰਣਨੀਤੀਆਂ ਹਨ, ਅਤੇ ਮੈਂ ਇੱਕ ਨੂੰ ਸ਼ਾਮਲ ਕੀਤਾ ਹੈ ਜੋ ਤਰਜੀਹਾਂ ਦਾ ਸਮਰਥਨ ਕਰਦਾ ਹੈ ਅਤੇ ਆਡੀਓ ਸਟ੍ਰੀਮ ਨੂੰ ਉੱਚ ਤਰਜੀਹ 'ਤੇ ਸੈੱਟ ਕਰਦਾ ਹੈ। ਇਸ ਨਾਲ ਵੀ ਕੋਈ ਫਾਇਦਾ ਨਹੀਂ ਹੋਇਆ।

ਅਗਲਾ ਵਿਚਾਰ ਇਹ ਸੀ ਕਿ ਅਸੀਂ ਬਾਹਰੀ ਮੈਮੋਰੀ ਦੇ ਨਾਲ ਕੰਮ ਕਰ ਰਹੇ ਹਾਂ ਅਤੇ ਇਹ ਬਹੁਤ ਵਧੀਆ ਹੋਵੇਗਾ ਕਿ ਉੱਥੇ ਢਾਂਚਿਆਂ ਨੂੰ ਹਿਲਾਉਣਾ ਬਹੁਤ ਵਧੀਆ ਹੋਵੇਗਾ ਜੋ ਅਕਸਰ ਪਹੁੰਚਦੇ ਹਨ। ਮੈਂ ਕਦੋਂ ਅਤੇ ਕਿਸ ਦੇ ਅਧੀਨ ਇੱਕ ਸ਼ੁਰੂਆਤੀ ਵਿਸ਼ਲੇਸ਼ਣ ਕੀਤਾ ਸਧਾਰਨ_pjsua ਮੈਮੋਰੀ ਨਿਰਧਾਰਤ ਕਰਦਾ ਹੈ. ਇਹ ਪਤਾ ਚਲਿਆ ਕਿ 190 Kb ਵਿੱਚੋਂ, ਪਹਿਲੇ 90 Kb ਨੂੰ PJSIP ਦੀਆਂ ਅੰਦਰੂਨੀ ਲੋੜਾਂ ਲਈ ਨਿਰਧਾਰਤ ਕੀਤਾ ਗਿਆ ਹੈ ਅਤੇ ਉਹਨਾਂ ਤੱਕ ਅਕਸਰ ਪਹੁੰਚ ਨਹੀਂ ਕੀਤੀ ਜਾਂਦੀ। ਇਸ ਤੋਂ ਇਲਾਵਾ, ਇਨਕਮਿੰਗ ਕਾਲ ਦੇ ਦੌਰਾਨ, pjsua_call_answer ਫੰਕਸ਼ਨ ਨੂੰ ਕਾਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ, ਜਿਸ ਵਿੱਚ ਬਫਰਾਂ ਨੂੰ ਫਿਰ ਇਨਕਮਿੰਗ ਅਤੇ ਆਊਟਗੋਇੰਗ ਫਰੇਮਾਂ ਨਾਲ ਕੰਮ ਕਰਨ ਲਈ ਨਿਰਧਾਰਤ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। ਇਹ ਅਜੇ ਵੀ ਲਗਭਗ 100 Kb ਸੀ. ਅਤੇ ਫਿਰ ਅਸੀਂ ਹੇਠਾਂ ਦਿੱਤਾ. ਕਾਲ ਦੇ ਪਲ ਤੱਕ, ਅਸੀਂ ਡੇਟਾ ਨੂੰ ਬਾਹਰੀ ਮੈਮੋਰੀ ਵਿੱਚ ਰੱਖਦੇ ਹਾਂ। ਜਿਵੇਂ ਹੀ ਕਾਲ ਆਉਂਦੀ ਹੈ, ਅਸੀਂ ਤੁਰੰਤ ਹੀਪ ਨੂੰ ਇੱਕ ਹੋਰ ਨਾਲ ਬਦਲਦੇ ਹਾਂ - RAM ਵਿੱਚ. ਇਸ ਤਰ੍ਹਾਂ, ਸਾਰੇ "ਗਰਮ" ਡੇਟਾ ਨੂੰ ਤੇਜ਼ ਅਤੇ ਵਧੇਰੇ ਅਨੁਮਾਨਿਤ ਮੈਮੋਰੀ ਵਿੱਚ ਟ੍ਰਾਂਸਫਰ ਕੀਤਾ ਗਿਆ ਸੀ.

ਨਤੀਜੇ ਵਜੋਂ, ਇਸ ਸਭ ਨੇ ਮਿਲ ਕੇ ਇਸ ਨੂੰ ਲਾਂਚ ਕਰਨਾ ਸੰਭਵ ਬਣਾਇਆ ਸਧਾਰਨ_pjsua ਅਤੇ ਤੁਹਾਡੇ ਸਰਵਰ ਦੁਆਰਾ ਕਾਲ ਕਰੋ। ਅਤੇ ਫਿਰ ਦੂਜੇ ਸਰਵਰਾਂ ਜਿਵੇਂ ਕਿ sip.linphone.org ਰਾਹੀਂ।

ਸਿੱਟਾ

ਨਤੀਜੇ ਵਜੋਂ, ਇਸ ਨੂੰ ਲਾਂਚ ਕਰਨਾ ਸੰਭਵ ਸੀ ਸਧਾਰਨ_pjsua ਸਰਵਰ ਦੁਆਰਾ ਦੋਵਾਂ ਦਿਸ਼ਾਵਾਂ ਵਿੱਚ ਵੌਇਸ ਟ੍ਰਾਂਸਮਿਸ਼ਨ ਦੇ ਨਾਲ। ਵਾਧੂ ਖਰਚੇ ਗਏ 128 KB SDRAM ਵਾਲੀ ਸਮੱਸਿਆ ਨੂੰ ਥੋੜ੍ਹਾ ਹੋਰ ਸ਼ਕਤੀਸ਼ਾਲੀ Cortex-M7 (ਉਦਾਹਰਨ ਲਈ, 32 KB RAM ਦੇ ਨਾਲ STM769F512NI) ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਹੱਲ ਕੀਤਾ ਜਾ ਸਕਦਾ ਹੈ, ਪਰ ਉਸੇ ਸਮੇਂ, ਅਸੀਂ ਅਜੇ ਵੀ 256 ਵਿੱਚ ਜਾਣ ਦੀ ਉਮੀਦ ਨਹੀਂ ਛੱਡੀ ਹੈ। KB 🙂 ਸਾਨੂੰ ਖੁਸ਼ੀ ਹੋਵੇਗੀ ਜੇਕਰ ਕੋਈ ਦਿਲਚਸਪੀ ਰੱਖਦਾ ਹੈ, ਜਾਂ ਬਿਹਤਰ ਅਜੇ ਤੱਕ, ਇਸਨੂੰ ਅਜ਼ਮਾਓ। ਸਾਰੇ ਸਰੋਤ, ਆਮ ਵਾਂਗ, ਸਾਡੇ ਵਿੱਚ ਹਨ ਰਿਪੋਜ਼ਟਰੀਆਂ.

ਸਰੋਤ: www.habr.com

ਇੱਕ ਟਿੱਪਣੀ ਜੋੜੋ