====== VISUALIZATION OF SYNCHRONOUS BLOCKING PROBLEM ======

CURRENT IMPLEMENTATION (Synchronous - Sequential Processing):

Timeline for steady-state blocks (ignoring 6.1s first-block warmup):

0ms ──────────────────────────────────────────────────────────────────
      [Soprano generating chunk 1 - 400ms]
400ms ────────────────────────────────────────────────────────────────
                                              [RVC block 1 - 160ms]
560ms ────────────────────────────────────────────────────────────────
                                              [RVC block 2 - 160ms]
720ms ────────────────────────────────────────────────────────────────
      [Soprano generating chunk 2 - 400ms]
1120ms ───────────────────────────────────────────────────────────────
                                              [RVC block 3 - 160ms]
1280ms ───────────────────────────────────────────────────────────────
                                              [RVC block 4 - 160ms]
1440ms ───────────────────────────────────────────────────────────────
                                              [RVC block 5 - 160ms]
1600ms ───────────────────────────────────────────────────────────────

PROBLEM:
- Soprano IDLES during RVC processing (wasted time: 320-480ms per iteration)
- RVC IDLES during Soprano generation (wasted time: 400ms per iteration)
- Total time per 2 blocks: 720ms
- Effective realtime: 0.78x (320ms audio in 720ms) ❌


PROPOSED IMPLEMENTATION (Async - Parallel Processing):

Timeline for steady-state blocks:

0ms ──────────────────────────────────────────────────────────────────
      [Soprano gen chunk 1 - 400ms]
      [RVC block 1 - 160ms]────────────────────────────────────────
400ms ────────────────────────────────────────────────────────────────
      [Soprano gen chunk 2 - 400ms]
                                   [RVC block 2 - 160ms]─────────────
560ms ────────────────────────────────────────────────────────────────
                                                      [RVC block 3 - 160ms]
800ms ────────────────────────────────────────────────────────────────
      [Soprano gen chunk 3 - 400ms]
                                                      [RVC block 4 - 160ms]
1200ms ───────────────────────────────────────────────────────────────

SOLUTION:
- Soprano and RVC run IN PARALLEL (no idle time!)
- Queue between them buffers chunks (decouples timing)
- RVC processes faster than Soprano generates (160ms < 400ms ✅)
- Pipeline limited by SLOWER component (Soprano at 1.49x realtime)
- Total time per 2 blocks: 400ms (RVC finishes before next Soprano chunk ready)
- Effective realtime: 1.49x (320ms audio in ~215ms) ✅

IMPLEMENTATION PATTERN:
┌──────────────┐    Queue    ┌──────────────┐
│   Soprano    │──────────────>│     RVC      │
│  Generator   │              │  Processor   │
│  (Thread 1)  │              │  (Thread 2)  │
└──────────────┘              └──────────────┘
     Runs at                       Runs at
   400ms/chunk                  160ms/block
  (1.49x realtime)             (1.56x realtime)

Both threads run continuously!
Soprano doesn't wait for RVC!
RVC pulls from queue as ready!

