71 lines
2.2 KiB
Python
71 lines
2.2 KiB
Python
import os
|
|
import time
|
|
import numpy as np
|
|
import sounddevice as sd
|
|
import alsaaudio
|
|
import pulsectl
|
|
|
|
class DualSenseAudio:
|
|
def __init__(self):
|
|
self.alsa_devices = self._get_alsa_devices()
|
|
self.pulse_devices = self._get_pulseaudio_devices()
|
|
self.dualsense_device = self._detect_dualsense()
|
|
|
|
def _get_alsa_devices(self):
|
|
try:
|
|
cards = alsaaudio.cards()
|
|
return cards
|
|
except Exception as e:
|
|
print("ALSA detection failed:", e)
|
|
return []
|
|
|
|
def _get_pulseaudio_devices(self):
|
|
try:
|
|
pulse = pulsectl.Pulse("dualsense-audio")
|
|
sinks = pulse.sink_list()
|
|
return sinks
|
|
except Exception as e:
|
|
print("PulseAudio detection failed:", e)
|
|
return []
|
|
|
|
def _detect_dualsense(self):
|
|
# Check ALSA names
|
|
for card in self.alsa_devices:
|
|
if "DualSense" in card:
|
|
return {'type': 'alsa', 'name': card}
|
|
|
|
# Check PulseAudio sinks
|
|
for sink in self.pulse_devices:
|
|
if "dualsense" in sink.description.lower():
|
|
return {'type': 'pulse', 'name': sink.name}
|
|
|
|
return None
|
|
|
|
def play_tone(self, frequency=440.0, duration=2.0, volume=0.5):
|
|
if not self.dualsense_device:
|
|
print("DualSense speaker not found.")
|
|
return
|
|
|
|
print(f"Playing tone on DualSense ({self.dualsense_device['type']})...")
|
|
|
|
fs = 48000 # Sample rate
|
|
t = np.linspace(0, duration, int(fs * duration), False)
|
|
tone = np.sin(frequency * 2 * np.pi * t) * volume
|
|
audio = tone.astype(np.float32)
|
|
|
|
if self.dualsense_device['type'] == 'pulse':
|
|
sd.play(audio, samplerate=fs, device=self.dualsense_device['name'])
|
|
elif self.dualsense_device['type'] == 'alsa':
|
|
device_index = self.alsa_devices.index(self.dualsense_device['name'])
|
|
sd.play(audio, samplerate=fs, device=device_index)
|
|
sd.wait()
|
|
|
|
def list_devices(self):
|
|
print("ALSA Devices:")
|
|
for card in self.alsa_devices:
|
|
print(f" - {card}")
|
|
print("\nPulseAudio Devices:")
|
|
for sink in self.pulse_devices:
|
|
print(f" - {sink.name} ({sink.description})")
|
|
|