
# How a room is controlled

A room is a `Player` and the equipment it plays through: an A/V
receiver, a TV, or both. When a `Player` starts playing, wakes its
screen, or gets a press of a volume or power key, `media-operator`
writes a session into the status of the `Receiver` that the `Player`
plays through. `equipment-operator` reads the session and sends the
receiver its commands. It also finds the `Television` that shows the
session's `Display` and writes the session into that `Television`'s
status, so the TV wakes and goes to standby with the room.

The two operators share no message bus. They talk through three
fields: the session in the `Receiver`'s status, which `media-operator`
writes, the `Receiver`'s `spec.volume.indicator`, which
`media-operator` reads, and the `Television`'s `status.screenAsk`,
which `equipment-operator` writes when the TV should wake or put the
`Player`'s screen to sleep, such as when a person picks the machine's
input in the TV's source menu, and which `media-operator` passes to
the `Player`'s screen.

The operator sends the receiver's power and input only when the
receiver reports a different value from the session's. So when a
receiver is already on the right input, a `Play` sends it nothing, and
an operator restart sends nothing for the sessions it finds.

## Receivers

A `Receiver` is an A/V receiver on your network. Its spec says how to
reach it, which of its inputs each `liken` machine is connected to,
and the volume limits for the room's remote. The operator controls
it over the receiver's own network protocol: the Denon and Marantz
control protocol, or WiiM's HTTPS API. The operator finds WiiM
devices on the network and creates a `Receiver` for each one. You
declare a Denon or Marantz receiver yourself.

## Televisions and the CEC bus

HDMI-CEC is one wire that every HDMI port in the room shares. A
USB-CEC adapter plugged into a `liken` machine and into a spare input
of the receiver connects that machine to the wire. Each adapter
appears as a `CECBus`.

A `CECBus` starts in `Listen`: it hears the bus and sends nothing.
When you declare your own `CECBus` in `Control`, the adapter joins the
bus as a playback device, announces the machine's video input, and
finds the devices on the bus. For each TV it finds, the operator
creates a `Television`. From then on, the adapter wakes the TV and
switches it to the machine when the room wakes, puts it in standby
when the room turns off, and passes the TV remote's key presses to
the `Player`.

The adapter scans the bus once when it joins, and after that sends
nothing on a timer. It asks a device questions only when that device
announces itself, because a TV can switch its own input in reply to an adapter
that asks too often.

