<h4>res_pjsip_diversion: resolve race condition between Diversion header processin..</h4>
<p>Author: Mike Bradeen
Date: 2025-08-07</p>
<p>Based on the firing order of the PJSIP call-backs on a redirect, it was possible for
the Diversion header to not be included in the outgoing 181 response to the UAC and
the INVITE to the UAS.</p>
<p>This change moves the Diversion header processing to an earlier PJSIP callback while also
preventing the corresponding update that can cause a duplicate 181 response when processing
the header at that time.</p>
<p>Resolves: #1349</p>
<h4>file.c: with "sounds_search_custom_dir = yes", search "custom" directory</h4>
<p>Author: Allan Nathanson
Date: 2025-08-10</p>
<p>With <code>sounds_search_custom_dir = yes</code>, we are supposed to search for sounds
in the <code>AST_DATA_DIR/sounds/custom</code> directory before searching the normal
directories. Unfortunately, a recent change
(https://github.com/asterisk/asterisk/pull/1172) had a typo resulting in
the "custom" directory not being searched. This change restores this
expected behavior.</p>
<p>Resolves: #1353</p>
<h4>cel: Add STREAM_BEGIN, STREAM_END and DTMF event types.</h4>
<p>Author: Sperl Viktor
Date: 2025-06-30</p>
<p>Fixes: #1280</p>
<p>UserNote: Enabling the tracking of the
STREAM_BEGIN and the STREAM_END event
types in cel.conf will log media files and
music on hold played to each channel.
The STREAM_BEGIN event's extra field will
contain a JSON with the file details (path,
format and language), or the class name, in
case of music on hold is played. The DTMF
event's extra field will contain a JSON with
the digit and the duration in milliseconds.</p>
<h4>channelstorage_cpp_map_name_id.cc: Refactor iterators for thread-safety.</h4>
<p>Author: George Joseph
Date: 2025-07-30</p>
<p>The fact that deleting an object from a map invalidates any iterator
that happens to currently point to that object was overlooked in the initial
implementation. Unfortunately, there's no way to detect that an iterator
has been invalidated so the result was an occasional SEGV triggered by modules
like app_chanspy that opens an iterator and can keep it open for a long period
of time. The new implementation doesn't keep the underlying C++ iterator
open across calls to ast_channel_iterator_next() and uses a read lock
on the map to ensure that, even for the few microseconds we use the
iterator, another thread can't delete a channel from under it. Even with
this change, the iterators are still WAY faster than the ao2_legacy
storage driver.</p>
<p>Full details about the new implementation are located in the comments for
iterator_next() in channelstorage_cpp_map_name_id.cc.</p>
<p>Resolves: #1309</p>
<h4>res_srtp: Add menuselect options to enable AES_192, AES_256 and AES_GCM</h4>
<p>Author: George Joseph
Date: 2025-08-05</p>
<p>UserNote: Options are now available in the menuselect "Resource Modules"
category that allow you to enable the AES_192, AES_256 and AES_GCM
cipher suites in res_srtp. Of course, libsrtp and OpenSSL must support
them but modern versions do. Previously, the only way to enable them was
to set the CFLAGS environment variable when running ./configure.
The default setting is to disable them preserving existing behavior.</p>
<h4>cdr: add CANCEL dispostion in CDR</h4>
<p>Author: zhou_jiajian
Date: 2025-07-24</p>
<p>In the original implementation, both CANCEL and NO ANSWER states were
consolidated under the NO ANSWER disposition. This patch introduces a
separate CANCEL disposition, with an optional configuration switch to
enable this new disposition.</p>
<p>Resolves: #1323</p>
<p>UserNote: A new CDR option "canceldispositionenabled" has been added
that when set to true, the NO ANSWER disposition will be split into
two dispositions: CANCEL and NO ANSWER. The default value is 'no'</p>
<h4>func_curl: Allow auth methods to be set.</h4>
<p>Author: Naveen Albert
Date: 2025-08-01</p>
<p>Currently the CURL function only supports Basic Authentication,
the default auth method in libcurl. Add an option that also
allows enabling digest authentication.</p>
<p>Resolves: #1332</p>
<p>UserNote: The httpauth field in CURLOPT now allows the authentication
methods to be set.</p>
<h4>options: Change ast_options from ast_flags to ast_flags64.</h4>
<p>Author: George Joseph
Date: 2025-07-21</p>
<p>DeveloperNote: The 32-bit ast_options has no room left to accomodate new
options and so has been converted to an ast_flags64 structure. All internal
references to ast_options have been updated to use the 64-bit flag
manipulation macros. External module references to the 32-bit ast_options
should continue to work on little-endian systems because the
least-significant bytes of a 64 bit integer will be in the same location as a
32-bit integer. Because that's not the case on big-endian systems, we've
swapped the bytes in the flags manupulation macros on big-endian systems
so external modules should still work however you are encouraged to test.</p>
<h4>res_config_odbc: Prevent Realtime fallback on record-not-found (SQL_NO_DATA)</h4>
<p>Author: Alexei Gradinari
Date: 2025-07-15</p>
<p>This patch fixes an issue in the ODBC Realtime engine where Asterisk incorrectly
falls back to the next configured backend when the current one returns
SQL_NO_DATA (i.e., no record found).
This is a logical error and performance risk in multi-backend configurations.</p>
<p>Solution:
Introduced CONFIG_RT_NOT_FOUND ((void *)-1) as a special return marker.
ODBC Realtime backend now return CONFIG_RT_NOT_FOUND when no data is found.
Core engine stops iterating on this marker, avoiding unnecessary fallback.</p>
<p>Notes:
Other Realtime backends (PostgreSQL, LDAP, etc.) can be updated similarly.
This patch only covers ODBC.</p>
<p>Fixes: #1305</p>
<h4>resource_channels.c: Don't call ast_channel_get_by_name on empty optional argu..</h4>
<p>Author: Sven Kube
Date: 2025-07-30</p>
<p><code>ast_ari_channels_create</code> and <code>ast_ari_channels_dial</code> called the
<code>ast_channel_get_by_name</code> function with optional arguments. Since
8f1982c4d6, this function logs an error for empty channel names.
This commit adds checks for empty optional arguments that are used
to call <code>ast_channel_get_by_name</code> to prevent these error logs.</p>
<h4>app_agent_pool: Remove documentation for removed option.</h4>
<p>Author: Naveen Albert
Date: 2025-07-28</p>
<p>The already-deprecated "password" option for the AGENT function was
removed in commit d43b17a872e8227aa8a9905a21f90bd48f9d5348 for
Asterisk 12, but the documentation for it wasn't removed then.</p>
<p>Resolves: #1321</p>
<h4>pbx.c: When the AST_SOFTHANGUP_ASYNCGOTO flag is set, pbx_extension_helper sho..</h4>
<p>Author: Tinet-mucw
Date: 2025-07-22</p>
<p>Under certain circumstances the context/extens/prio are set in the ast_async_goto, for example action Redirect.
In the situation that action Redirect is broken by pbx_extension_helper this info is changed.
This will cause the current dialplan location to be executed twice.
In other words, the Redirect action does not take effect.</p>
<p>Resolves: #1315</p>
<h4>res_agi: Increase AGI command buffer size from 2K to 8K</h4>
<p>Author: Sperl Viktor
Date: 2025-07-22</p>
<p>Fixes: #1317</p>
<h4>ast_tls_cert: Make certificate validity configurable.</h4>
<p>Author: Naveen Albert
Date: 2025-07-16</p>
<p>Currently, the ast_tls_cert script is hardcoded to produce certificates
with a validity of 365 days, which is not generally desirable for self-
signed certificates. Make this parameter configurable.</p>
<p>Resolves: #1307</p>
<h4>cdr.c: Set tenantid from party_a->base instead of chan->base.</h4>
<p>Author: George Joseph
Date: 2025-07-17</p>
<p>The CDR tenantid was being set in cdr_object_alloc from the channel->base
snapshot. Since this happens at channel creation before the dialplan is even
reached, calls to <code>CHANNEL(tenantid)=<something></code> in the dialplan were being
ignored. Instead we now take tenantid from party_a when
cdr_object_create_public_records() is called which is after the call has
ended and all channel snapshots rebuilt. This is exactly how accountcode
and amaflags, which can also be set in tha dialplpan, are handled.</p>
<p>Resolves: #1259</p>
<h4>app_mixmonitor: Update the documentation concerning the "D" option.</h4>
<p>Author: George Joseph
Date: 2025-07-16</p>
<p>When using the "D" option to output interleaved audio, the file extension
must be ".raw". That info wasn't being properly rendered in the markdown
and HTML on the documentation site. The XML was updated to move the
note in the option section to a warning in the description.</p>
<p>Resolves: #1269</p>
<h4>sig_analog: Properly handle STP, ST2P, and ST3P for fgccamamf.</h4>
<p>Author: Naveen Albert
Date: 2025-07-14</p>
<p>Previously, we were only using # (ST) as a terminator, and not handling
A (STP), B (ST2P), or C (ST3P), which erroneously led to it being
treated as part of the dialed number. Parse any of these as the start
digit.</p>
<p>Resolves: #1301</p>
<h4>chan_websocket: Reset frame_queue_length to 0 after FLUSH_MEDIA</h4>
<p>Author: kodokaii
Date: 2025-07-03</p>
<p>In the WebSocket channel driver, the FLUSH_MEDIA command clears all frames from
the queue but does not reset the frame_queue_length counter.</p>
<p>As a result, the driver incorrectly thinks the queue is full after flushing,
which prevents new multimedia frames from being sent, especially after multiple
flush commands.</p>
<p>This fix sets frame_queue_length to 0 after flushing, ensuring the queue state
is consistent with its actual content.</p>
<p>Fixes: #1304</p>
<h4>chan_pjsip.c: Change SSRC after media source change</h4>
<p>Author: Martin Tomec
Date: 2025-06-25</p>
<p>When the RTP media source changes, such as after a blind transfer, the new source introduces a discontinuous timestamp. According to RFC 3550, Section 5.1, an RTP stream's timestamp for a given SSRC must increment monotonically and linearly.
To comply with the standard and avoid a large timestamp jump on the existing SSRC, a new SSRC is generated for the new media stream.
This change resolves known interoperability issues with certain SBCs (like Sonus/Ribbon) that stop forwarding media when they detect such a timestamp violation. This code uses the existing implementation from chan_sip.</p>
<p>Resolves: #927</p>
<h4>Media over Websocket Channel Driver</h4>
<p>Author: George Joseph
Date: 2025-04-28</p>
<ul>
<li>
<p>Created chan_websocket which can exchange media over both inbound and
outbound websockets which the driver will frame and time.
See http://s.asterisk.net/mow for more information.</p>
</li>
<li>
<p>res_http_websocket: Made defines for max message size public and converted
a few nuisance verbose messages to debugs.</p>
</li>
<li>
<p>main/channel.c: Changed an obsolete nuisance error to a debug.</p>
</li>
<li>
<p>ARI channels: Updated externalMedia to include chan_websocket as a supported
transport.</p>
</li>
</ul>
<p>UserNote: A new channel driver "chan_websocket" is now available. It can
exchange media over both inbound and outbound websockets and will both frame
and re-time the media it receives.
See http://s.asterisk.net/mow for more information.</p>
<p>UserNote: The ARI channels/externalMedia API now includes support for the
WebSocket transport provided by chan_websocket.</p>
<h4>bundled_pjproject: Avoid deadlock between transport and transaction</h4>
<p>Author: Stanislav Abramenkov
Date: 2025-07-01</p>
<p>Backport patch from upstream
* Avoid deadlock between transport and transaction
<h4>utils.h: Add rounding to float conversion to int.</h4>
<p>Author: mkmer
Date: 2025-03-23</p>
<p>Quote from an audio engineer NR9V:
There is a minor issue of a small amount of crossover distortion though as a result of <code>ast_slinear_saturated_multiply_float()</code> not rounding the float. This could result in some quiet but potentially audible distortion artifacts in lower volume parts of the signal. If you have for example a sign wave function with a max amplitude of just a few samples, all samples between -1 and 1 will be truncated to zero, resulting in the waveform no longer being a sine wave and in harmonic distortion.</p>
<p>Resolves: #1176</p>
<h4>pbx.c: when set flag AST_SOFTHANGUP_ASYNCGOTO, ast_explicit_goto should return..</h4>
<p>Author: Tinet-mucw
Date: 2025-06-18</p>
<p>Under certain circumstances the context/extens/prio are set in the ast_async_goto, for example action Redirect.
In the situation that action Redirect is broken by GotoIf this info is changed.
that will causes confusion in dialplan execution.</p>
<p>Resolves: #1273</p>
<h4>res_musiconhold.c: Ensure we're always locked around music state access.</h4>
<p>Author: Sean Bright
Date: 2025-04-08</p>
<h4>res_musiconhold.c: Annotate when the channel is locked.</h4>
<p>Author: Sean Bright
Date: 2025-04-08</p>
<h4>res_musiconhold: Appropriately lock channel during start.</h4>
<p>Author: Jaco Kroon
Date: 2024-12-19</p>
<p>This relates to #829</p>
<p>This doesn't sully solve the Ops issue, but it solves the specific crash
there. Further PRs to follow.</p>
<p>In the specific crash the generator was still under construction when
moh was being stopped, which then proceeded to close the stream whilst