// Copyright 2020 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.media;

using zx;

@discoverable
protocol ProfileProvider {
    /// Register a thread as a media thread. This notifies the media subsystem that this thread
    /// should have an elevated scheduling profile applied to it in order to meet audio or video
    /// deadlines.
    ///
    /// `name` is the name of the component requesting the profile. `period` is the suggested
    /// interval to be scheduled at. If `period` is 0, then the server will select an appropriate
    /// interval in an implemenation dependent way. `capacity` is the suggested CPU capacity to
    /// reserve for `thread_handle`. For example, with a 0.1 capacity, 10% of a core will be
    /// reserved for the thread. For heterogeneous systems, this capacity should be planned against
    /// the highest performance processor(s) in the system.
    ///
    /// Returns the period and capacity that was applied, if a deadline profile was selected.
    /// Returns 0 if no deadline profile was selected.
    RegisterHandlerWithCapacity(resource struct {
        thread_handle zx.handle:THREAD;
        name string:64;
        period zx.duration;
        capacity float32;
    }) -> (struct {
        period zx.duration;
        capacity zx.duration;
    });

    /// Reset a thread's scheduling profile to the default.
    UnregisterHandler(resource struct {
        thread_handle zx.handle:THREAD;
        name string:64;
    }) -> ();
};
