Fix: Microphone & audio on page load, PID field parsing in audio input supervisor

This commit is contained in:
Alex P 2025-09-06 06:11:29 +00:00
parent d3e2b2dff2
commit 5a0dce9984
5 changed files with 38 additions and 2 deletions

View File

@ -103,11 +103,21 @@ func handleUnsubscribeAudioEvents(connectionID string, l *zerolog.Logger) {
audioControlService.UnsubscribeFromAudioEvents(connectionID, l)
}
// handleAudioStatus handles GET requests for audio status
func handleAudioStatus(c *gin.Context) {
initAudioControlService()
status := audioControlService.GetAudioStatus()
c.JSON(200, status)
}
// handleAudioQuality handles GET requests for audio quality presets
func handleAudioQuality(c *gin.Context) {
initAudioControlService()
presets := audioControlService.GetAudioQualityPresets()
current := audioControlService.GetCurrentAudioQuality()
c.JSON(200, gin.H{
"presets": presets,
"current": current,

View File

@ -97,6 +97,13 @@ func (s *AudioControlService) ResetMicrophone() error {
return nil
}
// GetAudioStatus returns the current audio output status
func (s *AudioControlService) GetAudioStatus() map[string]interface{} {
return map[string]interface{}{
"muted": IsAudioMuted(),
}
}
// GetMicrophoneStatus returns the current microphone status
func (s *AudioControlService) GetMicrophoneStatus() map[string]interface{} {
if s.sessionProvider == nil {

View File

@ -347,8 +347,8 @@ func (ais *AudioInputSupervisor) findExistingAudioInputProcess() (int, error) {
// Extract PID from ps output (second column)
fields := strings.Fields(line)
if len(fields) >= 2 {
if pid, err := strconv.Atoi(fields[1]); err == nil {
// Verify the process is still running and accessible
// PID is the first field
if pid, err := strconv.Atoi(fields[0]); err == nil {
if ais.isProcessRunning(pid) {
return pid, nil
}

View File

@ -63,6 +63,19 @@ export function useAudioEvents(onAudioDeviceChanged?: (data: AudioDeviceChangedD
const [audioMuted, setAudioMuted] = useState<boolean | null>(null);
const [microphoneState, setMicrophoneState] = useState<MicrophoneStateData | null>(null);
// Fetch initial audio status
const fetchInitialAudioStatus = useCallback(async () => {
try {
const response = await fetch('/audio/status');
if (response.ok) {
const data = await response.json();
setAudioMuted(data.muted);
}
} catch (error) {
devError('Failed to fetch initial audio status:', error);
}
}, []);
// Local subscription state
const [isLocallySubscribed, setIsLocallySubscribed] = useState(false);
const subscriptionTimeoutRef = useRef<number | null>(null);
@ -240,6 +253,11 @@ export function useAudioEvents(onAudioDeviceChanged?: (data: AudioDeviceChangedD
}
}, [readyState]);
// Fetch initial audio status on component mount
useEffect(() => {
fetchInitialAudioStatus();
}, [fetchInitialAudioStatus]);
// Cleanup on component unmount
useEffect(() => {
return () => {

1
web.go
View File

@ -156,6 +156,7 @@ func setupRouter() *gin.Engine {
protected.POST("/storage/upload", handleUploadHttp)
// Audio handlers
protected.GET("/audio/status", handleAudioStatus)
protected.POST("/audio/mute", handleAudioMute)
protected.GET("/audio/quality", handleAudioQuality)
protected.POST("/audio/quality", handleSetAudioQuality)