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)
|
||||
}
|
||||
|
||||
// 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,
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
|
|
@ -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
1
web.go
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue