blob: 03ec631ef3fda70d4c348ca0ca11812411dffa6d [file] [log] [blame]
// Copyright 2022 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
library fuchsia.audio.mixer;
using zx;
using fuchsia.hardware.audio;
/// Creates and controls a collection of synthetic clocks. Each realm has its
/// own, isolated, synthetic monotonic clock, which advances on demand. See
/// [`SyntheticClockRealm.AdvanceBy`]. Within a realm, all clocks advance
/// atomically relative to the realm's synthetic montonic clock.
closed protocol SyntheticClockRealm {
/// Creates a new synthetic clock.
strict CreateClock(resource table {
/// Name of this clock, used for diagnostics only.
/// If specified, ideally this should be globally unique and have a
/// printable CamelCase format, but uniqueness is not required.
///
/// Optional. Empty if not specified.
1: name string:MAX_NAME_LENGTH;
/// Domain in which the clock runs. This is isolated from clock domains
/// in other realms, including the real-time realm. In particular, a
/// value of `CLOCK_DOMAIN_MONOTONIC` means this clock has the same rate
/// as the realm's synthetic monotonic clock -- it does NOT mean the
/// clock has the same rate as the system-wide monotonic clock.
///
/// Required.
2: domain fuchsia.hardware.audio.ClockDomain;
/// Whether the clock's rate can be adjusted via the `control` channel.
///
/// Required.
3: adjustable bool;
/// A channel that can be used to read and adjust the clock. If the
/// client does not need to read or adjust the clock, this may be
/// omitted.
///
/// Optional.
4: control server_end:SyntheticClock;
}) -> (resource table {
/// A handle for this synthetic clock. This handle may be passed to our
/// parent [`Graph`] wherever a `zx.Handle:CLOCK` is needed. The
/// [`Graph`] will recognized this handle until [`ForgetClock`] is
/// called.
///
/// This handle has rights `ZX_RIGHT_DUPLICATE | ZX_RIGHT_TRANSFER`.
/// It does not have `ZX_RIGHT_READ` or `ZX_RIGHT_WRITE` and cannot
/// be read or updated directly. The clock's value is meaningless. To
/// read the clock, use the `control`, below.
1: handle zx.Handle:CLOCK;
}) error CreateClockError;
/// Forgets about a synthetic clock. This releases internal resources and
/// closes the clock's `SyntheticClock` channel. The clock must not be used
/// by any node in our parent [`Graph`]. After this returns, our parent
/// [`Graph`] will not recognize this handle.
///
/// * error `ZX_ERR_INVALID_ARGS` if missing a required field
/// * error `ZX_ERR_NOT_FOUND` if `handle` was not created by
/// [`CreateClock`] or if was already forgotten
/// * error `ZX_ERR_BAD_STATE` if `handle` is still in use
strict ForgetClock(resource table {
/// The clock to forget.
///
/// Required.
1: handle zx.Handle:CLOCK;
}) -> (table {}) error zx.Status;
/// Observes a synthetic clock. This can observe any clock created by this
/// realm, including clocks created by [`CreateClock`] as well as clocks
/// created by [`Graph.CreateGraphControlledClock`] in the parent [`Graph`].
///
/// * error `ZX_ERR_INVALID_ARGS` if missing a required field
/// * error `ZX_ERR_NOT_FOUND` if `handle` was not created by this realm or
/// if has been forgotten
strict ObserveClock(resource table {
/// The clock to observe.
///
/// Required.
1: handle zx.Handle:CLOCK;
/// A channel to observe the clock. Since this only observes the clock,
/// the only legal method is [`SyntheticClock.Now`] -- it is illegal to
/// call [`SyntheticClock.Create`].
///
/// Required.
2: observe server_end:SyntheticClock;
}) -> (table {}) error zx.Status;
/// Reads the current synthetic monotonic time.
strict Now(table {}) -> (table {
1: now zx.Time;
});
/// Advances synthetic monotonic time by the given duration, which must be
/// positive. Does not return until the graph has completed all actions that
/// must occur over the given duration.
///
/// * error `ZX_ERR_INVALID_ARGS` if the duration is not positive
strict AdvanceBy(table {
/// Required.
1: duration zx.Duration;
}) -> (table {}) error zx.Status;
};
/// Reads and adjusts a synthetic clock.
closed protocol SyntheticClock {
/// Reads the clock's current time.
strict Now(table {}) -> (table {
1: now zx.Time;
});
/// Sets the clock's rate adjustment, in parts-per-million, relative to the
/// realm's synthetic monotonic clock. The semantics are identical to
/// `zx_clock_update`.
strict SetRate(table {
/// Required.
1: rate_adjust_ppm int32;
}) -> (table {}) error zx.Status;
};
type CreateClockError = flexible enum {
/// Missing a required field.
MISSING_FIELD = 1;
/// CreateClock was called with `domain = MONOTONIC` and `adjustable =
/// true`. This is an illegal configuration because the MONOTONIC domain is
/// not adjustable, by definition.
MONOTONIC_DOMAIN_IS_NOT_ADJUSTABLE = 2;
};