// 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
@for_deprecated_c_bindings
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.
    ///
    /// Returns the period and capacity that was applied, if a deadline profile
    /// was selected. Returns 0 if no deadline profile was selected.
    RegisterHandler(resource struct {
        thread_handle zx.handle:THREAD;
        name string:64;
        period zx.duration;
    }) -> (struct {
        period zx.duration;
        capacity zx.duration;
    });

    /// 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.
    @transitional
    RegisterHandlerWithCapacity(resource struct {
        thread_handle zx.handle:THREAD;
        name string:64;
        period zx.duration;
        capacity float32;
    }) -> (struct {
        period zx.duration;
        capacity zx.duration;
    });
};
