Added audio commands + "server test" command
This commit is contained in:
78
src/devices.py
Normal file
78
src/devices.py
Normal file
@@ -0,0 +1,78 @@
|
||||
from subprocess import CompletedProcess
|
||||
import sounddevice as sd
|
||||
|
||||
from .core.Expando import Expando
|
||||
from .core.utils import run_ps_command, run_ps_command_live, ProcessResult
|
||||
|
||||
|
||||
def _is_audio_device_cmdlets_installed():
|
||||
# PowerShell command to check if module is available
|
||||
ps_command = "Get-Module -ListAvailable -Name AudioDeviceCmdlets"
|
||||
|
||||
result = run_ps_command(ps_command)
|
||||
|
||||
# If something is returned in stdout, the module is installed
|
||||
return bool(result.stdout.strip())
|
||||
|
||||
|
||||
def install_audio_cmdlets():
|
||||
"""Install AudioDevice cmdlet for better audio device management"""
|
||||
if _is_audio_device_cmdlets_installed():
|
||||
return CompletedProcess(
|
||||
args=["is_audio_device_cmdlets_installed()"],
|
||||
returncode=0,
|
||||
stdout="AudioDevice cmdlet is already installed",
|
||||
stderr="")
|
||||
|
||||
ps_script = r"""
|
||||
# 1) Trust PSGallery
|
||||
Set-PSRepository -Name "PSGallery" -InstallationPolicy Trusted -ErrorAction SilentlyContinue
|
||||
|
||||
# 2) Ensure NuGet provider is available
|
||||
if (-not (Get-PackageProvider -Name NuGet -ErrorAction SilentlyContinue)) {
|
||||
Install-PackageProvider -Name NuGet -Force -Scope CurrentUser
|
||||
}
|
||||
|
||||
# 3) Install AudioDeviceCmdlets if missing
|
||||
if (-not (Get-Module -ListAvailable -Name AudioDeviceCmdlets)) {
|
||||
Install-Module -Name AudioDeviceCmdlets -Scope CurrentUser -Force -AllowClobber
|
||||
}
|
||||
|
||||
# 4) Import the module
|
||||
Import-Module AudioDeviceCmdlets -ErrorAction SilentlyContinue
|
||||
"""
|
||||
return run_ps_command_live(ps_script)
|
||||
|
||||
|
||||
def get_audio_devices_windows():
|
||||
"""Get all audio devices using AudioDevice cmdlet"""
|
||||
ps_script = "Get-AudioDevice -List | ConvertTo-Json"
|
||||
return run_ps_command(ps_script)
|
||||
|
||||
|
||||
def get_audio_devices_windows_from_pnp_devices():
|
||||
ps_script = "Get-PnpDevice -Class AudioEndpoint | Select-Object FriendlyName, Status, InstanceId | ConvertTo-Json"
|
||||
return run_ps_command(ps_script)
|
||||
|
||||
|
||||
def get_audio_devices_linux():
|
||||
"""Get all audio devices using sounddevice module"""
|
||||
try:
|
||||
devices = sd.query_devices()
|
||||
result = []
|
||||
|
||||
for i, device in enumerate(devices):
|
||||
hostapi_name = sd.query_hostapis(device['hostapi'])['name']
|
||||
|
||||
result.append(Expando({
|
||||
"device_id": i,
|
||||
"name": device['name'],
|
||||
"max_input_channels": device['max_input_channels'],
|
||||
"max_output_channels": device['max_output_channels'],
|
||||
"default_samplerate": device['default_samplerate'],
|
||||
"hostapi_name": hostapi_name}
|
||||
))
|
||||
|
||||
return ProcessResult(result)
|
||||
except Exception as e:
|
||||
ProcessResult(None, f"Error querying Linux audio devices: {e}")
|
||||
Reference in New Issue
Block a user