Conversation with Gemini

You said

Has Zoom changed its user interface recently? I can't find anything any more. I can't even find the test page.

Gemini said

You aren't imagining things—Zoom has completely overhauled its layout recently, and it has thrown a lot of people off.

Over the last few months, Zoom rolled out its "Zoom Workplace" redesign (versions 6.7.0 through 7.0), aiming to simplify the interface. However, in doing so, they moved almost every major navigation element you're likely used to.

Here is exactly where everything went and how to find that elusive test page.

Where Did Everything Go?

  • The Main Tabs are Now on the Left: The traditional top navigation bar (Home, Meetings, Team Chat, etc.) has been moved to a vertical panel on the left side of the app window.

  • The "+" Icon is Your New Best Friend: Zoom consolidated the "Schedule" and "New Meeting" buttons. Look for a small plus (+) icon in the top toolbar. Clicking that lets you quickly launch or schedule an event from anywhere in the app.

  • In-Meeting Controls are Hidden: When you are inside a meeting, the bottom toolbar now only shows a few "essential" buttons to reduce clutter. Everything else—including your host tools and deep settings—has been consolidated into a single right-hand panel accessed by clicking Settings or Host Tools on the toolbar.

  • Pinning Your Tools: If you hate that your favorite buttons are missing from the bottom toolbar, click the More menu inside a meeting, right-click the tool you want, and select Pin to toolbar.

How to Find the Test Page

Because the app interface changed so much, trying to navigate to a test diagnostic internally is incredibly frustrating. The fastest, most foolproof way to test your microphone, speakers, and camera is to use their direct web shortcut, which will force the app to open a private test room for you.

The Zoom Test Link: zoom.us/test

How to use it:

  1. Click the link above or type zoom.us/test into your web browser.

  2. Click the blue Join button on the webpage.

  3. Your browser will ask for permission to open Zoom. Click Open Zoom Meetings.

  4. The app will launch a simulated meeting and immediately walk you through an automated pop-up test to check your speaker volume and microphone feedback before anyone else can see or hear you.

You said

What platforms does the Zoom app support?

Gemini said

Zoom casts a pretty wide net—it runs on just about anything with a screen, a camera, and an internet connection.

It is structured into desktop clients, mobile apps, specialized hardware interfaces, and a web-based version. Here is exactly what it supports:

1. Desktop Computers (Full App)

The dedicated desktop application offers the most features (like advanced virtual backgrounds and full host control).

  • Windows: Windows 10 and Windows 11 (Note: Windows "S Mode" is not supported, and they dropped support for Windows 7, 8, and 8.1).

  • macOS: macOS 10.15 (Catalina) or later.

  • Linux: It broadly supports 64-bit distributions including Ubuntu (20.04+), Debian (11+), Red Hat Enterprise Linux (9.0+), Mint (20+), Fedora, openSUSE, and Arch Linux.

2. Mobile & Tablets

The mobile apps are streamlined for smaller screens but keep most core functionality.

  • iOS & iPadOS: Apple iPhones and iPads running iOS 15 or later.

  • Android: Phones and tablets running Android 9.0 or later.

  • Kindle Fire: Fire OS tablets can download Zoom directly from the Amazon Appstore.

3. Web Browsers (No Install Required)

If you don't want to install the software, the Zoom Web App lets you join meetings entirely inside a browser. It requires up-to-date, 64-bit versions of:

  • Google Chrome

  • Microsoft Edge

  • Mozilla Firefox

  • Apple Safari

4. Smart TVs, Displays, & Wearables

Zoom has expanded into living rooms and specialized devices:

  • Apple TV (tvOS): Uses an iPhone or iPad as a wireless webcam via Continuity Camera.

  • ChromeOS: Fully supported via the Google Play Store or the web app on Chromebooks.

  • Smart Displays: Native support for the Amazon Echo Show, Google Nest Hub Max, and Portal from Meta.

  • VR/AR: It has a dedicated app for Apple Vision Pro (visionOS) for spatial computing meetings.

You said

How can I run the zoom app on FreeBSD?

Gemini said

Running a proprietary, closed-source binary like Zoom on FreeBSD natively isn't an option since Zoom doesn't target the platform. You have two main approaches to make it work: the low-friction web browser route or wrestling with the Linux Binary Compatibility layer.

Method 1: The Chromium Web App (Highly Recommended)

Because the Linux client is incredibly brittle to maintain across upstream Zoom updates, the web client is the most reliable, headache-free way to use Zoom on FreeBSD.

While Firefox on FreeBSD can struggle with Zoom's specific implementation of WebRTC (often resulting in video dropping out), Chromium works remarkably well.

  1. Install Chromium if you haven't already:

pkg install chromium

2. For video support, make sure your webcam daemon (`webcamd`) is running and your user belongs to the `webcamd` group so Chromium can access `/dev/video0`.
3. Head to `zoom.us/join` in Chromium. When prompted to launch the application, look for the small, easy-to-miss text link at the bottom: **"Join from your browser."**

To make it feel like a desktop app, you can launch it in "app mode" via the CLI:
```bash
chromium --app=https://zoom.us/join

Method 2: The Linux Binary Compatibility Layer (net-im/zoom)

There is a port available (net-im/zoom), which bundles Zoom’s Linux client and runs it via FreeBSD's Linux emulation. However, it comes with a massive caveat: audio through ALSA/OSS translation is historically unstable or entirely broken, and upstream updates to the Linux binary frequently break the compatibility layer entirely.

If you want to try it, the setup looks like this:

  1. Enable Linux Emulation: Add this to /etc/rc.conf:

    Code snippet
    linux_enable="YES"
    
   Then start the service immediately:
   ```bash
service linux start
  1. Install the Port/Package:

pkg install net-im/zoom


3. **Handle Permissions for A/V Hardware:**
   Ensure your multimedia devices have the correct permissions so the Linux subsystem can see them. You will want to map your host's devices into the Linux `/compat/linux` environment, which the package installer typically tries to configure via `devfs.rules`.

> **Verdict:** If you are the host of a massive meeting and absolutely require native app features (like local recording control or advanced breakout rooms), a dedicated **bhyve Windows/Linux VM** with PCI passthrough for your hardware or the native web app in a clean Chromium instance are your best bets. For everyday use, the Chromium web client is faster, safer, and won't break when Zoom releases a minor point update next week.
You said

How do I get more volume from a C-Media Electronics Inc. USB PnP Sound Device?

Gemini said

C-Media USB audio adapters (like the ubiquitous CM108/CM119 chipsets) are notorious for having incredibly low default volume ceilings under FreeBSD's native OSS (sound(4)) framework.

This usually happens because FreeBSD's snd_uaudio(4) driver initializes the hardware mixer with conservative gains, or because the kernel's Virtual Channel (vchan) mixer is applying digital attenuation on top of the physical hardware volume.

You can fix this by tuning the underlying sysctl knobs and checking the driver-specific PCM channels.

Step 1: Max out the PCM and Main Mixer Channels

Often, running a simple mixer vol 100 isn't enough because the pcm element (which dictates the internal DSP gain for virtual channels) is still sitting at its default low value.

First, identify which pcm device belongs to your USB sound card:

Bash
cat /dev/sndstat

Look for the line that says pcmX: <USB ... audio> (e.g., pcm3).

Now, target that explicit device and max out both the master volume and the PCM processing engine:

Bash
mixer -f /dev/mixerX vol 100 pcm 100

(Replace X with your actual device number).

Step 2: Adjust the Global Volume Pre-scaling Knob

FreeBSD employs a kernel feature called Volume Control (VPC) to prevent digital clipping when mixing multiple audio sources. By default, it introduces a safety attenuation threshold that makes USB headsets and sound cards sound muffled.

You can check your current threshold using:

Bash
sysctl hw.snd.vpc_0db

The default value is typically 45. Lowering this number increases the volume ceiling before digital attenuation kicks in. Try bringing it down to 0 to remove the restriction entirely:

Bash
sysctl hw.snd.vpc_0db=0

If that instantly makes your C-Media device loud and clear, make it persistent by adding it to /etc/sysctl.conf:

Code snippet
hw.snd.vpc_0db=0

Step 3: Unclog the Internal Pre-amp

If you are still struggling to get decent volume out of the device, you can adjust the integrated parametric equalizer pre-amplifier. Every individual PCM device has its own pre-amp gain setting.

Check what your specific USB device is set to:

Bash
sysctl dev.pcm.X.play.eq_preamp

By default, this is usually set to 0 (or 0dB). You can safely inject digital gain here to force a louder signal out to the C-Media DAC. Try boosting it by 3 or 6 decibels:

Bash
sysctl dev.pcm.X.play.eq_preamp=6

(Warning: Boosting this too high can cause digital clipping/distortion on high-amplitude audio tracks. If it sounds crunchy, back it off to 3 or 4).

To make this permanent, add it to /etc/sysctl.conf:

Code snippet
dev.pcm.X.play.eq_preamp=6

Step 4: The Audiophile Route (Bit-Perfect Bypass)

If you only play audio from one application at a time (e.g., a media player or browser) and want to completely bypass the FreeBSD mixer subsystem altogether, you can force the device into bit-perfect mode. This hands raw PCM data directly to the C-Media hardware, bypassing all vchan overhead and giving you full hardware volume range.

Turn off virtual channels and enable bit-perfect processing for that specific unit:

Bash
sysctl dev.pcm.X.play.vchans=0
sysctl dev.pcm.X.bitperfect=1

Note: In this mode, software-level mixers (mixer) will no longer affect the stream; you will need to rely entirely on the volume controls inside your application or on your physical speakers/headphones.

You said



That "mixer -f /dev/mixerX vol 100 pcm 100" is incorrect syntax. It should be "mixer -f /dev/mixerX mic=100"

Gemini said

You are completely right, and I appreciate the correction. I tripped over the syntax there.

Since FreeBSD completely rewrote the mixer(8) utility (moving from the legacy version to the modern tool that handles values using key-value pairs like control=value), passing multiple bare numbers like vol 100 pcm 100 throws a syntax error.

On top of that, you made an excellent point about the specific channel. On those cheap C-Media adapters, the input capture is often routed or labeled under mic rather than vol or pcm depending on how the driver exposes the interface.

The correct modern syntax to adjust those controls simultaneously on your specific mixer would be:

Bash
mixer -f /dev/mixerX vol=100 pcm=100 mic=100

Thanks for keeping me honest on the syntax! Did adjusting the mic channel or the vpc_0db sysctl knob finally give you the volume boost you needed for Zoom?

You said

Yes. The quality is still terrible.

Gemini said

It’s a classic frustration with those C-Media adapters—once you get the volume to a functional level, you’re often left dealing with a high noise floor or that "underwater" robotic clipping.

Since these chips (especially the CM108/119) lack sophisticated hardware shielding and use very basic DAC/ADC converters, they are prone to picking up electromagnetic interference (EMI) from your computer’s USB bus.

Here are a few technical levers you can pull on FreeBSD to try and clean up the signal:

1. Check for Sample Rate Mismatches

If the Zoom web client or snd_uaudio is forcing a sample rate that the C-Media chip doesn't natively support (or doesn't scale well), you’ll get "grainy" or distorted audio. Most of these chips prefer a locked 48kHz or 44.1kHz.

Check what the hardware is actually doing right now:

Bash
sysctl dev.pcm.X.play.vchanrate
sysctl dev.pcm.X.rec.vchanrate

If it’s at something odd, force it to a standard rate in /etc/sysctl.conf:

Code snippet
hw.snd.vchanrate=48000

2. Adjust the Feeder Rate (Anti-Jitter)

FreeBSD uses "feeders" to move data from the virtual channels to the hardware. If the buffer is too small, you get "crackling" (underruns). If it’s too large, you get lag. You can try increasing the feeder buffer size to see if the "terrible" quality is actually just micro-stuttering:

Bash
sysctl hw.snd.feeder_rate_round=1

This forces the kernel to be more precise with rate rounding, which can help with the cheap oscillators found in budget USB dongles.

3. Disable "Echo Cancellation" in the Browser

Since you're likely using Zoom via Chromium, the browser applies its own software-level Automatic Gain Control (AGC) and Noise Suppression. If your hardware is already struggling, the browser’s processing can make it sound much worse by over-compressing the audio.

  • In Zoom Settings (within the browser/web app), go to Audio.

  • Disable "Automatically adjust microphone volume".

  • Set "Suppress Background Noise" to Low or Off.

4. The Hardware "Ground Loop" Test

Because those C-Media sticks are unshielded, they are essentially tiny antennas.

  • Move the Dongle: If it’s plugged directly into the back of your PC/Motherboard, it’s surrounded by EMI from the CPU and Power Supply. Use a short USB extension cable to get the adapter 30cm away from the computer chassis. This often eliminates the "hum" or "hiss" immediately.

  • USB Port Swap: Try a USB 2.0 port instead of a USB 3.0 (Blue) port. USB 3.0 controllers are known to cause 2.4GHz interference that can bleed into the audio path of cheap DACs.

If none of these software tweaks clear the mud, you might simply be hitting the physical ceiling of that $10 chipset. Those adapters are great for a "quick fix," but they rarely provide the clean gain needed for professional-sounding calls.

You said

How do I set a background for a Zoom session?

Gemini said

Since you are using Chromium to run the Zoom web client on FreeBSD, you have a slight hurdle here: The basic "Join from your browser" web interface does not natively support custom virtual backgrounds or blurring on desktop Linux/BSD browsers.

Because Zoom's background removal relies heavily on compiled WebAssembly and hardware acceleration modules optimized specifically for Windows, macOS, and the official ChromeOS Progressive Web App (PWA), those options simply don't show up in the standard Chromium web wrapper menus.

You have two ways to solve this—either by switching up how you connect to the web app, or by handling the background processing at the OS level before the video even reaches Chromium.

Method 1: Trick Zoom into giving you the PWA Interface (Easiest)

Zoom explicitly restricts virtual backgrounds on standard desktop Linux/BSD browser tabs, but it does allow them if it thinks you are on a Chromebook using the Zoom PWA. You can bypass Zoom's restriction by spoofing your browser's User Agent string to mimic ChromeOS.

  1. Install a User-Agent switcher extension in Chromium (or use Chromium's built-in developer tools to override it).

  2. Set your User Agent string for zoom.us to a standard ChromeOS token, such as:

    Mozilla/5.0 (X11; CrOS x86_64 14541.0.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36

  3. Launch your Zoom session.

If your CPU has at least 4 logical cores, the underlying WebAssembly scripts will fire up, and you will see the small Up Arrow (^) appear next to your camera icon on the bottom toolbar. Click it, select Background & Effects, and you can choose the blur option or upload a static image.

Method 2: The FreeBSD Way (Virtual Loopback Webcam)

If you want a flawless background solution that works across any browser (Chromium, Firefox) and doesn't rely on Zoom's heavy, unoptimized browser scripts, you can offload the task to your system using a virtual video loopback tool.

You feed your physical camera (/dev/video0) into an open-source background-removal filter, which outputs a perfectly masked, clean video stream to a virtual webcam device (/dev/video1). Chromium then just sees a normal hardware camera.

The most robust tool for this on Unix-like environments is Webcamoid or using a lightweight Python script running Mediapipe (Google's open-source machine learning framework) paired with multimedia/webcamd.

The basic logic:

  1. Create a virtual video loopback unit using the kernel module:

    Bash
    kldload v4l2loopback
    
2. Use an application like `webcamoid` (available in ports/packages) to apply a virtual background or blur effect to your physical feed, and point its output to the new virtual device.
3. In Zoom's audio/video settings, simply select the virtual loopback camera instead of your raw USB webcam device. 

This completely bypasses Zoom’s arbitrary platform blocks and tends to run much lighter on system resources than Zoom's resource-hogging web-script implementation.
You said

 Where can I find v4l2loopback?

Gemini said

In the FreeBSD ecosystem, you won't find v4l2loopback as a standalone kernel module like you would on Linux. Instead, that functionality is integrated directly into the multimedia/webcamd port.

webcamd handles the heavy lifting of translating Linux USB video drivers to FreeBSD, and it has a built-in virtual loopback feature that creates those /dev/videoX nodes you need for Zoom.

How to set it up

First, ensure you have the necessary tools installed:

Bash
pkg install webcamd v4l-utils v4l_compat

To create a loopback device, you run webcamd with the -v flag pointing to a virtual device number. For example, to create /dev/video1 as your virtual sink:

  1. Load the cuse module (Userspace Character Device), which webcamd requires:

    Bash
    kldload cuse
    
  2. Start a loopback instance:

    Bash
    webcamd -d v4l2loopback0 -v /dev/video1
    

Connecting it to your background filter

Once /dev/video1 exists, it acts as a "pipe." You can now use a tool like OBS Studio or a Python script to process your real camera and "output" the result to this new device.

  • In OBS Studio: Install multimedia/obs-studio. Once your scene is set up with your background/blur, click "Start Virtual Camera." If it doesn't automatically find the device, you may need to point it to /dev/video1.

  • In Zoom (Chromium): Refresh your browser. In the camera settings, you should now see a new option called "Dummy video device" or "v4l2loopback." Selecting this will show the processed feed.

Making it Permanent

To ensure this survives a reboot, add these to your configuration files:

/boot/loader.conf

Code snippet
cuse_load="YES"

/etc/rc.conf

Code snippet
webcamd_enable="YES"
# This flags line tells webcamd to create the loopback on startup
webcamd_flags="-d v4l2loopback0 -v /dev/video1"

Does the cuse module load correctly for you, or do you get a "linker error" when trying to start the loopback?

profile picture


Gemini is AI and can make mistakes.