feat(sysaudio): 支持 macOS 系统音频流采集

- 新增 darwin.py 文件实现 macOS 音频流采集功能
- 修改 main-gummy.py 以支持 macOS 平台
- 更新 AllConfig 和 CaptionEngine 以适配新平台
This commit is contained in:
himeditator mac
2025-07-08 17:04:15 +08:00
parent 65da30f83d
commit 7e953db6bd
14 changed files with 141 additions and 36 deletions

View File

@@ -37,6 +37,7 @@ export interface CaptionItem {
}
export interface FullConfig {
platform: string,
uiLanguage: UILanguage,
uiTheme: UITheme,
leftBarWidth: number,

View File

@@ -51,6 +51,7 @@ class AllConfig {
if(config.uiTheme) this.uiTheme = config.uiTheme
if(config.leftBarWidth) this.leftBarWidth = config.leftBarWidth
if(config.styles) this.setStyles(config.styles)
if(process.platform !== 'win32' && process.platform !== 'darwin') config.controls.audio = 1
if(config.controls) this.setControls(config.controls)
console.log('[INFO] Read Config from:', configPath)
}
@@ -71,6 +72,7 @@ class AllConfig {
public getFullConfig(): FullConfig {
return {
platform: process.platform,
uiLanguage: this.uiLanguage,
uiTheme: this.uiTheme,
leftBarWidth: this.leftBarWidth,

View File

@@ -27,7 +27,7 @@ export class CaptionEngine {
if (process.platform === 'win32') {
gummyName = 'main-gummy.exe'
}
else if (process.platform === 'linux') {
else if (process.platform === 'darwin' || process.platform === 'linux') {
gummyName = 'main-gummy'
}
else {
@@ -124,16 +124,16 @@ export class CaptionEngine {
if(this.processStatus !== 'running') return
if (this.process) {
console.log('[INFO] Trying to stop process, PID:', this.process.pid)
if (process.platform === "win32" && this.process.pid) {
exec(`taskkill /pid ${this.process.pid} /t /f`, (error) => {
if (error) {
controlWindow.sendErrorMessage(i18n('engine.shutdown.error') + error)
console.error(`[ERROR] Failed to kill process: ${error}`)
}
});
} else {
this.process.kill('SIGKILL');
let cmd = `kill ${this.process.pid}`;
if (process.platform === "win32") {
cmd = `taskkill /pid ${this.process.pid} /t /f`
}
exec(cmd, (error) => {
if (error) {
controlWindow.sendErrorMessage(i18n('engine.shutdown.error') + error)
console.error(`[ERROR] Failed to kill process: ${error}`)
}
})
}
this.processStatus = 'stopping'
console.log('[INFO] Caption engine process stopping')

View File

@@ -16,6 +16,7 @@ onMounted(() => {
useGeneralSettingStore().uiTheme = data.uiTheme
useGeneralSettingStore().leftBarWidth = data.leftBarWidth
useCaptionStyleStore().setStyles(data.styles)
useEngineControlStore().platform = data.platform
useEngineControlStore().setControls(data.controls)
useCaptionLogStore().captionData = data.captionLog
})

View File

@@ -32,6 +32,7 @@
<div class="input-item">
<span class="input-label">{{ $t('engine.audioType') }}</span>
<a-select
:disabled="platform !== 'win32' && platform !== 'darwin'"
class="input-area"
v-model:value="currentAudio"
:options="audioType"
@@ -87,7 +88,7 @@ import { useI18n } from 'vue-i18n'
const { t } = useI18n()
const engineControl = useEngineControlStore()
const { captionEngine, audioType, changeSignal } = storeToRefs(engineControl)
const { platform, captionEngine, audioType, changeSignal } = storeToRefs(engineControl)
const currentSourceLang = ref('auto')
const currentTargetLang = ref('zh')

View File

@@ -1,4 +1,4 @@
import { ref } from 'vue'
import { ref, watch } from 'vue'
import { defineStore } from 'pinia'
import { notification } from 'ant-design-vue'
@@ -12,6 +12,7 @@ import { useGeneralSettingStore } from './generalSetting'
export const useEngineControlStore = defineStore('engineControl', () => {
const { t } = useI18n()
const platform = ref('unknown')
const captionEngine = ref(engines[useGeneralSettingStore().uiLanguage])
const audioType = ref(audioTypes[useGeneralSettingStore().uiLanguage])
@@ -91,7 +92,14 @@ export const useEngineControlStore = defineStore('engineControl', () => {
});
})
watch(platform, (newValue) => {
if(newValue !== 'win32' && newValue !== 'darwin') {
audio.value = 1
}
})
return {
platform, // 系统平台
captionEngine, // 字幕引擎
audioType, // 音频类型
engineEnabled, // 字幕引擎是否启用

View File

@@ -37,6 +37,7 @@ export interface CaptionItem {
}
export interface FullConfig {
platform: string,
uiLanguage: UILanguage,
uiTheme: UITheme,
leftBarWidth: number,