# crazyfull/ravava architecture

> Architecture diagram of the GitHub repository crazyfull/ravava, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-11-11). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/crazyfull/ravava
- Repository: https://github.com/crazyfull/ravava

## Overview

RavAva is a Qt-free C++ voice library: an application supplies the transport, sends captured audio datagrams, and passes received datagrams back for playback. The graph preserves capture, packet framing/routing, resilient receive playback, conference and music features, shared processing, and platform device handling. Edges use README workflow statements or source-index references; unsampled implementation details are not asserted.

Main entry points: [`src/ravava/Player.cpp`](https://github.com/crazyfull/ravava/blob/master/src/ravava/Player.cpp) (Player), [`src/ravava/Recorder.cpp`](https://github.com/crazyfull/ravava/blob/master/src/ravava/Recorder.cpp) (Recorder), [`src/ravava/AudioDevice.cpp`](https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioDevice.cpp) (Audio devices), [`src/ravava/OpusCodec.cpp`](https://github.com/crazyfull/ravava/blob/master/src/ravava/OpusCodec.cpp) (Opus codec)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_capture["Capture and encode"]
  node_recorder["Recorder<br/>[Recorder.cpp]"]
  node_codec["Opus codec<br/>[OpusCodec.cpp]"]
  node_voicepacket["Voice packets<br/>[VoicePacket.h]"]
  node_opusvendor["Opus library<br/>[opus.h]"]
end

subgraph group_receive["Receive and playback"]
  node_player["Player<br/>[Player.cpp]"]
  node_jitter["Jitter buffer<br/>[JitterBuffer.cpp]"]
  node_conference["Conference playback"]
end

subgraph group_audio["Audio devices and processing"]
  node_music["Music playback<br/>[MusicPlayer.cpp]"]
  node_processor["Audio processing<br/>[AudioProcessor.cpp]"]
  node_device["Audio devices<br/>[AudioDevice.cpp]"]
  node_miniaudio["miniaudio backend<br/>[miniaudio.c]"]
  node_devicepolicy["Device recovery<br/>[DeviceWatchdog.h]"]
  node_androidroute["Android routing"]
  node_iossession["iOS audio session"]
  node_types["Audio types<br/>[AudioTypes.h]"]
end

subgraph group_network["Datagrams and routing"]
  node_packet["Packet envelope<br/>[Packet.h]"]
  node_router["Packet router<br/>[PacketRouter.cpp]"]
end

node_application(("Application"))
node_transport(("Datagram transport"))

node_application -->|"starts capture"| node_recorder
node_recorder -->|"encodes audio"| node_codec
node_recorder -->|"emits packets"| node_voicepacket
node_voicepacket -->|"gets envelope"| node_packet
node_packet -->|"sent by app"| node_transport
node_transport -->|"delivers datagrams"| node_router
node_router -.->|"dispatches audio"| node_player
node_application -->|"submits datagrams"| node_player
node_player -->|"buffers and recovers"| node_jitter
node_player -->|"decodes audio"| node_codec
node_conference -->|"manages talkers"| node_player
node_recorder -->|"mixes music"| node_music
node_recorder -->|"processes microphone"| node_processor
node_player -->|"shares speaker signal"| node_processor
node_recorder -->|"captures from"| node_device
node_player -->|"plays through"| node_device
node_device -->|"uses backend"| node_miniaudio
node_device -->|"integrates routing"| node_androidroute
node_device -->|"activates session"| node_iossession
node_devicepolicy -.->|"repairs devices"| node_device
node_codec -.->|"uses Opus"| node_opusvendor
node_recorder -->|"uses audio types"| node_types
node_player -->|"uses audio types"| node_types
node_jitter -->|"reads packets"| node_voicepacket

click node_recorder "https://github.com/crazyfull/ravava/blob/master/src/ravava/Recorder.cpp"
click node_codec "https://github.com/crazyfull/ravava/blob/master/src/ravava/OpusCodec.cpp"
click node_voicepacket "https://github.com/crazyfull/ravava/blob/master/src/ravava/VoicePacket.h"
click node_packet "https://github.com/crazyfull/ravava/blob/master/src/ravava/net/Packet.h"
click node_router "https://github.com/crazyfull/ravava/blob/master/src/ravava/net/PacketRouter.cpp"
click node_player "https://github.com/crazyfull/ravava/blob/master/src/ravava/Player.cpp"
click node_jitter "https://github.com/crazyfull/ravava/blob/master/src/ravava/JitterBuffer.cpp"
click node_conference "https://github.com/crazyfull/ravava/blob/master/src/ravava/ConferencePlayer.cpp"
click node_music "https://github.com/crazyfull/ravava/blob/master/src/ravava/MusicPlayer.cpp"
click node_processor "https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioProcessor.cpp"
click node_device "https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioDevice.cpp"
click node_miniaudio "https://github.com/crazyfull/ravava/blob/master/miniaudio/miniaudio.c"
click node_devicepolicy "https://github.com/crazyfull/ravava/blob/master/src/ravava/DeviceWatchdog.h"
click node_androidroute "https://github.com/crazyfull/ravava/blob/master/src/ravava/platform/AndroidAudioRoute.cpp"
click node_iossession "https://github.com/crazyfull/ravava/blob/master/src/ravava/platform/IosAudioSession.cpp"
click node_types "https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioTypes.h"
click node_opusvendor "https://github.com/crazyfull/ravava/blob/master/libs/opus/win32/include/opus.h"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_recorder,node_codec,node_voicepacket,node_opusvendor toneBlue
class node_player,node_jitter,node_conference toneAmber
class node_music,node_processor,node_device,node_miniaudio,node_devicepolicy,node_androidroute,node_iossession,node_types toneMint
class node_packet,node_router toneRose
class node_application,node_transport toneIndigo
```

## Components

### Capture and encode

- [Recorder](https://github.com/crazyfull/ravava/blob/master/src/ravava/Recorder.cpp): `src/ravava/Recorder.cpp`
- [Opus codec](https://github.com/crazyfull/ravava/blob/master/src/ravava/OpusCodec.cpp): `src/ravava/OpusCodec.cpp`
- [Voice packets](https://github.com/crazyfull/ravava/blob/master/src/ravava/VoicePacket.h): `src/ravava/VoicePacket.h`
- [Opus library](https://github.com/crazyfull/ravava/blob/master/libs/opus/win32/include/opus.h): `libs/opus/win32/include/opus.h`

### Receive and playback

- [Player](https://github.com/crazyfull/ravava/blob/master/src/ravava/Player.cpp): `src/ravava/Player.cpp`
- [Jitter buffer](https://github.com/crazyfull/ravava/blob/master/src/ravava/JitterBuffer.cpp): `src/ravava/JitterBuffer.cpp`
- [Conference playback](https://github.com/crazyfull/ravava/blob/master/src/ravava/ConferencePlayer.cpp): `src/ravava/ConferencePlayer.cpp`

### Audio devices and processing

- [Music playback](https://github.com/crazyfull/ravava/blob/master/src/ravava/MusicPlayer.cpp): `src/ravava/MusicPlayer.cpp`
- [Audio processing](https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioProcessor.cpp): `src/ravava/AudioProcessor.cpp`
- [Audio devices](https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioDevice.cpp): `src/ravava/AudioDevice.cpp`
- [miniaudio backend](https://github.com/crazyfull/ravava/blob/master/miniaudio/miniaudio.c): `miniaudio/miniaudio.c`
- [Device recovery](https://github.com/crazyfull/ravava/blob/master/src/ravava/DeviceWatchdog.h): `src/ravava/DeviceWatchdog.h`
- [Android routing](https://github.com/crazyfull/ravava/blob/master/src/ravava/platform/AndroidAudioRoute.cpp): `src/ravava/platform/AndroidAudioRoute.cpp`
- [iOS audio session](https://github.com/crazyfull/ravava/blob/master/src/ravava/platform/IosAudioSession.cpp): `src/ravava/platform/IosAudioSession.cpp`
- [Audio types](https://github.com/crazyfull/ravava/blob/master/src/ravava/AudioTypes.h): `src/ravava/AudioTypes.h`

### Datagrams and routing

- [Packet envelope](https://github.com/crazyfull/ravava/blob/master/src/ravava/net/Packet.h): `src/ravava/net/Packet.h`
- [Packet router](https://github.com/crazyfull/ravava/blob/master/src/ravava/net/PacketRouter.cpp): `src/ravava/net/PacketRouter.cpp`

### Other components

- **Application**
- **Datagram transport**

## Connections

- Application → Recorder: starts capture
- Recorder → Opus codec: encodes audio
- Recorder → Voice packets: emits packets (evidence: `src/ravava/Recorder.cpp`)
- Voice packets → Packet envelope: gets envelope
- Packet envelope → Datagram transport: sent by app
- Datagram transport → Packet router: delivers datagrams
- Packet router → Player: dispatches audio
- Application → Player: submits datagrams
- Player → Jitter buffer: buffers and recovers (evidence: `src/ravava/Player.cpp`)
- Player → Opus codec: decodes audio (evidence: `src/ravava/Player.cpp`)
- Conference playback → Player: manages talkers
- Recorder → Music playback: mixes music
- Recorder → Audio processing: processes microphone
- Player → Audio processing: shares speaker signal
- Recorder → Audio devices: captures from
- Player → Audio devices: plays through
- Audio devices → miniaudio backend: uses backend (evidence: `src/ravava/AudioDevice.cpp`)
- Audio devices → Android routing: integrates routing (evidence: `src/ravava/AudioDevice.cpp`)
- Audio devices → iOS audio session: activates session (evidence: `src/ravava/AudioDevice.cpp`)
- Device recovery → Audio devices: repairs devices
- Opus codec → Opus library: uses Opus
- Recorder → Audio types: uses audio types
- Player → Audio types: uses audio types
- Jitter buffer → Voice packets: reads packets (evidence: `src/ravava/JitterBuffer.cpp`)
