blob: d2c3fdd0e770294ab85da7d1ac2f0129ad58bab9 [file] [log] [blame]
// Copyright 2024 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.
use ffx_command::FfxContext;
use fidl::endpoints::create_proxy;
use fidl_fuchsia_hardware_audio as fhaudio;
use fidl_fuchsia_io as fio;
/// Connect to an instance of a FIDL protocol hosted in `directory` using the given `path`.
// This is essentially the same as `fuchsia_component::client::connect_to_named_protocol_at_dir_root`.
// We can't use the `fuchsia_component` library in ffx because it doesn't build on host.
fn connect_to_named_protocol_at_dir_root<P: fidl::endpoints::ProtocolMarker>(
directory: &fio::DirectoryProxy,
path: &str,
) -> fho::Result<P::Proxy> {
let (proxy, server_end) = create_proxy::<P>().unwrap();
directory
.open(
fio::OpenFlags::empty(),
fio::ModeType::empty(),
path,
server_end.into_channel().into(),
)
.bug_context("Failed to call Directory.Open")?;
Ok(proxy)
}
/// Connects to the `fuchsia.hardware.audio.Codec` protocol node in the `dev_class` directory
/// at `path`.
pub fn connect_hw_codec(
dev_class: &fio::DirectoryProxy,
path: &str,
) -> fho::Result<fhaudio::CodecProxy> {
let connector_proxy =
connect_to_named_protocol_at_dir_root::<fhaudio::CodecConnectorMarker>(dev_class, path)
.bug_context("Failed to connect to CodecConnector")?;
let (proxy, server_end) = create_proxy::<fhaudio::CodecMarker>().unwrap();
connector_proxy.connect(server_end).bug_context("Failed to call Connect")?;
Ok(proxy)
}
/// Connects to the `fuchsia.hardware.audio.Dai` protocol node in the `dev_class` directory
/// at `path`.
pub fn connect_hw_dai(
dev_class: &fio::DirectoryProxy,
path: &str,
) -> fho::Result<fhaudio::DaiProxy> {
let connector_proxy =
connect_to_named_protocol_at_dir_root::<fhaudio::DaiConnectorMarker>(dev_class, path)
.bug_context("Failed to connect to DaiConnector")?;
let (proxy, server_end) = create_proxy::<fhaudio::DaiMarker>().unwrap();
connector_proxy.connect(server_end).bug_context("Failed to call Connect")?;
Ok(proxy)
}
/// Connects to the `fuchsia.hardware.audio.Composite` protocol node in the `dev_class` directory
/// at `path`.
pub fn connect_hw_composite(
dev_class: &fio::DirectoryProxy,
path: &str,
) -> fho::Result<fhaudio::CompositeProxy> {
// DFv2 Composite drivers do not use a connector/trampoline like Codec/Dai/StreamConfig.
connect_to_named_protocol_at_dir_root::<fhaudio::CompositeMarker>(dev_class, path)
.bug_context("Failed to connect to Composite")
}
/// Connects to the `fuchsia.hardware.audio.StreamConfig` protocol node in the `dev_class` directory
/// at `path`.
pub fn connect_hw_streamconfig(
dev_class: &fio::DirectoryProxy,
path: &str,
) -> fho::Result<fhaudio::StreamConfigProxy> {
let connector_proxy = connect_to_named_protocol_at_dir_root::<
fhaudio::StreamConfigConnectorMarker,
>(dev_class, path)
.bug_context("Failed to connect to StreamConfigConnector")?;
let (proxy, server_end) = create_proxy::<fhaudio::StreamConfigMarker>().unwrap();
connector_proxy.connect(server_end).bug_context("Failed to call Connect")?;
Ok(proxy)
}