Commit Graph

133 Commits

Author SHA1 Message Date
João Victor Nunes
8e83d93eb0
feat(audio): track mute state by meeting (#21095) 2024-09-27 19:13:08 -04:00
prlanzarin
1e53140a00 fix(audio): prevent permission check loop in Safari
Safari may enter a microphone permission check loop due to buggy behavior
in the Permissions API. When permission isn't permanently denied, gUM
requests fail with a NotAllowedError for a few seconds. During this time,
the permission state remains 'prompt' instead of transitioning to 'denied'
and back to 'prompt' after the timeout.

This leads to an issue where, on retrying while in 'prompt' + blocked,
the client loops through gUM checks via: 1) checking permission in the API,
2) receiving 'prompt', so trying gUM, 3) gUM fails, 4) returning to the
modal and checking permission again because the API still says 'prompt'.

Additionally, the `isUsingAudio` flag incorrectly counts the local echo
test/audio settings modal as "using audio," which toggles the flag on/off,
triggering the useEffect that causes the loop more frequently.

To fix this, remove the unnecessary AudioModal permission check that
causes the loop. Also, exclude "isEchoTest" from the `isUsingAudio` flag.
2024-08-20 19:19:08 +00:00
prlanzarin
b9f66c2a10 fix(audio): ensure correct audio device labels in Firefox
Firefox incorretly displays placeholder audio device labels in the audio
settings/echo test modal when audio is disconnected. This issue arises
due to two quirks:
- Firefox does not support the 'microphone' query from the Permissions
  API, causing a fallback gUM permission check.
- Firefox omits device labels from `enumerateDevices` if no streams
  are active, even if gUM permission is granted. This behavior differs
  from other browsers and causes our `enumerateDevices` handling to
  assume that granted permission implies labels are present. This
  failed since we clear streams before resolving the fallback gUM.

We now run an additional `enumerateDevices` call in `AudioSettings` when
a selected input device is defined. This ensures `enumerateDevices` is
re-run when a new stream is active, adding the correct device labels in
Firefox and improving device listings in all browsers. We've also
enhanced error handling in the enumeration process and fixed a false
positive in `hasMicrophonePermission`.
2024-08-20 00:43:24 +00:00
prlanzarin
325887e325 feat(audio): rework audio join without listen only
This is a rework of the audio join procedure whithout the explict listen
only separation in mind. It's supposed to be used in conjunction with
the transparent listen only feature so that the distinction between
modes is seamless with minimal server-side impact. An abridged list of
changes:
  - Let the user pick no input device when joining microphone while
    allowing them to set an input device on the fly later on
  - Give the user the option to join audio with no input device whenever
    we fail to obtain input devices, with the option to try re-enabling
    them on the fly later on
  - Add the option to open the audio settings modal (echo test et al)
    via the in-call device selection chevron
  - Rework the SFU audio bridge and its services to support
    adding/removing tracks on the fly without renegotiation
  - Rework the SFU audio bridge and its services to support a new peer
    role called "passive-sendrecv". That role is used by dupled peers
    that have no active input source on start, but might have one later
    on.
  - Remove stale PermissionsOverlay component from the audio modal
  - Rework how permission errors are detected using the Permissions API
  - Rework the local echo test so that it uses a separate media tag
    rather than the remote
  - Add new, separate dialplans that mute/hold FreeSWITCH channels on
    hold based on UA strings. This is orchestrated server-side via
    webrtc-sfu and akka-apps. The basic difference here is that channels
    now join in their desired state rather than waiting for client side
    observers to sync the state up. It also mitigates transparent listen
    only performance edge cases on multiple audio channels joining at
    the same time.

The old, decoupled listen only mode is still present in code while we
validate this new approach. To test this, transparentListenOnly
must be enabled and listen only mode must be disable on audio join so
that the user skips straight through microphone join.
2024-08-15 00:43:28 +00:00
germanocaumo
124bbe401e
fix: askForConfirmationOnLeave not working if user joined audio (#20739)
Fix missing isMuted in Audio Service
Fix muteMicrophone function not working on leave
2024-07-24 11:49:43 -04:00
João Victor
7738207fb5 Remove users adapter consumption 2024-06-14 11:35:53 -03:00
João Victor
78958ccf45 Remove meeting adapter consumption 2024-06-14 10:30:48 -03:00
João Victor Nunes
1b87055343
refactor(audio): replace Tracker.Dependency with makeVar (#20408) 2024-06-12 09:25:46 -04:00
João Victor
af52a8574c refactor: remove voice users adapter 2024-06-06 15:47:41 -03:00
Ramón Souza
7514066fc3
fix: Client can't load in certain cases (#20336)
* move settings

* remove meteor cache files
2024-05-29 09:26:11 -04:00
João Victor
40fa0eaab3 fix(audio): explicitly pass whcih user to mute
- Do not assume current user to mute when params are nullable
2024-05-10 08:52:01 -03:00
Tainan Felipe
b40930cc4a Refactor: move captions to graphql 2024-04-16 19:39:29 -03:00
Tainan Felipe
f3465827dd
Migrate meeting collection to graphql (#19853) 2024-03-26 08:57:28 -03:00
Tainan Felipe
3826a49968 Refactor: move adapter to new main and make it non blocking 2024-03-07 14:20:11 -03:00
Tainan Felipe
a5f26da361 Merge remote-tracking branch 'upstream/v3.0.x-release' into refactor-voice-user 2024-03-07 14:16:05 -03:00
André Castro
58a0efe708
Migrate auth and settings to graphQL (#19507) 2024-03-06 14:28:18 -03:00
Tainan Felipe
00e055ff6e Refactor: move voice users to graphql 2024-03-06 13:08:32 -03:00
João Victor
431511b8da migrate toggleVoice 2024-01-29 11:05:39 -03:00
Ramón Souza
7fee4d5f95 replace mute debounce 2023-08-09 13:06:57 -03:00
Anton Georgiev
6b76d9aa66 Merge remote-tracking branch 'bbb/v2.6.x-release' into merge-july-21 2023-07-21 16:24:45 -04:00
GuiLeme
6fb701045a [issue-18259] - fix join audio in breakout room 2023-07-17 09:14:23 -03:00
Ramón Souza
bcd504b749 Merge remote-tracking branch 'upstream/v2.7.x-release' into lodash-radash 2023-04-05 09:42:05 -03:00
Anton Georgiev
372e17ca08 fix: check if defined before checking .role 2023-03-14 16:39:06 -04:00
Ramón Souza
d181eba1c2 replace lodash.throttle with native function 2023-03-02 10:25:08 -03:00
Ramón Souza
0a622eff32 replace lodash throttle with standalone package 2023-03-01 15:13:29 -03:00
Ramón Souza
a60d817041 replace lodash debounce 2023-03-01 10:39:04 -03:00
Lucas Fialho Zawacki
a2bc96fe35 Ask for confirmation before closing meeting window 2022-10-13 16:41:43 -03:00
prlanzarin
89e814d570 fix(audio): centralize device change code, add rollbacks, surface errors
There's no rollback procedure in case a device switch fails right now,
nor does the code entrypoints that call the switching procedures wait
for resolution or failure before marking the new device as chosen. That
may cause inconsistent states in a couple of ways:
  - No rollback: switch fails, audio is still on but no actual
    microphone input is being transmitted
  - Not waiting for resolutions: inconsistent chosen devices on failures
Device switching errors are also not surfaced to the end user

This commit:
  - Adds device rollback and proper resolution/failure response
    awaits to try and make the state a bit more consistent.
  - Centralizes the input device switching code to be reused between
    different bridges
  - Centralizes device ID state management in audio-manager to try and
    mantain them a bit more consistent across the board
  - Surface device switching failures to the end user
  - Guarantee device IDs are set to the session storage on all
    appropriate scenarios
2022-08-24 13:28:27 +00:00
prlanzarin
d81041443b fix(audio): guarantee consistency of selected output devices in AudioSettings
The initial selected output device in AudioSettings could be the wrong one if
the user's session had an output device ID already stored, but is joining on a
new session. That would cause the remote-media tag not to be updated with the
correct output device ID when it should (the service.js change)

The issue is tackled by guaranteeing the output device ID is set on all ends
when AudioSettings/AudioModal mounts.
2022-04-28 16:36:47 +00:00
prlanzarin
e0bda16c06 refactor(audio): linter pass over local echo/volume meter
Address linter warnings before any further changes in that area
2022-04-18 20:05:26 +00:00
prlanzarin
f4ba6dd9a2 refactor(audio): use preloaded audio stream if provided
Avoids a surplus gUM with local echo test et al
2022-04-11 22:29:20 +00:00
prlanzarin
1e37924e41 refactor(audio): local echo initial hearing state is configurable, ...
public.media.showVolumeMeterInSettings => public.media.showVolumeMeter

public.media.simplifiedEchoTest => public.media.localEchoTest.enabled

Initial hearing state can be configured in public.media.localEchoTest.initialHearingState
2022-04-11 21:04:08 +00:00
prlanzarin
d6c7f23a0e feat(audio): local echo test and audio energy meter
New features:
  - A simplified echo test mode that only does a local loopback (instead of
  going to FS and back)
  - A volume meter for microphone streams to the AudioSettings view

Those two features are experimental and disabled by default; see
public.app.media.simplifiedEchoTest and public.app.media.showVolumeMeter configs

Collateral changes:
  - fix: localize fallback device strings in AudioSettings/DeviceSelector
  - Refactor on some media stream utils to be re-usable across components
  - Refactor in AudioSettings to keep gUM #uses stable.
    * TODO: need to pass streams through AudioManager to avoid the surplus gUM.
  - fix(audio): drop ScriptProcessorNode usage (deprecated)
    * Used in volume meter for tracking - use hark instead
2022-04-11 19:21:56 +00:00
Ramón Souza
16fd642e33 interrupt connection proccess if audio modal is closed 2021-12-03 11:45:07 +00:00
Mario Jr
9578efbcd3 fix(audio): prevent audio to hang when user is transferred to breakout room
When joining breakouts, we now wait for the bridge to be loaded before
automatically start user's audio.
This problems happens only on fullaudio bridge
2021-11-09 15:04:10 -03:00
Mario Jr
cf366e5090 Get user and audio data, shows it and allows it to be copied to clipboard
Using getStats api and peer information to retrieve upload/download rates
and transport information
2021-08-12 16:39:04 -03:00
Mario Jr
60378e8c63 Merge branch 'develop' into merge-update-pr-10129 2021-03-29 19:07:27 -03:00
Mario Jr
cddca95ad1 Fixes and improvements on pr #10129 - dynamic change audio device
Allow listenonly users to change output devices
Fixed dynamic audio device change for firefox
Fixed shortcuts for audio join/leave
Show (with a bold font) the current selected device
[performance] Prevent calling mediaDevices.enumerateDevices every time we render
the selector. This adds a delay (~200ms, on my chrome setup) to render this component
[performance] Do not call enumerateDevices to search for new devices, instead we listen on mediaDevices.deviceChange event
Small refactoring and fixed a few errors that were being throw in browser's console
Fixed device selection when this is done in audio-settings modal
Fallback to default device when current device is removed
Truncate device name length
Renamed "Input","Output" labels to "Microphone","Speakers", respectively
Update eslint rule for accessKey
2021-03-29 18:55:17 -03:00
Mario Jr
cec88c996d Merge remote-tracking branch 'tainan/issue-9723' into merge-update-pr-10129 2021-03-29 18:52:12 -03:00
Mario Jr
af4f9dbf26 Merge branch 'v2.2.x-release' into merge-2.2-develop 2021-03-23 17:10:28 -03:00
Mario Jr
1c7c1d5076 Change breakout-audio-transfer-status function signature
We now update breakout'a audio transfer status by using an object
2021-03-08 14:55:15 -03:00
Mario Jr
ff6cba8d53 Store information about user status during breakout room audio transfer
Currently this information is lost everytime breakout-room component is
unmounted, causing the panel to shows wrong information during next renders
Fixes #11333
2021-03-08 14:55:05 -03:00
Mario Jr
39780c6a50 Do not try to recover mute state when joining listenonly
Prevent toggleMute api call to be called for listenonly
This has no effect to the end user, but avoids unnecessary server calls
2021-03-05 00:23:20 -03:00
Mario Jr
c0625e2ee1 Cleanup joinedAudioOnly state when user disconnects or reconnect microphone
Fixes #11490
2021-03-05 00:06:19 -03:00
Mario Jr
e16566de9d Recover mute state for moderator when returning from breakout's audio transfer
Fixes #11489
2021-03-05 00:02:31 -03:00
Mario Jr
fc1401ab53 Do not try to recover mute state when joining listenonly
Prevent toggleMute api call to be called for listenonly
This has no effect to the end user, but avoids unnecessary server calls
2021-02-26 15:52:11 -03:00
Mario Jr
ad23e9c0af Cleanup joinedAudioOnly state when user disconnects or reconnect microphone
Fixes #11490
2021-02-26 15:05:17 -03:00
Mario Jr
404d65d7a4 Recover mute state for moderator when returning from breakout's audio transfer
Fixes #11489
2021-02-25 15:38:41 -03:00
Anton Georgiev
58be3d42ef remove duplicate import of throttle 2021-02-18 20:52:23 +00:00
Anton Georgiev
55e8de4357 Merge branch 'v2.2.x-release' of github.com:bigbluebutton/bigbluebutton into feb18-merge 2021-02-18 20:33:19 +00:00