blob: eb415ee7419e824a063b9d321db87dd38ad1134e [file] [log] [blame]
// 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.tuning;
using zx;
/// Usage annotating the purpose of the stream that may be processed in tuning.
type StreamType = strict enum {
/// Stream is intended to be used for ambient or background renderer audio.
RENDER_BACKGROUND = 0;
/// Stream is intended to be used for normal renderer functionality.
RENDER_MEDIA = 1;
/// Renderer stream is intended to interrupt any ongoing function of the device.
RENDER_INTERRUPTION = 2;
/// Stream is for interaction with a system agent renderer.
RENDER_SYSTEM_AGENT = 3;
/// Stream is intended to be used for some form of real time user to user
/// communication render.
RENDER_COMMUNICATION = 4;
/// Stream is intended to be used for ultrasound-specific renderer streams.
/// A standard renderer is not able to assign this usage; rather, an ultrasound
/// renderer is explicitly created with fuchsia.ultrasound.Factory.
RENDER_ULTRASOUND = 5;
};
/// Specification of an audio stream effect name and compiled library module.
///
/// A valid `AudioEffectType` includes a specific module and audio effect name,
/// such as module 'google_audio_effects.so' with name 'equalizer'.
type AudioEffectType = table {
/// Library module associated with the effect, such as 'my_audio_effects.so'.
1: module_name string:64;
/// Name of the effect type within the module.
2: effect_name string:255;
};
/// Details of an audio effect and its configuration to be applied to an audio stream(s).
///
/// An audio effect type can be instantiated multiple times, differentiable by its unique
/// name. For example, an 'equalizer' effect type can be instantiated twice as
/// 'equalizer1' and 'equalizer2'.
type AudioEffectConfig = table {
/// Unique identifier of the audio effect instance.
1: instance_name string:64;
/// Detailed specification of the audio effect type.
2: type AudioEffectType;
/// JSON string of the audio effect configuration to be applied to an audio stream(s).
3: configuration string:4096;
/// Rechannelization defined by the effect and applied to the audio stream output; this
/// is in addition to channelization provided by the AudioMixGroup.
4: output_channels uint16;
};
/// Association of a volume level with its decibel value.
type Volume = struct {
/// Specific volume level identifier in the range [0.0, 1.0].
level float32;
/// Decibel value of the associated volume level in the range [-120.0, 0.0].
decibel float32;
};
/// Audio effects configuration details applied to audio streams within
/// a device's media pipeline.
type AudioMixGroup = struct {
/// Identifier of the audio effects mix detailed in this object.
name string:32;
/// True if the device profile is eligible for loopback capture.
loopback bool;
/// Audio effect configurations applied to the specified `streams`.
effects vector<AudioEffectConfig>:16;
/// Set of audio effect mixes, each of which consist of various effects configurations.
inputs vector<box<AudioMixGroup>>:16;
/// Names of the audio streams to which the `effects` are applied.
streams vector<StreamType>:8;
/// Framerate of the mix stage output, which can accommodate upsampling and downsampling.
/// A different rate may be chosen if the specified rate cannot be accommodated by hardware.
output_rate uint32;
/// Channelization of the mix stream output before any effects are applied; effects can apply
/// additional rechannelization.
output_channels uint16;
};
/// Specification of the audio effects mixes and volume curve for a device.
type AudioDeviceTuningProfile = table {
/// Details of the media pipeline effects configuration.
1: pipeline AudioMixGroup;
/// Set of associations between volume level and decibel value.
2: volume_curve vector<Volume>:16;
};
@discoverable
closed protocol AudioTuner {
/// Provides names of audio effects classes available for tuning.
strict GetAvailableAudioEffects() -> (struct {
effects vector<AudioEffectType>:16;
});
/// Provides the current, tunable audio effects configuration and
/// volume settings for the given device.
strict GetAudioDeviceProfile(struct {
device_id string:32;
}) -> (struct {
profile AudioDeviceTuningProfile;
});
/// Provides the device's current default audio effects configuration and
/// volume settings, which are read-only and unaffected by the audio tuner.
strict GetDefaultAudioDeviceProfile(struct {
device_id string:32;
}) -> (struct {
profile AudioDeviceTuningProfile;
});
/// Updates the audio effects configuration and volume settings of the given
/// device with the provided profile.
strict SetAudioDeviceProfile(struct {
device_id string:32;
profile AudioDeviceTuningProfile;
}) -> (struct {
status zx.Status;
});
/// Deletes the current, tunable audio effects configuration and volume settings
/// for the given device.
strict DeleteAudioDeviceProfile(struct {
device_id string:32;
}) -> (struct {
status zx.Status;
});
/// Applies the provided `AudioEffectConfig` to the specified device's tuning profile in the media
/// pipeline.
///
/// A single audio effect class can be instantiated multiple times, with each instance
/// able to be applied to the same media pipeline. The `AudioEffectConfig.instance_name` is scoped
/// to the specified device.
///
/// For example, two 'equalizer' effect instances named 'equalizer1' and 'equalizer2'
/// can be applied to the same media pipeline.
strict SetAudioEffectConfig(struct {
device_id string:32;
effect AudioEffectConfig;
}) -> (struct {
status zx.Status;
});
};