v 0.0.6 (исправленны мелкие недочеты)

This commit is contained in:
DND
2026-06-05 10:50:09 +07:00
parent 4eda7446bf
commit 18ae1b62cc
13 changed files with 453 additions and 224 deletions
+35 -47
View File
@@ -8,6 +8,7 @@ import (
"os/exec"
"path/filepath"
"regexp"
"sort"
"strings"
"sync"
"time"
@@ -56,6 +57,16 @@ func (dm *DeviceManager) ScanDevices() []AudioDevice {
}
}
// Сортируем устройства для стабильного порядка
sort.Slice(devices, func(i, j int) bool {
// Сначала рабочие, потом нерабочие
if devices[i].Working != devices[j].Working {
return devices[i].Working
}
// Затем по имени
return devices[i].Name < devices[j].Name
})
dm.mu.Lock()
dm.devices = devices
dm.mu.Unlock()
@@ -66,7 +77,11 @@ func (dm *DeviceManager) ScanDevices() []AudioDevice {
func (dm *DeviceManager) GetDevices() []AudioDevice {
dm.mu.RLock()
defer dm.mu.RUnlock()
return dm.devices
// Возвращаем копию с сохранением порядка
result := make([]AudioDevice, len(dm.devices))
copy(result, dm.devices)
return result
}
func (dm *DeviceManager) TestDevice(deviceName string) (bool, string) {
@@ -81,6 +96,7 @@ func (dm *DeviceManager) GetDevicesJSON() ([]byte, error) {
func getAudioDevicesList() []AudioDevice {
devices := []AudioDevice{}
deviceMap := make(map[string]AudioDevice) // Для устранения дубликатов
// 1. Получаем устройства через arecord -L
cmd := exec.Command("arecord", "-L")
@@ -88,34 +104,44 @@ func getAudioDevicesList() []AudioDevice {
if err != nil {
log.Printf("Error getting device list from arecord -L: %v", err)
} else {
devices = append(devices, parseArecordOutput(string(output))...)
for _, dev := range parseArecordOutput(string(output)) {
deviceMap[dev.Name] = dev
}
}
// 2. Получаем устройства через /proc/asound/cards
cardDevices := getCardDevices()
for _, dev := range cardDevices {
if !deviceExists(devices, dev.Name) {
devices = append(devices, dev)
if _, exists := deviceMap[dev.Name]; !exists {
deviceMap[dev.Name] = dev
}
}
// 3. Получаем USB устройства напрямую
usbDevices := getUSBDevices()
for _, dev := range usbDevices {
if !deviceExists(devices, dev.Name) {
devices = append(devices, dev)
if _, exists := deviceMap[dev.Name]; !exists {
deviceMap[dev.Name] = dev
}
}
// 4. Получаем устройства через pactl (если установлен PulseAudio)
pulseDevices := getPulseAudioDevices()
for _, dev := range pulseDevices {
if !deviceExists(devices, dev.Name) {
devices = append(devices, dev)
if _, exists := deviceMap[dev.Name]; !exists {
deviceMap[dev.Name] = dev
}
}
devices = removeDuplicates(devices)
// Преобразуем map в slice
for _, dev := range deviceMap {
devices = append(devices, dev)
}
// Сортируем для стабильного порядка
sort.Slice(devices, func(i, j int) bool {
return devices[i].Name < devices[j].Name
})
if len(devices) == 0 {
return getDefaultDevices()
@@ -214,21 +240,6 @@ func getUSBDevices() []AudioDevice {
Channels: 2,
Working: false,
})
// Пробуем найти другие устройства на этой карте (subdevice 1, 2 и т.д.)
for subdev := 1; subdev <= 4; subdev++ {
testDevice := fmt.Sprintf("hw:%s,%d", cardNum, subdev)
if working, _ := testDeviceRecordingFast(testDevice); working {
devices = append(devices, AudioDevice{
Name: testDevice,
Description: fmt.Sprintf("USB AUDIO: %s - %s (Card %s, subdevice %d)", cardDesc, cardName, cardNum, subdev),
Card: cardNum,
Device: fmt.Sprintf("%d", subdev),
Channels: 2,
Working: false,
})
}
}
}
}
}
@@ -377,29 +388,6 @@ func getDeviceDescription(deviceName, cardNum, deviceNum string) string {
}
}
func deviceExists(devices []AudioDevice, name string) bool {
for _, dev := range devices {
if dev.Name == name {
return true
}
}
return false
}
func removeDuplicates(devices []AudioDevice) []AudioDevice {
seen := make(map[string]bool)
result := []AudioDevice{}
for _, dev := range devices {
if !seen[dev.Name] {
seen[dev.Name] = true
result = append(result, dev)
}
}
return result
}
func getDefaultDevices() []AudioDevice {
return []AudioDevice{
{Name: "default", Description: "Default audio device", Card: "default", Device: "0", Channels: 2, Working: false},