Jtt1078AudioBroadcastManager.java 2.14 KB
package com.genersoft.iot.vmp.jtt1078.websocket;

import com.genersoft.iot.vmp.jtt1078.util.AudioCodecUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.websocket.Session;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.util.Set;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.CopyOnWriteArraySet;

@Component
public class Jtt1078AudioBroadcastManager {
    private static final Logger logger = LoggerFactory.getLogger(Jtt1078AudioBroadcastManager.class);

    private static final ConcurrentHashMap<String, Set<Session>> sessionMap = new ConcurrentHashMap<>();

    public static void addSession(String sim, int channel, Session session) {
        String key = sim + "_" + channel;
        sessionMap.computeIfAbsent(key, k -> new CopyOnWriteArraySet<>()).add(session);
        logger.info("Frontend joined audio stream: {}", key);
    }

    public static void removeSession(String sim, int channel, Session session) {
        String key = sim + "_" + channel;
        Set<Session> sessions = sessionMap.get(key);
        if (sessions != null) {
            sessions.remove(session);
            if (sessions.isEmpty()) {
                sessionMap.remove(key);
            }
        }
    }

    public static void broadcastAudio(String sim, int channel, byte[] g711Data) {
        String key = sim + "_" + channel;
        Set<Session> sessions = sessionMap.get(key);

        if (sessions != null && !sessions.isEmpty()) {
            // 转码: G.711A -> PCM (浏览器友好)
            byte[] pcmData = AudioCodecUtil.g711aToPcm(g711Data);
            ByteBuffer buffer = ByteBuffer.wrap(pcmData);

            for (Session session : sessions) {
                if (session.isOpen()) {
                    try {
                        synchronized (session) {
                            session.getBasicRemote().sendBinary(buffer.duplicate());
                        }
                    } catch (IOException e) {
                        logger.error("WebSocket send error", e);
                    }
                }
            }
        }
    }
}