feat(native): windows audio monitoring & recording (#12615)

fix AF-2692

<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->
## Summary by CodeRabbit

- **New Features**
- Added comprehensive Windows support for audio and application capture,
including real-time microphone usage detection, combined microphone and
system audio recording, and application state monitoring.
  - The "meetings" setting is now enabled on Windows as well as macOS.
- Conditional UI styling and attributes introduced for Windows
environments in the Electron renderer.

- **Bug Fixes**
- Enhanced file path handling and validation for Windows in Electron
file requests.

- **Refactor**
- Unified application info handling across platforms by consolidating
types into a single `ApplicationInfo` structure.
- Updated native module APIs by removing deprecated types, refining
method signatures, and improving error messages.
- Streamlined audio tapping APIs to use process IDs and consistent
callback types.

- **Documentation**
- Added detailed documentation for the Windows-specific audio recording
and microphone listener modules.

- **Chores**
  - Updated development dependencies in multiple packages.
- Reorganized and added platform-specific dependencies and configuration
for Windows support.
<!-- end of auto-generated comment: release notes by coderabbit.ai -->





#### PR Dependency Tree


* **PR #12615** 👈

This tree was auto-generated by
[Charcoal](https://github.com/danerwilliams/charcoal)

---------

Co-authored-by: LongYinan <lynweklm@gmail.com>
This commit is contained in:
Peng Xiao
2025-06-18 13:57:01 +08:00
committed by GitHub
parent c844786a7f
commit 899ffd1ad3
27 changed files with 2509 additions and 458 deletions

View File

@@ -95,7 +95,10 @@ export const useGeneralSettingList = (): GeneralSettingList => {
});
}
if (environment.isMacOs && BUILD_CONFIG.isElectron) {
if (
(environment.isMacOs || environment.isWindows) &&
BUILD_CONFIG.isElectron
) {
settings.push({
key: 'meetings',
title: t['com.affine.settings.meetings'](),

View File

@@ -295,28 +295,31 @@ const MeetingsSettingsMain = () => {
/>
</SettingRow>
</SettingWrapper>
<SettingWrapper
title={t['com.affine.settings.meetings.privacy.header']()}
>
<PermissionSettingRow
nameKey="com.affine.settings.meetings.privacy.screen-system-audio-recording"
descriptionKey="com.affine.settings.meetings.privacy.screen-system-audio-recording.description"
permissionSettingKey="com.affine.settings.meetings.privacy.screen-system-audio-recording.permission-setting"
hasPermission={permissions?.screen || false}
onOpenPermissionSetting={() =>
handleOpenPermissionSetting('screen')
}
/>
<PermissionSettingRow
nameKey="com.affine.settings.meetings.privacy.microphone"
descriptionKey="com.affine.settings.meetings.privacy.microphone.description"
permissionSettingKey="com.affine.settings.meetings.privacy.microphone.permission-setting"
hasPermission={permissions?.microphone || false}
onOpenPermissionSetting={() =>
handleOpenPermissionSetting('microphone')
}
/>
</SettingWrapper>
{environment.isMacOs && (
<SettingWrapper
title={t['com.affine.settings.meetings.privacy.header']()}
>
<PermissionSettingRow
nameKey="com.affine.settings.meetings.privacy.screen-system-audio-recording"
descriptionKey="com.affine.settings.meetings.privacy.screen-system-audio-recording.description"
permissionSettingKey="com.affine.settings.meetings.privacy.screen-system-audio-recording.permission-setting"
hasPermission={permissions?.screen || false}
onOpenPermissionSetting={() =>
handleOpenPermissionSetting('screen')
}
/>
<PermissionSettingRow
nameKey="com.affine.settings.meetings.privacy.microphone"
descriptionKey="com.affine.settings.meetings.privacy.microphone.description"
permissionSettingKey="com.affine.settings.meetings.privacy.microphone.permission-setting"
hasPermission={permissions?.microphone || false}
onOpenPermissionSetting={() =>
handleOpenPermissionSetting('microphone')
}
/>
</SettingWrapper>
)}
<SettingWrapper>
<SettingRow
name={t['com.affine.settings.meetings.privacy.issues']()}