mirror of https://github.com/jetkvm/kvm.git
Fix: Microphone & audio on page load, PID field parsing in audio input supervisor
This commit is contained in:
parent
d3e2b2dff2
commit
5a0dce9984
|
@ -103,11 +103,21 @@ func handleUnsubscribeAudioEvents(connectionID string, l *zerolog.Logger) {
|
||||||
audioControlService.UnsubscribeFromAudioEvents(connectionID, l)
|
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
|
// handleAudioQuality handles GET requests for audio quality presets
|
||||||
func handleAudioQuality(c *gin.Context) {
|
func handleAudioQuality(c *gin.Context) {
|
||||||
initAudioControlService()
|
initAudioControlService()
|
||||||
|
|
||||||
presets := audioControlService.GetAudioQualityPresets()
|
presets := audioControlService.GetAudioQualityPresets()
|
||||||
current := audioControlService.GetCurrentAudioQuality()
|
current := audioControlService.GetCurrentAudioQuality()
|
||||||
|
|
||||||
c.JSON(200, gin.H{
|
c.JSON(200, gin.H{
|
||||||
"presets": presets,
|
"presets": presets,
|
||||||
"current": current,
|
"current": current,
|
||||||
|
|
|
@ -97,6 +97,13 @@ func (s *AudioControlService) ResetMicrophone() error {
|
||||||
return nil
|
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
|
// GetMicrophoneStatus returns the current microphone status
|
||||||
func (s *AudioControlService) GetMicrophoneStatus() map[string]interface{} {
|
func (s *AudioControlService) GetMicrophoneStatus() map[string]interface{} {
|
||||||
if s.sessionProvider == nil {
|
if s.sessionProvider == nil {
|
||||||
|
|
|
@ -347,8 +347,8 @@ func (ais *AudioInputSupervisor) findExistingAudioInputProcess() (int, error) {
|
||||||
// Extract PID from ps output (second column)
|
// Extract PID from ps output (second column)
|
||||||
fields := strings.Fields(line)
|
fields := strings.Fields(line)
|
||||||
if len(fields) >= 2 {
|
if len(fields) >= 2 {
|
||||||
if pid, err := strconv.Atoi(fields[1]); err == nil {
|
// PID is the first field
|
||||||
// Verify the process is still running and accessible
|
if pid, err := strconv.Atoi(fields[0]); err == nil {
|
||||||
if ais.isProcessRunning(pid) {
|
if ais.isProcessRunning(pid) {
|
||||||
return pid, nil
|
return pid, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -63,6 +63,19 @@ export function useAudioEvents(onAudioDeviceChanged?: (data: AudioDeviceChangedD
|
||||||
const [audioMuted, setAudioMuted] = useState<boolean | null>(null);
|
const [audioMuted, setAudioMuted] = useState<boolean | null>(null);
|
||||||
const [microphoneState, setMicrophoneState] = useState<MicrophoneStateData | 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
|
// Local subscription state
|
||||||
const [isLocallySubscribed, setIsLocallySubscribed] = useState(false);
|
const [isLocallySubscribed, setIsLocallySubscribed] = useState(false);
|
||||||
const subscriptionTimeoutRef = useRef<number | null>(null);
|
const subscriptionTimeoutRef = useRef<number | null>(null);
|
||||||
|
@ -240,6 +253,11 @@ export function useAudioEvents(onAudioDeviceChanged?: (data: AudioDeviceChangedD
|
||||||
}
|
}
|
||||||
}, [readyState]);
|
}, [readyState]);
|
||||||
|
|
||||||
|
// Fetch initial audio status on component mount
|
||||||
|
useEffect(() => {
|
||||||
|
fetchInitialAudioStatus();
|
||||||
|
}, [fetchInitialAudioStatus]);
|
||||||
|
|
||||||
// Cleanup on component unmount
|
// Cleanup on component unmount
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
return () => {
|
return () => {
|
||||||
|
|
1
web.go
1
web.go
|
@ -156,6 +156,7 @@ func setupRouter() *gin.Engine {
|
||||||
protected.POST("/storage/upload", handleUploadHttp)
|
protected.POST("/storage/upload", handleUploadHttp)
|
||||||
|
|
||||||
// Audio handlers
|
// Audio handlers
|
||||||
|
protected.GET("/audio/status", handleAudioStatus)
|
||||||
protected.POST("/audio/mute", handleAudioMute)
|
protected.POST("/audio/mute", handleAudioMute)
|
||||||
protected.GET("/audio/quality", handleAudioQuality)
|
protected.GET("/audio/quality", handleAudioQuality)
|
||||||
protected.POST("/audio/quality", handleSetAudioQuality)
|
protected.POST("/audio/quality", handleSetAudioQuality)
|
||||||
|
|
Loading…
Reference in New Issue