Updated. /JL
This commit is contained in:
70
pygameController/dualsense_audio.py
Normal file
70
pygameController/dualsense_audio.py
Normal file
@@ -0,0 +1,70 @@
|
||||
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})")
|
||||
|
Reference in New Issue
Block a user