2025-09-29 09:19:40 +08:00
|
|
|
|
import subprocess
|
|
|
|
|
|
import re
|
|
|
|
|
|
import sys
|
|
|
|
|
|
|
|
|
|
|
|
# 原代码4. 音频控制项自动检测与音量控制完整逻辑
|
|
|
|
|
|
def detect_audio_control():
|
|
|
|
|
|
"""自动检测可用的音频播放控制项"""
|
|
|
|
|
|
try:
|
|
|
|
|
|
result = subprocess.run(["amixer", "controls"], capture_output=True, text=True)
|
|
|
|
|
|
playback_controls = []
|
|
|
|
|
|
|
|
|
|
|
|
# 优先查找常见的音频控制项
|
|
|
|
|
|
priority_names = ["Master", "Speaker", "Headphone", "Audio", "Sound"]
|
|
|
|
|
|
|
|
|
|
|
|
for name in priority_names:
|
|
|
|
|
|
if name in result.stdout:
|
|
|
|
|
|
print(f"✅ 自动检测到音频控制项:{name}")
|
|
|
|
|
|
return name
|
|
|
|
|
|
|
|
|
|
|
|
# 如果没有找到优先项,从所有控制项中提取
|
|
|
|
|
|
for line in result.stdout.splitlines():
|
|
|
|
|
|
if "Playback" in line:
|
|
|
|
|
|
match = re.search(r"'([^']+)'", line)
|
|
|
|
|
|
if match:
|
|
|
|
|
|
playback_controls.append(match.group(1))
|
|
|
|
|
|
|
|
|
|
|
|
if playback_controls:
|
|
|
|
|
|
print(f"✅ 找到音频控制项:{playback_controls[0]}")
|
|
|
|
|
|
return playback_controls[0]
|
|
|
|
|
|
else:
|
|
|
|
|
|
print("⚠️ 未检测到音频控制项,将尝试不指定控制项调节音量")
|
|
|
|
|
|
return None
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ 音频控制检测失败:{str(e)}")
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
class VolumeController:
|
|
|
|
|
|
def __init__(self, audio_control_name, current_volume, volume_step, min_volume, max_volume):
|
|
|
|
|
|
# 接收调度脚本传入的全局参数,保持原逻辑
|
|
|
|
|
|
self.available = True
|
|
|
|
|
|
self.AUDIO_CONTROL_NAME = audio_control_name
|
|
|
|
|
|
self.CURRENT_VOLUME = current_volume
|
|
|
|
|
|
self.VOLUME_STEP = volume_step
|
|
|
|
|
|
self.MIN_VOLUME = min_volume
|
|
|
|
|
|
self.MAX_VOLUME = max_volume
|
|
|
|
|
|
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 强制取消静音并设置初始音量
|
|
|
|
|
|
self.set_system_volume(self.CURRENT_VOLUME)
|
|
|
|
|
|
current_volume = self.get_system_volume()
|
|
|
|
|
|
if current_volume is not None:
|
|
|
|
|
|
self.CURRENT_VOLUME = current_volume
|
|
|
|
|
|
print(f"🔊 音量控制初始化成功(当前音量:{self.CURRENT_VOLUME}%)")
|
|
|
|
|
|
else:
|
|
|
|
|
|
print(f"⚠️ 无法获取当前音量,但已尝试设置为{self.CURRENT_VOLUME}%")
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
self.available = False
|
|
|
|
|
|
print(f"❌ 音量控制失败:{str(e)}")
|
|
|
|
|
|
|
|
|
|
|
|
def get_system_volume(self):
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 根据检测到的控制项获取音量
|
|
|
|
|
|
cmd = ["amixer", "get"]
|
|
|
|
|
|
if self.AUDIO_CONTROL_NAME:
|
|
|
|
|
|
cmd.append(self.AUDIO_CONTROL_NAME)
|
|
|
|
|
|
|
|
|
|
|
|
result = subprocess.run(cmd, capture_output=True, text=True)
|
|
|
|
|
|
volume_match = re.search(r"(\d+)%", result.stdout)
|
|
|
|
|
|
return int(volume_match.group(1)) if volume_match else None
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ 获取音量失败:{str(e)}")
|
|
|
|
|
|
return None
|
|
|
|
|
|
|
|
|
|
|
|
def set_system_volume(self, target_volume: int):
|
|
|
|
|
|
target_volume = max(self.MIN_VOLUME, min(self.MAX_VOLUME, target_volume))
|
|
|
|
|
|
try:
|
|
|
|
|
|
# 根据检测到的控制项设置音量
|
|
|
|
|
|
cmd = ["amixer", "set"]
|
|
|
|
|
|
if self.AUDIO_CONTROL_NAME:
|
|
|
|
|
|
cmd.append(self.AUDIO_CONTROL_NAME)
|
|
|
|
|
|
cmd.extend([f"{target_volume}%", "unmute"]) # 强制取消静音
|
|
|
|
|
|
|
|
|
|
|
|
subprocess.run(cmd, capture_output=True)
|
|
|
|
|
|
self.CURRENT_VOLUME = target_volume
|
|
|
|
|
|
print(f"🔊 音量已调整至:{self.CURRENT_VOLUME}%")
|
|
|
|
|
|
return True
|
|
|
|
|
|
except Exception as e:
|
|
|
|
|
|
print(f"❌ 调整音量失败:{str(e)}")
|
|
|
|
|
|
return False
|
|
|
|
|
|
|
|
|
|
|
|
def adjust_volume(self, is_increase: bool):
|
|
|
|
|
|
target_volume = self.CURRENT_VOLUME + self.VOLUME_STEP if is_increase else self.CURRENT_VOLUME - self.VOLUME_STEP
|
|
|
|
|
|
return self.set_system_volume(target_volume)
|