| Commit message (Collapse) | Author | Age | Lines |
|
|
|
|
|
|
| |
The window title of a toolbar is displayed in the default context menu
of the main window.
Closes #195
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Starting with version 1.0.2, bcg729 has changed its API to add support
for G.729B, thus requiring us to adjust our function calls depending on
which version is installed.
When dealing with the new API, we merely need to add a few parameters to
disable all G.729B features, namely:
* On the decoder side: When `SIDFrameFlag` is not set, the decoder will
behave just like before, decoding the payload as a standard G.729A
voice frame (or concealing an erased frame). The other parameters,
`rfc3389PayloadFlag` and `bitStreamLength`, are only of use when
dealing with a SID frame sent as per RFC 3389, and are ignored if
`SIDFrameFlag` is not set.
* On the encoder side: When `enableVAD` is disabled, the encoder will
behave just like before, producing only standard G.729A voice frames.
The only API difference is the introduction of `*bitStreamLength`, to
return the length of the encoded frame (0, 2 or 10 bytes). In our
case, this will always be 10 bytes just like before; an assert() was
added to guarantee this.
Closes #104
|
| |
|
|\
| |
| | |
Introduce read-write-update locks and guards to prevent deadlocks
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This occurs when the user declines an incoming call transfer request,
due to the following path:
- recvd_refer_permission() acquires a read lock over lines_mtx
- move_releasing_lines_to_background() is called
- A write lock over lines_mtx is acquired
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This occurs when performing a consult transfer if the target does not
support the Replaces extension, due to the following path:
- refer() acquires a read lock over lines_mtx
- refer_consultation() is called
- A write lock over lines_mtx is acquired
Closes #118
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This can easily be triggered by starting a blind transfer, and hanging
up before the other end has accepted/rejected it, due to the following
path:
- recvd_notify() acquires a read lock on lines_mtx
- cleanup_dead_lines() is called
- A write lock on lines_mtx is acquired
|
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This occurs on reception of an INVITE with a Replaces header, due to the
following path:
- recvd_invite() acquires a read lock on lines_mtx
- recvd_initial_invite() is called
- A write lock over lines_mtx is acquired
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| | |
This converts t_rwmutex and t_rwmutex_guard into a read-write-update[*]
lock and guard, in an attempt to circumvent the various deadlocks that
were introduced with the addition of lines_mtx in 38bb6b7.
[*] For more details, see https://stackoverflow.com/a/18785300 and
http://lkml.iu.edu/hypermail/linux/kernel/0004.3/0117.html.
Note that this is not a real fix; this would require analyzing and
refactoring phone.cpp, which is well beyond my abilities. This is at
best a workaround that appears to conveniently dodge all the deadlocks
I've encountered so far.
(It would have been more proper to introduce a separate class for this
purpose, but this would have required modifying over 80 lines just to
change one type for another. As phone_users_mtx is the only other
instance of this class, the impact of subverting t_rwmutex directly is
minimal.)
|
| |
| |
| |
| | |
(Doing this ahead of time to simplify the next commit a bit.)
|
| |
| |
| |
| |
| | |
These classes are about to get more complex, so let's move them ahead of
time into mutex.cpp.
|
|\ \
| | |
| | | |
Support multiple WWW-Authenticate/Proxy-Authenticate headers
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
The server may send multiple WWW-Authenticate/Proxy-Authenticate
headers, with different digest algorithms, in decreasing order of
preference. We must therefore avoid overwriting any supported challenge
once we've got a hold of one.
Closes #162
|
|\ \ \
| | | |
| | | | |
Add an option to prevent an idle session while a call is in progress
|
| | | | |
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Having the session marked as idle while a call is in progress could
trigger certain actions (such as locking the screen, logging out
automatically, or suspending the system) which could be undesirable in
this situation.
Closes #123
|
|\ \ \
| | | |
| | | | |
Add configuration option to disable incoming call popup window
|
| |/ /
| | |
| | |
| | | |
Closes #126
|
|\ \ \
| | | |
| | | | |
Use a mutex in all t_sys_settings getters/setters, even bool
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Despite what one might intuitively expect, the C++ standard does not
make any guarantee about fundamental types being atomic, not even bool.
(In fact, it explicitly mentions the existence of std::atomic<bool> for
that purpose.)
See https://stackoverflow.com/a/35226186 for more details about this
subject.
|
|\ \ \
| | | |
| | | | |
Add missing tests lost in the autotools to CMake transition
|
| | | |
| | | |
| | | |
| | | |
| | | | |
This check (AC_CHECK_RES_INIT) was originally defined in acinclude.m4,
and was lost in the transition to CMake.
|
| |/ /
| | |
| | |
| | |
| | | |
This check (AC_FUNC_STRERROR_R) was originally present in configure.in,
and was lost in the transition to CMake.
|
|\ \ \
| | | |
| | | | |
Systray icon: Always toggle visibility when clicking & Add "Show/Hide" menu entry
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
It's customary for applications embedding themselves in the system tray
to offer a "Show/Hide window" menu entry on right-click, even for those
applications which offer the same functionality via a single left-click.
(Thanks to qBittorrent for the idea of using QMenu::aboutToShow to
update the label of this menu entry.)
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
Left-clicking on the system tray icon should always result in toggling
the visibility of the main window; if the icon is visible and clickble,
then the window can always be hidden via --hide, or on startup via the
"Startup hidden in system tray" option. (In the latter case, this
previously resulted in a hidden and inaccessible window, as reported in
issue #121.)
|
|\ \ \
| | | |
| | | | |
Fix QML binding loop in TextImageButton (used in incoming call popup)
|
| |/ / |
|
|\ \ \
| | | |
| | | | |
Respond immediately to a "quit" command while in CLI mode
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
Now that we are no longer blocking on Readline calls, we can set up a
self-pipe that will let us break out of the Readline loop upon receiving
a "quit" command on our local socket, thus (finally) fixing issue #143.
(Thanks to https://stackoverflow.com/a/27662212 for the tip!)
Fixes #143
|
| | | |
| | | |
| | | |
| | | |
| | | | |
By only invoking rl_callback_read_char() when there is actual input on
stdin, we can now avoid blocking on Readline calls.
|
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | |
| | | | |
When using Readline's callback interface, signals are (by default) only
captured within the duration of the rl_callback_read_char() call. It is
therefore expected of the application to capture SIGWINCH on its own,
and notify Readline of the fact.
(While it's possible to change this with rl_persistent_signal_handlers,
some signals, such as SIGHUP, will still only be *processed* during that
call, making it a somewhat unappealing solution. This all could be
alleviated by calling rl_check_signals() periodically, but that function
was only introduced in Readline 8.0, which is far too recent.)
Note that we are using signal(2) and not sigaction(2), depite the
various warnings that come with it, mostly because it's what is already
present in the codebase.
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
When Twinkle is running in CLI mode and is sent a "quit" command to its
local socket, it will currently not respond immediately, but rather wait
until the next line has been read from its standard input (issue #143).
This is due to the blocking nature of readline(), which only returns
once a complete line has been read. Switching to Readline's "alternate"
callback interface is the first step in addressing this issue.
(As a bonus, this also fixes a bug where the line pointer returned by
readline() was not freed correctly.)
|
|\ \ \
| | | |
| | | | |
Add twinkle-console option --sip-port --rtp-port
|
| |/ / |
|
|\ \ \
| | | |
| | | | |
Prevent recursive locking of phone_users_mtx in add_phone_user()
|
| |/ /
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
When encountering two users with the same contact name, attempting to
differentiate them using USER_HOST(), a.k.a. get_ip_sip(), would result
in EDEADLK since phone_users_mtx was already locked by add_phone_user().
Closes #88
|
|\ \ \
| | | |
| | | | |
resolve nat_public_ip hostname for dyndns to work
|
| |/ / |
|
|\ \ \
| | |/
| |/| |
Simple fixes for two deadlocks
|
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | |
| | | |
`t_phone::mutex_3way` can be locked twice when hanging up a conference
call:
- `t_phone::cleanup_3way_state()` acquires a lock
- `t_audio_session::stop_3way()` is called
- `t_audio_session::get_peer_3way()` is called
- `t_phone::get_3way_peer_line()` is called
- which acquires another lock
Making that mutex recursive is a simple way to work around this issue.
|
| |/
| |
| |
| |
| | |
A write lock on `lines_mtx` has already been acquired at the beginning
of `end_call()`.
|
|\ \
| | |
| | | |
let gui set MAX_PTIME cutoff 80ms
|
| |/ |
|
| | |
|
| | |
|
| | |
|
|\ \
| | |
| | | |
Add Slovak translation
|
| |/ |
|
|/ |
|