[pjsip] Audio Pre-Processing

Benny Prijono bennylp at pjsip.org
Wed Feb 20 04:00:33 EST 2008


Done with this ticket: http://trac.pjsip.org/repos/ticket/489

The implementation details differ slightly, but I think there
shouldn't be any difference in the behavior.

thanks,
 -benny


On 2/19/08, Norman Franke <norman at myasd.com> wrote:
>  Ignore that last one. I think one should call the on_stream_destroy after
> removing from the bridge, otherwise, you'd never be able to dispose of the
> memory if you allocated a new pjmedia_port. So, I implemented a quick and
> dirty AGC using this method and it works! Now I just need to fine tune it.
>
> -Norman
>
>
> norman:~/src/pjproject-svn franke$ svn diff
> Index: pjsip/include/pjsua-lib/pjsua.h
> ===================================================================
> --- pjsip/include/pjsua-lib/pjsua.h     (revision 1805)
> +++ pjsip/include/pjsua-lib/pjsua.h     (working copy)
> @@ -922,6 +922,19 @@
>       */
>      void (*on_nat_detect)(const pj_stun_nat_detect_result *res);
>
> +    /** Notify application when media session is created and before
> +     *  it is registered to the conference bridge. Application may return
> +     *  different media port if it has added media processing port to
> +     *  the stream.
> +     */
> +     void (*on_stream_created)(pjsua_call_id call_id,
> pjmedia_session *sess,
> +                              unsigned stream_idx, pjmedia_port **p_port);
> +
> +    /** Notify application when media session has been destroyed.
> +     */
> +     void (*on_stream_destroyed)(pjsua_call_id call_id,
> +                                pjmedia_session *sess, unsigned
> stream_idx);
> +
>  } pjsua_callback;
>
>
> Index: pjsip/src/pjsua-lib/pjsua_media.c
> ===================================================================
> --- pjsip/src/pjsua-lib/pjsua_media.c   (revision 1805)
> +++ pjsip/src/pjsua-lib/pjsua_media.c   (working copy)
> @@ -882,6 +882,9 @@
>
>      if (call->conf_slot != PJSUA_INVALID_ID) {
>         pjmedia_conf_remove_port(pjsua_var.mconf,
> call->conf_slot);
> +       if (pjsua_var.ua_cfg.cb.on_stream_destroyed) {
> +
> pjsua_var.ua_cfg.cb.on_stream_destroyed(call_id,
> call->session, 0);
> +       }
>         call->conf_slot = PJSUA_INVALID_ID;
>      }
>
> @@ -1064,7 +1067,13 @@
>         {
>             char tmp[PJSIP_MAX_URL_SIZE];
>             pj_str_t port_name;
> +           pjmedia_port *conf_media_port = media_port;
>
> +           if (pjsua_var.ua_cfg.cb.on_stream_created) {
> +               pjsua_var.ua_cfg.cb.on_stream_created(
> +                               call_id, call->session, 0,
> &conf_media_port);
> +           }
> +
>             port_name.ptr = tmp;
>             port_name.slen =
> pjsip_uri_print(PJSIP_URI_IN_REQ_URI,
>
> call->inv->dlg->remote.info->uri,
> @@ -1073,7 +1082,7 @@
>                 port_name = pj_str("call");
>             }
>             status = pjmedia_conf_add_port( pjsua_var.mconf,
> call->inv->pool,
> -                                           media_port,
> +                                           conf_media_port,
>                                             &port_name,
>                                             (unsigned*)&call->conf_slot);
>             if (status != PJ_SUCCESS) {
>
>
>
> Norman Franke
> Answering Service for Directors, Inc.
> www.myasd.com
>
> On Feb 19, 2008, at 3:40 AM, Benny Prijono wrote:
>
> On 2/18/08, Norman Franke <norman at myasd.com> wrote:
>  I'm using the PJSUA library, and I want to intercept audio from remote
> callers and process it before mixing in the conference bridge. What's the
> best way to do this? I want to add some type of dynamic gain control, since
> we get some very soft callers. I've done something similar for playback of
> files and that works great, so now I want to do so with callers.
>
>
>
> Currently there's no way to do that with PJSUA-LIB, as stream will be
> added to the conference bridge automatically. But perhaps this would
> be simple to support by adding couple of callbacks below in
> pjsua_callback:
>
> /** Notify application when media session is created and before
>  *  it is registered to the conference bridge. Application may return
>  *  different media port if it has added media processing port to
>  *  the stream.
>  */
>  void (*on_stream_created)(pjsua_call_id call_id,
> pjmedia_session *sess,
>                                         unsigned stream_idx,
> pjmedia_port **p_port);
>
> /** Notify application when media session is about to be destroyed.
>  */
>  void (*on_stream_destroyed)(pjsua_call_id call_id,
>                                            pjmedia_session *sess,
>                                            unsigned stream_idx);
>
>
> This would also fix the problem discussed in "stream port destroyed
> before callback function was called" thread.
>
> Now, care to make patch? ;-)
>
> cheers,
>  -benny
>
>
>
> Norman Franke
> Answering Service for Directors, Inc.
> www.myasd.com
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>
>
>
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>
> _______________________________________________
> Visit our blog: http://blog.pjsip.org
>
> pjsip mailing list
> pjsip at lists.pjsip.org
> http://lists.pjsip.org/mailman/listinfo/pjsip_lists.pjsip.org
>
>




More information about the pjsip mailing list