93 lines
3.8 KiB
Python
93 lines
3.8 KiB
Python
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) |