## Voice Stream Control

Commands that can be executed on an ongoing stream.

### Connection Flow Diagram

```mermaid
sequenceDiagram
    title Voice Stream WebSocket Flow (Sinch Platform - Customer WebSocket Server)
    participant SP as Sinch Platform
    participant CS as Customer WebSocket Server

    Note over SP,CS: WebSocket Connection
    SP->>CS: WS connect request
    alt WS accepted
        CS-->>SP: Accept connection
    else WS rejected
        CS--xSP: Non-success response
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    end

    Note over SP,CS: Session Start
    SP->>CS: ConnectRequest<br/>{command: connect}
    Note right of CS: First protocol message.<br/>Server decides to accept,<br/>reject, or signal busy.

    alt Accepted
        CS->>SP: ConnectResponse<br/>{command: answer}
    else Busy
        CS->>SP: ConnectResponse<br/>{command: busy}
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    else Rejected
        CS->>SP: ConnectResponse<br/>{command: reject}
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    end

    Note over SP,CS: Bidirectional Audio Streaming
    loop While call is active
        rect rgb(240, 240, 240)
        Note over SP,CS: Platform to Server Audio
        SP->>CS: [binary] AudioFrame<br/>(16-bit signed PCM, mono, little-endian)
        Note right of CS: Recommended: 20ms frames.<br/>8 kHz = 320 bytes/frame,<br/>16 kHz = 640 bytes/frame.
        end

        rect rgb(240, 240, 240)
        Note over SP,CS: Server to Platform Audio
        CS->>SP: [binary] AudioFrame<br/>(16-bit signed PCM, mono, little-endian)
        Note left of SP: Queued in playback buffer.<br/>Max buffer: 5 MB per call.
        end

        rect rgb(240, 240, 240)
        Note over SP,CS: Stream Control (Server to Platform)
        alt Flush unplayed audio (e.g. interrupt)
            CS->>SP: StreamControl<br/>{command: clear}
            Note left of SP: Discards buffered audio<br/>not yet played to caller.
        else Keep-alive during silence
            CS->>SP: StreamControl<br/>{command: heartbeat}
            Note left of SP: Prevents 1-minute<br/>no-audio timeout.
        end
        end
    end

    Note over SP,CS: Call End
    Note over SP,CS: No reconnection mechanism.<br/>Connection loss = call hung up.

    alt Customer closes connection
        CS->>SP: WebSocket close
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    else Sinch ends call
        SP->>CS: WebSocket close
        rect rgb(255, 204, 204)
        Note over SP,CS: Stream ended
        end
    end
```