- Shipped
- August 27, 2026 at 3:07 AM UTC
- Author
- Kamo
- Commit
- 55d4c9e
Replaces the hand-rolled Dial()+Goto queue loop with app_queue. The deciding factor is DTMF: digits are NOT matched against the dialplan while Dial() is running, so "press 0 while on hold" cannot be built on Dial() at all. The queue's `context = kamo-queue-exit` setting is what makes it possible. extension -> forwarded to that extension 1 or 2 -> queue 0 -> straight to voicemail, from the greeting or from hold 10 min -> voicemail bad exten -> "invalid" prompt, then queue Main-line voicemail is mailbox 8100, deliberately not one of the staff mailboxes so main-line messages do not land in someone's personal voicemail. The greeting is played with Playback() from sounds/ and VoiceMail() is then called with `s`. Two findings drove that: - A copy installed at **************** was silently REMOVED between a voicemail reload and the next call, and VoiceMail fell back to the built-in "the person at extension ... is unavailable". The spool is managed by app_voicemail/FreePBX; sounds/ is not. - The `s` option skips the greeting as well as the instructions, despite the docs describing it as instructions only. With `su` the recording never played at all. Playback + `s` gives recording -> beep -> record exactly. Verified live, each path separately: - queue timeout: queue_log EXITWITHTIMEOUT, then CDR dcontext=kamo-voicemail lastapp=Playback custom/kamocrm-highcallv..., userfield QS:TIMEOUT - press 0: queue_log EXITWITHKEY|0 with RINGCANCELED on the ringing member, then the same voicemail leg - record + store: msg0000.gsm written to mailbox 8100 - answer: queue_log CONNECT PJSIP/8080 -> COMPLETEAGENT Two testing notes worth keeping. `channel originate` caps calls at ~30s, which truncates any longer test and looks like a dialplan fault. And silent test recordings are discarded by maxsilence=10, so an empty INBOX does not mean recording is broken — proven by temporarily setting maxsilence=0 and restoring. Adds **************** queue outcomes are otherwise invisible outside queue_log.