v 0.0.6 (исправленны мелкие недочеты)
This commit is contained in:
+35
-47
@@ -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},
|
||||
|
||||
Reference in New Issue
Block a user