diff --git a/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/WebRtcSignalingController.java b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/WebRtcSignalingController.java new file mode 100644 index 0000000..3cc8ea9 --- /dev/null +++ b/cmvr-iot-admin/src/main/java/com/cmvr/web/controller/api/WebRtcSignalingController.java @@ -0,0 +1,123 @@ +package com.cmvr.web.controller.api; + +import com.cmvr.edge.client.service.AudioService; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.RequiredArgsConstructor; +import org.jetbrains.annotations.NotNull; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.socket.BinaryMessage; +import org.springframework.web.socket.CloseStatus; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; +import org.springframework.web.socket.config.annotation.WebSocketConfigurer; +import org.springframework.web.socket.config.annotation.WebSocketHandlerRegistry; +import org.springframework.web.socket.handler.AbstractWebSocketHandler; + +/** + * WebRTC 信令 WebSocket 入口。 + * + * 路径:/ws/signaling + * + * 约束: + * 1. WebSocket 只传 JSON 信令:join、offer、answer、candidate、heartbeat、stop; + * 2. WebSocket 禁止传输 PCM 音频; + * 3. PCM 音频由 WebRTC 媒体通道进入 Java 后端,再由 AudioService 转 gRPC 双向流。 + */ +@Configuration +@RequiredArgsConstructor +public class WebRtcSignalingController implements WebSocketConfigurer { + + private final AudioService audioService; + + @Override + public void registerWebSocketHandlers(WebSocketHandlerRegistry registry) { + registry.addHandler(new SignalingWebSocketHandler(audioService), "/ws/signaling") + .setAllowedOrigins("*"); + registry.addHandler(new SignalingWebSocketHandler(audioService), "/ws/audio") + .setAllowedOrigins("*"); + } + + /** + * 信令处理器。这里只处理文本 JSON,不处理二进制音频。 + */ + private static class SignalingWebSocketHandler extends AbstractWebSocketHandler { + + private static final Logger log = LoggerFactory.getLogger(SignalingWebSocketHandler.class); + + private final AudioService audioService; + private final ObjectMapper objectMapper = new ObjectMapper(); + + private SignalingWebSocketHandler(AudioService audioService) { + this.audioService = audioService; + } + + @Override + public void afterConnectionEstablished(@NotNull WebSocketSession session) { + log.info("WebRTC信令连接建立,wsSessionId={}", session.getId()); + sendConnected(session); + } + + @Override + protected void handleTextMessage(@NotNull WebSocketSession session, @NotNull TextMessage message) { + try { + audioService.handleSignalingMessage(session, message.getPayload()); + } catch (Exception e) { + log.error("处理WebRTC信令异常,wsSessionId={}", session.getId(), e); + sendError(session, "处理WebRTC信令异常:" + e.getMessage()); + } + } + + @Override + protected void handleBinaryMessage(@NotNull WebSocketSession session, @NotNull BinaryMessage message) { + try { + audioService.handleBrowserAudioMessage(session, message.getPayload()); + } catch (Exception e) { + log.error("处理WebSocket音频二进制帧失败,wsSessionId={}", session.getId(), e); + sendError(session, "audio binary frame failed: " + e.getMessage()); + } + } + + @Override + public void handleTransportError(@NotNull WebSocketSession session, @NotNull Throwable exception) { + log.error("WebRTC信令连接传输异常,wsSessionId={}", session.getId(), exception); + audioService.handleWebSocketClosed(session); + } + + @Override + public void afterConnectionClosed(@NotNull WebSocketSession session, @NotNull CloseStatus status) { + log.info("WebRTC信令连接关闭,wsSessionId={},status={}", session.getId(), status); + audioService.handleWebSocketClosed(session); + } + + private void sendConnected(WebSocketSession session) { + ObjectNode node = objectMapper.createObjectNode(); + node.put("type", "connected"); + node.put("timestamp", System.currentTimeMillis()); + sendJson(session, node); + } + + private void sendError(WebSocketSession session, String message) { + ObjectNode node = objectMapper.createObjectNode(); + node.put("type", "error"); + node.put("message", message); + node.put("timestamp", System.currentTimeMillis()); + sendJson(session, node); + } + + private void sendJson(WebSocketSession session, ObjectNode node) { + if (session == null || !session.isOpen()) { + return; + } + try { + synchronized (session) { + session.sendMessage(new TextMessage(objectMapper.writeValueAsString(node))); + } + } catch (Exception e) { + log.error("发送WebRTC信令响应失败,wsSessionId={}", session.getId(), e); + } + } + } +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/pom.xml b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/pom.xml index 5aec454..0ef6f9f 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/pom.xml +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/pom.xml @@ -55,6 +55,12 @@ 1.5.9 + + dev.onvoid.webrtc + webrtc-java + 0.14.0 + + - \ No newline at end of file + diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/adapter/RobotAudioGrpcAdapter.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/adapter/RobotAudioGrpcAdapter.java new file mode 100644 index 0000000..c746192 --- /dev/null +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/adapter/RobotAudioGrpcAdapter.java @@ -0,0 +1,743 @@ +package com.cmvr.edge.client.adapter; + +import cmvr.api.RobotAudio; +import cmvr.api.RobotAudioServiceGrpc; +import com.google.protobuf.ByteString; +import com.cmvr.edge.client.manage.GrpcServiceManager; +import com.cmvr.edge.client.utils.EdgeCommonUtil; +import io.grpc.Status; +import io.grpc.stub.StreamObserver; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicLong; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.atomic.AtomicInteger; + +/** + * 机器人实时语音 gRPC 适配层。 + * + * 约束: + * 1. Java 后端只作为 gRPC client; + * 2. 机器人终端作为 gRPC server; + * 3. Stub 必须复用项目现有 GrpcServiceManager,禁止在这里创建 ManagedChannel。 + */ +@Component +@RequiredArgsConstructor +public class RobotAudioGrpcAdapter { + + private static final Logger log = LoggerFactory.getLogger(RobotAudioGrpcAdapter.class); + + /** 浏览器与机器人之间约定的音频格式:PCM-48K-16bit-单声道。 */ + public static final int SAMPLE_RATE = 48000; + public static final int CHANNELS = 1; + public static final int BITS_PER_SAMPLE = 16; + // WebRTC 与主流 PCM 设备默认使用 signed 16-bit little-endian,终端如需大端序应在设备边界自行转换。 + public static final String ENCODING = "PCM_S16LE"; + private static final int FRAME_MS = 10; + private static final int FRAME_SAMPLES = SAMPLE_RATE * FRAME_MS / 1000; + private static final int FRAME_BYTES = FRAME_SAMPLES * CHANNELS * (BITS_PER_SAMPLE / 8); + private static final int TARGET_QUEUED_BROWSER_FRAMES = 2; + private static final int MAX_QUEUED_BROWSER_FRAMES = 10; + private static final long AUDIO_STATS_LOG_INTERVAL_MS = 5000L; + private static final int DEBUG_DUMP_SECONDS = 10; + private static final int DEBUG_DUMP_BYTES = SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8) * DEBUG_DUMP_SECONDS; + + private final GrpcServiceManager grpcServiceManager; + private final ConcurrentHashMap lastGrpcInboundFormatLogAt = new ConcurrentHashMap<>(); + private final WavDumpRecorder robotInboundDumpRecorder = + new WavDumpRecorder("robot-to-backend", DEBUG_DUMP_BYTES); + + /** + * 打开机器人音频双向流。 + */ + public RobotAudioStream openStream(String terminalId, + String deviceId, + String sessionId, + String operatorId, + RobotAudioStreamListener listener) { + RobotAudioServiceGrpc.RobotAudioServiceStub stub = + grpcServiceManager.getGrpcClient(terminalId, RobotAudioServiceGrpc.RobotAudioServiceStub.class); + + StreamObserver responseObserver = new StreamObserver() { + @Override + public void onNext(RobotAudio.RobotAudioResponse response) { + try { + handleRobotResponse(sessionId, response, listener); + } catch (Exception e) { + log.error("处理机器人音频响应失败,sessionId={}", sessionId, e); + listener.onError(sessionId, e); + } + } + + @Override + public void onError(Throwable t) { + log.error("机器人音频gRPC流异常,sessionId={}", sessionId, t); + listener.onError(sessionId, t); + } + + @Override + public void onCompleted() { + log.info("机器人音频gRPC流结束,sessionId={}", sessionId); + listener.onCompleted(sessionId); + } + }; + + StreamObserver requestObserver = stub.audioTalk(responseObserver); + RobotAudioStream stream = new RobotAudioStream(terminalId, deviceId, sessionId, requestObserver); + stream.sendStart(operatorId); + return stream; + } + + private void handleRobotResponse(String sessionId, + RobotAudio.RobotAudioResponse response, + RobotAudioStreamListener listener) { + if (response.hasHeader() + && !response.getHeader().getSuccess() + && response.getHeader().getErrorMessage() != null + && !response.getHeader().getErrorMessage().trim().isEmpty()) { + String errorMessage = response.getHeader().getErrorMessage(); + log.warn("机器人音频响应失败,sessionId={},error={}", sessionId, errorMessage); + listener.onError(sessionId, new RuntimeException(errorMessage)); + return; + } + + switch (response.getPayloadCase()) { + case START_ACK: + listener.onStarted(sessionId, response.getStartAck().getAccepted(), response.getStartAck().getMessage()); + break; + case AUDIO_FRAME: + RobotAudio.RobotAudioFrame frame = response.getAudioFrame(); + byte[] pcm = frame.getPcm().toByteArray(); + robotInboundDumpRecorder.record(pcm); + logGrpcInboundFormatIfNeeded(sessionId, frame); + listener.onRobotAudio(sessionId, frame.getSequence(), frame.getTimestampMs(), pcm); + break; + case HEARTBEAT: + listener.onHeartbeat(sessionId, response.getHeartbeat().getTimestampMs()); + break; + case STOP: + listener.onRobotStop(sessionId, response.getStop().getReason()); + break; + case ERROR: + RobotAudio.RobotAudioError error = response.getError(); + listener.onError(sessionId, new RuntimeException(error.getCode() + ":" + error.getMessage())); + break; + case PAYLOAD_NOT_SET: + default: + log.debug("机器人音频响应为空payload,sessionId={}", sessionId); + break; + } + } + + private void logGrpcInboundFormatIfNeeded(String sessionId, RobotAudio.RobotAudioFrame frame) { + long now = System.currentTimeMillis(); + Long last = lastGrpcInboundFormatLogAt.get(sessionId); + if (last != null && now - last < AUDIO_STATS_LOG_INTERVAL_MS) { + return; + } + lastGrpcInboundFormatLogAt.put(sessionId, now); + int bytes = frame.getPcm().size(); + int frameSamples = bytes / (CHANNELS * (BITS_PER_SAMPLE / 8)); + int frameMs = frameSamples * 1000 / SAMPLE_RATE; + log.info("gRPC机器人上行音频格式,sessionId={},sampleRate={},channels={},bitsPerSample={},encoding={},frameSamples={},frameMs={},bytes={},sequence={},timestampMs={}", + sessionId, + SAMPLE_RATE, + CHANNELS, + BITS_PER_SAMPLE, + ENCODING, + frameSamples, + frameMs, + bytes, + frame.getSequence(), + frame.getTimestampMs()); + logPcmStats("grpc-inbound-robot", sessionId, frame.getPcm().toByteArray(), frame.getSequence(), frame.getTimestampMs()); + } + + private void logPcmStats(String direction, String sessionId, byte[] pcm, long sequence, long timestampMs) { + PcmStats stats = PcmStats.fromPcm16Le(pcm); + log.info("PCM-STATS direction={} sessionId={} sequence={} timestampMs={} bytes={} samples={} rms={} peak={} zeroCrossRate={} firstSamples={}", + direction, + sessionId, + sequence, + timestampMs, + pcm == null ? 0 : pcm.length, + stats.samples, + stats.rms, + stats.peak, + stats.zeroCrossRate, + stats.firstSamples); + } + + /** + * 单个会话对应的一条 gRPC 双向流。 + */ + public class RobotAudioStream { + private final String terminalId; + private final String deviceId; + private final String sessionId; + private final StreamObserver requestObserver; + private final AtomicLong sequence = new AtomicLong(0); + private final AtomicBoolean closed = new AtomicBoolean(false); + private final Object sendLock = new Object(); + private final ConcurrentLinkedQueue browserAudioQueue = new ConcurrentLinkedQueue<>(); + private final AtomicInteger queuedBrowserFrames = new AtomicInteger(0); + private final Object browserAudioBufferLock = new Object(); + private byte[] browserAudioRemainder = new byte[FRAME_BYTES]; + private int browserAudioRemainderLength; + private final ScheduledExecutorService browserAudioSender; + private final ScheduledFuture browserAudioSenderFuture; + private volatile long browserAudioFramesEnqueued; + private volatile long browserAudioFramesSent; + private volatile long browserAudioFramesDropped; + private volatile long browserAudioSilentFramesSent; + private volatile boolean browserAudioStarted; + private volatile long lastAudioStatsLogAt; + private volatile long lastGrpcOutboundFormatLogAt; + + private RobotAudioStream(String terminalId, + String deviceId, + String sessionId, + StreamObserver requestObserver) { + this.terminalId = terminalId; + this.deviceId = deviceId; + this.sessionId = sessionId; + this.requestObserver = requestObserver; + this.browserAudioSender = Executors.newSingleThreadScheduledExecutor(runnable -> { + Thread thread = new Thread(runnable, "robot-audio-send-" + sessionId); + thread.setDaemon(true); + return thread; + }); + this.browserAudioSenderFuture = browserAudioSender.scheduleAtFixedRate( + this::sendQueuedBrowserAudio, + FRAME_MS, + FRAME_MS, + TimeUnit.MILLISECONDS); + } + + /** + * 通知机器人开启对讲。 + */ + public void sendStart(String operatorId) { + RobotAudio.RobotAudioFormat format = RobotAudio.RobotAudioFormat.newBuilder() + .setSampleRate(SAMPLE_RATE) + .setChannels(CHANNELS) + .setBitsPerSample(BITS_PER_SAMPLE) + .setEncoding(ENCODING) + .build(); + + RobotAudio.RobotAudioStart start = RobotAudio.RobotAudioStart.newBuilder() + .setSessionId(sessionId) + .setOperatorId(operatorId == null ? "" : operatorId) + .setFormat(format) + .build(); + + log.info("gRPC下发终端音频协商格式,sessionId={},terminalId={},deviceId={},sampleRate={},channels={},bitsPerSample={},encoding={},frameMs={},frameSamples={},frameBytes={}", + sessionId, + terminalId, + deviceId, + SAMPLE_RATE, + CHANNELS, + BITS_PER_SAMPLE, + ENCODING, + FRAME_MS, + FRAME_SAMPLES, + FRAME_BYTES); + + send(RobotAudio.RobotAudioRequest.newBuilder() + .setHeader(EdgeCommonUtil.buildRequest(deviceId)) + .setStart(start) + .build()); + } + + /** + * 将浏览器侧 WebRTC 媒体通道产出的 PCM 帧发送给机器人。 + */ + public void sendAudio(byte[] pcm) { + if (pcm == null || pcm.length == 0) { + return; + } + if (closed.get()) { + return; + } + enqueueBrowserAudio(pcm); + } + + private void enqueueBrowserAudio(byte[] pcm) { + if (closed.get()) { + return; + } + synchronized (browserAudioBufferLock) { + int offset = 0; + if (browserAudioRemainderLength > 0) { + int need = FRAME_BYTES - browserAudioRemainderLength; + int copy = Math.min(need, pcm.length); + System.arraycopy(pcm, 0, browserAudioRemainder, browserAudioRemainderLength, copy); + browserAudioRemainderLength += copy; + offset += copy; + if (browserAudioRemainderLength == FRAME_BYTES) { + offerBrowserAudioFrame(browserAudioRemainder); + browserAudioRemainder = new byte[FRAME_BYTES]; + browserAudioRemainderLength = 0; + } + } + + while (offset + FRAME_BYTES <= pcm.length) { + byte[] frame = new byte[FRAME_BYTES]; + System.arraycopy(pcm, offset, frame, 0, FRAME_BYTES); + offerBrowserAudioFrame(frame); + offset += FRAME_BYTES; + } + + int remain = pcm.length - offset; + if (remain > 0) { + System.arraycopy(pcm, offset, browserAudioRemainder, 0, remain); + browserAudioRemainderLength = remain; + } + } + } + + private void offerBrowserAudioFrame(byte[] frame) { + if (queuedBrowserFrames.get() >= MAX_QUEUED_BROWSER_FRAMES) { + if (browserAudioQueue.poll() != null) { + queuedBrowserFrames.decrementAndGet(); + browserAudioFramesDropped++; + } + } + browserAudioQueue.offer(frame.clone()); + queuedBrowserFrames.incrementAndGet(); + browserAudioFramesEnqueued++; + browserAudioStarted = true; + logBrowserAudioStatsIfNeeded("browserAudioEnqueue"); + } + + private void sendQueuedBrowserAudio() { + if (closed.get()) { + return; + } + trimBrowserAudioQueue(); + byte[] pcm = browserAudioQueue.poll(); + if (pcm == null) { + if (!browserAudioStarted) { + return; + } + pcm = new byte[FRAME_BYTES]; + browserAudioSilentFramesSent++; + } else { + queuedBrowserFrames.decrementAndGet(); + } + + RobotAudio.RobotAudioFrame frame = RobotAudio.RobotAudioFrame.newBuilder() + .setSessionId(sessionId) + .setSequence(sequence.incrementAndGet()) + .setTimestampMs(System.currentTimeMillis()) + .setPcm(ByteString.copyFrom(pcm)) + .build(); + logGrpcOutboundFormatIfNeeded(frame); + + sendDirect(RobotAudio.RobotAudioRequest.newBuilder() + .setHeader(EdgeCommonUtil.buildRequest(deviceId)) + .setAudioFrame(frame) + .build()); + browserAudioFramesSent++; + logBrowserAudioStatsIfNeeded("browserAudioGrpcSend"); + } + + private void trimBrowserAudioQueue() { + while (queuedBrowserFrames.get() > TARGET_QUEUED_BROWSER_FRAMES) { + byte[] dropped = browserAudioQueue.poll(); + if (dropped == null) { + queuedBrowserFrames.set(0); + break; + } + queuedBrowserFrames.decrementAndGet(); + browserAudioFramesDropped++; + } + } + + private void logBrowserAudioStatsIfNeeded(String source) { + long now = System.currentTimeMillis(); + if (now - lastAudioStatsLogAt < AUDIO_STATS_LOG_INTERVAL_MS) { + return; + } + lastAudioStatsLogAt = now; + log.info("gRPC浏览器音频统计,source={},sessionId={},enqueued={},sent={},dropped={},queued={}", + source, + sessionId, + browserAudioFramesEnqueued, + browserAudioFramesSent, + browserAudioFramesDropped, + queuedBrowserFrames.get()); + log.info("GRPC-BROWSER-AUDIO-STATS source={} sessionId={} enqueued={} sent={} dropped={} silentSent={} queued={}", + source, + sessionId, + browserAudioFramesEnqueued, + browserAudioFramesSent, + browserAudioFramesDropped, + browserAudioSilentFramesSent, + queuedBrowserFrames.get()); + } + + private void logGrpcOutboundFormatIfNeeded(RobotAudio.RobotAudioFrame frame) { + long now = System.currentTimeMillis(); + if (now - lastGrpcOutboundFormatLogAt < AUDIO_STATS_LOG_INTERVAL_MS) { + return; + } + lastGrpcOutboundFormatLogAt = now; + int bytes = frame.getPcm().size(); + int frameSamples = bytes / (CHANNELS * (BITS_PER_SAMPLE / 8)); + int frameMs = frameSamples * 1000 / SAMPLE_RATE; + log.info("gRPC浏览器下行音频格式,sessionId={},sampleRate={},channels={},bitsPerSample={},encoding={},frameSamples={},frameMs={},bytes={},sequence={},timestampMs={}", + sessionId, + SAMPLE_RATE, + CHANNELS, + BITS_PER_SAMPLE, + ENCODING, + frameSamples, + frameMs, + bytes, + frame.getSequence(), + frame.getTimestampMs()); + logPcmStats("grpc-outbound-browser", sessionId, frame.getPcm().toByteArray(), frame.getSequence(), frame.getTimestampMs()); + } + + + /** + * Java 侧保活心跳。机器人仍需按协议每秒上报心跳。 + */ + public void sendHeartbeat() { + RobotAudio.RobotAudioHeartbeat heartbeat = RobotAudio.RobotAudioHeartbeat.newBuilder() + .setSessionId(sessionId) + .setTimestampMs(System.currentTimeMillis()) + .build(); + + send(RobotAudio.RobotAudioRequest.newBuilder() + .setHeader(EdgeCommonUtil.buildRequest(deviceId)) + .setHeartbeat(heartbeat) + .build()); + } + + /** + * 正常结束对讲。 + */ + public void sendStop(String reason) { + if (!closed.compareAndSet(false, true)) { + return; + } + RobotAudio.RobotAudioStop stop = RobotAudio.RobotAudioStop.newBuilder() + .setSessionId(sessionId) + .setReason(reason == null ? "" : reason) + .build(); + RobotAudio.RobotAudioRequest request = RobotAudio.RobotAudioRequest.newBuilder() + .setHeader(EdgeCommonUtil.buildRequest(deviceId)) + .setStop(stop) + .build(); + executeOnGrpcSendThread(() -> { + sendDirect(request); + completeDirect(); + shutdownBrowserAudioSender(); + }); + } + + /** + * 异常关闭流。 + */ + public void cancel(String reason) { + if (closed.compareAndSet(false, true)) { + executeOnGrpcSendThread(() -> { + synchronized (sendLock) { + requestObserver.onError(Status.CANCELLED.withDescription(reason).asRuntimeException()); + } + shutdownBrowserAudioSender(); + }); + } + } + + private void complete() { + if (closed.compareAndSet(false, true)) { + executeOnGrpcSendThread(() -> { + completeDirect(); + shutdownBrowserAudioSender(); + }); + } + } + + private void completeDirect() { + synchronized (sendLock) { + requestObserver.onCompleted(); + } + } + + private void shutdownBrowserAudioSender() { + if (browserAudioSenderFuture != null) { + browserAudioSenderFuture.cancel(false); + } + browserAudioQueue.clear(); + queuedBrowserFrames.set(0); + browserAudioSender.shutdown(); + } + + private void send(RobotAudio.RobotAudioRequest request) { + if (closed.get()) { + log.warn("机器人音频流已关闭,忽略发送,sessionId={}", sessionId); + return; + } + executeOnGrpcSendThread(() -> { + if (closed.get()) { + return; + } + sendDirect(request); + }); + } + + private void executeOnGrpcSendThread(Runnable runnable) { + try { + browserAudioSender.execute(runnable); + } catch (Exception e) { + log.warn("机器人音频gRPC发送线程不可用,sessionId={}", sessionId, e); + } + } + + private void sendDirect(RobotAudio.RobotAudioRequest request) { + synchronized (sendLock) { + requestObserver.onNext(request); + } + } + + public String getTerminalId() { + return terminalId; + } + + public String getDeviceId() { + return deviceId; + } + + public String getSessionId() { + return sessionId; + } + } + + /** + * gRPC 流事件监听器,由业务层实现会话状态更新和音频转发。 + */ + public interface RobotAudioStreamListener { + void onStarted(String sessionId, boolean accepted, String message); + + void onRobotAudio(String sessionId, long sequence, long timestampMs, byte[] pcm); + + void onHeartbeat(String sessionId, long timestampMs); + + void onRobotStop(String sessionId, String reason); + + void onError(String sessionId, Throwable throwable); + + void onCompleted(String sessionId); + } + + private static class WavDumpRecorder { + private final String name; + private final int maxBytes; + private final ByteArrayOutputStream buffer; + private Path filePath; + private int writtenBytes; + private boolean completed; + + private WavDumpRecorder(String name, int maxBytes) { + this.name = name; + this.maxBytes = maxBytes; + this.buffer = new ByteArrayOutputStream(maxBytes); + } + + private synchronized void record(byte[] pcm) { + if (completed || pcm == null || pcm.length == 0) { + return; + } + try { + if (filePath == null) { + Path dir = Paths.get("logs", "audio-dump"); + Files.createDirectories(dir); + filePath = dir.resolve(name + "-" + System.currentTimeMillis() + ".wav"); + log.info("开始保存10秒WAV音频,name={},file={},sampleRate={},channels={},bitsPerSample={}", + name, filePath.toAbsolutePath(), SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); + } + int remain = maxBytes - writtenBytes; + int writeBytes = Math.min(remain, pcm.length); + buffer.write(pcm, 0, writeBytes); + writtenBytes += writeBytes; + if (writtenBytes >= maxBytes) { + writeWavFile(filePath, buffer.toByteArray(), SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); + completed = true; + log.info("WAV音频保存完成,name={},file={},pcmBytes={}", + name, filePath == null ? "" : filePath.toAbsolutePath(), writtenBytes); + } + } catch (IOException e) { + completed = true; + log.warn("保存WAV音频失败,name={},file={}", name, filePath, e); + } + } + + private void writeWavFile(Path path, byte[] pcm, int sampleRate, int channels, int bitsPerSample) throws IOException { + try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)) { + writeAscii(out, "RIFF"); + writeIntLe(out, 36 + pcm.length); + writeAscii(out, "WAVE"); + writeAscii(out, "fmt "); + writeIntLe(out, 16); + writeShortLe(out, 1); + writeShortLe(out, channels); + writeIntLe(out, sampleRate); + writeIntLe(out, sampleRate * channels * bitsPerSample / 8); + writeShortLe(out, channels * bitsPerSample / 8); + writeShortLe(out, bitsPerSample); + writeAscii(out, "data"); + writeIntLe(out, pcm.length); + out.write(pcm); + } + } + + private void writeAscii(OutputStream out, String value) throws IOException { + out.write(value.getBytes(java.nio.charset.StandardCharsets.US_ASCII)); + } + + private void writeIntLe(OutputStream out, int value) throws IOException { + out.write(value & 0xFF); + out.write((value >> 8) & 0xFF); + out.write((value >> 16) & 0xFF); + out.write((value >> 24) & 0xFF); + } + + private void writeShortLe(OutputStream out, int value) throws IOException { + out.write(value & 0xFF); + out.write((value >> 8) & 0xFF); + } + } + + private static class PcmDumpRecorder { + private final String name; + private final int maxBytes; + private OutputStream outputStream; + private Path filePath; + private int writtenBytes; + private boolean completed; + + private PcmDumpRecorder(String name, int maxBytes) { + this.name = name; + this.maxBytes = maxBytes; + } + + private synchronized void record(byte[] pcm) { + if (completed || pcm == null || pcm.length == 0) { + return; + } + try { + if (outputStream == null) { + Path dir = Paths.get("logs", "audio-dump"); + Files.createDirectories(dir); + filePath = dir.resolve(name + "-" + System.currentTimeMillis() + ".pcm"); + outputStream = Files.newOutputStream(filePath, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE); + log.info("开始保存10秒PCM音频,name={},file={},sampleRate={},channels={},bitsPerSample={}", + name, filePath.toAbsolutePath(), SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); + } + int remain = maxBytes - writtenBytes; + int writeBytes = Math.min(remain, pcm.length); + outputStream.write(pcm, 0, writeBytes); + writtenBytes += writeBytes; + if (writtenBytes >= maxBytes) { + close(); + completed = true; + log.info("PCM音频保存完成,name={},file={},bytes={}", + name, filePath == null ? "" : filePath.toAbsolutePath(), writtenBytes); + } + } catch (IOException e) { + completed = true; + closeQuietly(); + log.warn("保存PCM音频失败,name={},file={}", name, filePath, e); + } + } + + private void close() throws IOException { + if (outputStream != null) { + outputStream.flush(); + outputStream.close(); + outputStream = null; + } + } + + private void closeQuietly() { + try { + close(); + } catch (IOException ignored) { + } + } + } + + private static class PcmStats { + private final int samples; + private final int rms; + private final int peak; + private final String zeroCrossRate; + private final String firstSamples; + + private PcmStats(int samples, int rms, int peak, String zeroCrossRate, String firstSamples) { + this.samples = samples; + this.rms = rms; + this.peak = peak; + this.zeroCrossRate = zeroCrossRate; + this.firstSamples = firstSamples; + } + + private static PcmStats fromPcm16Le(byte[] pcm) { + if (pcm == null || pcm.length < 2) { + return new PcmStats(0, 0, 0, "0.0000", "[]"); + } + + int samples = pcm.length / 2; + long squareSum = 0L; + int peak = 0; + int zeroCross = 0; + int previous = 0; + StringBuilder first = new StringBuilder("["); + int firstCount = Math.min(8, samples); + + for (int i = 0; i < samples; i++) { + int low = pcm[i * 2] & 0xFF; + int high = pcm[i * 2 + 1]; + short sample = (short) ((high << 8) | low); + int value = sample; + int abs = Math.abs(value); + peak = Math.max(peak, abs); + squareSum += (long) value * value; + if (i > 0 && ((previous < 0 && value >= 0) || (previous >= 0 && value < 0))) { + zeroCross++; + } + previous = value; + if (i < firstCount) { + if (i > 0) { + first.append(','); + } + first.append(value); + } + } + first.append(']'); + + int rms = (int) Math.round(Math.sqrt(squareSum / (double) samples)); + String zeroCrossRate = String.format(java.util.Locale.ROOT, "%.4f", zeroCross / (double) Math.max(1, samples - 1)); + return new PcmStats(samples, rms, peak, zeroCrossRate, first.toString()); + } + } +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/manage/GrpcServiceManager.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/manage/GrpcServiceManager.java index 1111749..0cf5977 100644 --- a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/manage/GrpcServiceManager.java +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/manage/GrpcServiceManager.java @@ -59,6 +59,8 @@ public class GrpcServiceManager { clientFactories.put(HlcServiceGrpc.HlcServiceBlockingStub.class, new GrpcClientFactory<>(HlcServiceGrpc::newBlockingStub)); // 注册agv服务的stub clientFactories.put(AgvServiceGrpc.AgvServiceBlockingStub.class, new GrpcClientFactory<>(AgvServiceGrpc::newBlockingStub)); + // 注册机器人实时语音双向流服务的异步Stub + clientFactories.put(RobotAudioServiceGrpc.RobotAudioServiceStub.class, new GrpcClientFactory<>(RobotAudioServiceGrpc::newStub)); } diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/AudioService.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/AudioService.java new file mode 100644 index 0000000..cd0cf81 --- /dev/null +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/service/AudioService.java @@ -0,0 +1,591 @@ +package com.cmvr.edge.client.service; + +import com.cmvr.common.utils.uuid.IdUtils; +import com.cmvr.edge.client.adapter.RobotAudioGrpcAdapter; +import com.cmvr.edge.client.adapter.RobotAudioGrpcAdapter.RobotAudioStream; +import com.cmvr.edge.client.adapter.RobotAudioGrpcAdapter.RobotAudioStreamListener; +import com.fasterxml.jackson.databind.JsonNode; +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import lombok.RequiredArgsConstructor; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import org.springframework.web.socket.BinaryMessage; +import org.springframework.web.socket.TextMessage; +import org.springframework.web.socket.WebSocketSession; + +import java.io.IOException; +import java.nio.ByteBuffer; +import java.util.Iterator; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; +import java.util.function.Consumer; + +/** + * 实时语音对讲业务层。 + * + * 分工: + * 1. WebSocket 只处理 WebRTC 信令 JSON,不承载音频; + * 2. 浏览器 WebRTC 媒体通道产出的 PCM 通过 sendBrowserAudio 方法进入业务层; + * 3. 业务层通过 RobotAudioGrpcAdapter 将 PCM 转发到机器人 gRPC 双向流; + * 4. 机器人音频通过 gRPC 回调给业务层,再交给已接入的 WebRTC 媒体发送侧。 + */ +@Service +@RequiredArgsConstructor +public class AudioService implements RobotAudioStreamListener { + + private static final Logger log = LoggerFactory.getLogger(AudioService.class); + + /** 机器人心跳超时时间:机器人每 1 秒上报一次,超过 5 秒判定离线。 */ + private static final long ROBOT_HEARTBEAT_TIMEOUT_MS = 5000L; + + private final RobotAudioGrpcAdapter robotAudioGrpcAdapter; + + private final ObjectMapper objectMapper = new ObjectMapper(); + + /** sessionId -> 会话上下文。 */ + private final ConcurrentHashMap sessionMap = new ConcurrentHashMap<>(); + private final ConcurrentHashMap webSocketSessionMap = new ConcurrentHashMap<>(); + + /** + * 处理 /ws/signaling 收到的 JSON 信令。 + */ + public void handleSignalingMessage(WebSocketSession webSocketSession, String payload) { + try { + JsonNode jsonNode = objectMapper.readTree(payload); + String type = getText(jsonNode, "type"); + if (type == null) { + sendError(webSocketSession, null, "信令缺少type字段"); + return; + } + + switch (type) { + case "join": + case "start": + handleJoin(webSocketSession, jsonNode); + break; + case "offer": + case "answer": + case "candidate": + sendError(webSocketSession, getText(jsonNode, "sessionId"), "WebRTC disabled, use WebSocket binary audio"); + break; + case "leave": + case "stop": + stopSession(getText(jsonNode, "sessionId"), "browser stop"); + break; + case "heartbeat": + handleBrowserHeartbeat(webSocketSession, jsonNode); + break; + default: + sendError(webSocketSession, getText(jsonNode, "sessionId"), "未知信令类型:" + type); + break; + } + } catch (Exception e) { + log.error("处理WebRTC信令失败,payload={}", payload, e); + sendError(webSocketSession, null, "处理信令失败:" + e.getMessage()); + } + } + + /** + * 浏览器 WebSocket 断开时关闭对应会话。 + */ + public void handleWebSocketClosed(WebSocketSession webSocketSession) { + if (webSocketSession == null) { + return; + } + String wsId = webSocketSession.getId(); + webSocketSessionMap.remove(wsId); + for (AudioSession session : sessionMap.values()) { + if (session.webSocketSession != null && wsId.equals(session.webSocketSession.getId())) { + stopSession(session.sessionId, "websocket closed"); + } + } + } + + /** + * 浏览器通过 WebSocket BinaryMessage 发送 PCM_S16LE / 48k / mono 音频。 + * 推荐前端按 10ms 一帧发送:480 samples,960 bytes。 + */ + public void handleBrowserAudioMessage(WebSocketSession webSocketSession, ByteBuffer payload) { + if (webSocketSession == null || payload == null) { + return; + } + String sessionId = webSocketSessionMap.get(webSocketSession.getId()); + if (sessionId == null) { + sessionId = findSessionIdByWebSocket(webSocketSession); + } + if (sessionId == null) { + log.warn("收到浏览器音频但未找到会话,wsSessionId={},bytes={}", webSocketSession.getId(), payload.remaining()); + return; + } + byte[] pcm = new byte[payload.remaining()]; + payload.get(pcm); + sendBrowserAudio(sessionId, pcm); + } + + /** + * WebRTC 媒体层调用此方法,把浏览器侧 PCM-48K-16bit-单声道音频帧发给机器人。 + * + * 注意:WebSocket 禁止传音频,音频必须来自 WebRTC 媒体通道。 + */ + public void sendBrowserAudio(String sessionId, byte[] pcm) { + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + log.warn("浏览器音频帧找不到会话,sessionId={}", sessionId); + return; + } + try { + session.lastBrowserAudioAt = System.currentTimeMillis(); + session.robotStream.sendAudio(pcm); + } catch (Exception e) { + log.error("发送浏览器音频到机器人失败,sessionId={}", sessionId, e); + failSession(session, "发送浏览器音频失败:" + e.getMessage(), true); + } + } + + /** + * WebRTC 媒体发送层可注册该回调,接收机器人 gRPC 上传的 PCM 音频。 + */ + public void registerRobotAudioConsumer(String sessionId, Consumer robotAudioConsumer) { + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + throw new IllegalArgumentException("会话不存在:" + sessionId); + } + session.robotAudioConsumer = robotAudioConsumer; + } + + public void unregisterRobotAudioConsumer(String sessionId) { + AudioSession session = sessionMap.get(sessionId); + if (session != null) { + session.robotAudioConsumer = null; + } + } + + private void handleJoin(WebSocketSession webSocketSession, JsonNode jsonNode) { + String terminalId = getText(jsonNode, "terminalId"); + String deviceId = getText(jsonNode, "deviceId"); + String operatorId = getText(jsonNode, "operatorId"); + String sessionId = getText(jsonNode, "sessionId"); + + if (terminalId == null || deviceId == null) { + sendError(webSocketSession, sessionId, "terminalId和deviceId不能为空"); + return; + } + if (sessionId == null) { + sessionId = IdUtils.fastSimpleUUID(); + } + + try { + AudioSession exists = sessionMap.get(sessionId); + if (exists != null) { + exists.webSocketSession = webSocketSession; + exists.lastBrowserSignalAt = System.currentTimeMillis(); + webSocketSessionMap.put(webSocketSession.getId(), sessionId); + sendState(exists, "joined"); + return; + } + + AudioSession session = new AudioSession(); + session.sessionId = sessionId; + session.terminalId = terminalId; + session.deviceId = deviceId; + session.operatorId = operatorId; + session.webSocketSession = webSocketSession; + session.state = AudioSessionState.CONNECTING; + session.createdAt = System.currentTimeMillis(); + session.lastBrowserSignalAt = session.createdAt; + session.lastRobotHeartbeatAt = session.createdAt; + + sessionMap.put(sessionId, session); + webSocketSessionMap.put(webSocketSession.getId(), sessionId); + try { + session.robotStream = robotAudioGrpcAdapter.openStream(terminalId, deviceId, sessionId, operatorId, this); + } catch (Exception e) { + sessionMap.remove(sessionId); + webSocketSessionMap.remove(webSocketSession.getId()); + throw e; + } + sendState(session, "joined"); + log.info("实时语音会话创建成功,sessionId={},terminalId={},deviceId={}", sessionId, terminalId, deviceId); + } catch (Exception e) { + log.error("创建实时语音会话失败,sessionId={}", sessionId, e); + sendError(webSocketSession, sessionId, "创建实时语音会话失败:" + e.getMessage()); + } + } + + private void handleWebRtcSignal(WebSocketSession webSocketSession, JsonNode jsonNode, String type) { + String sessionId = getText(jsonNode, "sessionId"); + + // 如果sessionId为空,尝试从WebSocket会话关联的session中查找 + if (sessionId == null) { + for (AudioSession session : sessionMap.values()) { + if (session.webSocketSession != null && + session.webSocketSession.getId().equals(webSocketSession.getId())) { + sessionId = session.sessionId; + log.warn("WebRTC信令缺少sessionId,自动关联到会话: {}", sessionId); + break; + } + } + } + + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + sendError(webSocketSession, sessionId, "会话不存在,请先发送join信令"); + return; + } + + session.webSocketSession = webSocketSession; + session.lastBrowserSignalAt = System.currentTimeMillis(); + + try { + if ("offer".equals(type)) { + String sdp = getSdp(jsonNode); + if (sdp == null) { + sendError(webSocketSession, sessionId, "offer信令缺少sdp字段"); + return; + } + sendError(webSocketSession, sessionId, "WebRTC disabled, use WebSocket binary audio"); + } else if ("candidate".equals(type)) { + IceCandidateValue candidate = getIceCandidate(jsonNode); + if (candidate == null || candidate.candidate == null) { + sendError(webSocketSession, sessionId, "candidate信令格式错误"); + return; + } + sendError(webSocketSession, sessionId, "WebRTC disabled, use WebSocket binary audio"); + } else { + ObjectNode ack = baseMessage("signalAck", sessionId); + ack.put("signalType", type); + ack.put("state", session.state.name()); + sendJson(webSocketSession, ack); + } + } catch (Exception e) { + log.error("处理WebRTC媒体信令失败,sessionId={},type={}", sessionId, type, e); + sendError(webSocketSession, sessionId, "处理WebRTC媒体信令失败:" + e.getMessage()); + } + } + + private void handleBrowserHeartbeat(WebSocketSession webSocketSession, JsonNode jsonNode) { + String sessionId = getText(jsonNode, "sessionId"); + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + sendError(webSocketSession, sessionId, "会话不存在"); + return; + } + session.lastBrowserSignalAt = System.currentTimeMillis(); + if (session.robotStream != null) { + session.robotStream.sendHeartbeat(); + } + + ObjectNode pong = baseMessage("heartbeatAck", sessionId); + pong.put("state", session.state.name()); + sendJson(webSocketSession, pong); + } + + public void stopSession(String sessionId, String reason) { + if (sessionId == null) { + return; + } + AudioSession session = sessionMap.remove(sessionId); + if (session == null) { + return; + } + try { + session.state = AudioSessionState.CLOSED; + removeWebSocketMapping(session); + if (session.robotStream != null) { + session.robotStream.sendStop(reason); + } + sendState(session, "closed"); + log.info("实时语音会话已关闭,sessionId={},reason={}", sessionId, reason); + } catch (Exception e) { + log.error("关闭实时语音会话异常,sessionId={}", sessionId, e); + } + } + + /** + * 定时检测机器人心跳。 + */ + @Scheduled(fixedDelay = 1000L) + public void checkRobotHeartbeatTimeout() { + long now = System.currentTimeMillis(); + Iterator> iterator = sessionMap.entrySet().iterator(); + while (iterator.hasNext()) { + Map.Entry entry = iterator.next(); + AudioSession session = entry.getValue(); + if (session.state == AudioSessionState.CLOSED || session.state == AudioSessionState.FAILED) { + continue; + } + if (now - session.lastRobotHeartbeatAt > ROBOT_HEARTBEAT_TIMEOUT_MS) { + log.warn("机器人心跳超时,sessionId={},terminalId={},deviceId={}", + session.sessionId, session.terminalId, session.deviceId); + // 先从业务会话表摘除,避免 cancel/close 触发的异步回调再次进入同一个会话并重复关闭 native 对象。 + iterator.remove(); + session.state = AudioSessionState.ROBOT_OFFLINE; + sendState(session, "robotOffline"); + if (session.robotStream != null) { + session.robotStream.cancel("robot heartbeat timeout"); + } + removeWebSocketMapping(session); + } + } + } + + @Override + public void onStarted(String sessionId, boolean accepted, String message) { + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + return; + } + session.lastRobotHeartbeatAt = System.currentTimeMillis(); + session.state = accepted ? AudioSessionState.RUNNING : AudioSessionState.FAILED; + ObjectNode event = baseMessage("robotStartAck", sessionId); + event.put("accepted", accepted); + event.put("message", message == null ? "" : message); + event.put("state", session.state.name()); + sendJson(session.webSocketSession, event); + if (!accepted) { + failSession(session, message == null ? "机器人拒绝开启语音对讲" : message, true); + } + } + + @Override + public void onRobotAudio(String sessionId, long sequence, long timestampMs, byte[] pcm) { + AudioSession session = sessionMap.get(sessionId); + if (session == null) { +// log.warn("机器人音频帧找不到会话,sessionId={}", sessionId); + return; + } + session.lastRobotAudioAt = System.currentTimeMillis(); + session.lastRobotHeartbeatAt = session.lastRobotAudioAt; + sendBinary(session.webSocketSession, pcm); + Consumer consumer = session.robotAudioConsumer; + if (consumer != null) { + try { + consumer.accept(pcm); + } catch (Exception e) { + log.error("投递机器人音频到WebRTC媒体层失败,sessionId={},sequence={}", sessionId, sequence, e); + } + } else { + log.debug("未注册机器人音频消费者,丢弃PCM帧,sessionId={},sequence={},bytes={}", + sessionId, sequence, pcm == null ? 0 : pcm.length); + } + } + + @Override + public void onHeartbeat(String sessionId, long timestampMs) { + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + return; + } + session.lastRobotHeartbeatAt = System.currentTimeMillis(); + if (session.state == AudioSessionState.CONNECTING) { + session.state = AudioSessionState.RUNNING; + sendState(session, "running"); + } + } + + @Override + public void onRobotStop(String sessionId, String reason) { + AudioSession session = sessionMap.get(sessionId); + if (session != null) { + sendState(session, "robotStop"); + } + stopSession(sessionId, reason == null ? "robot stop" : reason); + } + + @Override + public void onError(String sessionId, Throwable throwable) { + AudioSession session = sessionMap.get(sessionId); + if (session == null) { + return; + } + failSession(session, throwable == null ? "机器人音频流异常" : throwable.getMessage(), false); + } + + @Override + public void onCompleted(String sessionId) { + AudioSession session = sessionMap.get(sessionId); + if (session != null) { + session.state = AudioSessionState.CLOSED; + sendState(session, "grpcCompleted"); + } + sessionMap.remove(sessionId); + removeWebSocketMapping(session); + } + + private void failSession(AudioSession session, String reason, boolean cancelRobotStream) { + sessionMap.remove(session.sessionId, session); + session.state = AudioSessionState.FAILED; + ObjectNode event = baseMessage("error", session.sessionId); + event.put("message", reason == null ? "未知错误" : reason); + event.put("state", session.state.name()); + sendJson(session.webSocketSession, event); + if (cancelRobotStream && session.robotStream != null) { + try { + session.robotStream.cancel(reason == null ? "audio session failed" : reason); + } catch (Exception e) { + log.debug("取消机器人音频流异常,sessionId={}", session.sessionId, e); + } + } + removeWebSocketMapping(session); + } + + private void sendState(AudioSession session, String type) { + ObjectNode event = baseMessage(type, session.sessionId); + event.put("terminalId", session.terminalId); + event.put("deviceId", session.deviceId); + event.put("state", session.state.name()); + event.put("createdAt", session.createdAt); + event.put("lastRobotHeartbeatAt", session.lastRobotHeartbeatAt); + sendJson(session.webSocketSession, event); + } + + private void sendError(WebSocketSession session, String sessionId, String message) { + ObjectNode event = baseMessage("error", sessionId); + event.put("message", message == null ? "未知错误" : message); + sendJson(session, event); + } + + private ObjectNode baseMessage(String type, String sessionId) { + ObjectNode event = objectMapper.createObjectNode(); + event.put("type", type); + if (sessionId != null) { + event.put("sessionId", sessionId); + } + event.put("timestamp", System.currentTimeMillis()); + return event; + } + + private void sendJson(WebSocketSession session, ObjectNode event) { + sendText(session, toJson(event)); + } + + private void sendBinary(WebSocketSession session, byte[] pcm) { + if (session == null || !session.isOpen() || pcm == null || pcm.length == 0) { + return; + } + try { + synchronized (session) { + session.sendMessage(new BinaryMessage(pcm)); + } + } catch (IOException e) { + log.error("发送WebSocket二进制音频失败,wsSessionId={}", session.getId(), e); + } + } + + private void sendText(WebSocketSession session, String text) { + if (session == null || !session.isOpen()) { + return; + } + try { + synchronized (session) { + session.sendMessage(new TextMessage(text)); + } + } catch (IOException e) { + log.error("发送WebSocket信令失败", e); + } + } + + private String toJson(ObjectNode event) { + try { + return objectMapper.writeValueAsString(event); + } catch (Exception e) { + throw new RuntimeException("序列化WebSocket信令失败", e); + } + } + + private String findSessionIdByWebSocket(WebSocketSession webSocketSession) { + if (webSocketSession == null) { + return null; + } + String wsId = webSocketSession.getId(); + for (AudioSession session : sessionMap.values()) { + if (session.webSocketSession != null && wsId.equals(session.webSocketSession.getId())) { + webSocketSessionMap.put(wsId, session.sessionId); + return session.sessionId; + } + } + return null; + } + + private void removeWebSocketMapping(AudioSession session) { + if (session != null && session.webSocketSession != null) { + webSocketSessionMap.remove(session.webSocketSession.getId(), session.sessionId); + } + } + + private String getText(JsonNode node, String fieldName) { + JsonNode value = node == null ? null : node.get(fieldName); + if (value == null || value.isNull()) { + return null; + } + String text = value.asText(); + return text == null || text.trim().isEmpty() ? null : text.trim(); + } + + private String getSdp(JsonNode jsonNode) { + String direct = getText(jsonNode, "sdp"); + if (direct != null) { + return direct; + } + JsonNode description = jsonNode == null ? null : jsonNode.get("description"); + return getText(description, "sdp"); + } + + private IceCandidateValue getIceCandidate(JsonNode jsonNode) { + JsonNode candidateNode = jsonNode == null ? null : jsonNode.get("candidate"); + if (candidateNode == null || candidateNode.isTextual()) { + IceCandidateValue value = new IceCandidateValue(); + value.candidate = candidateNode == null ? getText(jsonNode, "candidate") : candidateNode.asText(); + value.sdpMid = getText(jsonNode, "sdpMid"); + value.sdpMLineIndex = getInt(jsonNode, "sdpMLineIndex", 0); + return value; + } + + IceCandidateValue value = new IceCandidateValue(); + value.candidate = getText(candidateNode, "candidate"); + value.sdpMid = getText(candidateNode, "sdpMid"); + value.sdpMLineIndex = getInt(candidateNode, "sdpMLineIndex", 0); + return value; + } + + private int getInt(JsonNode node, String fieldName, int defaultValue) { + JsonNode value = node == null ? null : node.get(fieldName); + return value == null || !value.isNumber() ? defaultValue : value.asInt(defaultValue); + } + + private enum AudioSessionState { + CONNECTING, + RUNNING, + ROBOT_OFFLINE, + CLOSED, + FAILED + } + + /** + * 单个实时对讲会话上下文。 + */ + private static class AudioSession { + private String sessionId; + private String terminalId; + private String deviceId; + private String operatorId; + private volatile WebSocketSession webSocketSession; + private volatile RobotAudioStream robotStream; + private volatile Consumer robotAudioConsumer; + private volatile AudioSessionState state; + private volatile long createdAt; + private volatile long lastBrowserSignalAt; + private volatile long lastBrowserAudioAt; + private volatile long lastRobotAudioAt; + private volatile long lastRobotHeartbeatAt; + } + + private static class IceCandidateValue { + private String candidate; + private String sdpMid; + private int sdpMLineIndex; + } +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/webrtc/WebRtcAudioBridge.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/webrtc/WebRtcAudioBridge.java new file mode 100644 index 0000000..535664a --- /dev/null +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-client/src/main/java/com/cmvr/edge/client/webrtc/WebRtcAudioBridge.java @@ -0,0 +1,1114 @@ +package com.cmvr.edge.client.webrtc; + +import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.node.ObjectNode; +import dev.onvoid.webrtc.CreateSessionDescriptionObserver; +import dev.onvoid.webrtc.PeerConnectionFactory; +import dev.onvoid.webrtc.PeerConnectionObserver; +import dev.onvoid.webrtc.RTCAnswerOptions; +import dev.onvoid.webrtc.RTCConfiguration; +import dev.onvoid.webrtc.RTCDataChannel; +import dev.onvoid.webrtc.RTCIceCandidate; +import dev.onvoid.webrtc.RTCIceConnectionState; +import dev.onvoid.webrtc.RTCIceGatheringState; +import dev.onvoid.webrtc.RTCPeerConnection; +import dev.onvoid.webrtc.RTCPeerConnectionIceErrorEvent; +import dev.onvoid.webrtc.RTCPeerConnectionState; +import dev.onvoid.webrtc.RTCRtpReceiver; +import dev.onvoid.webrtc.RTCRtpSender; +import dev.onvoid.webrtc.RTCRtpTransceiver; +import dev.onvoid.webrtc.RTCSessionDescription; +import dev.onvoid.webrtc.RTCSignalingState; +import dev.onvoid.webrtc.RTCSdpType; +import dev.onvoid.webrtc.SetSessionDescriptionObserver; +import dev.onvoid.webrtc.media.MediaStream; +import dev.onvoid.webrtc.media.MediaStreamTrack; +import dev.onvoid.webrtc.media.SyncClock; +import dev.onvoid.webrtc.media.audio.AudioDeviceModuleBase; +import dev.onvoid.webrtc.media.audio.AudioTrack; +import dev.onvoid.webrtc.media.audio.AudioTrackSink; +import dev.onvoid.webrtc.media.audio.CustomAudioSource; +import dev.onvoid.webrtc.media.audio.HeadlessAudioDeviceModule; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import javax.annotation.PreDestroy; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.OutputStream; +import java.nio.ByteBuffer; +import java.nio.ByteOrder; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.nio.file.StandardOpenOption; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.concurrent.CompletableFuture; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentLinkedQueue; +import java.util.concurrent.ExecutionException; +import java.util.concurrent.Executors; +import java.util.concurrent.RejectedExecutionException; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.ScheduledFuture; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.atomic.AtomicBoolean; +import java.util.concurrent.atomic.AtomicInteger; +import java.util.function.Consumer; + +/** + * 浏览器 WebRTC 与后端 PCM 的桥接层。 + * + * 下行:浏览器 WebRTC 48k PCM -> Java 转 short16/单声道 -> gRPC。 + * 上行:机器人 48k/short16 PCM -> WebRTC。 + */ +public class WebRtcAudioBridge { + + private static final Logger log = LoggerFactory.getLogger(WebRtcAudioBridge.class); + + private static final int WEBRTC_SAMPLE_RATE = 48000; + private static final int ROBOT_SAMPLE_RATE = 48000; + private static final int CHANNELS = 1; + private static final int BITS_PER_SAMPLE = 16; + private static final int ROBOT_FRAME_MS = 10; + private static final int ROBOT_FRAME_SAMPLES = ROBOT_SAMPLE_RATE * ROBOT_FRAME_MS / 1000; + private static final int ROBOT_FRAME_BYTES = ROBOT_FRAME_SAMPLES * CHANNELS * (BITS_PER_SAMPLE / 8); + private static final int WEBRTC_FRAME_SAMPLES = WEBRTC_SAMPLE_RATE * ROBOT_FRAME_MS / 1000; + private static final int TARGET_QUEUED_ROBOT_FRAMES = 3; + private static final int MAX_QUEUED_ROBOT_FRAMES = 10; + private static final long AUDIO_STATS_LOG_INTERVAL_MS = 5000L; + private static final int DEBUG_DUMP_SECONDS = 10; + private static final int DEBUG_DUMP_BYTES = WEBRTC_SAMPLE_RATE * CHANNELS * (BITS_PER_SAMPLE / 8) * DEBUG_DUMP_SECONDS; + + private final ObjectMapper objectMapper = new ObjectMapper(); + private final WavDumpRecorder webRtcOutputDumpRecorder = + new WavDumpRecorder("webrtc-to-browser", DEBUG_DUMP_BYTES); + private final Map sessionMap = new ConcurrentHashMap<>(); + private final ScheduledExecutorService webrtcExecutor = Executors.newSingleThreadScheduledExecutor(runnable -> { + Thread thread = new Thread(runnable, "webrtc-audio-native"); + thread.setDaemon(true); + return thread; + }); + + public void createSession(String sessionId, + Consumer browserAudioConsumer, + Consumer signalingSender) { + if (sessionMap.containsKey(sessionId)) { + return; + } + + executeNativeAndWait("create WebRTC session", () -> { + if (sessionMap.containsKey(sessionId)) { + return; + } + + WebRtcSession session = new WebRtcSession(); + session.sessionId = sessionId; + session.browserAudioConsumer = browserAudioConsumer; + session.signalingSender = signalingSender; + session.audioDeviceModule = new HeadlessAudioDeviceModule(); + session.peerConnectionFactory = new PeerConnectionFactory(session.audioDeviceModule); + session.robotAudioSyncClock = new SyncClock(); + session.robotAudioTrackSource = new CustomAudioSource(session.robotAudioSyncClock); + + AudioTrack robotAudioTrack = session.peerConnectionFactory.createAudioTrack( + "robot-audio-" + sessionId, session.robotAudioTrackSource); + session.robotAudioTrack = robotAudioTrack; + session.peerConnection = session.peerConnectionFactory.createPeerConnection( + new RTCConfiguration(), new BridgePeerObserver(session)); + session.robotAudioSender = session.peerConnection.addTrack( + robotAudioTrack, Collections.singletonList("robot-audio-stream-" + sessionId)); + + sessionMap.put(sessionId, session); + log.info("WebRTC音频桥接会话已创建,sessionId={}", sessionId); + }); + } + + public void handleOffer(String sessionId, String sdp) { + WebRtcSession session = requireSession(sessionId); + RTCSessionDescription offer = new RTCSessionDescription(RTCSdpType.OFFER, fixSdpFormat(sdp)); + executeNativeAsync("handle WebRTC offer", () -> handleOfferOnNativeThread(session, offer)); + } + + public void addIceCandidate(String sessionId, String sdpMid, int sdpMLineIndex, String candidate) { + WebRtcSession session = requireSession(sessionId); + executeNativeAsync("add WebRTC ICE candidate", () -> { + if (session.closed.get() || session.peerConnection == null) { + return; + } + try { + session.peerConnection.addIceCandidate(new RTCIceCandidate(sdpMid, sdpMLineIndex, candidate)); + } catch (Exception e) { + log.error("添加浏览器ICE失败,sessionId={}", sessionId, e); + sendError(session, "添加浏览器ICE失败:" + e.getMessage()); + } + }); + } + + public void pushRobotAudio(String sessionId, long timestampMs, byte[] pcm48kMono) { + WebRtcSession session = sessionMap.get(sessionId); + if (session == null || session.closed.get() || pcm48kMono == null || pcm48kMono.length == 0) { + return; + } + enqueueRobotAudio(session, timestampMs, pcm48kMono); + } + + public void closeSession(String sessionId) { + WebRtcSession session = sessionMap.remove(sessionId); + if (session == null || !session.closed.compareAndSet(false, true)) { + return; + } + executeNativeAndWait("close WebRTC session", () -> closeSessionOnNativeThread(session)); + } + + private void handleOfferOnNativeThread(WebRtcSession session, RTCSessionDescription offer) { + if (session.closed.get() || session.peerConnection == null) { + return; + } + + try { + session.peerConnection.setRemoteDescription(offer, new SetSessionDescriptionObserver() { + @Override + public void onSuccess() { + executeNativeAsync("create WebRTC answer", () -> createAnswerOnNativeThread(session)); + } + + @Override + public void onFailure(String error) { + log.error("设置WebRTC remote description失败,sessionId={},error={}", session.sessionId, error); + sendError(session, "设置WebRTC remote description失败:" + error); + } + }); + } catch (Exception e) { + log.error("处理WebRTC offer失败,sessionId={}", session.sessionId, e); + sendError(session, "处理WebRTC offer失败:" + e.getMessage()); + } + } + + private void createAnswerOnNativeThread(WebRtcSession session) { + if (session.closed.get() || session.peerConnection == null) { + return; + } + + try { + session.peerConnection.createAnswer(new RTCAnswerOptions(), new CreateSessionDescriptionObserver() { + @Override + public void onSuccess(RTCSessionDescription answer) { + executeNativeAsync("set WebRTC local description", () -> setLocalAnswerOnNativeThread(session, answer)); + } + + @Override + public void onFailure(String error) { + log.error("生成WebRTC answer失败,sessionId={},error={}", session.sessionId, error); + sendError(session, "生成WebRTC answer失败:" + error); + } + }); + } catch (Exception e) { + log.error("生成WebRTC answer异常,sessionId={}", session.sessionId, e); + sendError(session, "生成WebRTC answer异常:" + e.getMessage()); + } + } + + private void setLocalAnswerOnNativeThread(WebRtcSession session, RTCSessionDescription answer) { + if (session.closed.get() || session.peerConnection == null) { + return; + } + + try { + session.peerConnection.setLocalDescription(answer, new SetSessionDescriptionObserver() { + @Override + public void onSuccess() { + clearQueuedRobotAudio(session, "mediaReady"); + session.mediaReady.set(true); + startRobotAudioPusherOnNativeThread(session); + Consumer signalingSender = session.signalingSender; + if (session.closed.get() || signalingSender == null) { + return; + } + ObjectNode node = baseMessage("answer", session.sessionId); + node.put("sdp", answer.sdp); + signalingSender.accept(toJson(node)); + log.info("WebRTC媒体发送侧已就绪,sessionId={}", session.sessionId); + } + + @Override + public void onFailure(String error) { + log.error("设置WebRTC local description失败,sessionId={},error={}", session.sessionId, error); + sendError(session, "设置WebRTC local description失败:" + error); + } + }); + } catch (Exception e) { + log.error("设置WebRTC local description异常,sessionId={}", session.sessionId, e); + sendError(session, "设置WebRTC local description异常:" + e.getMessage()); + } + } + + private void enqueueRobotAudio(WebRtcSession session, long timestampMs, byte[] pcm48kMono) { + synchronized (session.robotAudioBufferLock) { + int offset = 0; + long frameTimestampMs = timestampMs <= 0 ? System.currentTimeMillis() : timestampMs; + + if (session.robotAudioRemainderLength > 0) { + int need = ROBOT_FRAME_BYTES - session.robotAudioRemainderLength; + int copy = Math.min(need, pcm48kMono.length); + System.arraycopy(pcm48kMono, 0, session.robotAudioRemainder, session.robotAudioRemainderLength, copy); + session.robotAudioRemainderLength += copy; + offset += copy; + if (session.robotAudioRemainderLength == ROBOT_FRAME_BYTES) { + offerRobotAudioFrame(session, session.robotAudioRemainder, session.robotAudioRemainderTimestampMs); + session.robotAudioRemainder = new byte[ROBOT_FRAME_BYTES]; + session.robotAudioRemainderLength = 0; + } + } + + while (offset + ROBOT_FRAME_BYTES <= pcm48kMono.length) { + byte[] frame = new byte[ROBOT_FRAME_BYTES]; + System.arraycopy(pcm48kMono, offset, frame, 0, ROBOT_FRAME_BYTES); + offerRobotAudioFrame(session, frame, frameTimestampMs); + offset += ROBOT_FRAME_BYTES; + frameTimestampMs += ROBOT_FRAME_MS; + } + + int remain = pcm48kMono.length - offset; + if (remain > 0) { + if (session.robotAudioRemainderLength == 0) { + session.robotAudioRemainderTimestampMs = frameTimestampMs; + } + System.arraycopy(pcm48kMono, offset, session.robotAudioRemainder, session.robotAudioRemainderLength, remain); + session.robotAudioRemainderLength += remain; + } + } + } + + private void offerRobotAudioFrame(WebRtcSession session, byte[] frame, long timestampMs) { + if (session.queuedRobotAudioFrames.get() >= MAX_QUEUED_ROBOT_FRAMES) { + if (session.robotAudioQueue.poll() != null) { + session.queuedRobotAudioFrames.decrementAndGet(); + session.robotAudioFramesDropped++; + } + } + session.robotAudioQueue.offer(new RobotAudioFrameData(frame.clone(), timestampMs)); + int queued = session.queuedRobotAudioFrames.incrementAndGet(); + session.robotAudioFramesEnqueued++; + logAudioStatsIfNeeded(session, "robotAudioEnqueue", queued); + } + + private void clearQueuedRobotAudio(WebRtcSession session, String reason) { + synchronized (session.robotAudioBufferLock) { + int queued = session.queuedRobotAudioFrames.get(); + int remainder = session.robotAudioRemainderLength; + session.robotAudioQueue.clear(); + session.queuedRobotAudioFrames.set(0); + session.robotAudioRemainder = new byte[ROBOT_FRAME_BYTES]; + session.robotAudioRemainderLength = 0; + session.robotAudioRemainderTimestampMs = 0L; + if (queued > 0 || remainder > 0) { + log.info("清理WebRTC就绪前机器人音频缓存,sessionId={},reason={},droppedFrames={},remainderBytes={}", + session.sessionId, reason, queued, remainder); + } + } + } + + private void pushQueuedRobotAudioOnNativeThread(WebRtcSession session) { + if (session.closed.get() || !session.mediaReady.get() || session.robotAudioTrackSource == null) { + return; + } + + trimRobotAudioQueue(session); + RobotAudioFrameData frame = pollRobotAudioFrame(session); + byte[] pcm48k; + long sourceTimestampMs = 0L; + if (frame == null) { + pcm48k = new byte[WEBRTC_FRAME_SAMPLES * CHANNELS * (BITS_PER_SAMPLE / 8)]; + session.robotAudioPushSilentFrames++; + } else { + short[] robotSamples = pcmBytesToShorts(frame.pcm, WEBRTC_FRAME_SAMPLES); + pcm48k = shortsToPcmBytes(robotSamples, WEBRTC_FRAME_SAMPLES); + sourceTimestampMs = frame.timestampMs; + session.lastRobotTimestampMs = sourceTimestampMs; + } + + try { + webRtcOutputDumpRecorder.record(pcm48k); + // 当前 webrtc-java API 不能设置外部 RTP timestamp,只能按 48k 采样数和推送节奏由 native 生成。 + session.robotAudioTrackSource.pushAudio( + pcm48k, + BITS_PER_SAMPLE, + WEBRTC_SAMPLE_RATE, + CHANNELS, + WEBRTC_FRAME_SAMPLES); + session.robotAudioPushCalls++; + logWebRtcPushPcmStatsIfNeeded(session, pcm48k, sourceTimestampMs); + logAudioStatsIfNeeded(session, "robotAudioPush", session.queuedRobotAudioFrames.get()); + } catch (Exception e) { + log.error("推送机器人音频到WebRTC失败,sessionId={}", session.sessionId, e); + } + } + + private void startRobotAudioPusherOnNativeThread(WebRtcSession session) { + if (session.closed.get() || session.robotAudioPusherFuture != null) { + return; + } + session.robotAudioPusherFuture = webrtcExecutor.scheduleWithFixedDelay( + () -> pushQueuedRobotAudioOnNativeThread(session), + ROBOT_FRAME_MS, + ROBOT_FRAME_MS, + TimeUnit.MILLISECONDS); + log.info("WebRTC机器人音频推送任务已启动,sessionId={},sampleRate={},frameMs={},frameSamples={}", + session.sessionId, WEBRTC_SAMPLE_RATE, ROBOT_FRAME_MS, WEBRTC_FRAME_SAMPLES); + } + + private RobotAudioFrameData pollRobotAudioFrame(WebRtcSession session) { + synchronized (session.robotAudioBufferLock) { + RobotAudioFrameData frame = session.robotAudioQueue.poll(); + if (frame != null) { + session.queuedRobotAudioFrames.decrementAndGet(); + } + return frame; + } + } + + private void trimRobotAudioQueue(WebRtcSession session) { + synchronized (session.robotAudioBufferLock) { + while (session.queuedRobotAudioFrames.get() > TARGET_QUEUED_ROBOT_FRAMES) { + RobotAudioFrameData dropped = session.robotAudioQueue.poll(); + if (dropped == null) { + session.queuedRobotAudioFrames.set(0); + break; + } + session.queuedRobotAudioFrames.decrementAndGet(); + session.robotAudioFramesDropped++; + } + } + } + + private void closeSessionOnNativeThread(WebRtcSession session) { + synchronized (session.closeLock) { + String sessionId = session.sessionId; + try { + session.browserAudioConsumer = null; + session.signalingSender = null; + session.mediaReady.set(false); + session.robotAudioQueue.clear(); + session.queuedRobotAudioFrames.set(0); + if (session.robotAudioPusherFuture != null) { + session.robotAudioPusherFuture.cancel(false); + session.robotAudioPusherFuture = null; + } + + if (session.browserAudioTrack != null && session.browserAudioSink != null) { + try { + session.browserAudioTrack.removeSink(session.browserAudioSink); + } catch (Exception e) { + log.debug("移除浏览器音频sink异常,sessionId={}", sessionId, e); + } + } + session.browserAudioTrack = null; + session.browserAudioSink = null; + session.browserAudioTransceiver = null; + + if (session.peerConnection != null && session.robotAudioSender != null) { + try { + session.peerConnection.removeTrack(session.robotAudioSender); + } catch (Exception e) { + log.debug("移除机器人音频sender异常,sessionId={}", sessionId, e); + } + } + session.robotAudioSender = null; + + if (session.peerConnection != null) { + try { + session.peerConnection.close(); + } catch (Exception e) { + log.debug("关闭PeerConnection异常,sessionId={}", sessionId, e); + } + } + session.peerConnection = null; + + if (session.robotAudioTrack != null) { + try { + session.robotAudioTrack.dispose(); + } catch (Exception e) { + log.debug("释放机器人音频track异常,sessionId={}", sessionId, e); + } + } + session.robotAudioTrack = null; + + if (session.robotAudioTrackSource != null) { + try { + session.robotAudioTrackSource.dispose(); + } catch (Exception e) { + log.debug("释放机器人音频source异常,sessionId={}", sessionId, e); + } + } + session.robotAudioTrackSource = null; + + if (session.robotAudioSyncClock != null) { + try { + session.robotAudioSyncClock.dispose(); + } catch (Exception e) { + log.debug("释放机器人音频时钟异常,sessionId={}", sessionId, e); + } + } + session.robotAudioSyncClock = null; + + if (session.peerConnectionFactory != null) { + try { + session.peerConnectionFactory.dispose(); + } catch (Exception e) { + log.debug("释放PeerConnectionFactory异常,sessionId={}", sessionId, e); + } + } + session.peerConnectionFactory = null; + + if (session.audioDeviceModule != null) { + try { + session.audioDeviceModule.dispose(); + } catch (Exception e) { + log.debug("释放AudioDeviceModule异常,sessionId={}", sessionId, e); + } + } + session.audioDeviceModule = null; + log.info("WebRTC桥接会话已清理,sessionId={}", sessionId); + } catch (Exception e) { + log.warn("关闭WebRTC桥接会话异常,sessionId={}", sessionId, e); + } + } + } + + private void executeNativeAsync(String action, Runnable runnable) { + try { + webrtcExecutor.execute(() -> { + try { + runnable.run(); + } catch (Exception e) { + log.error("执行WebRTC native任务失败,action={}", action, e); + } + }); + } catch (RejectedExecutionException e) { + log.warn("WebRTC native执行器已关闭,忽略任务,action={}", action, e); + } + } + + private void executeNativeAndWait(String action, Runnable runnable) { + CompletableFuture future = new CompletableFuture<>(); + try { + webrtcExecutor.execute(() -> { + try { + runnable.run(); + future.complete(null); + } catch (Exception e) { + future.completeExceptionally(e); + } + }); + } catch (RejectedExecutionException e) { + throw new IllegalStateException("WebRTC native执行器已关闭:" + action, e); + } + + try { + future.get(); + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + throw new IllegalStateException("等待WebRTC native任务被中断:" + action, e); + } catch (ExecutionException e) { + throw new IllegalStateException("执行WebRTC native任务失败:" + action, e.getCause()); + } + } + + @PreDestroy + public void destroy() { + List sessionIds = new ArrayList<>(sessionMap.keySet()); + for (String sessionId : sessionIds) { + try { + closeSession(sessionId); + } catch (Exception e) { + log.warn("清理WebRTC会话失败,sessionId={}", sessionId, e); + } + } + sessionMap.clear(); + webrtcExecutor.shutdown(); + try { + if (!webrtcExecutor.awaitTermination(3, TimeUnit.SECONDS)) { + log.warn("WebRTC native执行器未在超时时间内退出"); + } + } catch (InterruptedException e) { + Thread.currentThread().interrupt(); + log.warn("等待WebRTC native执行器退出被中断", e); + } + } + + private WebRtcSession requireSession(String sessionId) { + WebRtcSession session = sessionMap.get(sessionId); + if (session == null) { + throw new IllegalArgumentException("WebRTC会话不存在:" + sessionId); + } + return session; + } + + private ObjectNode baseMessage(String type, String sessionId) { + ObjectNode node = objectMapper.createObjectNode(); + node.put("type", type); + node.put("sessionId", sessionId); + node.put("timestamp", System.currentTimeMillis()); + return node; + } + + private String fixSdpFormat(String sdp) { + if (sdp == null) { + return null; + } + String fixed = sdp.replaceAll("(?m)^a=ssrc:.*$", ""); + fixed = fixed.replaceAll("(?m)^[ \\t\\r\\n]*$", ""); + return fixed.replace("\r\n", "\n").replace("\r", "\n").replace("\n", "\r\n"); + } + + private String toJson(ObjectNode node) { + try { + return objectMapper.writeValueAsString(node); + } catch (Exception e) { + throw new RuntimeException(e); + } + } + + private void sendError(WebRtcSession session, String message) { + Consumer signalingSender = session.signalingSender; + if (session.closed.get() || signalingSender == null) { + return; + } + ObjectNode node = baseMessage("error", session.sessionId); + node.put("message", message); + signalingSender.accept(toJson(node)); + } + + private byte[] convertWebRtcAudioToRobotPcm(byte[] input, int bitsPerSample, int sampleRate, int channels, int frameCount) { + if (input == null || input.length == 0 || sampleRate <= 0 || channels <= 0 || frameCount <= 0) { + return new byte[0]; + } + if (sampleRate != ROBOT_SAMPLE_RATE) { + log.warn("浏览器WebRTC音频采样率不是48000,丢弃该帧,sampleRate={},channels={},frameCount={}", + sampleRate, channels, frameCount); + return new byte[0]; + } + + short[] mono48k; + if (bitsPerSample == 32) { + mono48k = float32PcmToMonoShort(input, channels, frameCount); + } else if (bitsPerSample == 16) { + mono48k = pcm16ToMonoShort(input, channels, frameCount); + } else { + log.warn("不支持的WebRTC音频位深,bitsPerSample={},sampleRate={},channels={}", bitsPerSample, sampleRate, channels); + return new byte[0]; + } + + return shortsToPcmBytes(mono48k, mono48k.length); + } + + private short[] float32PcmToMonoShort(byte[] input, int channels, int frameCount) { + int inputFrames = Math.min(frameCount, input.length / (4 * channels)); + short[] mono = new short[inputFrames]; + ByteBuffer buffer = ByteBuffer.wrap(input).order(ByteOrder.LITTLE_ENDIAN); + for (int frame = 0; frame < inputFrames; frame++) { + double mixed = 0.0d; + for (int ch = 0; ch < channels; ch++) { + float sample = buffer.getFloat((frame * channels + ch) * 4); + if (sample > 1.0f) { + sample = 1.0f; + } else if (sample < -1.0f) { + sample = -1.0f; + } + mixed += sample; + } + mono[frame] = (short) Math.round((mixed / channels) * 32767.0d); + } + return mono; + } + + private short[] pcm16ToMonoShort(byte[] input, int channels, int frameCount) { + int inputFrames = Math.min(frameCount, input.length / (2 * channels)); + short[] mono = new short[inputFrames]; + for (int frame = 0; frame < inputFrames; frame++) { + int mixed = 0; + for (int ch = 0; ch < channels; ch++) { + int offset = (frame * channels + ch) * 2; + mixed += readPcm16Le(input, offset); + } + mono[frame] = (short) (mixed / channels); + } + return mono; + } + + private short[] pcmBytesToShorts(byte[] input, int maxSamples) { + int samples = Math.min(maxSamples, input.length / 2); + short[] output = new short[samples]; + for (int i = 0; i < samples; i++) { + output[i] = readPcm16Le(input, i * 2); + } + return output; + } + + private byte[] shortsToPcmBytes(short[] samples, int targetSamples) { + byte[] output = new byte[targetSamples * 2]; + int count = Math.min(targetSamples, samples == null ? 0 : samples.length); + for (int i = 0; i < count; i++) { + output[i * 2] = (byte) (samples[i] & 0xFF); + output[i * 2 + 1] = (byte) ((samples[i] >> 8) & 0xFF); + } + return output; + } + + private short readPcm16Le(byte[] input, int offset) { + int low = input[offset] & 0xFF; + int high = input[offset + 1]; + return (short) ((high << 8) | low); + } + + private void logAudioStatsIfNeeded(WebRtcSession session, String source, int queuedRobotFrames) { + long now = System.currentTimeMillis(); + if (now - session.lastAudioStatsLogAt < AUDIO_STATS_LOG_INTERVAL_MS) { + return; + } + session.lastAudioStatsLogAt = now; + log.info("WebRTC音频统计,source={},sessionId={},mediaReady={},browserFrames={},robotEnqueued={},robotDropped={},robotPushCalls={},robotPushSilent={},queuedRobotFrames={},lastRobotTimestampMs={}", + source, + session.sessionId, + session.mediaReady.get(), + session.browserAudioFramesReceived, + session.robotAudioFramesEnqueued, + session.robotAudioFramesDropped, + session.robotAudioPushCalls, + session.robotAudioPushSilentFrames, + queuedRobotFrames, + session.lastRobotTimestampMs); + log.info("WEBRTC-AUDIO-STATS source={} sessionId={} browserRaw={} browserAccepted={} queuedRobotFrames={}", + source, + session.sessionId, + session.browserAudioFramesReceived, + session.browserAudioFramesAccepted, + queuedRobotFrames); + } + + private void logBrowserInputFormatIfNeeded(WebRtcSession session, + int bitsPerSample, + int sampleRate, + int channels, + int frameCount, + int inputBytes, + int outputBytes) { + long now = System.currentTimeMillis(); + if (now - session.lastBrowserFormatLogAt < AUDIO_STATS_LOG_INTERVAL_MS) { + return; + } + session.lastBrowserFormatLogAt = now; + log.info("浏览器WebRTC输入音频格式,sessionId={},bitsPerSample={},sampleRate={},channels={},frameCount={},inputBytes={},robotOutputBytes={}", + session.sessionId, + bitsPerSample, + sampleRate, + channels, + frameCount, + inputBytes, + outputBytes); + } + + private int estimateRobotOutputBytes(int sampleRate, int channels, int frameCount) { + if (sampleRate <= 0 || channels <= 0 || frameCount <= 0) { + return 0; + } + if (sampleRate != ROBOT_SAMPLE_RATE) { + return 0; + } + int monoSamples = frameCount; + return monoSamples * (BITS_PER_SAMPLE / 8); + } + + private void logWebRtcPushPcmStatsIfNeeded(WebRtcSession session, byte[] pcm48k, long sourceTimestampMs) { + long now = System.currentTimeMillis(); + if (now - session.lastWebRtcPushPcmStatsLogAt < AUDIO_STATS_LOG_INTERVAL_MS) { + return; + } + session.lastWebRtcPushPcmStatsLogAt = now; + PcmStats stats = PcmStats.fromPcm16Le(pcm48k); + log.info("PCM-STATS direction=webrtc-outbound-robot sessionId={} sampleRate={} channels={} bitsPerSample={} frameMs={} sourceTimestampMs={} bytes={} samples={} rms={} peak={} zeroCrossRate={} firstSamples={}", + session.sessionId, + WEBRTC_SAMPLE_RATE, + CHANNELS, + BITS_PER_SAMPLE, + ROBOT_FRAME_MS, + sourceTimestampMs, + pcm48k == null ? 0 : pcm48k.length, + stats.samples, + stats.rms, + stats.peak, + stats.zeroCrossRate, + stats.firstSamples); + } + + private class BridgePeerObserver implements PeerConnectionObserver { + private final WebRtcSession session; + + private BridgePeerObserver(WebRtcSession session) { + this.session = session; + } + + @Override + public void onIceCandidate(RTCIceCandidate candidate) { + Consumer signalingSender = session.signalingSender; + if (session.closed.get() || signalingSender == null) { + return; + } + ObjectNode node = baseMessage("candidate", session.sessionId); + ObjectNode candidateNode = objectMapper.createObjectNode(); + candidateNode.put("candidate", candidate.sdp); + candidateNode.put("sdpMid", candidate.sdpMid); + candidateNode.put("sdpMLineIndex", candidate.sdpMLineIndex); + node.set("candidate", candidateNode); + signalingSender.accept(toJson(node)); + } + + @Override + public void onTrack(RTCRtpTransceiver transceiver) { + executeNativeAsync("bind browser WebRTC audio track", () -> { + if (session.closed.get()) { + return; + } + MediaStreamTrack track = transceiver.getReceiver().getTrack(); + if (!(track instanceof AudioTrack)) { + return; + } + AudioTrack audioTrack = (AudioTrack) track; + if (session.browserAudioSink != null) { + log.warn("浏览器WebRTC音频track已绑定,忽略重复onTrack,sessionId={}", session.sessionId); + return; + } + AudioTrackSink sink = (audioData, bitsPerSample, sampleRate, channels, frameCount) -> { + try { + Consumer consumer = session.browserAudioConsumer; + if (session.closed.get() || consumer == null) { + return; + } + session.browserAudioFramesReceived++; + int expectedOutputBytes = estimateRobotOutputBytes(sampleRate, channels, frameCount); + logBrowserInputFormatIfNeeded(session, bitsPerSample, sampleRate, channels, frameCount, + audioData == null ? 0 : audioData.length, expectedOutputBytes); + session.browserAudioFramesAccepted++; + byte[] pcm48kMono = convertWebRtcAudioToRobotPcm(audioData, bitsPerSample, sampleRate, channels, frameCount); + if (pcm48kMono.length == 0) { + log.debug("浏览器WebRTC音频帧为空,sessionId={},bitsPerSample={},sampleRate={},channels={},frameCount={},bytes={}", + session.sessionId, bitsPerSample, sampleRate, channels, frameCount, audioData == null ? 0 : audioData.length); + return; + } + logAudioStatsIfNeeded(session, "browserAudioSink", session.queuedRobotAudioFrames.get()); + consumer.accept(pcm48kMono); + } catch (Exception e) { + log.error("处理浏览器WebRTC音频帧失败,sessionId={}", session.sessionId, e); + } + }; + audioTrack.addSink(sink); + session.browserAudioTrack = audioTrack; + session.browserAudioSink = sink; + session.browserAudioTransceiver = transceiver; + log.info("已绑定浏览器WebRTC音频track,sessionId={}", session.sessionId); + }); + } + + @Override + public void onSignalingChange(RTCSignalingState state) { + log.debug("WebRTC signaling状态变化,sessionId={},state={}", session.sessionId, state); + } + + @Override + public void onConnectionChange(RTCPeerConnectionState state) { + log.info("WebRTC连接状态变化,sessionId={},state={}", session.sessionId, state); + } + + @Override + public void onIceConnectionChange(RTCIceConnectionState state) { + log.debug("WebRTC ICE连接状态变化,sessionId={},state={}", session.sessionId, state); + } + + @Override + public void onStandardizedIceConnectionChange(RTCIceConnectionState state) { + } + + @Override + public void onIceConnectionReceivingChange(boolean receiving) { + } + + @Override + public void onIceGatheringChange(RTCIceGatheringState state) { + log.debug("WebRTC ICE采集状态变化,sessionId={},state={}", session.sessionId, state); + } + + @Override + public void onIceCandidateError(RTCPeerConnectionIceErrorEvent event) { + log.warn("WebRTC ICE候选异常,sessionId={},event={}", session.sessionId, event); + } + + @Override + public void onIceCandidatesRemoved(RTCIceCandidate[] candidates) { + } + + @Override + public void onAddStream(MediaStream stream) { + } + + @Override + public void onRemoveStream(MediaStream stream) { + } + + @Override + public void onDataChannel(RTCDataChannel dataChannel) { + } + + @Override + public void onRenegotiationNeeded() { + log.debug("WebRTC需要重新协商,sessionId={}", session.sessionId); + } + + @Override + public void onAddTrack(RTCRtpReceiver receiver, MediaStream[] mediaStreams) { + } + + @Override + public void onRemoveTrack(RTCRtpReceiver receiver) { + } + } + + private static class RobotAudioFrameData { + private final byte[] pcm; + private final long timestampMs; + + private RobotAudioFrameData(byte[] pcm, long timestampMs) { + this.pcm = pcm; + this.timestampMs = timestampMs; + } + } + + private static class WavDumpRecorder { + private final String name; + private final int maxBytes; + private final ByteArrayOutputStream buffer; + private Path filePath; + private int writtenBytes; + private boolean completed; + + private WavDumpRecorder(String name, int maxBytes) { + this.name = name; + this.maxBytes = maxBytes; + this.buffer = new ByteArrayOutputStream(maxBytes); + } + + private synchronized void record(byte[] pcm) { + if (completed || pcm == null || pcm.length == 0) { + return; + } + try { + if (filePath == null) { + Path dir = Paths.get("logs", "audio-dump"); + Files.createDirectories(dir); + filePath = dir.resolve(name + "-" + System.currentTimeMillis() + ".wav"); + log.info("开始保存10秒WAV音频,name={},file={},sampleRate={},channels={},bitsPerSample={}", + name, filePath.toAbsolutePath(), WEBRTC_SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); + } + int remain = maxBytes - writtenBytes; + int writeBytes = Math.min(remain, pcm.length); + buffer.write(pcm, 0, writeBytes); + writtenBytes += writeBytes; + if (writtenBytes >= maxBytes) { + writeWavFile(filePath, buffer.toByteArray(), WEBRTC_SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); + completed = true; + log.info("WAV音频保存完成,name={},file={},pcmBytes={}", + name, filePath == null ? "" : filePath.toAbsolutePath(), writtenBytes); + } + } catch (IOException e) { + completed = true; + log.warn("保存WAV音频失败,name={},file={}", name, filePath, e); + } + } + + private void writeWavFile(Path path, byte[] pcm, int sampleRate, int channels, int bitsPerSample) throws IOException { + try (OutputStream out = Files.newOutputStream(path, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)) { + writeAscii(out, "RIFF"); + writeIntLe(out, 36 + pcm.length); + writeAscii(out, "WAVE"); + writeAscii(out, "fmt "); + writeIntLe(out, 16); + writeShortLe(out, 1); + writeShortLe(out, channels); + writeIntLe(out, sampleRate); + writeIntLe(out, sampleRate * channels * bitsPerSample / 8); + writeShortLe(out, channels * bitsPerSample / 8); + writeShortLe(out, bitsPerSample); + writeAscii(out, "data"); + writeIntLe(out, pcm.length); + out.write(pcm); + } + } + + private void writeAscii(OutputStream out, String value) throws IOException { + out.write(value.getBytes(java.nio.charset.StandardCharsets.US_ASCII)); + } + + private void writeIntLe(OutputStream out, int value) throws IOException { + out.write(value & 0xFF); + out.write((value >> 8) & 0xFF); + out.write((value >> 16) & 0xFF); + out.write((value >> 24) & 0xFF); + } + + private void writeShortLe(OutputStream out, int value) throws IOException { + out.write(value & 0xFF); + out.write((value >> 8) & 0xFF); + } + } + + private static class PcmDumpRecorder { + private final String name; + private final int maxBytes; + private OutputStream outputStream; + private Path filePath; + private int writtenBytes; + private boolean completed; + + private PcmDumpRecorder(String name, int maxBytes) { + this.name = name; + this.maxBytes = maxBytes; + } + + private synchronized void record(byte[] pcm) { + if (completed || pcm == null || pcm.length == 0) { + return; + } + try { + if (outputStream == null) { + Path dir = Paths.get("logs", "audio-dump"); + Files.createDirectories(dir); + filePath = dir.resolve(name + "-" + System.currentTimeMillis() + ".pcm"); + outputStream = Files.newOutputStream(filePath, StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE); + log.info("开始保存10秒PCM音频,name={},file={},sampleRate={},channels={},bitsPerSample={}", + name, filePath.toAbsolutePath(), WEBRTC_SAMPLE_RATE, CHANNELS, BITS_PER_SAMPLE); + } + int remain = maxBytes - writtenBytes; + int writeBytes = Math.min(remain, pcm.length); + outputStream.write(pcm, 0, writeBytes); + writtenBytes += writeBytes; + if (writtenBytes >= maxBytes) { + close(); + completed = true; + log.info("PCM音频保存完成,name={},file={},bytes={}", + name, filePath == null ? "" : filePath.toAbsolutePath(), writtenBytes); + } + } catch (IOException e) { + completed = true; + closeQuietly(); + log.warn("保存PCM音频失败,name={},file={}", name, filePath, e); + } + } + + private void close() throws IOException { + if (outputStream != null) { + outputStream.flush(); + outputStream.close(); + outputStream = null; + } + } + + private void closeQuietly() { + try { + close(); + } catch (IOException ignored) { + } + } + } + + private static class WebRtcSession { + private String sessionId; + private AudioDeviceModuleBase audioDeviceModule; + private PeerConnectionFactory peerConnectionFactory; + private RTCPeerConnection peerConnection; + private SyncClock robotAudioSyncClock; + private CustomAudioSource robotAudioTrackSource; + private AudioTrack robotAudioTrack; + private RTCRtpSender robotAudioSender; + private ScheduledFuture robotAudioPusherFuture; + private final ConcurrentLinkedQueue robotAudioQueue = new ConcurrentLinkedQueue<>(); + private final AtomicInteger queuedRobotAudioFrames = new AtomicInteger(0); + private final Object robotAudioBufferLock = new Object(); + private byte[] robotAudioRemainder = new byte[ROBOT_FRAME_BYTES]; + private int robotAudioRemainderLength; + private long robotAudioRemainderTimestampMs; + private AudioTrack browserAudioTrack; + private AudioTrackSink browserAudioSink; + private RTCRtpTransceiver browserAudioTransceiver; + private Consumer browserAudioConsumer; + private Consumer signalingSender; + private final AtomicBoolean closed = new AtomicBoolean(false); + private final AtomicBoolean mediaReady = new AtomicBoolean(false); + private final Object closeLock = new Object(); + private volatile long browserAudioFramesReceived; + private volatile long browserAudioFramesAccepted; + private volatile long robotAudioFramesEnqueued; + private volatile long robotAudioFramesDropped; + private volatile long robotAudioPushCalls; + private volatile long robotAudioPushSilentFrames; + private volatile long lastRobotTimestampMs; + private volatile long lastAudioStatsLogAt; + private volatile long lastBrowserFormatLogAt; + private volatile long lastWebRtcPushPcmStatsLogAt; + } + + private static class PcmStats { + private final int samples; + private final int rms; + private final int peak; + private final String zeroCrossRate; + private final String firstSamples; + + private PcmStats(int samples, int rms, int peak, String zeroCrossRate, String firstSamples) { + this.samples = samples; + this.rms = rms; + this.peak = peak; + this.zeroCrossRate = zeroCrossRate; + this.firstSamples = firstSamples; + } + + private static PcmStats fromPcm16Le(byte[] pcm) { + if (pcm == null || pcm.length < 2) { + return new PcmStats(0, 0, 0, "0.0000", "[]"); + } + int samples = pcm.length / 2; + long squareSum = 0L; + int peak = 0; + int zeroCross = 0; + int previous = 0; + StringBuilder first = new StringBuilder("["); + int firstCount = Math.min(8, samples); + for (int i = 0; i < samples; i++) { + int low = pcm[i * 2] & 0xFF; + int high = pcm[i * 2 + 1]; + short sample = (short) ((high << 8) | low); + int value = sample; + int abs = Math.abs(value); + peak = Math.max(peak, abs); + squareSum += (long) value * value; + if (i > 0 && ((previous < 0 && value >= 0) || (previous >= 0 && value < 0))) { + zeroCross++; + } + previous = value; + if (i < firstCount) { + if (i > 0) { + first.append(','); + } + first.append(value); + } + } + first.append(']'); + int rms = (int) Math.round(Math.sqrt(squareSum / (double) samples)); + String zeroCrossRate = String.format(java.util.Locale.ROOT, "%.4f", zeroCross / (double) Math.max(1, samples - 1)); + return new PcmStats(samples, rms, peak, zeroCrossRate, first.toString()); + } + } +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/RobotAudio.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/RobotAudio.java new file mode 100644 index 0000000..ae32f56 --- /dev/null +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/RobotAudio.java @@ -0,0 +1,9090 @@ +// Generated by the protocol buffer compiler. DO NOT EDIT! +// source: cmvr/api/robot_audio.proto + +package cmvr.api; + +public final class RobotAudio { + private RobotAudio() {} + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistryLite registry) { + } + + public static void registerAllExtensions( + com.google.protobuf.ExtensionRegistry registry) { + registerAllExtensions( + (com.google.protobuf.ExtensionRegistryLite) registry); + } + public interface RobotAudioFormatOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioFormat) + com.google.protobuf.MessageOrBuilder { + + /** + * int32 sample_rate = 1; + * @return The sampleRate. + */ + int getSampleRate(); + + /** + * int32 channels = 2; + * @return The channels. + */ + int getChannels(); + + /** + * int32 bits_per_sample = 3; + * @return The bitsPerSample. + */ + int getBitsPerSample(); + + /** + * string encoding = 4; + * @return The encoding. + */ + java.lang.String getEncoding(); + /** + * string encoding = 4; + * @return The bytes for encoding. + */ + com.google.protobuf.ByteString + getEncodingBytes(); + } + /** + *
+   * Fixed audio format: PCM_S16LE, 48 kHz, 16-bit, mono.
+   * Both directions use 10 ms frames: 480 samples, 960 bytes.
+   * 
+ * + * Protobuf type {@code cmvr.api.RobotAudioFormat} + */ + public static final class RobotAudioFormat extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioFormat) + RobotAudioFormatOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioFormat.newBuilder() to construct. + private RobotAudioFormat(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioFormat() { + encoding_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioFormat(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFormat_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFormat_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioFormat.class, cmvr.api.RobotAudio.RobotAudioFormat.Builder.class); + } + + public static final int SAMPLE_RATE_FIELD_NUMBER = 1; + private int sampleRate_; + /** + * int32 sample_rate = 1; + * @return The sampleRate. + */ + @java.lang.Override + public int getSampleRate() { + return sampleRate_; + } + + public static final int CHANNELS_FIELD_NUMBER = 2; + private int channels_; + /** + * int32 channels = 2; + * @return The channels. + */ + @java.lang.Override + public int getChannels() { + return channels_; + } + + public static final int BITS_PER_SAMPLE_FIELD_NUMBER = 3; + private int bitsPerSample_; + /** + * int32 bits_per_sample = 3; + * @return The bitsPerSample. + */ + @java.lang.Override + public int getBitsPerSample() { + return bitsPerSample_; + } + + public static final int ENCODING_FIELD_NUMBER = 4; + private volatile java.lang.Object encoding_; + /** + * string encoding = 4; + * @return The encoding. + */ + @java.lang.Override + public java.lang.String getEncoding() { + java.lang.Object ref = encoding_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + encoding_ = s; + return s; + } + } + /** + * string encoding = 4; + * @return The bytes for encoding. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getEncodingBytes() { + java.lang.Object ref = encoding_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + encoding_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (sampleRate_ != 0) { + output.writeInt32(1, sampleRate_); + } + if (channels_ != 0) { + output.writeInt32(2, channels_); + } + if (bitsPerSample_ != 0) { + output.writeInt32(3, bitsPerSample_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(encoding_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 4, encoding_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (sampleRate_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(1, sampleRate_); + } + if (channels_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, channels_); + } + if (bitsPerSample_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(3, bitsPerSample_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(encoding_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(4, encoding_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioFormat)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioFormat other = (cmvr.api.RobotAudio.RobotAudioFormat) obj; + + if (getSampleRate() + != other.getSampleRate()) return false; + if (getChannels() + != other.getChannels()) return false; + if (getBitsPerSample() + != other.getBitsPerSample()) return false; + if (!getEncoding() + .equals(other.getEncoding())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SAMPLE_RATE_FIELD_NUMBER; + hash = (53 * hash) + getSampleRate(); + hash = (37 * hash) + CHANNELS_FIELD_NUMBER; + hash = (53 * hash) + getChannels(); + hash = (37 * hash) + BITS_PER_SAMPLE_FIELD_NUMBER; + hash = (53 * hash) + getBitsPerSample(); + hash = (37 * hash) + ENCODING_FIELD_NUMBER; + hash = (53 * hash) + getEncoding().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioFormat parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioFormat prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + *
+     * Fixed audio format: PCM_S16LE, 48 kHz, 16-bit, mono.
+     * Both directions use 10 ms frames: 480 samples, 960 bytes.
+     * 
+ * + * Protobuf type {@code cmvr.api.RobotAudioFormat} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioFormat) + cmvr.api.RobotAudio.RobotAudioFormatOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFormat_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFormat_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioFormat.class, cmvr.api.RobotAudio.RobotAudioFormat.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioFormat.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sampleRate_ = 0; + + channels_ = 0; + + bitsPerSample_ = 0; + + encoding_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFormat_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFormat getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioFormat.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFormat build() { + cmvr.api.RobotAudio.RobotAudioFormat result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFormat buildPartial() { + cmvr.api.RobotAudio.RobotAudioFormat result = new cmvr.api.RobotAudio.RobotAudioFormat(this); + result.sampleRate_ = sampleRate_; + result.channels_ = channels_; + result.bitsPerSample_ = bitsPerSample_; + result.encoding_ = encoding_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioFormat) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioFormat)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioFormat other) { + if (other == cmvr.api.RobotAudio.RobotAudioFormat.getDefaultInstance()) return this; + if (other.getSampleRate() != 0) { + setSampleRate(other.getSampleRate()); + } + if (other.getChannels() != 0) { + setChannels(other.getChannels()); + } + if (other.getBitsPerSample() != 0) { + setBitsPerSample(other.getBitsPerSample()); + } + if (!other.getEncoding().isEmpty()) { + encoding_ = other.encoding_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 8: { + sampleRate_ = input.readInt32(); + + break; + } // case 8 + case 16: { + channels_ = input.readInt32(); + + break; + } // case 16 + case 24: { + bitsPerSample_ = input.readInt32(); + + break; + } // case 24 + case 34: { + encoding_ = input.readStringRequireUtf8(); + + break; + } // case 34 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private int sampleRate_ ; + /** + * int32 sample_rate = 1; + * @return The sampleRate. + */ + @java.lang.Override + public int getSampleRate() { + return sampleRate_; + } + /** + * int32 sample_rate = 1; + * @param value The sampleRate to set. + * @return This builder for chaining. + */ + public Builder setSampleRate(int value) { + + sampleRate_ = value; + onChanged(); + return this; + } + /** + * int32 sample_rate = 1; + * @return This builder for chaining. + */ + public Builder clearSampleRate() { + + sampleRate_ = 0; + onChanged(); + return this; + } + + private int channels_ ; + /** + * int32 channels = 2; + * @return The channels. + */ + @java.lang.Override + public int getChannels() { + return channels_; + } + /** + * int32 channels = 2; + * @param value The channels to set. + * @return This builder for chaining. + */ + public Builder setChannels(int value) { + + channels_ = value; + onChanged(); + return this; + } + /** + * int32 channels = 2; + * @return This builder for chaining. + */ + public Builder clearChannels() { + + channels_ = 0; + onChanged(); + return this; + } + + private int bitsPerSample_ ; + /** + * int32 bits_per_sample = 3; + * @return The bitsPerSample. + */ + @java.lang.Override + public int getBitsPerSample() { + return bitsPerSample_; + } + /** + * int32 bits_per_sample = 3; + * @param value The bitsPerSample to set. + * @return This builder for chaining. + */ + public Builder setBitsPerSample(int value) { + + bitsPerSample_ = value; + onChanged(); + return this; + } + /** + * int32 bits_per_sample = 3; + * @return This builder for chaining. + */ + public Builder clearBitsPerSample() { + + bitsPerSample_ = 0; + onChanged(); + return this; + } + + private java.lang.Object encoding_ = ""; + /** + * string encoding = 4; + * @return The encoding. + */ + public java.lang.String getEncoding() { + java.lang.Object ref = encoding_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + encoding_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string encoding = 4; + * @return The bytes for encoding. + */ + public com.google.protobuf.ByteString + getEncodingBytes() { + java.lang.Object ref = encoding_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + encoding_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string encoding = 4; + * @param value The encoding to set. + * @return This builder for chaining. + */ + public Builder setEncoding( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + encoding_ = value; + onChanged(); + return this; + } + /** + * string encoding = 4; + * @return This builder for chaining. + */ + public Builder clearEncoding() { + + encoding_ = getDefaultInstance().getEncoding(); + onChanged(); + return this; + } + /** + * string encoding = 4; + * @param value The bytes for encoding to set. + * @return This builder for chaining. + */ + public Builder setEncodingBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + encoding_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioFormat) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioFormat) + private static final cmvr.api.RobotAudio.RobotAudioFormat DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioFormat(); + } + + public static cmvr.api.RobotAudio.RobotAudioFormat getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioFormat parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFormat getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioStartOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioStart) + com.google.protobuf.MessageOrBuilder { + + /** + * string session_id = 1; + * @return The sessionId. + */ + java.lang.String getSessionId(); + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * string operator_id = 2; + * @return The operatorId. + */ + java.lang.String getOperatorId(); + /** + * string operator_id = 2; + * @return The bytes for operatorId. + */ + com.google.protobuf.ByteString + getOperatorIdBytes(); + + /** + * .cmvr.api.RobotAudioFormat format = 3; + * @return Whether the format field is set. + */ + boolean hasFormat(); + /** + * .cmvr.api.RobotAudioFormat format = 3; + * @return The format. + */ + cmvr.api.RobotAudio.RobotAudioFormat getFormat(); + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + cmvr.api.RobotAudio.RobotAudioFormatOrBuilder getFormatOrBuilder(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioStart} + */ + public static final class RobotAudioStart extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioStart) + RobotAudioStartOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioStart.newBuilder() to construct. + private RobotAudioStart(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioStart() { + sessionId_ = ""; + operatorId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioStart(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStart_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStart_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioStart.class, cmvr.api.RobotAudio.RobotAudioStart.Builder.class); + } + + public static final int SESSION_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object sessionId_; + /** + * string session_id = 1; + * @return The sessionId. + */ + @java.lang.Override + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int OPERATOR_ID_FIELD_NUMBER = 2; + private volatile java.lang.Object operatorId_; + /** + * string operator_id = 2; + * @return The operatorId. + */ + @java.lang.Override + public java.lang.String getOperatorId() { + java.lang.Object ref = operatorId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + operatorId_ = s; + return s; + } + } + /** + * string operator_id = 2; + * @return The bytes for operatorId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getOperatorIdBytes() { + java.lang.Object ref = operatorId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + operatorId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int FORMAT_FIELD_NUMBER = 3; + private cmvr.api.RobotAudio.RobotAudioFormat format_; + /** + * .cmvr.api.RobotAudioFormat format = 3; + * @return Whether the format field is set. + */ + @java.lang.Override + public boolean hasFormat() { + return format_ != null; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + * @return The format. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFormat getFormat() { + return format_ == null ? cmvr.api.RobotAudio.RobotAudioFormat.getDefaultInstance() : format_; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFormatOrBuilder getFormatOrBuilder() { + return getFormat(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sessionId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(operatorId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, operatorId_); + } + if (format_ != null) { + output.writeMessage(3, getFormat()); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, sessionId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(operatorId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, operatorId_); + } + if (format_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, getFormat()); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioStart)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioStart other = (cmvr.api.RobotAudio.RobotAudioStart) obj; + + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (!getOperatorId() + .equals(other.getOperatorId())) return false; + if (hasFormat() != other.hasFormat()) return false; + if (hasFormat()) { + if (!getFormat() + .equals(other.getFormat())) return false; + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SESSION_ID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + OPERATOR_ID_FIELD_NUMBER; + hash = (53 * hash) + getOperatorId().hashCode(); + if (hasFormat()) { + hash = (37 * hash) + FORMAT_FIELD_NUMBER; + hash = (53 * hash) + getFormat().hashCode(); + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStart parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioStart prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioStart} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioStart) + cmvr.api.RobotAudio.RobotAudioStartOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStart_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStart_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioStart.class, cmvr.api.RobotAudio.RobotAudioStart.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioStart.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sessionId_ = ""; + + operatorId_ = ""; + + if (formatBuilder_ == null) { + format_ = null; + } else { + format_ = null; + formatBuilder_ = null; + } + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStart_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStart getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStart build() { + cmvr.api.RobotAudio.RobotAudioStart result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStart buildPartial() { + cmvr.api.RobotAudio.RobotAudioStart result = new cmvr.api.RobotAudio.RobotAudioStart(this); + result.sessionId_ = sessionId_; + result.operatorId_ = operatorId_; + if (formatBuilder_ == null) { + result.format_ = format_; + } else { + result.format_ = formatBuilder_.build(); + } + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioStart) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioStart)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioStart other) { + if (other == cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance()) return this; + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (!other.getOperatorId().isEmpty()) { + operatorId_ = other.operatorId_; + onChanged(); + } + if (other.hasFormat()) { + mergeFormat(other.getFormat()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + sessionId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 18: { + operatorId_ = input.readStringRequireUtf8(); + + break; + } // case 18 + case 26: { + input.readMessage( + getFormatFieldBuilder().getBuilder(), + extensionRegistry); + + break; + } // case 26 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object sessionId_ = ""; + /** + * string session_id = 1; + * @return The sessionId. + */ + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string session_id = 1; + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + /** + * string session_id = 1; + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + /** + * string session_id = 1; + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private java.lang.Object operatorId_ = ""; + /** + * string operator_id = 2; + * @return The operatorId. + */ + public java.lang.String getOperatorId() { + java.lang.Object ref = operatorId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + operatorId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string operator_id = 2; + * @return The bytes for operatorId. + */ + public com.google.protobuf.ByteString + getOperatorIdBytes() { + java.lang.Object ref = operatorId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + operatorId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string operator_id = 2; + * @param value The operatorId to set. + * @return This builder for chaining. + */ + public Builder setOperatorId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + operatorId_ = value; + onChanged(); + return this; + } + /** + * string operator_id = 2; + * @return This builder for chaining. + */ + public Builder clearOperatorId() { + + operatorId_ = getDefaultInstance().getOperatorId(); + onChanged(); + return this; + } + /** + * string operator_id = 2; + * @param value The bytes for operatorId to set. + * @return This builder for chaining. + */ + public Builder setOperatorIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + operatorId_ = value; + onChanged(); + return this; + } + + private cmvr.api.RobotAudio.RobotAudioFormat format_; + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFormat, cmvr.api.RobotAudio.RobotAudioFormat.Builder, cmvr.api.RobotAudio.RobotAudioFormatOrBuilder> formatBuilder_; + /** + * .cmvr.api.RobotAudioFormat format = 3; + * @return Whether the format field is set. + */ + public boolean hasFormat() { + return formatBuilder_ != null || format_ != null; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + * @return The format. + */ + public cmvr.api.RobotAudio.RobotAudioFormat getFormat() { + if (formatBuilder_ == null) { + return format_ == null ? cmvr.api.RobotAudio.RobotAudioFormat.getDefaultInstance() : format_; + } else { + return formatBuilder_.getMessage(); + } + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + public Builder setFormat(cmvr.api.RobotAudio.RobotAudioFormat value) { + if (formatBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + format_ = value; + onChanged(); + } else { + formatBuilder_.setMessage(value); + } + + return this; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + public Builder setFormat( + cmvr.api.RobotAudio.RobotAudioFormat.Builder builderForValue) { + if (formatBuilder_ == null) { + format_ = builderForValue.build(); + onChanged(); + } else { + formatBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + public Builder mergeFormat(cmvr.api.RobotAudio.RobotAudioFormat value) { + if (formatBuilder_ == null) { + if (format_ != null) { + format_ = + cmvr.api.RobotAudio.RobotAudioFormat.newBuilder(format_).mergeFrom(value).buildPartial(); + } else { + format_ = value; + } + onChanged(); + } else { + formatBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + public Builder clearFormat() { + if (formatBuilder_ == null) { + format_ = null; + onChanged(); + } else { + format_ = null; + formatBuilder_ = null; + } + + return this; + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + public cmvr.api.RobotAudio.RobotAudioFormat.Builder getFormatBuilder() { + + onChanged(); + return getFormatFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + public cmvr.api.RobotAudio.RobotAudioFormatOrBuilder getFormatOrBuilder() { + if (formatBuilder_ != null) { + return formatBuilder_.getMessageOrBuilder(); + } else { + return format_ == null ? + cmvr.api.RobotAudio.RobotAudioFormat.getDefaultInstance() : format_; + } + } + /** + * .cmvr.api.RobotAudioFormat format = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFormat, cmvr.api.RobotAudio.RobotAudioFormat.Builder, cmvr.api.RobotAudio.RobotAudioFormatOrBuilder> + getFormatFieldBuilder() { + if (formatBuilder_ == null) { + formatBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFormat, cmvr.api.RobotAudio.RobotAudioFormat.Builder, cmvr.api.RobotAudio.RobotAudioFormatOrBuilder>( + getFormat(), + getParentForChildren(), + isClean()); + format_ = null; + } + return formatBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioStart) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioStart) + private static final cmvr.api.RobotAudio.RobotAudioStart DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioStart(); + } + + public static cmvr.api.RobotAudio.RobotAudioStart getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioStart parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStart getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioFrameOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioFrame) + com.google.protobuf.MessageOrBuilder { + + /** + * string session_id = 1; + * @return The sessionId. + */ + java.lang.String getSessionId(); + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * int64 sequence = 2; + * @return The sequence. + */ + long getSequence(); + + /** + *
+     * Robot upload: capture timestamp. Browser downlink: backend send timestamp.
+     * 
+ * + * int64 timestamp_ms = 3; + * @return The timestampMs. + */ + long getTimestampMs(); + + /** + *
+     * PCM_S16LE. Fixed 10 ms / 960 bytes at 48 kHz mono 16-bit.
+     * 
+ * + * bytes pcm = 4; + * @return The pcm. + */ + com.google.protobuf.ByteString getPcm(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioFrame} + */ + public static final class RobotAudioFrame extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioFrame) + RobotAudioFrameOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioFrame.newBuilder() to construct. + private RobotAudioFrame(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioFrame() { + sessionId_ = ""; + pcm_ = com.google.protobuf.ByteString.EMPTY; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioFrame(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFrame_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFrame_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioFrame.class, cmvr.api.RobotAudio.RobotAudioFrame.Builder.class); + } + + public static final int SESSION_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object sessionId_; + /** + * string session_id = 1; + * @return The sessionId. + */ + @java.lang.Override + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int SEQUENCE_FIELD_NUMBER = 2; + private long sequence_; + /** + * int64 sequence = 2; + * @return The sequence. + */ + @java.lang.Override + public long getSequence() { + return sequence_; + } + + public static final int TIMESTAMP_MS_FIELD_NUMBER = 3; + private long timestampMs_; + /** + *
+     * Robot upload: capture timestamp. Browser downlink: backend send timestamp.
+     * 
+ * + * int64 timestamp_ms = 3; + * @return The timestampMs. + */ + @java.lang.Override + public long getTimestampMs() { + return timestampMs_; + } + + public static final int PCM_FIELD_NUMBER = 4; + private com.google.protobuf.ByteString pcm_; + /** + *
+     * PCM_S16LE. Fixed 10 ms / 960 bytes at 48 kHz mono 16-bit.
+     * 
+ * + * bytes pcm = 4; + * @return The pcm. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPcm() { + return pcm_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sessionId_); + } + if (sequence_ != 0L) { + output.writeInt64(2, sequence_); + } + if (timestampMs_ != 0L) { + output.writeInt64(3, timestampMs_); + } + if (!pcm_.isEmpty()) { + output.writeBytes(4, pcm_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, sessionId_); + } + if (sequence_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, sequence_); + } + if (timestampMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(3, timestampMs_); + } + if (!pcm_.isEmpty()) { + size += com.google.protobuf.CodedOutputStream + .computeBytesSize(4, pcm_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioFrame)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioFrame other = (cmvr.api.RobotAudio.RobotAudioFrame) obj; + + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (getSequence() + != other.getSequence()) return false; + if (getTimestampMs() + != other.getTimestampMs()) return false; + if (!getPcm() + .equals(other.getPcm())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SESSION_ID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + SEQUENCE_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getSequence()); + hash = (37 * hash) + TIMESTAMP_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getTimestampMs()); + hash = (37 * hash) + PCM_FIELD_NUMBER; + hash = (53 * hash) + getPcm().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioFrame parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioFrame prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioFrame} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioFrame) + cmvr.api.RobotAudio.RobotAudioFrameOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFrame_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFrame_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioFrame.class, cmvr.api.RobotAudio.RobotAudioFrame.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioFrame.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sessionId_ = ""; + + sequence_ = 0L; + + timestampMs_ = 0L; + + pcm_ = com.google.protobuf.ByteString.EMPTY; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioFrame_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame build() { + cmvr.api.RobotAudio.RobotAudioFrame result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame buildPartial() { + cmvr.api.RobotAudio.RobotAudioFrame result = new cmvr.api.RobotAudio.RobotAudioFrame(this); + result.sessionId_ = sessionId_; + result.sequence_ = sequence_; + result.timestampMs_ = timestampMs_; + result.pcm_ = pcm_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioFrame) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioFrame)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioFrame other) { + if (other == cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance()) return this; + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (other.getSequence() != 0L) { + setSequence(other.getSequence()); + } + if (other.getTimestampMs() != 0L) { + setTimestampMs(other.getTimestampMs()); + } + if (other.getPcm() != com.google.protobuf.ByteString.EMPTY) { + setPcm(other.getPcm()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + sessionId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 16: { + sequence_ = input.readInt64(); + + break; + } // case 16 + case 24: { + timestampMs_ = input.readInt64(); + + break; + } // case 24 + case 34: { + pcm_ = input.readBytes(); + + break; + } // case 34 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object sessionId_ = ""; + /** + * string session_id = 1; + * @return The sessionId. + */ + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string session_id = 1; + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + /** + * string session_id = 1; + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + /** + * string session_id = 1; + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private long sequence_ ; + /** + * int64 sequence = 2; + * @return The sequence. + */ + @java.lang.Override + public long getSequence() { + return sequence_; + } + /** + * int64 sequence = 2; + * @param value The sequence to set. + * @return This builder for chaining. + */ + public Builder setSequence(long value) { + + sequence_ = value; + onChanged(); + return this; + } + /** + * int64 sequence = 2; + * @return This builder for chaining. + */ + public Builder clearSequence() { + + sequence_ = 0L; + onChanged(); + return this; + } + + private long timestampMs_ ; + /** + *
+       * Robot upload: capture timestamp. Browser downlink: backend send timestamp.
+       * 
+ * + * int64 timestamp_ms = 3; + * @return The timestampMs. + */ + @java.lang.Override + public long getTimestampMs() { + return timestampMs_; + } + /** + *
+       * Robot upload: capture timestamp. Browser downlink: backend send timestamp.
+       * 
+ * + * int64 timestamp_ms = 3; + * @param value The timestampMs to set. + * @return This builder for chaining. + */ + public Builder setTimestampMs(long value) { + + timestampMs_ = value; + onChanged(); + return this; + } + /** + *
+       * Robot upload: capture timestamp. Browser downlink: backend send timestamp.
+       * 
+ * + * int64 timestamp_ms = 3; + * @return This builder for chaining. + */ + public Builder clearTimestampMs() { + + timestampMs_ = 0L; + onChanged(); + return this; + } + + private com.google.protobuf.ByteString pcm_ = com.google.protobuf.ByteString.EMPTY; + /** + *
+       * PCM_S16LE. Fixed 10 ms / 960 bytes at 48 kHz mono 16-bit.
+       * 
+ * + * bytes pcm = 4; + * @return The pcm. + */ + @java.lang.Override + public com.google.protobuf.ByteString getPcm() { + return pcm_; + } + /** + *
+       * PCM_S16LE. Fixed 10 ms / 960 bytes at 48 kHz mono 16-bit.
+       * 
+ * + * bytes pcm = 4; + * @param value The pcm to set. + * @return This builder for chaining. + */ + public Builder setPcm(com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + + pcm_ = value; + onChanged(); + return this; + } + /** + *
+       * PCM_S16LE. Fixed 10 ms / 960 bytes at 48 kHz mono 16-bit.
+       * 
+ * + * bytes pcm = 4; + * @return This builder for chaining. + */ + public Builder clearPcm() { + + pcm_ = getDefaultInstance().getPcm(); + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioFrame) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioFrame) + private static final cmvr.api.RobotAudio.RobotAudioFrame DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioFrame(); + } + + public static cmvr.api.RobotAudio.RobotAudioFrame getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioFrame parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioHeartbeatOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioHeartbeat) + com.google.protobuf.MessageOrBuilder { + + /** + * string session_id = 1; + * @return The sessionId. + */ + java.lang.String getSessionId(); + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * int64 timestamp_ms = 2; + * @return The timestampMs. + */ + long getTimestampMs(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioHeartbeat} + */ + public static final class RobotAudioHeartbeat extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioHeartbeat) + RobotAudioHeartbeatOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioHeartbeat.newBuilder() to construct. + private RobotAudioHeartbeat(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioHeartbeat() { + sessionId_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioHeartbeat(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioHeartbeat_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioHeartbeat_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioHeartbeat.class, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder.class); + } + + public static final int SESSION_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object sessionId_; + /** + * string session_id = 1; + * @return The sessionId. + */ + @java.lang.Override + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int TIMESTAMP_MS_FIELD_NUMBER = 2; + private long timestampMs_; + /** + * int64 timestamp_ms = 2; + * @return The timestampMs. + */ + @java.lang.Override + public long getTimestampMs() { + return timestampMs_; + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sessionId_); + } + if (timestampMs_ != 0L) { + output.writeInt64(2, timestampMs_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, sessionId_); + } + if (timestampMs_ != 0L) { + size += com.google.protobuf.CodedOutputStream + .computeInt64Size(2, timestampMs_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioHeartbeat)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioHeartbeat other = (cmvr.api.RobotAudio.RobotAudioHeartbeat) obj; + + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (getTimestampMs() + != other.getTimestampMs()) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SESSION_ID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + TIMESTAMP_MS_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashLong( + getTimestampMs()); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioHeartbeat parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioHeartbeat prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioHeartbeat} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioHeartbeat) + cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioHeartbeat_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioHeartbeat_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioHeartbeat.class, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioHeartbeat.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sessionId_ = ""; + + timestampMs_ = 0L; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioHeartbeat_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat build() { + cmvr.api.RobotAudio.RobotAudioHeartbeat result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat buildPartial() { + cmvr.api.RobotAudio.RobotAudioHeartbeat result = new cmvr.api.RobotAudio.RobotAudioHeartbeat(this); + result.sessionId_ = sessionId_; + result.timestampMs_ = timestampMs_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioHeartbeat) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioHeartbeat)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioHeartbeat other) { + if (other == cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance()) return this; + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (other.getTimestampMs() != 0L) { + setTimestampMs(other.getTimestampMs()); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + sessionId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 16: { + timestampMs_ = input.readInt64(); + + break; + } // case 16 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object sessionId_ = ""; + /** + * string session_id = 1; + * @return The sessionId. + */ + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string session_id = 1; + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + /** + * string session_id = 1; + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + /** + * string session_id = 1; + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private long timestampMs_ ; + /** + * int64 timestamp_ms = 2; + * @return The timestampMs. + */ + @java.lang.Override + public long getTimestampMs() { + return timestampMs_; + } + /** + * int64 timestamp_ms = 2; + * @param value The timestampMs to set. + * @return This builder for chaining. + */ + public Builder setTimestampMs(long value) { + + timestampMs_ = value; + onChanged(); + return this; + } + /** + * int64 timestamp_ms = 2; + * @return This builder for chaining. + */ + public Builder clearTimestampMs() { + + timestampMs_ = 0L; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioHeartbeat) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioHeartbeat) + private static final cmvr.api.RobotAudio.RobotAudioHeartbeat DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioHeartbeat(); + } + + public static cmvr.api.RobotAudio.RobotAudioHeartbeat getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioHeartbeat parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioStopOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioStop) + com.google.protobuf.MessageOrBuilder { + + /** + * string session_id = 1; + * @return The sessionId. + */ + java.lang.String getSessionId(); + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * string reason = 2; + * @return The reason. + */ + java.lang.String getReason(); + /** + * string reason = 2; + * @return The bytes for reason. + */ + com.google.protobuf.ByteString + getReasonBytes(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioStop} + */ + public static final class RobotAudioStop extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioStop) + RobotAudioStopOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioStop.newBuilder() to construct. + private RobotAudioStop(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioStop() { + sessionId_ = ""; + reason_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioStop(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStop_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStop_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioStop.class, cmvr.api.RobotAudio.RobotAudioStop.Builder.class); + } + + public static final int SESSION_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object sessionId_; + /** + * string session_id = 1; + * @return The sessionId. + */ + @java.lang.Override + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int REASON_FIELD_NUMBER = 2; + private volatile java.lang.Object reason_; + /** + * string reason = 2; + * @return The reason. + */ + @java.lang.Override + public java.lang.String getReason() { + java.lang.Object ref = reason_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + reason_ = s; + return s; + } + } + /** + * string reason = 2; + * @return The bytes for reason. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getReasonBytes() { + java.lang.Object ref = reason_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + reason_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sessionId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(reason_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 2, reason_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, sessionId_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(reason_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(2, reason_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioStop)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioStop other = (cmvr.api.RobotAudio.RobotAudioStop) obj; + + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (!getReason() + .equals(other.getReason())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SESSION_ID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + REASON_FIELD_NUMBER; + hash = (53 * hash) + getReason().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStop parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioStop prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioStop} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioStop) + cmvr.api.RobotAudio.RobotAudioStopOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStop_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStop_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioStop.class, cmvr.api.RobotAudio.RobotAudioStop.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioStop.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sessionId_ = ""; + + reason_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStop_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop build() { + cmvr.api.RobotAudio.RobotAudioStop result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop buildPartial() { + cmvr.api.RobotAudio.RobotAudioStop result = new cmvr.api.RobotAudio.RobotAudioStop(this); + result.sessionId_ = sessionId_; + result.reason_ = reason_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioStop) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioStop)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioStop other) { + if (other == cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance()) return this; + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (!other.getReason().isEmpty()) { + reason_ = other.reason_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + sessionId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 18: { + reason_ = input.readStringRequireUtf8(); + + break; + } // case 18 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object sessionId_ = ""; + /** + * string session_id = 1; + * @return The sessionId. + */ + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string session_id = 1; + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + /** + * string session_id = 1; + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + /** + * string session_id = 1; + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private java.lang.Object reason_ = ""; + /** + * string reason = 2; + * @return The reason. + */ + public java.lang.String getReason() { + java.lang.Object ref = reason_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + reason_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string reason = 2; + * @return The bytes for reason. + */ + public com.google.protobuf.ByteString + getReasonBytes() { + java.lang.Object ref = reason_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + reason_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string reason = 2; + * @param value The reason to set. + * @return This builder for chaining. + */ + public Builder setReason( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + reason_ = value; + onChanged(); + return this; + } + /** + * string reason = 2; + * @return This builder for chaining. + */ + public Builder clearReason() { + + reason_ = getDefaultInstance().getReason(); + onChanged(); + return this; + } + /** + * string reason = 2; + * @param value The bytes for reason to set. + * @return This builder for chaining. + */ + public Builder setReasonBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + reason_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioStop) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioStop) + private static final cmvr.api.RobotAudio.RobotAudioStop DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioStop(); + } + + public static cmvr.api.RobotAudio.RobotAudioStop getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioStop parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioErrorOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioError) + com.google.protobuf.MessageOrBuilder { + + /** + * string session_id = 1; + * @return The sessionId. + */ + java.lang.String getSessionId(); + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * int32 code = 2; + * @return The code. + */ + int getCode(); + + /** + * string message = 3; + * @return The message. + */ + java.lang.String getMessage(); + /** + * string message = 3; + * @return The bytes for message. + */ + com.google.protobuf.ByteString + getMessageBytes(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioError} + */ + public static final class RobotAudioError extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioError) + RobotAudioErrorOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioError.newBuilder() to construct. + private RobotAudioError(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioError() { + sessionId_ = ""; + message_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioError(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioError_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioError_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioError.class, cmvr.api.RobotAudio.RobotAudioError.Builder.class); + } + + public static final int SESSION_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object sessionId_; + /** + * string session_id = 1; + * @return The sessionId. + */ + @java.lang.Override + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int CODE_FIELD_NUMBER = 2; + private int code_; + /** + * int32 code = 2; + * @return The code. + */ + @java.lang.Override + public int getCode() { + return code_; + } + + public static final int MESSAGE_FIELD_NUMBER = 3; + private volatile java.lang.Object message_; + /** + * string message = 3; + * @return The message. + */ + @java.lang.Override + public java.lang.String getMessage() { + java.lang.Object ref = message_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + message_ = s; + return s; + } + } + /** + * string message = 3; + * @return The bytes for message. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMessageBytes() { + java.lang.Object ref = message_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sessionId_); + } + if (code_ != 0) { + output.writeInt32(2, code_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, message_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, sessionId_); + } + if (code_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(2, code_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, message_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioError)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioError other = (cmvr.api.RobotAudio.RobotAudioError) obj; + + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (getCode() + != other.getCode()) return false; + if (!getMessage() + .equals(other.getMessage())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SESSION_ID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + CODE_FIELD_NUMBER; + hash = (53 * hash) + getCode(); + hash = (37 * hash) + MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getMessage().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioError parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioError parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioError parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioError prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioError} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioError) + cmvr.api.RobotAudio.RobotAudioErrorOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioError_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioError_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioError.class, cmvr.api.RobotAudio.RobotAudioError.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioError.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sessionId_ = ""; + + code_ = 0; + + message_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioError_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError build() { + cmvr.api.RobotAudio.RobotAudioError result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError buildPartial() { + cmvr.api.RobotAudio.RobotAudioError result = new cmvr.api.RobotAudio.RobotAudioError(this); + result.sessionId_ = sessionId_; + result.code_ = code_; + result.message_ = message_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioError) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioError)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioError other) { + if (other == cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance()) return this; + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (other.getCode() != 0) { + setCode(other.getCode()); + } + if (!other.getMessage().isEmpty()) { + message_ = other.message_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + sessionId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 16: { + code_ = input.readInt32(); + + break; + } // case 16 + case 26: { + message_ = input.readStringRequireUtf8(); + + break; + } // case 26 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object sessionId_ = ""; + /** + * string session_id = 1; + * @return The sessionId. + */ + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string session_id = 1; + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + /** + * string session_id = 1; + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + /** + * string session_id = 1; + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private int code_ ; + /** + * int32 code = 2; + * @return The code. + */ + @java.lang.Override + public int getCode() { + return code_; + } + /** + * int32 code = 2; + * @param value The code to set. + * @return This builder for chaining. + */ + public Builder setCode(int value) { + + code_ = value; + onChanged(); + return this; + } + /** + * int32 code = 2; + * @return This builder for chaining. + */ + public Builder clearCode() { + + code_ = 0; + onChanged(); + return this; + } + + private java.lang.Object message_ = ""; + /** + * string message = 3; + * @return The message. + */ + public java.lang.String getMessage() { + java.lang.Object ref = message_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + message_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string message = 3; + * @return The bytes for message. + */ + public com.google.protobuf.ByteString + getMessageBytes() { + java.lang.Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string message = 3; + * @param value The message to set. + * @return This builder for chaining. + */ + public Builder setMessage( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + message_ = value; + onChanged(); + return this; + } + /** + * string message = 3; + * @return This builder for chaining. + */ + public Builder clearMessage() { + + message_ = getDefaultInstance().getMessage(); + onChanged(); + return this; + } + /** + * string message = 3; + * @param value The bytes for message to set. + * @return This builder for chaining. + */ + public Builder setMessageBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + message_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioError) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioError) + private static final cmvr.api.RobotAudio.RobotAudioError DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioError(); + } + + public static cmvr.api.RobotAudio.RobotAudioError getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioError parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioStartAckOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioStartAck) + com.google.protobuf.MessageOrBuilder { + + /** + * string session_id = 1; + * @return The sessionId. + */ + java.lang.String getSessionId(); + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + com.google.protobuf.ByteString + getSessionIdBytes(); + + /** + * bool accepted = 2; + * @return The accepted. + */ + boolean getAccepted(); + + /** + * string message = 3; + * @return The message. + */ + java.lang.String getMessage(); + /** + * string message = 3; + * @return The bytes for message. + */ + com.google.protobuf.ByteString + getMessageBytes(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioStartAck} + */ + public static final class RobotAudioStartAck extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioStartAck) + RobotAudioStartAckOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioStartAck.newBuilder() to construct. + private RobotAudioStartAck(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioStartAck() { + sessionId_ = ""; + message_ = ""; + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioStartAck(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStartAck_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStartAck_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioStartAck.class, cmvr.api.RobotAudio.RobotAudioStartAck.Builder.class); + } + + public static final int SESSION_ID_FIELD_NUMBER = 1; + private volatile java.lang.Object sessionId_; + /** + * string session_id = 1; + * @return The sessionId. + */ + @java.lang.Override + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + public static final int ACCEPTED_FIELD_NUMBER = 2; + private boolean accepted_; + /** + * bool accepted = 2; + * @return The accepted. + */ + @java.lang.Override + public boolean getAccepted() { + return accepted_; + } + + public static final int MESSAGE_FIELD_NUMBER = 3; + private volatile java.lang.Object message_; + /** + * string message = 3; + * @return The message. + */ + @java.lang.Override + public java.lang.String getMessage() { + java.lang.Object ref = message_; + if (ref instanceof java.lang.String) { + return (java.lang.String) ref; + } else { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + message_ = s; + return s; + } + } + /** + * string message = 3; + * @return The bytes for message. + */ + @java.lang.Override + public com.google.protobuf.ByteString + getMessageBytes() { + java.lang.Object ref = message_; + if (ref instanceof java.lang.String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 1, sessionId_); + } + if (accepted_ != false) { + output.writeBool(2, accepted_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) { + com.google.protobuf.GeneratedMessageV3.writeString(output, 3, message_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(sessionId_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(1, sessionId_); + } + if (accepted_ != false) { + size += com.google.protobuf.CodedOutputStream + .computeBoolSize(2, accepted_); + } + if (!com.google.protobuf.GeneratedMessageV3.isStringEmpty(message_)) { + size += com.google.protobuf.GeneratedMessageV3.computeStringSize(3, message_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioStartAck)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioStartAck other = (cmvr.api.RobotAudio.RobotAudioStartAck) obj; + + if (!getSessionId() + .equals(other.getSessionId())) return false; + if (getAccepted() + != other.getAccepted()) return false; + if (!getMessage() + .equals(other.getMessage())) return false; + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + hash = (37 * hash) + SESSION_ID_FIELD_NUMBER; + hash = (53 * hash) + getSessionId().hashCode(); + hash = (37 * hash) + ACCEPTED_FIELD_NUMBER; + hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( + getAccepted()); + hash = (37 * hash) + MESSAGE_FIELD_NUMBER; + hash = (53 * hash) + getMessage().hashCode(); + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioStartAck parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioStartAck prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioStartAck} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioStartAck) + cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStartAck_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStartAck_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioStartAck.class, cmvr.api.RobotAudio.RobotAudioStartAck.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioStartAck.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + sessionId_ = ""; + + accepted_ = false; + + message_ = ""; + + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioStartAck_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAck getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAck build() { + cmvr.api.RobotAudio.RobotAudioStartAck result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAck buildPartial() { + cmvr.api.RobotAudio.RobotAudioStartAck result = new cmvr.api.RobotAudio.RobotAudioStartAck(this); + result.sessionId_ = sessionId_; + result.accepted_ = accepted_; + result.message_ = message_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioStartAck) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioStartAck)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioStartAck other) { + if (other == cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance()) return this; + if (!other.getSessionId().isEmpty()) { + sessionId_ = other.sessionId_; + onChanged(); + } + if (other.getAccepted() != false) { + setAccepted(other.getAccepted()); + } + if (!other.getMessage().isEmpty()) { + message_ = other.message_; + onChanged(); + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + sessionId_ = input.readStringRequireUtf8(); + + break; + } // case 10 + case 16: { + accepted_ = input.readBool(); + + break; + } // case 16 + case 26: { + message_ = input.readStringRequireUtf8(); + + break; + } // case 26 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + + private java.lang.Object sessionId_ = ""; + /** + * string session_id = 1; + * @return The sessionId. + */ + public java.lang.String getSessionId() { + java.lang.Object ref = sessionId_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + sessionId_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string session_id = 1; + * @return The bytes for sessionId. + */ + public com.google.protobuf.ByteString + getSessionIdBytes() { + java.lang.Object ref = sessionId_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + sessionId_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string session_id = 1; + * @param value The sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionId( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + sessionId_ = value; + onChanged(); + return this; + } + /** + * string session_id = 1; + * @return This builder for chaining. + */ + public Builder clearSessionId() { + + sessionId_ = getDefaultInstance().getSessionId(); + onChanged(); + return this; + } + /** + * string session_id = 1; + * @param value The bytes for sessionId to set. + * @return This builder for chaining. + */ + public Builder setSessionIdBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + sessionId_ = value; + onChanged(); + return this; + } + + private boolean accepted_ ; + /** + * bool accepted = 2; + * @return The accepted. + */ + @java.lang.Override + public boolean getAccepted() { + return accepted_; + } + /** + * bool accepted = 2; + * @param value The accepted to set. + * @return This builder for chaining. + */ + public Builder setAccepted(boolean value) { + + accepted_ = value; + onChanged(); + return this; + } + /** + * bool accepted = 2; + * @return This builder for chaining. + */ + public Builder clearAccepted() { + + accepted_ = false; + onChanged(); + return this; + } + + private java.lang.Object message_ = ""; + /** + * string message = 3; + * @return The message. + */ + public java.lang.String getMessage() { + java.lang.Object ref = message_; + if (!(ref instanceof java.lang.String)) { + com.google.protobuf.ByteString bs = + (com.google.protobuf.ByteString) ref; + java.lang.String s = bs.toStringUtf8(); + message_ = s; + return s; + } else { + return (java.lang.String) ref; + } + } + /** + * string message = 3; + * @return The bytes for message. + */ + public com.google.protobuf.ByteString + getMessageBytes() { + java.lang.Object ref = message_; + if (ref instanceof String) { + com.google.protobuf.ByteString b = + com.google.protobuf.ByteString.copyFromUtf8( + (java.lang.String) ref); + message_ = b; + return b; + } else { + return (com.google.protobuf.ByteString) ref; + } + } + /** + * string message = 3; + * @param value The message to set. + * @return This builder for chaining. + */ + public Builder setMessage( + java.lang.String value) { + if (value == null) { + throw new NullPointerException(); + } + + message_ = value; + onChanged(); + return this; + } + /** + * string message = 3; + * @return This builder for chaining. + */ + public Builder clearMessage() { + + message_ = getDefaultInstance().getMessage(); + onChanged(); + return this; + } + /** + * string message = 3; + * @param value The bytes for message to set. + * @return This builder for chaining. + */ + public Builder setMessageBytes( + com.google.protobuf.ByteString value) { + if (value == null) { + throw new NullPointerException(); + } + checkByteStringIsUtf8(value); + + message_ = value; + onChanged(); + return this; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioStartAck) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioStartAck) + private static final cmvr.api.RobotAudio.RobotAudioStartAck DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioStartAck(); + } + + public static cmvr.api.RobotAudio.RobotAudioStartAck getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioStartAck parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAck getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioRequestOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioRequest) + com.google.protobuf.MessageOrBuilder { + + /** + * .cmvr.api.CommandHeader.Request header = 1; + * @return Whether the header field is set. + */ + boolean hasHeader(); + /** + * .cmvr.api.CommandHeader.Request header = 1; + * @return The header. + */ + cmvr.api.Common.CommandHeader.Request getHeader(); + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + cmvr.api.Common.CommandHeader.RequestOrBuilder getHeaderOrBuilder(); + + /** + * .cmvr.api.RobotAudioStart start = 2; + * @return Whether the start field is set. + */ + boolean hasStart(); + /** + * .cmvr.api.RobotAudioStart start = 2; + * @return The start. + */ + cmvr.api.RobotAudio.RobotAudioStart getStart(); + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + cmvr.api.RobotAudio.RobotAudioStartOrBuilder getStartOrBuilder(); + + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return Whether the audioFrame field is set. + */ + boolean hasAudioFrame(); + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return The audioFrame. + */ + cmvr.api.RobotAudio.RobotAudioFrame getAudioFrame(); + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + cmvr.api.RobotAudio.RobotAudioFrameOrBuilder getAudioFrameOrBuilder(); + + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return Whether the heartbeat field is set. + */ + boolean hasHeartbeat(); + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return The heartbeat. + */ + cmvr.api.RobotAudio.RobotAudioHeartbeat getHeartbeat(); + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder getHeartbeatOrBuilder(); + + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return Whether the stop field is set. + */ + boolean hasStop(); + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return The stop. + */ + cmvr.api.RobotAudio.RobotAudioStop getStop(); + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + cmvr.api.RobotAudio.RobotAudioStopOrBuilder getStopOrBuilder(); + + /** + * .cmvr.api.RobotAudioError error = 6; + * @return Whether the error field is set. + */ + boolean hasError(); + /** + * .cmvr.api.RobotAudioError error = 6; + * @return The error. + */ + cmvr.api.RobotAudio.RobotAudioError getError(); + /** + * .cmvr.api.RobotAudioError error = 6; + */ + cmvr.api.RobotAudio.RobotAudioErrorOrBuilder getErrorOrBuilder(); + + public cmvr.api.RobotAudio.RobotAudioRequest.PayloadCase getPayloadCase(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioRequest} + */ + public static final class RobotAudioRequest extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioRequest) + RobotAudioRequestOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioRequest.newBuilder() to construct. + private RobotAudioRequest(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioRequest() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioRequest(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioRequest.class, cmvr.api.RobotAudio.RobotAudioRequest.Builder.class); + } + + private int payloadCase_ = 0; + private java.lang.Object payload_; + public enum PayloadCase + implements com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + START(2), + AUDIO_FRAME(3), + HEARTBEAT(4), + STOP(5), + ERROR(6), + PAYLOAD_NOT_SET(0); + private final int value; + private PayloadCase(int value) { + this.value = value; + } + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static PayloadCase valueOf(int value) { + return forNumber(value); + } + + public static PayloadCase forNumber(int value) { + switch (value) { + case 2: return START; + case 3: return AUDIO_FRAME; + case 4: return HEARTBEAT; + case 5: return STOP; + case 6: return ERROR; + case 0: return PAYLOAD_NOT_SET; + default: return null; + } + } + public int getNumber() { + return this.value; + } + }; + + public PayloadCase + getPayloadCase() { + return PayloadCase.forNumber( + payloadCase_); + } + + public static final int HEADER_FIELD_NUMBER = 1; + private cmvr.api.Common.CommandHeader.Request header_; + /** + * .cmvr.api.CommandHeader.Request header = 1; + * @return Whether the header field is set. + */ + @java.lang.Override + public boolean hasHeader() { + return header_ != null; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + * @return The header. + */ + @java.lang.Override + public cmvr.api.Common.CommandHeader.Request getHeader() { + return header_ == null ? cmvr.api.Common.CommandHeader.Request.getDefaultInstance() : header_; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + @java.lang.Override + public cmvr.api.Common.CommandHeader.RequestOrBuilder getHeaderOrBuilder() { + return getHeader(); + } + + public static final int START_FIELD_NUMBER = 2; + /** + * .cmvr.api.RobotAudioStart start = 2; + * @return Whether the start field is set. + */ + @java.lang.Override + public boolean hasStart() { + return payloadCase_ == 2; + } + /** + * .cmvr.api.RobotAudioStart start = 2; + * @return The start. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStart getStart() { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStart) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartOrBuilder getStartOrBuilder() { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStart) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } + + public static final int AUDIO_FRAME_FIELD_NUMBER = 3; + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return Whether the audioFrame field is set. + */ + @java.lang.Override + public boolean hasAudioFrame() { + return payloadCase_ == 3; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return The audioFrame. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame getAudioFrame() { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrameOrBuilder getAudioFrameOrBuilder() { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + + public static final int HEARTBEAT_FIELD_NUMBER = 4; + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return Whether the heartbeat field is set. + */ + @java.lang.Override + public boolean hasHeartbeat() { + return payloadCase_ == 4; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return The heartbeat. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat getHeartbeat() { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder getHeartbeatOrBuilder() { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + + public static final int STOP_FIELD_NUMBER = 5; + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return Whether the stop field is set. + */ + @java.lang.Override + public boolean hasStop() { + return payloadCase_ == 5; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return The stop. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop getStop() { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStopOrBuilder getStopOrBuilder() { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + + public static final int ERROR_FIELD_NUMBER = 6; + /** + * .cmvr.api.RobotAudioError error = 6; + * @return Whether the error field is set. + */ + @java.lang.Override + public boolean hasError() { + return payloadCase_ == 6; + } + /** + * .cmvr.api.RobotAudioError error = 6; + * @return The error. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError getError() { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioErrorOrBuilder getErrorOrBuilder() { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (header_ != null) { + output.writeMessage(1, getHeader()); + } + if (payloadCase_ == 2) { + output.writeMessage(2, (cmvr.api.RobotAudio.RobotAudioStart) payload_); + } + if (payloadCase_ == 3) { + output.writeMessage(3, (cmvr.api.RobotAudio.RobotAudioFrame) payload_); + } + if (payloadCase_ == 4) { + output.writeMessage(4, (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_); + } + if (payloadCase_ == 5) { + output.writeMessage(5, (cmvr.api.RobotAudio.RobotAudioStop) payload_); + } + if (payloadCase_ == 6) { + output.writeMessage(6, (cmvr.api.RobotAudio.RobotAudioError) payload_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (header_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getHeader()); + } + if (payloadCase_ == 2) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, (cmvr.api.RobotAudio.RobotAudioStart) payload_); + } + if (payloadCase_ == 3) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, (cmvr.api.RobotAudio.RobotAudioFrame) payload_); + } + if (payloadCase_ == 4) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_); + } + if (payloadCase_ == 5) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, (cmvr.api.RobotAudio.RobotAudioStop) payload_); + } + if (payloadCase_ == 6) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, (cmvr.api.RobotAudio.RobotAudioError) payload_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioRequest)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioRequest other = (cmvr.api.RobotAudio.RobotAudioRequest) obj; + + if (hasHeader() != other.hasHeader()) return false; + if (hasHeader()) { + if (!getHeader() + .equals(other.getHeader())) return false; + } + if (!getPayloadCase().equals(other.getPayloadCase())) return false; + switch (payloadCase_) { + case 2: + if (!getStart() + .equals(other.getStart())) return false; + break; + case 3: + if (!getAudioFrame() + .equals(other.getAudioFrame())) return false; + break; + case 4: + if (!getHeartbeat() + .equals(other.getHeartbeat())) return false; + break; + case 5: + if (!getStop() + .equals(other.getStop())) return false; + break; + case 6: + if (!getError() + .equals(other.getError())) return false; + break; + case 0: + default: + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasHeader()) { + hash = (37 * hash) + HEADER_FIELD_NUMBER; + hash = (53 * hash) + getHeader().hashCode(); + } + switch (payloadCase_) { + case 2: + hash = (37 * hash) + START_FIELD_NUMBER; + hash = (53 * hash) + getStart().hashCode(); + break; + case 3: + hash = (37 * hash) + AUDIO_FRAME_FIELD_NUMBER; + hash = (53 * hash) + getAudioFrame().hashCode(); + break; + case 4: + hash = (37 * hash) + HEARTBEAT_FIELD_NUMBER; + hash = (53 * hash) + getHeartbeat().hashCode(); + break; + case 5: + hash = (37 * hash) + STOP_FIELD_NUMBER; + hash = (53 * hash) + getStop().hashCode(); + break; + case 6: + hash = (37 * hash) + ERROR_FIELD_NUMBER; + hash = (53 * hash) + getError().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioRequest parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioRequest prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioRequest} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioRequest) + cmvr.api.RobotAudio.RobotAudioRequestOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioRequest_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioRequest_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioRequest.class, cmvr.api.RobotAudio.RobotAudioRequest.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioRequest.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (headerBuilder_ == null) { + header_ = null; + } else { + header_ = null; + headerBuilder_ = null; + } + if (startBuilder_ != null) { + startBuilder_.clear(); + } + if (audioFrameBuilder_ != null) { + audioFrameBuilder_.clear(); + } + if (heartbeatBuilder_ != null) { + heartbeatBuilder_.clear(); + } + if (stopBuilder_ != null) { + stopBuilder_.clear(); + } + if (errorBuilder_ != null) { + errorBuilder_.clear(); + } + payloadCase_ = 0; + payload_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioRequest_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioRequest getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioRequest.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioRequest build() { + cmvr.api.RobotAudio.RobotAudioRequest result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioRequest buildPartial() { + cmvr.api.RobotAudio.RobotAudioRequest result = new cmvr.api.RobotAudio.RobotAudioRequest(this); + if (headerBuilder_ == null) { + result.header_ = header_; + } else { + result.header_ = headerBuilder_.build(); + } + if (payloadCase_ == 2) { + if (startBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = startBuilder_.build(); + } + } + if (payloadCase_ == 3) { + if (audioFrameBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = audioFrameBuilder_.build(); + } + } + if (payloadCase_ == 4) { + if (heartbeatBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = heartbeatBuilder_.build(); + } + } + if (payloadCase_ == 5) { + if (stopBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = stopBuilder_.build(); + } + } + if (payloadCase_ == 6) { + if (errorBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = errorBuilder_.build(); + } + } + result.payloadCase_ = payloadCase_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioRequest) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioRequest)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioRequest other) { + if (other == cmvr.api.RobotAudio.RobotAudioRequest.getDefaultInstance()) return this; + if (other.hasHeader()) { + mergeHeader(other.getHeader()); + } + switch (other.getPayloadCase()) { + case START: { + mergeStart(other.getStart()); + break; + } + case AUDIO_FRAME: { + mergeAudioFrame(other.getAudioFrame()); + break; + } + case HEARTBEAT: { + mergeHeartbeat(other.getHeartbeat()); + break; + } + case STOP: { + mergeStop(other.getStop()); + break; + } + case ERROR: { + mergeError(other.getError()); + break; + } + case PAYLOAD_NOT_SET: { + break; + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + input.readMessage( + getHeaderFieldBuilder().getBuilder(), + extensionRegistry); + + break; + } // case 10 + case 18: { + input.readMessage( + getStartFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 2; + break; + } // case 18 + case 26: { + input.readMessage( + getAudioFrameFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 3; + break; + } // case 26 + case 34: { + input.readMessage( + getHeartbeatFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 4; + break; + } // case 34 + case 42: { + input.readMessage( + getStopFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 5; + break; + } // case 42 + case 50: { + input.readMessage( + getErrorFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 6; + break; + } // case 50 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int payloadCase_ = 0; + private java.lang.Object payload_; + public PayloadCase + getPayloadCase() { + return PayloadCase.forNumber( + payloadCase_); + } + + public Builder clearPayload() { + payloadCase_ = 0; + payload_ = null; + onChanged(); + return this; + } + + + private cmvr.api.Common.CommandHeader.Request header_; + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Request, cmvr.api.Common.CommandHeader.Request.Builder, cmvr.api.Common.CommandHeader.RequestOrBuilder> headerBuilder_; + /** + * .cmvr.api.CommandHeader.Request header = 1; + * @return Whether the header field is set. + */ + public boolean hasHeader() { + return headerBuilder_ != null || header_ != null; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + * @return The header. + */ + public cmvr.api.Common.CommandHeader.Request getHeader() { + if (headerBuilder_ == null) { + return header_ == null ? cmvr.api.Common.CommandHeader.Request.getDefaultInstance() : header_; + } else { + return headerBuilder_.getMessage(); + } + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + public Builder setHeader(cmvr.api.Common.CommandHeader.Request value) { + if (headerBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + header_ = value; + onChanged(); + } else { + headerBuilder_.setMessage(value); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + public Builder setHeader( + cmvr.api.Common.CommandHeader.Request.Builder builderForValue) { + if (headerBuilder_ == null) { + header_ = builderForValue.build(); + onChanged(); + } else { + headerBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + public Builder mergeHeader(cmvr.api.Common.CommandHeader.Request value) { + if (headerBuilder_ == null) { + if (header_ != null) { + header_ = + cmvr.api.Common.CommandHeader.Request.newBuilder(header_).mergeFrom(value).buildPartial(); + } else { + header_ = value; + } + onChanged(); + } else { + headerBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + public Builder clearHeader() { + if (headerBuilder_ == null) { + header_ = null; + onChanged(); + } else { + header_ = null; + headerBuilder_ = null; + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + public cmvr.api.Common.CommandHeader.Request.Builder getHeaderBuilder() { + + onChanged(); + return getHeaderFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + public cmvr.api.Common.CommandHeader.RequestOrBuilder getHeaderOrBuilder() { + if (headerBuilder_ != null) { + return headerBuilder_.getMessageOrBuilder(); + } else { + return header_ == null ? + cmvr.api.Common.CommandHeader.Request.getDefaultInstance() : header_; + } + } + /** + * .cmvr.api.CommandHeader.Request header = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Request, cmvr.api.Common.CommandHeader.Request.Builder, cmvr.api.Common.CommandHeader.RequestOrBuilder> + getHeaderFieldBuilder() { + if (headerBuilder_ == null) { + headerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Request, cmvr.api.Common.CommandHeader.Request.Builder, cmvr.api.Common.CommandHeader.RequestOrBuilder>( + getHeader(), + getParentForChildren(), + isClean()); + header_ = null; + } + return headerBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStart, cmvr.api.RobotAudio.RobotAudioStart.Builder, cmvr.api.RobotAudio.RobotAudioStartOrBuilder> startBuilder_; + /** + * .cmvr.api.RobotAudioStart start = 2; + * @return Whether the start field is set. + */ + @java.lang.Override + public boolean hasStart() { + return payloadCase_ == 2; + } + /** + * .cmvr.api.RobotAudioStart start = 2; + * @return The start. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStart getStart() { + if (startBuilder_ == null) { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStart) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } else { + if (payloadCase_ == 2) { + return startBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + public Builder setStart(cmvr.api.RobotAudio.RobotAudioStart value) { + if (startBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + startBuilder_.setMessage(value); + } + payloadCase_ = 2; + return this; + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + public Builder setStart( + cmvr.api.RobotAudio.RobotAudioStart.Builder builderForValue) { + if (startBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + startBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 2; + return this; + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + public Builder mergeStart(cmvr.api.RobotAudio.RobotAudioStart value) { + if (startBuilder_ == null) { + if (payloadCase_ == 2 && + payload_ != cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioStart.newBuilder((cmvr.api.RobotAudio.RobotAudioStart) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 2) { + startBuilder_.mergeFrom(value); + } else { + startBuilder_.setMessage(value); + } + } + payloadCase_ = 2; + return this; + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + public Builder clearStart() { + if (startBuilder_ == null) { + if (payloadCase_ == 2) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 2) { + payloadCase_ = 0; + payload_ = null; + } + startBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + public cmvr.api.RobotAudio.RobotAudioStart.Builder getStartBuilder() { + return getStartFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartOrBuilder getStartOrBuilder() { + if ((payloadCase_ == 2) && (startBuilder_ != null)) { + return startBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStart) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStart start = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStart, cmvr.api.RobotAudio.RobotAudioStart.Builder, cmvr.api.RobotAudio.RobotAudioStartOrBuilder> + getStartFieldBuilder() { + if (startBuilder_ == null) { + if (!(payloadCase_ == 2)) { + payload_ = cmvr.api.RobotAudio.RobotAudioStart.getDefaultInstance(); + } + startBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStart, cmvr.api.RobotAudio.RobotAudioStart.Builder, cmvr.api.RobotAudio.RobotAudioStartOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioStart) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 2; + onChanged();; + return startBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFrame, cmvr.api.RobotAudio.RobotAudioFrame.Builder, cmvr.api.RobotAudio.RobotAudioFrameOrBuilder> audioFrameBuilder_; + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return Whether the audioFrame field is set. + */ + @java.lang.Override + public boolean hasAudioFrame() { + return payloadCase_ == 3; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return The audioFrame. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame getAudioFrame() { + if (audioFrameBuilder_ == null) { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } else { + if (payloadCase_ == 3) { + return audioFrameBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder setAudioFrame(cmvr.api.RobotAudio.RobotAudioFrame value) { + if (audioFrameBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + audioFrameBuilder_.setMessage(value); + } + payloadCase_ = 3; + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder setAudioFrame( + cmvr.api.RobotAudio.RobotAudioFrame.Builder builderForValue) { + if (audioFrameBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + audioFrameBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 3; + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder mergeAudioFrame(cmvr.api.RobotAudio.RobotAudioFrame value) { + if (audioFrameBuilder_ == null) { + if (payloadCase_ == 3 && + payload_ != cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioFrame.newBuilder((cmvr.api.RobotAudio.RobotAudioFrame) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 3) { + audioFrameBuilder_.mergeFrom(value); + } else { + audioFrameBuilder_.setMessage(value); + } + } + payloadCase_ = 3; + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder clearAudioFrame() { + if (audioFrameBuilder_ == null) { + if (payloadCase_ == 3) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 3) { + payloadCase_ = 0; + payload_ = null; + } + audioFrameBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public cmvr.api.RobotAudio.RobotAudioFrame.Builder getAudioFrameBuilder() { + return getAudioFrameFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrameOrBuilder getAudioFrameOrBuilder() { + if ((payloadCase_ == 3) && (audioFrameBuilder_ != null)) { + return audioFrameBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFrame, cmvr.api.RobotAudio.RobotAudioFrame.Builder, cmvr.api.RobotAudio.RobotAudioFrameOrBuilder> + getAudioFrameFieldBuilder() { + if (audioFrameBuilder_ == null) { + if (!(payloadCase_ == 3)) { + payload_ = cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + audioFrameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFrame, cmvr.api.RobotAudio.RobotAudioFrame.Builder, cmvr.api.RobotAudio.RobotAudioFrameOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioFrame) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 3; + onChanged();; + return audioFrameBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioHeartbeat, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder, cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder> heartbeatBuilder_; + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return Whether the heartbeat field is set. + */ + @java.lang.Override + public boolean hasHeartbeat() { + return payloadCase_ == 4; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return The heartbeat. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat getHeartbeat() { + if (heartbeatBuilder_ == null) { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } else { + if (payloadCase_ == 4) { + return heartbeatBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder setHeartbeat(cmvr.api.RobotAudio.RobotAudioHeartbeat value) { + if (heartbeatBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + heartbeatBuilder_.setMessage(value); + } + payloadCase_ = 4; + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder setHeartbeat( + cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder builderForValue) { + if (heartbeatBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + heartbeatBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 4; + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder mergeHeartbeat(cmvr.api.RobotAudio.RobotAudioHeartbeat value) { + if (heartbeatBuilder_ == null) { + if (payloadCase_ == 4 && + payload_ != cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioHeartbeat.newBuilder((cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 4) { + heartbeatBuilder_.mergeFrom(value); + } else { + heartbeatBuilder_.setMessage(value); + } + } + payloadCase_ = 4; + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder clearHeartbeat() { + if (heartbeatBuilder_ == null) { + if (payloadCase_ == 4) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 4) { + payloadCase_ = 0; + payload_ = null; + } + heartbeatBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder getHeartbeatBuilder() { + return getHeartbeatFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder getHeartbeatOrBuilder() { + if ((payloadCase_ == 4) && (heartbeatBuilder_ != null)) { + return heartbeatBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioHeartbeat, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder, cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder> + getHeartbeatFieldBuilder() { + if (heartbeatBuilder_ == null) { + if (!(payloadCase_ == 4)) { + payload_ = cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + heartbeatBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioHeartbeat, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder, cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 4; + onChanged();; + return heartbeatBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStop, cmvr.api.RobotAudio.RobotAudioStop.Builder, cmvr.api.RobotAudio.RobotAudioStopOrBuilder> stopBuilder_; + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return Whether the stop field is set. + */ + @java.lang.Override + public boolean hasStop() { + return payloadCase_ == 5; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return The stop. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop getStop() { + if (stopBuilder_ == null) { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } else { + if (payloadCase_ == 5) { + return stopBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder setStop(cmvr.api.RobotAudio.RobotAudioStop value) { + if (stopBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + stopBuilder_.setMessage(value); + } + payloadCase_ = 5; + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder setStop( + cmvr.api.RobotAudio.RobotAudioStop.Builder builderForValue) { + if (stopBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + stopBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 5; + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder mergeStop(cmvr.api.RobotAudio.RobotAudioStop value) { + if (stopBuilder_ == null) { + if (payloadCase_ == 5 && + payload_ != cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioStop.newBuilder((cmvr.api.RobotAudio.RobotAudioStop) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 5) { + stopBuilder_.mergeFrom(value); + } else { + stopBuilder_.setMessage(value); + } + } + payloadCase_ = 5; + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder clearStop() { + if (stopBuilder_ == null) { + if (payloadCase_ == 5) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 5) { + payloadCase_ = 0; + payload_ = null; + } + stopBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public cmvr.api.RobotAudio.RobotAudioStop.Builder getStopBuilder() { + return getStopFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStopOrBuilder getStopOrBuilder() { + if ((payloadCase_ == 5) && (stopBuilder_ != null)) { + return stopBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStop, cmvr.api.RobotAudio.RobotAudioStop.Builder, cmvr.api.RobotAudio.RobotAudioStopOrBuilder> + getStopFieldBuilder() { + if (stopBuilder_ == null) { + if (!(payloadCase_ == 5)) { + payload_ = cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + stopBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStop, cmvr.api.RobotAudio.RobotAudioStop.Builder, cmvr.api.RobotAudio.RobotAudioStopOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioStop) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 5; + onChanged();; + return stopBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioError, cmvr.api.RobotAudio.RobotAudioError.Builder, cmvr.api.RobotAudio.RobotAudioErrorOrBuilder> errorBuilder_; + /** + * .cmvr.api.RobotAudioError error = 6; + * @return Whether the error field is set. + */ + @java.lang.Override + public boolean hasError() { + return payloadCase_ == 6; + } + /** + * .cmvr.api.RobotAudioError error = 6; + * @return The error. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError getError() { + if (errorBuilder_ == null) { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } else { + if (payloadCase_ == 6) { + return errorBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder setError(cmvr.api.RobotAudio.RobotAudioError value) { + if (errorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + errorBuilder_.setMessage(value); + } + payloadCase_ = 6; + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder setError( + cmvr.api.RobotAudio.RobotAudioError.Builder builderForValue) { + if (errorBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + errorBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 6; + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder mergeError(cmvr.api.RobotAudio.RobotAudioError value) { + if (errorBuilder_ == null) { + if (payloadCase_ == 6 && + payload_ != cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioError.newBuilder((cmvr.api.RobotAudio.RobotAudioError) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 6) { + errorBuilder_.mergeFrom(value); + } else { + errorBuilder_.setMessage(value); + } + } + payloadCase_ = 6; + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder clearError() { + if (errorBuilder_ == null) { + if (payloadCase_ == 6) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 6) { + payloadCase_ = 0; + payload_ = null; + } + errorBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public cmvr.api.RobotAudio.RobotAudioError.Builder getErrorBuilder() { + return getErrorFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioErrorOrBuilder getErrorOrBuilder() { + if ((payloadCase_ == 6) && (errorBuilder_ != null)) { + return errorBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioError, cmvr.api.RobotAudio.RobotAudioError.Builder, cmvr.api.RobotAudio.RobotAudioErrorOrBuilder> + getErrorFieldBuilder() { + if (errorBuilder_ == null) { + if (!(payloadCase_ == 6)) { + payload_ = cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + errorBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioError, cmvr.api.RobotAudio.RobotAudioError.Builder, cmvr.api.RobotAudio.RobotAudioErrorOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioError) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 6; + onChanged();; + return errorBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioRequest) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioRequest) + private static final cmvr.api.RobotAudio.RobotAudioRequest DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioRequest(); + } + + public static cmvr.api.RobotAudio.RobotAudioRequest getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioRequest parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioRequest getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + public interface RobotAudioResponseOrBuilder extends + // @@protoc_insertion_point(interface_extends:cmvr.api.RobotAudioResponse) + com.google.protobuf.MessageOrBuilder { + + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return Whether the header field is set. + */ + boolean hasHeader(); + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return The header. + */ + cmvr.api.Common.CommandHeader.Feedback getHeader(); + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + cmvr.api.Common.CommandHeader.FeedbackOrBuilder getHeaderOrBuilder(); + + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + * @return Whether the startAck field is set. + */ + boolean hasStartAck(); + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + * @return The startAck. + */ + cmvr.api.RobotAudio.RobotAudioStartAck getStartAck(); + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder getStartAckOrBuilder(); + + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return Whether the audioFrame field is set. + */ + boolean hasAudioFrame(); + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return The audioFrame. + */ + cmvr.api.RobotAudio.RobotAudioFrame getAudioFrame(); + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + cmvr.api.RobotAudio.RobotAudioFrameOrBuilder getAudioFrameOrBuilder(); + + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return Whether the heartbeat field is set. + */ + boolean hasHeartbeat(); + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return The heartbeat. + */ + cmvr.api.RobotAudio.RobotAudioHeartbeat getHeartbeat(); + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder getHeartbeatOrBuilder(); + + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return Whether the stop field is set. + */ + boolean hasStop(); + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return The stop. + */ + cmvr.api.RobotAudio.RobotAudioStop getStop(); + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + cmvr.api.RobotAudio.RobotAudioStopOrBuilder getStopOrBuilder(); + + /** + * .cmvr.api.RobotAudioError error = 6; + * @return Whether the error field is set. + */ + boolean hasError(); + /** + * .cmvr.api.RobotAudioError error = 6; + * @return The error. + */ + cmvr.api.RobotAudio.RobotAudioError getError(); + /** + * .cmvr.api.RobotAudioError error = 6; + */ + cmvr.api.RobotAudio.RobotAudioErrorOrBuilder getErrorOrBuilder(); + + public cmvr.api.RobotAudio.RobotAudioResponse.PayloadCase getPayloadCase(); + } + /** + * Protobuf type {@code cmvr.api.RobotAudioResponse} + */ + public static final class RobotAudioResponse extends + com.google.protobuf.GeneratedMessageV3 implements + // @@protoc_insertion_point(message_implements:cmvr.api.RobotAudioResponse) + RobotAudioResponseOrBuilder { + private static final long serialVersionUID = 0L; + // Use RobotAudioResponse.newBuilder() to construct. + private RobotAudioResponse(com.google.protobuf.GeneratedMessageV3.Builder builder) { + super(builder); + } + private RobotAudioResponse() { + } + + @java.lang.Override + @SuppressWarnings({"unused"}) + protected java.lang.Object newInstance( + UnusedPrivateParameter unused) { + return new RobotAudioResponse(); + } + + @java.lang.Override + public final com.google.protobuf.UnknownFieldSet + getUnknownFields() { + return this.unknownFields; + } + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioResponse.class, cmvr.api.RobotAudio.RobotAudioResponse.Builder.class); + } + + private int payloadCase_ = 0; + private java.lang.Object payload_; + public enum PayloadCase + implements com.google.protobuf.Internal.EnumLite, + com.google.protobuf.AbstractMessage.InternalOneOfEnum { + START_ACK(2), + AUDIO_FRAME(3), + HEARTBEAT(4), + STOP(5), + ERROR(6), + PAYLOAD_NOT_SET(0); + private final int value; + private PayloadCase(int value) { + this.value = value; + } + /** + * @param value The number of the enum to look for. + * @return The enum associated with the given number. + * @deprecated Use {@link #forNumber(int)} instead. + */ + @java.lang.Deprecated + public static PayloadCase valueOf(int value) { + return forNumber(value); + } + + public static PayloadCase forNumber(int value) { + switch (value) { + case 2: return START_ACK; + case 3: return AUDIO_FRAME; + case 4: return HEARTBEAT; + case 5: return STOP; + case 6: return ERROR; + case 0: return PAYLOAD_NOT_SET; + default: return null; + } + } + public int getNumber() { + return this.value; + } + }; + + public PayloadCase + getPayloadCase() { + return PayloadCase.forNumber( + payloadCase_); + } + + public static final int HEADER_FIELD_NUMBER = 1; + private cmvr.api.Common.CommandHeader.Feedback header_; + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return Whether the header field is set. + */ + @java.lang.Override + public boolean hasHeader() { + return header_ != null; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return The header. + */ + @java.lang.Override + public cmvr.api.Common.CommandHeader.Feedback getHeader() { + return header_ == null ? cmvr.api.Common.CommandHeader.Feedback.getDefaultInstance() : header_; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + @java.lang.Override + public cmvr.api.Common.CommandHeader.FeedbackOrBuilder getHeaderOrBuilder() { + return getHeader(); + } + + public static final int START_ACK_FIELD_NUMBER = 2; + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + * @return Whether the startAck field is set. + */ + @java.lang.Override + public boolean hasStartAck() { + return payloadCase_ == 2; + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + * @return The startAck. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAck getStartAck() { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStartAck) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder getStartAckOrBuilder() { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStartAck) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } + + public static final int AUDIO_FRAME_FIELD_NUMBER = 3; + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return Whether the audioFrame field is set. + */ + @java.lang.Override + public boolean hasAudioFrame() { + return payloadCase_ == 3; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return The audioFrame. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame getAudioFrame() { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrameOrBuilder getAudioFrameOrBuilder() { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + + public static final int HEARTBEAT_FIELD_NUMBER = 4; + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return Whether the heartbeat field is set. + */ + @java.lang.Override + public boolean hasHeartbeat() { + return payloadCase_ == 4; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return The heartbeat. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat getHeartbeat() { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder getHeartbeatOrBuilder() { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + + public static final int STOP_FIELD_NUMBER = 5; + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return Whether the stop field is set. + */ + @java.lang.Override + public boolean hasStop() { + return payloadCase_ == 5; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return The stop. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop getStop() { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStopOrBuilder getStopOrBuilder() { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + + public static final int ERROR_FIELD_NUMBER = 6; + /** + * .cmvr.api.RobotAudioError error = 6; + * @return Whether the error field is set. + */ + @java.lang.Override + public boolean hasError() { + return payloadCase_ == 6; + } + /** + * .cmvr.api.RobotAudioError error = 6; + * @return The error. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError getError() { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioErrorOrBuilder getErrorOrBuilder() { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + + private byte memoizedIsInitialized = -1; + @java.lang.Override + public final boolean isInitialized() { + byte isInitialized = memoizedIsInitialized; + if (isInitialized == 1) return true; + if (isInitialized == 0) return false; + + memoizedIsInitialized = 1; + return true; + } + + @java.lang.Override + public void writeTo(com.google.protobuf.CodedOutputStream output) + throws java.io.IOException { + if (header_ != null) { + output.writeMessage(1, getHeader()); + } + if (payloadCase_ == 2) { + output.writeMessage(2, (cmvr.api.RobotAudio.RobotAudioStartAck) payload_); + } + if (payloadCase_ == 3) { + output.writeMessage(3, (cmvr.api.RobotAudio.RobotAudioFrame) payload_); + } + if (payloadCase_ == 4) { + output.writeMessage(4, (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_); + } + if (payloadCase_ == 5) { + output.writeMessage(5, (cmvr.api.RobotAudio.RobotAudioStop) payload_); + } + if (payloadCase_ == 6) { + output.writeMessage(6, (cmvr.api.RobotAudio.RobotAudioError) payload_); + } + getUnknownFields().writeTo(output); + } + + @java.lang.Override + public int getSerializedSize() { + int size = memoizedSize; + if (size != -1) return size; + + size = 0; + if (header_ != null) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(1, getHeader()); + } + if (payloadCase_ == 2) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(2, (cmvr.api.RobotAudio.RobotAudioStartAck) payload_); + } + if (payloadCase_ == 3) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(3, (cmvr.api.RobotAudio.RobotAudioFrame) payload_); + } + if (payloadCase_ == 4) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(4, (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_); + } + if (payloadCase_ == 5) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(5, (cmvr.api.RobotAudio.RobotAudioStop) payload_); + } + if (payloadCase_ == 6) { + size += com.google.protobuf.CodedOutputStream + .computeMessageSize(6, (cmvr.api.RobotAudio.RobotAudioError) payload_); + } + size += getUnknownFields().getSerializedSize(); + memoizedSize = size; + return size; + } + + @java.lang.Override + public boolean equals(final java.lang.Object obj) { + if (obj == this) { + return true; + } + if (!(obj instanceof cmvr.api.RobotAudio.RobotAudioResponse)) { + return super.equals(obj); + } + cmvr.api.RobotAudio.RobotAudioResponse other = (cmvr.api.RobotAudio.RobotAudioResponse) obj; + + if (hasHeader() != other.hasHeader()) return false; + if (hasHeader()) { + if (!getHeader() + .equals(other.getHeader())) return false; + } + if (!getPayloadCase().equals(other.getPayloadCase())) return false; + switch (payloadCase_) { + case 2: + if (!getStartAck() + .equals(other.getStartAck())) return false; + break; + case 3: + if (!getAudioFrame() + .equals(other.getAudioFrame())) return false; + break; + case 4: + if (!getHeartbeat() + .equals(other.getHeartbeat())) return false; + break; + case 5: + if (!getStop() + .equals(other.getStop())) return false; + break; + case 6: + if (!getError() + .equals(other.getError())) return false; + break; + case 0: + default: + } + if (!getUnknownFields().equals(other.getUnknownFields())) return false; + return true; + } + + @java.lang.Override + public int hashCode() { + if (memoizedHashCode != 0) { + return memoizedHashCode; + } + int hash = 41; + hash = (19 * hash) + getDescriptor().hashCode(); + if (hasHeader()) { + hash = (37 * hash) + HEADER_FIELD_NUMBER; + hash = (53 * hash) + getHeader().hashCode(); + } + switch (payloadCase_) { + case 2: + hash = (37 * hash) + START_ACK_FIELD_NUMBER; + hash = (53 * hash) + getStartAck().hashCode(); + break; + case 3: + hash = (37 * hash) + AUDIO_FRAME_FIELD_NUMBER; + hash = (53 * hash) + getAudioFrame().hashCode(); + break; + case 4: + hash = (37 * hash) + HEARTBEAT_FIELD_NUMBER; + hash = (53 * hash) + getHeartbeat().hashCode(); + break; + case 5: + hash = (37 * hash) + STOP_FIELD_NUMBER; + hash = (53 * hash) + getStop().hashCode(); + break; + case 6: + hash = (37 * hash) + ERROR_FIELD_NUMBER; + hash = (53 * hash) + getError().hashCode(); + break; + case 0: + default: + } + hash = (29 * hash) + getUnknownFields().hashCode(); + memoizedHashCode = hash; + return hash; + } + + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + java.nio.ByteBuffer data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + java.nio.ByteBuffer data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + com.google.protobuf.ByteString data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + com.google.protobuf.ByteString data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom(byte[] data) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + byte[] data, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + return PARSER.parseFrom(data, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseDelimitedFrom(java.io.InputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseDelimitedFrom( + java.io.InputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseDelimitedWithIOException(PARSER, input, extensionRegistry); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + com.google.protobuf.CodedInputStream input) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input); + } + public static cmvr.api.RobotAudio.RobotAudioResponse parseFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + return com.google.protobuf.GeneratedMessageV3 + .parseWithIOException(PARSER, input, extensionRegistry); + } + + @java.lang.Override + public Builder newBuilderForType() { return newBuilder(); } + public static Builder newBuilder() { + return DEFAULT_INSTANCE.toBuilder(); + } + public static Builder newBuilder(cmvr.api.RobotAudio.RobotAudioResponse prototype) { + return DEFAULT_INSTANCE.toBuilder().mergeFrom(prototype); + } + @java.lang.Override + public Builder toBuilder() { + return this == DEFAULT_INSTANCE + ? new Builder() : new Builder().mergeFrom(this); + } + + @java.lang.Override + protected Builder newBuilderForType( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + Builder builder = new Builder(parent); + return builder; + } + /** + * Protobuf type {@code cmvr.api.RobotAudioResponse} + */ + public static final class Builder extends + com.google.protobuf.GeneratedMessageV3.Builder implements + // @@protoc_insertion_point(builder_implements:cmvr.api.RobotAudioResponse) + cmvr.api.RobotAudio.RobotAudioResponseOrBuilder { + public static final com.google.protobuf.Descriptors.Descriptor + getDescriptor() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioResponse_descriptor; + } + + @java.lang.Override + protected com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internalGetFieldAccessorTable() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioResponse_fieldAccessorTable + .ensureFieldAccessorsInitialized( + cmvr.api.RobotAudio.RobotAudioResponse.class, cmvr.api.RobotAudio.RobotAudioResponse.Builder.class); + } + + // Construct using cmvr.api.RobotAudio.RobotAudioResponse.newBuilder() + private Builder() { + + } + + private Builder( + com.google.protobuf.GeneratedMessageV3.BuilderParent parent) { + super(parent); + + } + @java.lang.Override + public Builder clear() { + super.clear(); + if (headerBuilder_ == null) { + header_ = null; + } else { + header_ = null; + headerBuilder_ = null; + } + if (startAckBuilder_ != null) { + startAckBuilder_.clear(); + } + if (audioFrameBuilder_ != null) { + audioFrameBuilder_.clear(); + } + if (heartbeatBuilder_ != null) { + heartbeatBuilder_.clear(); + } + if (stopBuilder_ != null) { + stopBuilder_.clear(); + } + if (errorBuilder_ != null) { + errorBuilder_.clear(); + } + payloadCase_ = 0; + payload_ = null; + return this; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.Descriptor + getDescriptorForType() { + return cmvr.api.RobotAudio.internal_static_cmvr_api_RobotAudioResponse_descriptor; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioResponse getDefaultInstanceForType() { + return cmvr.api.RobotAudio.RobotAudioResponse.getDefaultInstance(); + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioResponse build() { + cmvr.api.RobotAudio.RobotAudioResponse result = buildPartial(); + if (!result.isInitialized()) { + throw newUninitializedMessageException(result); + } + return result; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioResponse buildPartial() { + cmvr.api.RobotAudio.RobotAudioResponse result = new cmvr.api.RobotAudio.RobotAudioResponse(this); + if (headerBuilder_ == null) { + result.header_ = header_; + } else { + result.header_ = headerBuilder_.build(); + } + if (payloadCase_ == 2) { + if (startAckBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = startAckBuilder_.build(); + } + } + if (payloadCase_ == 3) { + if (audioFrameBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = audioFrameBuilder_.build(); + } + } + if (payloadCase_ == 4) { + if (heartbeatBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = heartbeatBuilder_.build(); + } + } + if (payloadCase_ == 5) { + if (stopBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = stopBuilder_.build(); + } + } + if (payloadCase_ == 6) { + if (errorBuilder_ == null) { + result.payload_ = payload_; + } else { + result.payload_ = errorBuilder_.build(); + } + } + result.payloadCase_ = payloadCase_; + onBuilt(); + return result; + } + + @java.lang.Override + public Builder clone() { + return super.clone(); + } + @java.lang.Override + public Builder setField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.setField(field, value); + } + @java.lang.Override + public Builder clearField( + com.google.protobuf.Descriptors.FieldDescriptor field) { + return super.clearField(field); + } + @java.lang.Override + public Builder clearOneof( + com.google.protobuf.Descriptors.OneofDescriptor oneof) { + return super.clearOneof(oneof); + } + @java.lang.Override + public Builder setRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + int index, java.lang.Object value) { + return super.setRepeatedField(field, index, value); + } + @java.lang.Override + public Builder addRepeatedField( + com.google.protobuf.Descriptors.FieldDescriptor field, + java.lang.Object value) { + return super.addRepeatedField(field, value); + } + @java.lang.Override + public Builder mergeFrom(com.google.protobuf.Message other) { + if (other instanceof cmvr.api.RobotAudio.RobotAudioResponse) { + return mergeFrom((cmvr.api.RobotAudio.RobotAudioResponse)other); + } else { + super.mergeFrom(other); + return this; + } + } + + public Builder mergeFrom(cmvr.api.RobotAudio.RobotAudioResponse other) { + if (other == cmvr.api.RobotAudio.RobotAudioResponse.getDefaultInstance()) return this; + if (other.hasHeader()) { + mergeHeader(other.getHeader()); + } + switch (other.getPayloadCase()) { + case START_ACK: { + mergeStartAck(other.getStartAck()); + break; + } + case AUDIO_FRAME: { + mergeAudioFrame(other.getAudioFrame()); + break; + } + case HEARTBEAT: { + mergeHeartbeat(other.getHeartbeat()); + break; + } + case STOP: { + mergeStop(other.getStop()); + break; + } + case ERROR: { + mergeError(other.getError()); + break; + } + case PAYLOAD_NOT_SET: { + break; + } + } + this.mergeUnknownFields(other.getUnknownFields()); + onChanged(); + return this; + } + + @java.lang.Override + public final boolean isInitialized() { + return true; + } + + @java.lang.Override + public Builder mergeFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws java.io.IOException { + if (extensionRegistry == null) { + throw new java.lang.NullPointerException(); + } + try { + boolean done = false; + while (!done) { + int tag = input.readTag(); + switch (tag) { + case 0: + done = true; + break; + case 10: { + input.readMessage( + getHeaderFieldBuilder().getBuilder(), + extensionRegistry); + + break; + } // case 10 + case 18: { + input.readMessage( + getStartAckFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 2; + break; + } // case 18 + case 26: { + input.readMessage( + getAudioFrameFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 3; + break; + } // case 26 + case 34: { + input.readMessage( + getHeartbeatFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 4; + break; + } // case 34 + case 42: { + input.readMessage( + getStopFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 5; + break; + } // case 42 + case 50: { + input.readMessage( + getErrorFieldBuilder().getBuilder(), + extensionRegistry); + payloadCase_ = 6; + break; + } // case 50 + default: { + if (!super.parseUnknownField(input, extensionRegistry, tag)) { + done = true; // was an endgroup tag + } + break; + } // default: + } // switch (tag) + } // while (!done) + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.unwrapIOException(); + } finally { + onChanged(); + } // finally + return this; + } + private int payloadCase_ = 0; + private java.lang.Object payload_; + public PayloadCase + getPayloadCase() { + return PayloadCase.forNumber( + payloadCase_); + } + + public Builder clearPayload() { + payloadCase_ = 0; + payload_ = null; + onChanged(); + return this; + } + + + private cmvr.api.Common.CommandHeader.Feedback header_; + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Feedback, cmvr.api.Common.CommandHeader.Feedback.Builder, cmvr.api.Common.CommandHeader.FeedbackOrBuilder> headerBuilder_; + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return Whether the header field is set. + */ + public boolean hasHeader() { + return headerBuilder_ != null || header_ != null; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + * @return The header. + */ + public cmvr.api.Common.CommandHeader.Feedback getHeader() { + if (headerBuilder_ == null) { + return header_ == null ? cmvr.api.Common.CommandHeader.Feedback.getDefaultInstance() : header_; + } else { + return headerBuilder_.getMessage(); + } + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder setHeader(cmvr.api.Common.CommandHeader.Feedback value) { + if (headerBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + header_ = value; + onChanged(); + } else { + headerBuilder_.setMessage(value); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder setHeader( + cmvr.api.Common.CommandHeader.Feedback.Builder builderForValue) { + if (headerBuilder_ == null) { + header_ = builderForValue.build(); + onChanged(); + } else { + headerBuilder_.setMessage(builderForValue.build()); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder mergeHeader(cmvr.api.Common.CommandHeader.Feedback value) { + if (headerBuilder_ == null) { + if (header_ != null) { + header_ = + cmvr.api.Common.CommandHeader.Feedback.newBuilder(header_).mergeFrom(value).buildPartial(); + } else { + header_ = value; + } + onChanged(); + } else { + headerBuilder_.mergeFrom(value); + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public Builder clearHeader() { + if (headerBuilder_ == null) { + header_ = null; + onChanged(); + } else { + header_ = null; + headerBuilder_ = null; + } + + return this; + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public cmvr.api.Common.CommandHeader.Feedback.Builder getHeaderBuilder() { + + onChanged(); + return getHeaderFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + public cmvr.api.Common.CommandHeader.FeedbackOrBuilder getHeaderOrBuilder() { + if (headerBuilder_ != null) { + return headerBuilder_.getMessageOrBuilder(); + } else { + return header_ == null ? + cmvr.api.Common.CommandHeader.Feedback.getDefaultInstance() : header_; + } + } + /** + * .cmvr.api.CommandHeader.Feedback header = 1; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Feedback, cmvr.api.Common.CommandHeader.Feedback.Builder, cmvr.api.Common.CommandHeader.FeedbackOrBuilder> + getHeaderFieldBuilder() { + if (headerBuilder_ == null) { + headerBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.Common.CommandHeader.Feedback, cmvr.api.Common.CommandHeader.Feedback.Builder, cmvr.api.Common.CommandHeader.FeedbackOrBuilder>( + getHeader(), + getParentForChildren(), + isClean()); + header_ = null; + } + return headerBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStartAck, cmvr.api.RobotAudio.RobotAudioStartAck.Builder, cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder> startAckBuilder_; + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + * @return Whether the startAck field is set. + */ + @java.lang.Override + public boolean hasStartAck() { + return payloadCase_ == 2; + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + * @return The startAck. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAck getStartAck() { + if (startAckBuilder_ == null) { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStartAck) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } else { + if (payloadCase_ == 2) { + return startAckBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + public Builder setStartAck(cmvr.api.RobotAudio.RobotAudioStartAck value) { + if (startAckBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + startAckBuilder_.setMessage(value); + } + payloadCase_ = 2; + return this; + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + public Builder setStartAck( + cmvr.api.RobotAudio.RobotAudioStartAck.Builder builderForValue) { + if (startAckBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + startAckBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 2; + return this; + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + public Builder mergeStartAck(cmvr.api.RobotAudio.RobotAudioStartAck value) { + if (startAckBuilder_ == null) { + if (payloadCase_ == 2 && + payload_ != cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioStartAck.newBuilder((cmvr.api.RobotAudio.RobotAudioStartAck) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 2) { + startAckBuilder_.mergeFrom(value); + } else { + startAckBuilder_.setMessage(value); + } + } + payloadCase_ = 2; + return this; + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + public Builder clearStartAck() { + if (startAckBuilder_ == null) { + if (payloadCase_ == 2) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 2) { + payloadCase_ = 0; + payload_ = null; + } + startAckBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + public cmvr.api.RobotAudio.RobotAudioStartAck.Builder getStartAckBuilder() { + return getStartAckFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder getStartAckOrBuilder() { + if ((payloadCase_ == 2) && (startAckBuilder_ != null)) { + return startAckBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 2) { + return (cmvr.api.RobotAudio.RobotAudioStartAck) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStartAck start_ack = 2; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStartAck, cmvr.api.RobotAudio.RobotAudioStartAck.Builder, cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder> + getStartAckFieldBuilder() { + if (startAckBuilder_ == null) { + if (!(payloadCase_ == 2)) { + payload_ = cmvr.api.RobotAudio.RobotAudioStartAck.getDefaultInstance(); + } + startAckBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStartAck, cmvr.api.RobotAudio.RobotAudioStartAck.Builder, cmvr.api.RobotAudio.RobotAudioStartAckOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioStartAck) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 2; + onChanged();; + return startAckBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFrame, cmvr.api.RobotAudio.RobotAudioFrame.Builder, cmvr.api.RobotAudio.RobotAudioFrameOrBuilder> audioFrameBuilder_; + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return Whether the audioFrame field is set. + */ + @java.lang.Override + public boolean hasAudioFrame() { + return payloadCase_ == 3; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + * @return The audioFrame. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrame getAudioFrame() { + if (audioFrameBuilder_ == null) { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } else { + if (payloadCase_ == 3) { + return audioFrameBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder setAudioFrame(cmvr.api.RobotAudio.RobotAudioFrame value) { + if (audioFrameBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + audioFrameBuilder_.setMessage(value); + } + payloadCase_ = 3; + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder setAudioFrame( + cmvr.api.RobotAudio.RobotAudioFrame.Builder builderForValue) { + if (audioFrameBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + audioFrameBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 3; + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder mergeAudioFrame(cmvr.api.RobotAudio.RobotAudioFrame value) { + if (audioFrameBuilder_ == null) { + if (payloadCase_ == 3 && + payload_ != cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioFrame.newBuilder((cmvr.api.RobotAudio.RobotAudioFrame) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 3) { + audioFrameBuilder_.mergeFrom(value); + } else { + audioFrameBuilder_.setMessage(value); + } + } + payloadCase_ = 3; + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public Builder clearAudioFrame() { + if (audioFrameBuilder_ == null) { + if (payloadCase_ == 3) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 3) { + payloadCase_ = 0; + payload_ = null; + } + audioFrameBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + public cmvr.api.RobotAudio.RobotAudioFrame.Builder getAudioFrameBuilder() { + return getAudioFrameFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioFrameOrBuilder getAudioFrameOrBuilder() { + if ((payloadCase_ == 3) && (audioFrameBuilder_ != null)) { + return audioFrameBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 3) { + return (cmvr.api.RobotAudio.RobotAudioFrame) payload_; + } + return cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioFrame audio_frame = 3; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFrame, cmvr.api.RobotAudio.RobotAudioFrame.Builder, cmvr.api.RobotAudio.RobotAudioFrameOrBuilder> + getAudioFrameFieldBuilder() { + if (audioFrameBuilder_ == null) { + if (!(payloadCase_ == 3)) { + payload_ = cmvr.api.RobotAudio.RobotAudioFrame.getDefaultInstance(); + } + audioFrameBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioFrame, cmvr.api.RobotAudio.RobotAudioFrame.Builder, cmvr.api.RobotAudio.RobotAudioFrameOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioFrame) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 3; + onChanged();; + return audioFrameBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioHeartbeat, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder, cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder> heartbeatBuilder_; + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return Whether the heartbeat field is set. + */ + @java.lang.Override + public boolean hasHeartbeat() { + return payloadCase_ == 4; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + * @return The heartbeat. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeat getHeartbeat() { + if (heartbeatBuilder_ == null) { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } else { + if (payloadCase_ == 4) { + return heartbeatBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder setHeartbeat(cmvr.api.RobotAudio.RobotAudioHeartbeat value) { + if (heartbeatBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + heartbeatBuilder_.setMessage(value); + } + payloadCase_ = 4; + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder setHeartbeat( + cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder builderForValue) { + if (heartbeatBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + heartbeatBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 4; + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder mergeHeartbeat(cmvr.api.RobotAudio.RobotAudioHeartbeat value) { + if (heartbeatBuilder_ == null) { + if (payloadCase_ == 4 && + payload_ != cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioHeartbeat.newBuilder((cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 4) { + heartbeatBuilder_.mergeFrom(value); + } else { + heartbeatBuilder_.setMessage(value); + } + } + payloadCase_ = 4; + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public Builder clearHeartbeat() { + if (heartbeatBuilder_ == null) { + if (payloadCase_ == 4) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 4) { + payloadCase_ = 0; + payload_ = null; + } + heartbeatBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + public cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder getHeartbeatBuilder() { + return getHeartbeatFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder getHeartbeatOrBuilder() { + if ((payloadCase_ == 4) && (heartbeatBuilder_ != null)) { + return heartbeatBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 4) { + return (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_; + } + return cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioHeartbeat heartbeat = 4; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioHeartbeat, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder, cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder> + getHeartbeatFieldBuilder() { + if (heartbeatBuilder_ == null) { + if (!(payloadCase_ == 4)) { + payload_ = cmvr.api.RobotAudio.RobotAudioHeartbeat.getDefaultInstance(); + } + heartbeatBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioHeartbeat, cmvr.api.RobotAudio.RobotAudioHeartbeat.Builder, cmvr.api.RobotAudio.RobotAudioHeartbeatOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioHeartbeat) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 4; + onChanged();; + return heartbeatBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStop, cmvr.api.RobotAudio.RobotAudioStop.Builder, cmvr.api.RobotAudio.RobotAudioStopOrBuilder> stopBuilder_; + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return Whether the stop field is set. + */ + @java.lang.Override + public boolean hasStop() { + return payloadCase_ == 5; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + * @return The stop. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStop getStop() { + if (stopBuilder_ == null) { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } else { + if (payloadCase_ == 5) { + return stopBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder setStop(cmvr.api.RobotAudio.RobotAudioStop value) { + if (stopBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + stopBuilder_.setMessage(value); + } + payloadCase_ = 5; + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder setStop( + cmvr.api.RobotAudio.RobotAudioStop.Builder builderForValue) { + if (stopBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + stopBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 5; + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder mergeStop(cmvr.api.RobotAudio.RobotAudioStop value) { + if (stopBuilder_ == null) { + if (payloadCase_ == 5 && + payload_ != cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioStop.newBuilder((cmvr.api.RobotAudio.RobotAudioStop) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 5) { + stopBuilder_.mergeFrom(value); + } else { + stopBuilder_.setMessage(value); + } + } + payloadCase_ = 5; + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public Builder clearStop() { + if (stopBuilder_ == null) { + if (payloadCase_ == 5) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 5) { + payloadCase_ = 0; + payload_ = null; + } + stopBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + public cmvr.api.RobotAudio.RobotAudioStop.Builder getStopBuilder() { + return getStopFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioStopOrBuilder getStopOrBuilder() { + if ((payloadCase_ == 5) && (stopBuilder_ != null)) { + return stopBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 5) { + return (cmvr.api.RobotAudio.RobotAudioStop) payload_; + } + return cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioStop stop = 5; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStop, cmvr.api.RobotAudio.RobotAudioStop.Builder, cmvr.api.RobotAudio.RobotAudioStopOrBuilder> + getStopFieldBuilder() { + if (stopBuilder_ == null) { + if (!(payloadCase_ == 5)) { + payload_ = cmvr.api.RobotAudio.RobotAudioStop.getDefaultInstance(); + } + stopBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioStop, cmvr.api.RobotAudio.RobotAudioStop.Builder, cmvr.api.RobotAudio.RobotAudioStopOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioStop) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 5; + onChanged();; + return stopBuilder_; + } + + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioError, cmvr.api.RobotAudio.RobotAudioError.Builder, cmvr.api.RobotAudio.RobotAudioErrorOrBuilder> errorBuilder_; + /** + * .cmvr.api.RobotAudioError error = 6; + * @return Whether the error field is set. + */ + @java.lang.Override + public boolean hasError() { + return payloadCase_ == 6; + } + /** + * .cmvr.api.RobotAudioError error = 6; + * @return The error. + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioError getError() { + if (errorBuilder_ == null) { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } else { + if (payloadCase_ == 6) { + return errorBuilder_.getMessage(); + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder setError(cmvr.api.RobotAudio.RobotAudioError value) { + if (errorBuilder_ == null) { + if (value == null) { + throw new NullPointerException(); + } + payload_ = value; + onChanged(); + } else { + errorBuilder_.setMessage(value); + } + payloadCase_ = 6; + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder setError( + cmvr.api.RobotAudio.RobotAudioError.Builder builderForValue) { + if (errorBuilder_ == null) { + payload_ = builderForValue.build(); + onChanged(); + } else { + errorBuilder_.setMessage(builderForValue.build()); + } + payloadCase_ = 6; + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder mergeError(cmvr.api.RobotAudio.RobotAudioError value) { + if (errorBuilder_ == null) { + if (payloadCase_ == 6 && + payload_ != cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance()) { + payload_ = cmvr.api.RobotAudio.RobotAudioError.newBuilder((cmvr.api.RobotAudio.RobotAudioError) payload_) + .mergeFrom(value).buildPartial(); + } else { + payload_ = value; + } + onChanged(); + } else { + if (payloadCase_ == 6) { + errorBuilder_.mergeFrom(value); + } else { + errorBuilder_.setMessage(value); + } + } + payloadCase_ = 6; + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public Builder clearError() { + if (errorBuilder_ == null) { + if (payloadCase_ == 6) { + payloadCase_ = 0; + payload_ = null; + onChanged(); + } + } else { + if (payloadCase_ == 6) { + payloadCase_ = 0; + payload_ = null; + } + errorBuilder_.clear(); + } + return this; + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + public cmvr.api.RobotAudio.RobotAudioError.Builder getErrorBuilder() { + return getErrorFieldBuilder().getBuilder(); + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioErrorOrBuilder getErrorOrBuilder() { + if ((payloadCase_ == 6) && (errorBuilder_ != null)) { + return errorBuilder_.getMessageOrBuilder(); + } else { + if (payloadCase_ == 6) { + return (cmvr.api.RobotAudio.RobotAudioError) payload_; + } + return cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + } + /** + * .cmvr.api.RobotAudioError error = 6; + */ + private com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioError, cmvr.api.RobotAudio.RobotAudioError.Builder, cmvr.api.RobotAudio.RobotAudioErrorOrBuilder> + getErrorFieldBuilder() { + if (errorBuilder_ == null) { + if (!(payloadCase_ == 6)) { + payload_ = cmvr.api.RobotAudio.RobotAudioError.getDefaultInstance(); + } + errorBuilder_ = new com.google.protobuf.SingleFieldBuilderV3< + cmvr.api.RobotAudio.RobotAudioError, cmvr.api.RobotAudio.RobotAudioError.Builder, cmvr.api.RobotAudio.RobotAudioErrorOrBuilder>( + (cmvr.api.RobotAudio.RobotAudioError) payload_, + getParentForChildren(), + isClean()); + payload_ = null; + } + payloadCase_ = 6; + onChanged();; + return errorBuilder_; + } + @java.lang.Override + public final Builder setUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.setUnknownFields(unknownFields); + } + + @java.lang.Override + public final Builder mergeUnknownFields( + final com.google.protobuf.UnknownFieldSet unknownFields) { + return super.mergeUnknownFields(unknownFields); + } + + + // @@protoc_insertion_point(builder_scope:cmvr.api.RobotAudioResponse) + } + + // @@protoc_insertion_point(class_scope:cmvr.api.RobotAudioResponse) + private static final cmvr.api.RobotAudio.RobotAudioResponse DEFAULT_INSTANCE; + static { + DEFAULT_INSTANCE = new cmvr.api.RobotAudio.RobotAudioResponse(); + } + + public static cmvr.api.RobotAudio.RobotAudioResponse getDefaultInstance() { + return DEFAULT_INSTANCE; + } + + private static final com.google.protobuf.Parser + PARSER = new com.google.protobuf.AbstractParser() { + @java.lang.Override + public RobotAudioResponse parsePartialFrom( + com.google.protobuf.CodedInputStream input, + com.google.protobuf.ExtensionRegistryLite extensionRegistry) + throws com.google.protobuf.InvalidProtocolBufferException { + Builder builder = newBuilder(); + try { + builder.mergeFrom(input, extensionRegistry); + } catch (com.google.protobuf.InvalidProtocolBufferException e) { + throw e.setUnfinishedMessage(builder.buildPartial()); + } catch (com.google.protobuf.UninitializedMessageException e) { + throw e.asInvalidProtocolBufferException().setUnfinishedMessage(builder.buildPartial()); + } catch (java.io.IOException e) { + throw new com.google.protobuf.InvalidProtocolBufferException(e) + .setUnfinishedMessage(builder.buildPartial()); + } + return builder.buildPartial(); + } + }; + + public static com.google.protobuf.Parser parser() { + return PARSER; + } + + @java.lang.Override + public com.google.protobuf.Parser getParserForType() { + return PARSER; + } + + @java.lang.Override + public cmvr.api.RobotAudio.RobotAudioResponse getDefaultInstanceForType() { + return DEFAULT_INSTANCE; + } + + } + + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioFormat_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioFormat_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioStart_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioStart_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioFrame_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioFrame_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioHeartbeat_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioHeartbeat_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioStop_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioStop_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioError_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioError_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioStartAck_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioStartAck_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioRequest_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioRequest_fieldAccessorTable; + private static final com.google.protobuf.Descriptors.Descriptor + internal_static_cmvr_api_RobotAudioResponse_descriptor; + private static final + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable + internal_static_cmvr_api_RobotAudioResponse_fieldAccessorTable; + + public static com.google.protobuf.Descriptors.FileDescriptor + getDescriptor() { + return descriptor; + } + private static com.google.protobuf.Descriptors.FileDescriptor + descriptor; + static { + java.lang.String[] descriptorData = { + "\n\032cmvr/api/robot_audio.proto\022\010cmvr.api\032\025" + + "cmvr/api/common.proto\"d\n\020RobotAudioForma" + + "t\022\023\n\013sample_rate\030\001 \001(\005\022\020\n\010channels\030\002 \001(\005" + + "\022\027\n\017bits_per_sample\030\003 \001(\005\022\020\n\010encoding\030\004 " + + "\001(\t\"f\n\017RobotAudioStart\022\022\n\nsession_id\030\001 \001" + + "(\t\022\023\n\013operator_id\030\002 \001(\t\022*\n\006format\030\003 \001(\0132" + + "\032.cmvr.api.RobotAudioFormat\"Z\n\017RobotAudi" + + "oFrame\022\022\n\nsession_id\030\001 \001(\t\022\020\n\010sequence\030\002" + + " \001(\003\022\024\n\014timestamp_ms\030\003 \001(\003\022\013\n\003pcm\030\004 \001(\014\"" + + "?\n\023RobotAudioHeartbeat\022\022\n\nsession_id\030\001 \001" + + "(\t\022\024\n\014timestamp_ms\030\002 \001(\003\"4\n\016RobotAudioSt" + + "op\022\022\n\nsession_id\030\001 \001(\t\022\016\n\006reason\030\002 \001(\t\"D" + + "\n\017RobotAudioError\022\022\n\nsession_id\030\001 \001(\t\022\014\n" + + "\004code\030\002 \001(\005\022\017\n\007message\030\003 \001(\t\"K\n\022RobotAud" + + "ioStartAck\022\022\n\nsession_id\030\001 \001(\t\022\020\n\010accept" + + "ed\030\002 \001(\010\022\017\n\007message\030\003 \001(\t\"\267\002\n\021RobotAudio" + + "Request\022/\n\006header\030\001 \001(\0132\037.cmvr.api.Comma" + + "ndHeader.Request\022*\n\005start\030\002 \001(\0132\031.cmvr.a" + + "pi.RobotAudioStartH\000\0220\n\013audio_frame\030\003 \001(" + + "\0132\031.cmvr.api.RobotAudioFrameH\000\0222\n\theartb" + + "eat\030\004 \001(\0132\035.cmvr.api.RobotAudioHeartbeat" + + "H\000\022(\n\004stop\030\005 \001(\0132\030.cmvr.api.RobotAudioSt" + + "opH\000\022*\n\005error\030\006 \001(\0132\031.cmvr.api.RobotAudi" + + "oErrorH\000B\t\n\007payload\"\300\002\n\022RobotAudioRespon" + + "se\0220\n\006header\030\001 \001(\0132 .cmvr.api.CommandHea" + + "der.Feedback\0221\n\tstart_ack\030\002 \001(\0132\034.cmvr.a" + + "pi.RobotAudioStartAckH\000\0220\n\013audio_frame\030\003" + + " \001(\0132\031.cmvr.api.RobotAudioFrameH\000\0222\n\thea" + + "rtbeat\030\004 \001(\0132\035.cmvr.api.RobotAudioHeartb" + + "eatH\000\022(\n\004stop\030\005 \001(\0132\030.cmvr.api.RobotAudi" + + "oStopH\000\022*\n\005error\030\006 \001(\0132\031.cmvr.api.RobotA" + + "udioErrorH\000B\t\n\007payload2_\n\021RobotAudioServ" + + "ice\022J\n\tAudioTalk\022\033.cmvr.api.RobotAudioRe" + + "quest\032\034.cmvr.api.RobotAudioResponse(\0010\001b" + + "\006proto3" + }; + descriptor = com.google.protobuf.Descriptors.FileDescriptor + .internalBuildGeneratedFileFrom(descriptorData, + new com.google.protobuf.Descriptors.FileDescriptor[] { + cmvr.api.Common.getDescriptor(), + }); + internal_static_cmvr_api_RobotAudioFormat_descriptor = + getDescriptor().getMessageTypes().get(0); + internal_static_cmvr_api_RobotAudioFormat_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioFormat_descriptor, + new java.lang.String[] { "SampleRate", "Channels", "BitsPerSample", "Encoding", }); + internal_static_cmvr_api_RobotAudioStart_descriptor = + getDescriptor().getMessageTypes().get(1); + internal_static_cmvr_api_RobotAudioStart_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioStart_descriptor, + new java.lang.String[] { "SessionId", "OperatorId", "Format", }); + internal_static_cmvr_api_RobotAudioFrame_descriptor = + getDescriptor().getMessageTypes().get(2); + internal_static_cmvr_api_RobotAudioFrame_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioFrame_descriptor, + new java.lang.String[] { "SessionId", "Sequence", "TimestampMs", "Pcm", }); + internal_static_cmvr_api_RobotAudioHeartbeat_descriptor = + getDescriptor().getMessageTypes().get(3); + internal_static_cmvr_api_RobotAudioHeartbeat_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioHeartbeat_descriptor, + new java.lang.String[] { "SessionId", "TimestampMs", }); + internal_static_cmvr_api_RobotAudioStop_descriptor = + getDescriptor().getMessageTypes().get(4); + internal_static_cmvr_api_RobotAudioStop_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioStop_descriptor, + new java.lang.String[] { "SessionId", "Reason", }); + internal_static_cmvr_api_RobotAudioError_descriptor = + getDescriptor().getMessageTypes().get(5); + internal_static_cmvr_api_RobotAudioError_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioError_descriptor, + new java.lang.String[] { "SessionId", "Code", "Message", }); + internal_static_cmvr_api_RobotAudioStartAck_descriptor = + getDescriptor().getMessageTypes().get(6); + internal_static_cmvr_api_RobotAudioStartAck_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioStartAck_descriptor, + new java.lang.String[] { "SessionId", "Accepted", "Message", }); + internal_static_cmvr_api_RobotAudioRequest_descriptor = + getDescriptor().getMessageTypes().get(7); + internal_static_cmvr_api_RobotAudioRequest_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioRequest_descriptor, + new java.lang.String[] { "Header", "Start", "AudioFrame", "Heartbeat", "Stop", "Error", "Payload", }); + internal_static_cmvr_api_RobotAudioResponse_descriptor = + getDescriptor().getMessageTypes().get(8); + internal_static_cmvr_api_RobotAudioResponse_fieldAccessorTable = new + com.google.protobuf.GeneratedMessageV3.FieldAccessorTable( + internal_static_cmvr_api_RobotAudioResponse_descriptor, + new java.lang.String[] { "Header", "StartAck", "AudioFrame", "Heartbeat", "Stop", "Error", "Payload", }); + cmvr.api.Common.getDescriptor(); + } + + // @@protoc_insertion_point(outer_class_scope) +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/RobotAudioServiceGrpc.java b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/RobotAudioServiceGrpc.java new file mode 100644 index 0000000..14c8575 --- /dev/null +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/java/cmvr/api/RobotAudioServiceGrpc.java @@ -0,0 +1,280 @@ +package cmvr.api; + +import static io.grpc.MethodDescriptor.generateFullMethodName; + +/** + *
+ * Real-time bidirectional robot audio service.
+ * Java backend is the gRPC client; robot terminal is the gRPC server.
+ * 
+ */ +@javax.annotation.Generated( + value = "by gRPC proto compiler (version 1.52.0)", + comments = "Source: cmvr/api/robot_audio.proto") +@io.grpc.stub.annotations.GrpcGenerated +public final class RobotAudioServiceGrpc { + + private RobotAudioServiceGrpc() {} + + public static final String SERVICE_NAME = "cmvr.api.RobotAudioService"; + + // Static method descriptors that strictly reflect the proto. + private static volatile io.grpc.MethodDescriptor getAudioTalkMethod; + + @io.grpc.stub.annotations.RpcMethod( + fullMethodName = SERVICE_NAME + '/' + "AudioTalk", + requestType = cmvr.api.RobotAudio.RobotAudioRequest.class, + responseType = cmvr.api.RobotAudio.RobotAudioResponse.class, + methodType = io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING) + public static io.grpc.MethodDescriptor getAudioTalkMethod() { + io.grpc.MethodDescriptor getAudioTalkMethod; + if ((getAudioTalkMethod = RobotAudioServiceGrpc.getAudioTalkMethod) == null) { + synchronized (RobotAudioServiceGrpc.class) { + if ((getAudioTalkMethod = RobotAudioServiceGrpc.getAudioTalkMethod) == null) { + RobotAudioServiceGrpc.getAudioTalkMethod = getAudioTalkMethod = + io.grpc.MethodDescriptor.newBuilder() + .setType(io.grpc.MethodDescriptor.MethodType.BIDI_STREAMING) + .setFullMethodName(generateFullMethodName(SERVICE_NAME, "AudioTalk")) + .setSampledToLocalTracing(true) + .setRequestMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + cmvr.api.RobotAudio.RobotAudioRequest.getDefaultInstance())) + .setResponseMarshaller(io.grpc.protobuf.ProtoUtils.marshaller( + cmvr.api.RobotAudio.RobotAudioResponse.getDefaultInstance())) + .setSchemaDescriptor(new RobotAudioServiceMethodDescriptorSupplier("AudioTalk")) + .build(); + } + } + } + return getAudioTalkMethod; + } + + /** + * Creates a new async stub that supports all call types for the service + */ + public static RobotAudioServiceStub newStub(io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @java.lang.Override + public RobotAudioServiceStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new RobotAudioServiceStub(channel, callOptions); + } + }; + return RobotAudioServiceStub.newStub(factory, channel); + } + + /** + * Creates a new blocking-style stub that supports unary and streaming output calls on the service + */ + public static RobotAudioServiceBlockingStub newBlockingStub( + io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @java.lang.Override + public RobotAudioServiceBlockingStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new RobotAudioServiceBlockingStub(channel, callOptions); + } + }; + return RobotAudioServiceBlockingStub.newStub(factory, channel); + } + + /** + * Creates a new ListenableFuture-style stub that supports unary calls on the service + */ + public static RobotAudioServiceFutureStub newFutureStub( + io.grpc.Channel channel) { + io.grpc.stub.AbstractStub.StubFactory factory = + new io.grpc.stub.AbstractStub.StubFactory() { + @java.lang.Override + public RobotAudioServiceFutureStub newStub(io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new RobotAudioServiceFutureStub(channel, callOptions); + } + }; + return RobotAudioServiceFutureStub.newStub(factory, channel); + } + + /** + *
+   * Real-time bidirectional robot audio service.
+   * Java backend is the gRPC client; robot terminal is the gRPC server.
+   * 
+ */ + public static abstract class RobotAudioServiceImplBase implements io.grpc.BindableService { + + /** + */ + public io.grpc.stub.StreamObserver audioTalk( + io.grpc.stub.StreamObserver responseObserver) { + return io.grpc.stub.ServerCalls.asyncUnimplementedStreamingCall(getAudioTalkMethod(), responseObserver); + } + + @java.lang.Override public final io.grpc.ServerServiceDefinition bindService() { + return io.grpc.ServerServiceDefinition.builder(getServiceDescriptor()) + .addMethod( + getAudioTalkMethod(), + io.grpc.stub.ServerCalls.asyncBidiStreamingCall( + new MethodHandlers< + cmvr.api.RobotAudio.RobotAudioRequest, + cmvr.api.RobotAudio.RobotAudioResponse>( + this, METHODID_AUDIO_TALK))) + .build(); + } + } + + /** + *
+   * Real-time bidirectional robot audio service.
+   * Java backend is the gRPC client; robot terminal is the gRPC server.
+   * 
+ */ + public static final class RobotAudioServiceStub extends io.grpc.stub.AbstractAsyncStub { + private RobotAudioServiceStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @java.lang.Override + protected RobotAudioServiceStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new RobotAudioServiceStub(channel, callOptions); + } + + /** + */ + public io.grpc.stub.StreamObserver audioTalk( + io.grpc.stub.StreamObserver responseObserver) { + return io.grpc.stub.ClientCalls.asyncBidiStreamingCall( + getChannel().newCall(getAudioTalkMethod(), getCallOptions()), responseObserver); + } + } + + /** + *
+   * Real-time bidirectional robot audio service.
+   * Java backend is the gRPC client; robot terminal is the gRPC server.
+   * 
+ */ + public static final class RobotAudioServiceBlockingStub extends io.grpc.stub.AbstractBlockingStub { + private RobotAudioServiceBlockingStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @java.lang.Override + protected RobotAudioServiceBlockingStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new RobotAudioServiceBlockingStub(channel, callOptions); + } + } + + /** + *
+   * Real-time bidirectional robot audio service.
+   * Java backend is the gRPC client; robot terminal is the gRPC server.
+   * 
+ */ + public static final class RobotAudioServiceFutureStub extends io.grpc.stub.AbstractFutureStub { + private RobotAudioServiceFutureStub( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + super(channel, callOptions); + } + + @java.lang.Override + protected RobotAudioServiceFutureStub build( + io.grpc.Channel channel, io.grpc.CallOptions callOptions) { + return new RobotAudioServiceFutureStub(channel, callOptions); + } + } + + private static final int METHODID_AUDIO_TALK = 0; + + private static final class MethodHandlers implements + io.grpc.stub.ServerCalls.UnaryMethod, + io.grpc.stub.ServerCalls.ServerStreamingMethod, + io.grpc.stub.ServerCalls.ClientStreamingMethod, + io.grpc.stub.ServerCalls.BidiStreamingMethod { + private final RobotAudioServiceImplBase serviceImpl; + private final int methodId; + + MethodHandlers(RobotAudioServiceImplBase serviceImpl, int methodId) { + this.serviceImpl = serviceImpl; + this.methodId = methodId; + } + + @java.lang.Override + @java.lang.SuppressWarnings("unchecked") + public void invoke(Req request, io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + default: + throw new AssertionError(); + } + } + + @java.lang.Override + @java.lang.SuppressWarnings("unchecked") + public io.grpc.stub.StreamObserver invoke( + io.grpc.stub.StreamObserver responseObserver) { + switch (methodId) { + case METHODID_AUDIO_TALK: + return (io.grpc.stub.StreamObserver) serviceImpl.audioTalk( + (io.grpc.stub.StreamObserver) responseObserver); + default: + throw new AssertionError(); + } + } + } + + private static abstract class RobotAudioServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoFileDescriptorSupplier, io.grpc.protobuf.ProtoServiceDescriptorSupplier { + RobotAudioServiceBaseDescriptorSupplier() {} + + @java.lang.Override + public com.google.protobuf.Descriptors.FileDescriptor getFileDescriptor() { + return cmvr.api.RobotAudio.getDescriptor(); + } + + @java.lang.Override + public com.google.protobuf.Descriptors.ServiceDescriptor getServiceDescriptor() { + return getFileDescriptor().findServiceByName("RobotAudioService"); + } + } + + private static final class RobotAudioServiceFileDescriptorSupplier + extends RobotAudioServiceBaseDescriptorSupplier { + RobotAudioServiceFileDescriptorSupplier() {} + } + + private static final class RobotAudioServiceMethodDescriptorSupplier + extends RobotAudioServiceBaseDescriptorSupplier + implements io.grpc.protobuf.ProtoMethodDescriptorSupplier { + private final String methodName; + + RobotAudioServiceMethodDescriptorSupplier(String methodName) { + this.methodName = methodName; + } + + @java.lang.Override + public com.google.protobuf.Descriptors.MethodDescriptor getMethodDescriptor() { + return getServiceDescriptor().findMethodByName(methodName); + } + } + + private static volatile io.grpc.ServiceDescriptor serviceDescriptor; + + public static io.grpc.ServiceDescriptor getServiceDescriptor() { + io.grpc.ServiceDescriptor result = serviceDescriptor; + if (result == null) { + synchronized (RobotAudioServiceGrpc.class) { + result = serviceDescriptor; + if (result == null) { + serviceDescriptor = result = io.grpc.ServiceDescriptor.newBuilder(SERVICE_NAME) + .setSchemaDescriptor(new RobotAudioServiceFileDescriptorSupplier()) + .addMethod(getAudioTalkMethod()) + .build(); + } + } + } + return result; + } +} diff --git a/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/robot_audio.proto b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/robot_audio.proto new file mode 100644 index 0000000..4f97c9d --- /dev/null +++ b/cmvr-iot-api/cmvr-iot-edge/cmvr-iot-grpc-lib/src/main/proto/cmvr/api/robot_audio.proto @@ -0,0 +1,81 @@ +syntax = "proto3"; + +import "cmvr/api/common.proto"; + +package cmvr.api; + +// Real-time bidirectional robot audio service. +// Java backend is the gRPC client; robot terminal is the gRPC server. +service RobotAudioService { + rpc AudioTalk(stream RobotAudioRequest) returns (stream RobotAudioResponse); +} + +// Fixed audio format: PCM_S16LE, 48 kHz, 16-bit, mono. +// Both directions use 10 ms frames: 480 samples, 960 bytes. +message RobotAudioFormat { + int32 sample_rate = 1; + int32 channels = 2; + int32 bits_per_sample = 3; + string encoding = 4; +} + +message RobotAudioStart { + string session_id = 1; + string operator_id = 2; + RobotAudioFormat format = 3; +} + +message RobotAudioFrame { + string session_id = 1; + int64 sequence = 2; + // Robot upload: capture timestamp. Browser downlink: backend send timestamp. + int64 timestamp_ms = 3; + // PCM_S16LE. Fixed 10 ms / 960 bytes at 48 kHz mono 16-bit. + bytes pcm = 4; +} + +message RobotAudioHeartbeat { + string session_id = 1; + int64 timestamp_ms = 2; +} + +message RobotAudioStop { + string session_id = 1; + string reason = 2; +} + +message RobotAudioError { + string session_id = 1; + int32 code = 2; + string message = 3; +} + +message RobotAudioStartAck { + string session_id = 1; + bool accepted = 2; + string message = 3; +} + +message RobotAudioRequest { + CommandHeader.Request header = 1; + + oneof payload { + RobotAudioStart start = 2; + RobotAudioFrame audio_frame = 3; + RobotAudioHeartbeat heartbeat = 4; + RobotAudioStop stop = 5; + RobotAudioError error = 6; + } +} + +message RobotAudioResponse { + CommandHeader.Feedback header = 1; + + oneof payload { + RobotAudioStartAck start_ack = 2; + RobotAudioFrame audio_frame = 3; + RobotAudioHeartbeat heartbeat = 4; + RobotAudioStop stop = 5; + RobotAudioError error = 6; + } +} diff --git a/logs/audio-dump/robot-to-backend-1784086438864.wav b/logs/audio-dump/robot-to-backend-1784086438864.wav new file mode 100644 index 0000000..35a9e02 Binary files /dev/null and b/logs/audio-dump/robot-to-backend-1784086438864.wav differ diff --git a/logs/audio-dump/robot-to-backend-1784086792085.wav b/logs/audio-dump/robot-to-backend-1784086792085.wav new file mode 100644 index 0000000..3d38b5d Binary files /dev/null and b/logs/audio-dump/robot-to-backend-1784086792085.wav differ