{
  "id": "osc-stack-live-audio-mixing",
  "job": "Mix the audio of a live show in a browser: a channel strip per input, group and aux buses, pre-fade listen, and EBU R128 loudness metering on the main bus, using Open Live and Open Live Studio on Open Source Cloud.",
  "aliases": [
    "live audio mixing in the browser",
    "browser audio mixer for live production",
    "ebu r128 loudness meter live",
    "audio follows video",
    "open live audio"
  ],
  "distinctFrom": [
    {
      "id": "osc-stack-live-rtmp-to-hls",
      "descriptorUrl": "https://www.osaas.io/stacks/live-rtmp-to-hls.json",
      "why": "That recipe distributes one finished stream (RTMP in, HLS out). This one produces the show: it mixes several inputs into a programme, with loudness metering."
    }
  ],
  "inputs": [
    {
      "protocol": "srt | efp | whip | html",
      "source": "your live sources; each source assigned to a production becomes an input with its own channel strip"
    },
    {
      "protocol": "https",
      "source": "the URL of a Strom engine (StromUrl). Strom is not a catalog service; use your own, or the managed Open Live at https://openlive.apps.osaas.io"
    }
  ],
  "outputs": [
    {
      "protocol": "https",
      "consumer": "the Open Live Studio URL: the browser controller with the audio panel"
    },
    {
      "protocol": "websocket",
      "consumer": "the Open Live controller WebSocket (/ws/productions/:id/controller), which also carries AUDIO_PROC_SET for per-channel processing"
    }
  ],
  "audioCapabilities": {
    "releasedIn": {
      "open-live": "v0.6.0 (2026-10-23)",
      "open-live-studio": "v0.7.0 (2026-10-27)"
    },
    "studioUi": [
      "a channel strip per input with fader and peak meter",
      "per-input mode: on, off or audio-follows-video (AFV), with AFV ramp up and ramp down times",
      "PFL and AFL listen, mutually exclusive per strip; monitor bus fader and mute",
      "group buses (GRP) with per-input assign and a master fader",
      "aux buses (for example IFB or a recording feed) with per-input send level and a master fader",
      "EBU R128 meter on MAIN: momentary loudness bar, integrated loudness readout, -23 LUFS target line, true peak latch above -1 dBTP, integrator reset",
      "FX button per input strip and on MAIN opens a Processing panel: on/off and Reset per stage (v0.7.0)"
    ],
    "processing": [
      "per channel: input gain -20..+20 dB, high-pass filter 20..500 Hz, gate, compressor, 4-band parametric EQ",
      "main bus: compressor, 4-band EQ, limiter",
      "out-of-range values are rejected, not clamped; settings persist with the production and are re-applied on activation",
      "hpf enabled is construction-time: takes effect on next activation; hpf frequency is live"
    ],
    "processingSetFrom": "Open Live Studio v0.7.0 FX panel (per input strip and MAIN), or the Open Live v0.6.0 API and controller WebSocket (AUDIO_PROC_SET)",
    "sources": [
      "Eyevinn/open-live-studio@v0.7.0 src/pages/ControllerPage/AudioPanel.tsx",
      "Eyevinn/open-live@v0.6.0 src/lib/audio-processing.ts",
      "Eyevinn/open-live@v0.6.0 docs/controller-websocket.md",
      "Eyevinn/open-live-studio@v0.7.0 release notes (PR #232 channel strip and main-bus processing controls)"
    ]
  },
  "recommendedPath": {
    "chain": [
      {
        "step": 1,
        "serviceId": "apache-couchdb",
        "role": "stores productions, sources and saved audio settings",
        "requiredConfig": ["name", "AdminPassword"],
        "requiresCredential": true
      },
      {
        "step": 2,
        "serviceId": "eyevinn-open-live",
        "role": "the production API; builds and starts the mixing flow in Strom on activation",
        "requiredConfig": ["name", "DatabaseUrl", "StromUrl"],
        "requiresCredential": true,
        "note": "DatabaseUrl is the CouchDB URL with credentials (serviceAssociations links it to apache-couchdb). StromUrl is supplied by the user; an agent must not invent it. Optional: StromAuthMode (default osc), StromAccessToken, OscAccessToken, CorsOrigin."
      },
      {
        "step": 3,
        "serviceId": "eyevinn-open-live-studio",
        "role": "the browser controller with the audio panel",
        "requiredConfig": ["name", "OpenLiveUrl"],
        "requiresCredential": false,
        "note": "OpenLiveUrl is the Open Live instance URL (serviceAssociations links it to eyevinn-open-live)."
      },
      {
        "step": 4,
        "action": "mix",
        "role": "done by the human in Studio: add sources, activate the production, set levels, AFV, PFL/AFL, group and aux sends, and read loudness on MAIN"
      }
    ],
    "measuredWallClockSeconds": null,
    "wallClockMeasured": false,
    "gapNote": "No end-to-end run of this recipe was timed for this page. Schemas and released source were read on 2026-10-27; no production was activated for this page."
  },
  "configSurface": {
    "servicesInChain": 3,
    "totalRequiredFieldsAcrossChain": 7,
    "sensitiveFields": ["AdminPassword", "DatabaseUrl"],
    "note": "get-service-schema 2026-10-27: eyevinn-open-live stable image open-live:stable = upstream v0.6.0, versionOffset 0; eyevinn-open-live-studio stable image open-live-studio:stable = upstream v0.7.0, versionOffset 0 (re-read later the same day). apache-couchdb required fields from compare-services the same day."
  },
  "setup": {
    "codeRequired": false,
    "knownDeployGotcha": "Create CouchDB first and wait until it runs before creating Open Live. Open Live needs a reachable Strom URL; without one, productions cannot be activated."
  },
  "cost": {
    "unit": "tokens/day",
    "ceiling": 30,
    "ceilingBreakdown": {
      "apache-couchdb": 10,
      "eyevinn-open-live": 10,
      "eyevinn-open-live-studio": 10
    },
    "excludes": "Strom, which is not a catalog service",
    "ceilingSource": "compare-services on the three serviceIds, 2026-10-27 (ceiling rates)",
    "cheapestPlanCoveringContinuousUse": {
      "name": "Personal",
      "eurPerMonth": 15,
      "tokensPerDay": 40
    },
    "pricingSource": "https://www.osaas.io/pricing"
  },
  "exitPath": {
    "software": "Open Live (https://github.com/Eyevinn/open-live), Open Live Studio (https://github.com/Eyevinn/open-live-studio) and Strom (https://github.com/Eyevinn/strom) are open source repositories that run wherever their containers run",
    "data": "productions live in your own CouchDB instance"
  },
  "notVerified": [
    "a timed run of this recipe from start to finish",
    "an activated production with live audio on OSC for this page",
    "the v0.7.0 Processing panel against an activated production on OSC (the manual check in open-live-studio PR #232 was still open)"
  ],
  "servicesVerifiedLive": {
    "date": "2026-10-27",
    "method": "osc_call_tool get-service-schema on eyevinn-open-live and eyevinn-open-live-studio, compare-services on the three serviceIds; source read at the v0.6.0 tags through the GitHub contents API."
  },
  "gateCheck": {
    "gatedServiceId": "eyevinn-just-go-live",
    "usesGatedService": false,
    "note": "This stack does not name or link eyevinn-just-go-live; the P3 gate does not bind it."
  },
  "verifiedOn": "2026-10-27",
  "publishedAt": "https://www.osaas.io/use-cases/live-audio-mixing",
  "descriptorUrl": "https://www.osaas.io/stacks/live-audio-mixing.json",
  "video": {
    "url": "https://youtu.be/y0MllzD3fQ8",
    "durationSec": 56,
    "language": "en",
    "shows": "Open Live Studio 0.7: FX channel strip and main-mix processing, plus ISO recording per input, which needs Open Live backend v0.7.0 (OSC stable ran v0.6.0 on 2026-10-27)"
  }
}
