| Commit message (Collapse) | Author | Age | Files | Lines |
| |
|
|
| |
cancellation
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Capture already went through FFmpeg's "dshow" demuxer, which does the job -
unlike the audio case there is nothing here the platform offers that we cannot
reach any other way, so there is no reason to drive DirectShow ourselves. Two
things were missing to make it work.
Enumeration, because the demuxer has none: it can only print device names to
the log with -list_devices, which is no use to a settings dialog. The list is
built in videodshow.cpp instead, walking the same CLSID_VideoInputDeviceCategory
the demuxer walks, so the names handed back are the ones it matches on. Where a
friendly name is not unique - two identical cameras - later duplicates fall
back to the device path, which the demuxer also accepts.
And the "video=" prefix, since DirectShow namespaces its devices by type and
the same name behind "audio=" would be a microphone. The name is stored
unprefixed and decorated at open time, so what the settings dialog shows and
writes stays readable.
Also adds a last-resort open with no constraints at all. DirectShow refuses a
video_size or framerate it cannot produce exactly rather than settling for the
nearest, so a camera with an unusual set of modes would otherwise give no
picture; whatever comes back is scaled by the transcode loop anyway.
The failure message on Windows now names the likely cause. A camera that
enumerated but will not open is usually not a broken camera: Windows lists
devices it then refuses to instantiate, which is what the "Let desktop apps
access your camera" privacy setting being off looks like from here, and what
another application holding the camera looks like too. None of them are
distinguishable from a real fault at that level, and the bare "I/O error" sent
me looking at the wrong layer entirely.
compressedFormats is left empty on Windows, so "prefer compressed formats" has
no effect there - finding out what a DirectShow camera can deliver means
walking its output pin's media types through IAMStreamConfig, which is a good
deal more than the one v4l2 ioctl that fills this in on Linux.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBqDgvq3Ty6C6BjLFH16bw
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
PlatformDriverName() now takes a direction, and answers with one of two kinds
of name. A bare one - "alsa", "pulse", "oss" - is an FFmpeg libavdevice driver
opened the way everything else here is opened. One prefixed "platform-" is not
an FFmpeg driver at all: what follows names a platform audio API the caller
drives itself through NativeAudioBackend.
Windows and macOS take the second route, because both provide acoustic echo
cancellation but only to streams that declare themselves part of a voice call
- AudioCategory_Communications on WASAPI, the VoiceProcessingIO audio unit on
CoreAudio - and libavdevice's wrappers have no way to ask for either. Doing our
own cancelling on platforms that would have done it better below us is not a
trade worth making.
Where the platform will not do it, speexdsp does: one EchoCanceller per call,
shared by both directions through a QSharedPointer, since the call is torn down
without joining either audio thread. Playback feeds it the far end as it hands
it to the device; capture subtracts before encoding. Alignment is left to the
FIFO - in steady state its backlog settles at the sound card's buffer depth,
which is also how far ahead of the speaker the playback side runs, leaving only
the room for the filter tail to model. Measured 27 dB ERLE on a 60 ms echo with
1.6 dB of loss on speech when nothing is playing.
On macOS the canceller is a single audio unit that renders and captures at
once, so both directions share one refcounted instance. Ringtones deliberately
get a plain HALOutput unit instead - opening a voice unit to play a bell would
switch the microphone on and prompt for permission.
Linux gains a choice of alsa or pulse, with PulseAudio device enumeration
through libpulse when configure finds it.
Info.plist gains NSMicrophoneUsageDescription and NSCameraUsageDescription.
Without them macOS 10.14 and later kills the process on first use of the
microphone or camera rather than asking, so calls did not merely fail, they
took the application with them.
Two things fixed along the way that were not about echo at all: the settings
dialog's microphone test paced playback by counting timer ticks, which on
Windows meant a 20 ms packet every ~31 ms because the system timer granularity
is 15.6 ms - the recording came out slowed down and chopped up. It now paces
against a QElapsedTimer. And chooseEncoderSampleFmt() uses
avcodec_get_supported_config() where available, the AVCodec format arrays it
replaced having been removed in FFmpeg 9.
Only the Linux paths are verified here; the Windows and macOS backends compile
to nothing on this machine and have been reviewed by hand.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CBqDgvq3Ty6C6BjLFH16bw
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| |
Wires ringback, busy, special-information (unreachable) and an
electromechanical-bell incoming ringtone into
AudioVideoCallController, each played on its own QThread since
TonePlayer::play() blocks. Device selection reads audio.playback_device
and audio.ring_device from Settings so it follows what's configured in
SettingsDialog.
Centralizes the FFmpeg libavdevice output driver name
(alsa/audiotoolbox/dsound) in AudioDevice::PlatformDriverName() rather
than hardcoding ALSA, so it can also back capture/playback later.
Adds toneplayer.{h,cpp} to the autotools build and adds the missing
GPL v3 header to the touched files that lacked it.
|
| | |
|
| | |
|
| |
|
|
| |
for Linux
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
handled by distro packaging
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
one place
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
| |
connections
|
| | |
|
| | |
|
| | |
|
| | |
|
| | |
|
| |
|
|
|
|
| |
item in systray menu for muting
git-svn-id: svn://localhost/project_picapica/trunk@318 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@317 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@294 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
|
|
| |
default DH param file dhparam4096.pem
git-svn-id: svn://localhost/project_picapica/trunk@277 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
|
|
| |
containing functions for working with id
git-svn-id: svn://localhost/project_picapica/trunk@263 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@245 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@242 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@230 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@229 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@226 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@215 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@195 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
|
|
| |
included in dist
git-svn-id: svn://localhost/project_picapica/trunk@189 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@183 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@175 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@174 fb96df88-216d-11de-830c-f3023f12d8ac
|
| |
|
|
| |
git-svn-id: svn://localhost/project_picapica/trunk@172 fb96df88-216d-11de-830c-f3023f12d8ac
|