fix: Improve microphone permission handling and audio capture robustness

- Add device enumeration check before attempting to capture audio
- Use simpler audio constraints (audio: true) instead of specific options
- Add fallback to explicit device ID if simple constraints fail
- Add more descriptive error messages for different failure modes
- Enhance Electron permission handlers with better logging
- Add setDevicePermissionHandler for audio device access
- Include 'microphone' in allowed permissions list

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
egg
2025-12-17 16:47:09 +08:00
parent e565951bf6
commit 49dba2c43e
2 changed files with 46 additions and 8 deletions

View File

@@ -446,8 +446,10 @@ app.whenReady().then(async () => {
loadConfig();
// Grant microphone permission automatically
session.defaultSession.setPermissionRequestHandler((webContents, permission, callback) => {
const allowedPermissions = ['media', 'mediaKeySystem', 'audioCapture'];
session.defaultSession.setPermissionRequestHandler((webContents, permission, callback, details) => {
console.log(`Permission request: ${permission}`, details);
// Allow all media-related permissions
const allowedPermissions = ['media', 'mediaKeySystem', 'audioCapture', 'microphone'];
if (allowedPermissions.includes(permission)) {
console.log(`Granting permission: ${permission}`);
callback(true);
@@ -458,11 +460,22 @@ app.whenReady().then(async () => {
});
// Also handle permission check (for some Electron versions)
session.defaultSession.setPermissionCheckHandler((webContents, permission) => {
const allowedPermissions = ['media', 'mediaKeySystem', 'audioCapture'];
session.defaultSession.setPermissionCheckHandler((webContents, permission, requestingOrigin, details) => {
console.log(`Permission check: ${permission}`, { requestingOrigin, details });
const allowedPermissions = ['media', 'mediaKeySystem', 'audioCapture', 'microphone'];
return allowedPermissions.includes(permission);
});
// Set device permission handler for media devices
session.defaultSession.setDevicePermissionHandler((details) => {
console.log('Device permission request:', details);
// Allow all audio devices
if (details.deviceType === 'audio' || details.deviceType === 'hid') {
return true;
}
return false;
});
// Start backend sidecar if embedded mode is enabled
startBackendSidecar();