| // Copyright 2016 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; |
| |
| // Ordinal range: 0x0700-0x7ff |
| [Discoverable] |
| interface Audio { |
| 0x0701: CreateAudioRenderer(request<AudioRenderer> audio_renderer_request); |
| |
| // Create an AudioCapturer which either captures from the current default |
| // audio input device, or loops-back from the current default audio output |
| // device based on value passed for the the loopback flag. |
| // |
| // TODO(mpuryear): Get rid of the loopback flag ASAP. Routing decisions (and |
| // security surrounding routing decisions) should be much more sophisticated |
| // than this. This is just a placeholder until we have a design in place. |
| // Eventually, I suspect that all of this will move up into the audio policy |
| // manager and application clients will obtain AudioCapturers from and control |
| // through the policy manager. |
| 0x0702: CreateAudioCapturer(request<AudioCapturer> audio_capturer_request, |
| bool loopback); |
| |
| // System Gain and Mute |
| // TODO(mpuryear): remove this systemwide setting once device-centric settings |
| // are plumbed into the system UI. Also, device-centric (and certainly |
| // systemwide settings) should be moved out of the accessible-to-all public |
| // audio interface and relocated to a more restrictive interface that is only |
| // accessible by clients with the appropriate privileges (such as system |
| // configuration API, or the governor of audio policy). |
| // |
| // Mirroring device-centric gain and mute stages, Fuchsia's systemwide Gain |
| // and Mute settings are fully independent. Changing the value of one does not |
| // change the value of the other. Both have the ability to silence a system |
| // (or a device, in the case of device Gain/Mute). If Mute is true, or if Gain |
| // is kMutedGain, the system is silenced regardless of the other. Similarly, |
| // one's value does not restrict the other's possible values in any way. |
| // |
| // Sets the system-wide gain in decibels. |db| values are clamped to the range |
| // -160db to 0db, inclusive. This setting is applied to all audio output |
| // devices. Audio input devices are unaffected. System Gain changes do not |
| // affect the System Mute state. |
| 0x0703: SetSystemGain(float32 gain_db); |
| |
| // Sets/clears the systemwide 'Mute' state for audio output devices. Audio |
| // input devices are unaffected. Changes to the System Mute state do not |
| // affect the value of System Gain. |
| 0x0704: SetSystemMute(bool muted); |
| |
| // Provides current values for the systemwide Gain and Mute. |
| // When a client connects to Audio, the system enqueues an action (to be |
| // executed once the system regains control) to send this newly-connected |
| // client a callback with the current systemwide Gain|Mute settings. Further, |
| // upon any change to the systemwide Gain|Mute values, the system will trigger |
| // all registered callbacks, notifying clients of the new values. |
| // |
| // Calls to SetSystemMute or SetSystemGain that do NOT result in a change to |
| // these values (e.g. calling SetSystemMute(false) when Mute is already false) |
| // will not cause the callbacks to be triggered. |
| // |
| // During and immediately following connecting to Audio, it is essential that |
| // clients keep in mind the fundamental single-threaded nature of FIDL. |
| // Specifically, if a newly-connected client registers a SystemGainMuteChanged |
| // callback before returning, that client will (once the system has subsequent |
| // opportunity) be notified via callback of the Gain|Mute settings at the time |
| // the connection was established. If however a newly-connected client returns |
| // from a FIDL message dispatch (returning control to the FIDL dispatcher), |
| // then that client subsequently registers this callback, the client has no |
| // way to learn the current Gain|Mute settings until they actually change. |
| 0x0705: -> SystemGainMuteChanged(float32 gain_db, bool muted); |
| |
| 0x0706: SetRoutingPolicy(AudioOutputRoutingPolicy policy); |
| }; |
| |
| // A placeholder for various types of simple routing policies. This should be |
| // replaced when routing policy moves to a more centralized policy manager. |
| enum AudioOutputRoutingPolicy { |
| // AudioRenderers are always connected to all audio outputs which currently |
| // in the plugged state (eg; have a connector attached to them) |
| ALL_PLUGGED_OUTPUTS = 0; |
| |
| // AudioRenderers are only connected to the output stream which most |
| // recently entered the plugged state. AudioRenderers move around from output to |
| // output as streams are published/unpublished and become plugged/unplugged. |
| // |
| // This is the initial setting for audio output routing. |
| LAST_PLUGGED_OUTPUT = 1; |
| }; |
| |
| // Permitted ranges for AudioRenderer and AudioCapturer |
| const uint32 MIN_PCM_CHANNEL_COUNT = 1; |
| const uint32 MAX_PCM_CHANNEL_COUNT = 8; |
| const uint32 MIN_PCM_FRAMES_PER_SECOND = 1000; |
| const uint32 MAX_PCM_FRAMES_PER_SECOND = 192000; |