DailyTrackState describes the current condition of one media track — camera, microphone, screen share, or custom — from the local participant’s point of view. It appears as a value in DailyParticipant.tracks.
Properties
Whether the local participant is subscribed to this track. Only meaningful for remote participants — local tracks are always implicitly subscribed.
true— subscribed and receivingfalse— not subscribed'staged'— SDP negotiated but no bytes are flowing; track can transition toplayablefaster when set totrue
updateParticipant() with setSubscribedTracks.The complete, mutually exclusive state of the track from the local participant’s point of view.
| Value | Meaning |
|---|---|
'blocked' | Track cannot be sent. Check blocked for the cause. |
'off' | Track is intentionally not being sent. Check off for the cause. |
'sendable' | Track is available to send but the local participant hasn’t subscribed to it yet. |
'loading' | Track is subscribed and the stream is being established. |
'playable' | Track is live and ready to render. |
'interrupted' | Track was playable but has transiently stalled (network fluctuation, iOS background). May return to playable. |
Present when
state is 'off'. Indicates why the track is off. All sub-fields are optional booleans.Present when
state is 'blocked'. Indicates why the track cannot be sent. All sub-fields are optional booleans.The underlying
MediaStreamTrack. Only present when state === 'playable'. Only available in call object mode.Prefer persistentTrack for attaching to media elements.The underlying
MediaStreamTrack. Present whenever a track exists, regardless of state. Only available in call object mode.Recommended over track as a proactive defense against black frames during call disruptions and browser limitations. Use track only when you need a guarantee that media is currently flowing.