Initial commit

This commit is contained in:
2025-12-25 12:01:35 +03:00
commit c574533f63
85 changed files with 6027 additions and 0 deletions
+112
View File
@@ -0,0 +1,112 @@
#!/usr/bin/env python3
import subprocess
import sys
CARD_INDEX = 2 # Можно изменить при необходимости
def _get_mixer_name(card_index, mixer_type=None):
"""
Вспомогательная функция: находит микшер указанного типа или первый из списка.
Args:
card_index: Индекс звуковой карты
mixer_type: Тип микшера ('Playback' или 'Capture'). Если None, вернет первый найденный.
"""
try:
result = subprocess.run(
['amixer', '-c', str(card_index), 'scontrols'],
capture_output=True, text=True, check=True
)
# Если указан конкретный тип микшера, ищем его
if mixer_type in ['Playback', 'Capture']:
for line in result.stdout.splitlines():
name = line.strip().replace("Simple mixer control '", "").replace("',0", "")
if name == mixer_type:
return name
print(f"Mixer type '{mixer_type}' not found for card {card_index}.", file=sys.stderr)
return None
# Если тип не указан, возвращаем первый подходящий
for line in result.stdout.splitlines():
name = line.strip().replace("Simple mixer control '", "").replace("',0", "")
if name in ['Playback', 'Capture']:
return name
print(f"No valid mixer (Playback/Capture) found for card {card_index}.", file=sys.stderr)
return None
except subprocess.CalledProcessError as e:
print(f"Error listing mixers: {e}", file=sys.stderr)
return None
def get_volume(card_index, mixer_type=None):
"""
Получить текущую громкость для устройства (card_index).
Args:
card_index: Индекс звуковой карты
mixer_type: Тип микшера ('Playback' или 'Capture'). Если None, используется первый найденный.
Возвращает: int (0-100) или None при ошибке.
"""
mixer_name = _get_mixer_name(card_index, mixer_type)
if not mixer_name:
print(f"No valid mixer found for card {card_index} with type {mixer_type}.", file=sys.stderr)
return None
try:
result = subprocess.run(
['amixer', '-c', str(card_index), '-M', 'sget', mixer_name],
capture_output=True, text=True, check=True
)
for line in result.stdout.splitlines():
if '[' in line and ']' in line and '%' in line:
percentage = line.split('[')[1].split(']')[0].strip('%')
return int(percentage)
return None
except subprocess.CalledProcessError as e:
print(f"Failed to get volume: {e}", file=sys.stderr)
return None
except ValueError:
print("Failed to parse volume percentage.", file=sys.stderr)
return None
def set_volume(card_index, volume, mixer_type=None):
"""
Установить громкость для устройства (card_index).
Args:
card_index: Индекс звуковой карты
volume: Громкость (int от 0 до 100)
mixer_type: Тип микшера ('Playback' или 'Capture'). Если None, используется первый найденный.
Возвращает: True при успехе, False при ошибке.
"""
if not (0 <= volume <= 100):
print("Volume must be between 0 and 100.", file=sys.stderr)
return False
mixer_name = _get_mixer_name(card_index, mixer_type)
if not mixer_name:
print(f"No valid mixer found for card {card_index} with type {mixer_type}.", file=sys.stderr)
return False
try:
subprocess.run(
['amixer', '-c', str(card_index), '-M', 'sset', mixer_name, f'{volume}%'],
check=True
)
print(f"Volume set to {volume}% for card {card_index}, mixer '{mixer_name}'")
return True
except subprocess.CalledProcessError as e:
print(f"Failed to set volume: {e}", file=sys.stderr)
return False
# === Пример использования (раскомментировать для теста) ===
# if __name__ == "__main__":
# print("Current volume:", get_volume(CARD_INDEX))
# set_volume(CARD_INDEX, 75)
# print("New volume:", get_volume(CARD_INDEX))