[asterisk-dev] Pickup peculiarities

Dennis Buteyn dennis.buteyn at xorcom.com
Sun Sep 3 04:23:24 CDT 2023


On 9/3/23 01:33, asterisk at phreaknet.org wrote:
> Some architectural questions about the current incarnation of the 
> builtin call pickup code... at some point I decided it was horribly 
> deficient and wrote my own module that I typically use, but I wanted 
> to see if I could get something to work for an environment just using 
> simple building blocks.
>
> A slightly atypical use case I was toying with was picking up incoming 
> calls arriving on FXO ports (chan_dahdi), but that aren't ringing any 
> FXS stations. For example, the call could come in on FXO line 1 and 
> ring FXS line 1, and the call ringing FXS line 1 could be picked up, 
> but I was trying to see if the original call to FXO 1 could be picked 
> up without ringing any channels, i.e. pickup without ringing (which is 
> maybe a bit contradictory). In the case of an FXO channel, it's 
> already executing dialplan (so has a PBX), although it may still be in 
> the "ring" state since it hasn't answered yet.
>
> In pickup.c, a channel is only eligible for pickup if there is no PBX 
> running on it[1], so this seems to preclude the case above. As such, I 
> have a couple questions, just to confirm I'm understanding this right:
>
>  * Semantically, should the above scenario work with the builtin pickup
>    functionality, or is it by design that this case is excluded, e.g.
>    channels with a PBX but not yet answered (I'm guessing no, since how
>    would one distinguish between valid cases such as these, and most
>    any other? After all, to the core, it's a channel that's executing
>    dialplan)
>  * What would be the prototypical "Asterisk way" of doing the above
>    scenario? Something like ChannelRedirect() should work, but I mean
>    more within the bounds of the pickup construct (and maybe there
>    isn't any, just want to confirm I haven't missed something). Put
>    another way, how would you do the above, in the simplest way
>    possible? (high level, no code necessary)
>  * I'm thinking that one way to accomplish this given the way that
>    pickup is would be to have some kind of dummy "sink" channel driver,
>    e.g. something that can be called, but will never actually answer,
>    and can't do anything useful. This should make the above scenario
>    function without creating any further additional channels or ringing
>    any "real" endpoints. Local channels would not suffice, because they
>    begin executing dialplan immediately. The dummy channel driver
>    wouldn't do that, or really do anything, it would just be a valid
>    target for Dial() that would satisfy the properties expected by
>    pickup.c, to allow a channel currently ringing the dummy channel
>    driver to be picked up. A toy example:
>
> [from-fxo-port] ; Allow the incoming call from the FXO port to be 
> picked up by any station in the same call group for up to 30 seconds, 
> go to voicemail otherwise.
> exten => s,1,NoOp(Incoming call from ${CALLERID(all)}) ; after 1 ring, 
> chan_dahdi spawns PBX execution to handle the FXO port
>    same => n,Dial(WaitPickup/group1,30) ; not shown for simplicity, 
> but would probably need to use a pre-dial subroutine to execute 
> Set(CHANNEL(pickupgroup)=1) on the called channel, or the dummy driver 
> would need to accept this and call ast_channel_callgroup_set in its 
> _new callback.
>    same => n,NoOp(channel was not picked up within 30 seconds)
>    same => n,VoiceMail(1234)
>
> Let's ignore exactly how an end user is alerted to the fact there is 
> an incoming call on the FXO port; that's not relevant to the situation 
> here - for example, suppose there's an external ringer in parallel on 
> the line.
>
> Any thoughts on doing something like this? I'm assuming there isn't 
> such a channel driver already (since why would there be?), one would 
> need to be written although it'd be fairly simple. Might there be a 
> more elegant way of doing this that comes to mind?
>
> [1] https://github.com/asterisk/asterisk/blob/master/main/pickup.c#L79
>
>
If you just want to avoid ringing extensions, sending the incoming call 
to a parking lot would suffice. To solve the "how to alert user" problem 
you can use ParkAndAnnounce() instead of Park(). Alternatively, AGI 
offers many options to DYI your own custom pickup.

-- 
Dennis Buteyn
Xorcom Ltd
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.digium.com/pipermail/asterisk-dev/attachments/20230903/c98a0f99/attachment-0001.html>


More information about the asterisk-dev mailing list