settings/
audio.rs

1// Copyright 2019 The Fuchsia Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5pub use self::audio_controller::Request;
6pub use self::audio_default_settings::build_audio_default_settings;
7#[cfg(test)]
8pub(crate) use self::audio_default_settings::create_default_audio_stream;
9pub(crate) use self::audio_default_settings::{
10    AudioInfoLoader, ModifiedCounters, create_default_modified_counters,
11};
12pub use self::stream_volume_control::StreamVolumeControl;
13pub mod audio_controller;
14pub mod types;
15
16mod audio_default_settings;
17mod audio_fidl_handler;
18mod stream_volume_control;
19
20#[cfg(test)]
21mod test_fakes;
22
23/// Mod containing utility functions for audio-related functionality.
24pub(crate) mod utils;
25
26use self::audio_controller::AudioController;
27use self::audio_fidl_handler::AudioFidlHandler;
28use futures::channel::mpsc::{self, UnboundedSender};
29use settings_common::inspect::event::{
30    ExternalEventPublisher, SettingValuePublisher, UsagePublisher,
31};
32use settings_common::service_context::ServiceContext;
33use settings_storage::device_storage::DeviceStorage;
34use settings_storage::storage_factory::StorageFactory;
35use std::rc::Rc;
36use types::AudioInfo;
37
38pub struct SetupResult {
39    pub audio_fidl_handler: AudioFidlHandler,
40    pub request_tx: UnboundedSender<Request>,
41    pub task: fuchsia_async::Task<()>,
42}
43
44pub async fn setup_audio_api<F>(
45    service_context: Rc<ServiceContext>,
46    audio_info_loader: AudioInfoLoader,
47    storage_factory: Rc<F>,
48    setting_value_publisher: SettingValuePublisher<AudioInfo>,
49    usage_publisher: UsagePublisher<AudioInfo>,
50    external_publisher: ExternalEventPublisher,
51) -> SetupResult
52where
53    F: StorageFactory<Storage = DeviceStorage>,
54{
55    let (request_tx, request_rx) = mpsc::unbounded();
56    let mut audio_controller = AudioController::new(
57        service_context,
58        audio_info_loader,
59        storage_factory,
60        setting_value_publisher.clone(),
61        external_publisher,
62    )
63    .await;
64    let initial_value = audio_controller.restore().await;
65    let _ = setting_value_publisher.publish(&initial_value);
66
67    let audio_fidl_handler = AudioFidlHandler::new(
68        &mut audio_controller,
69        usage_publisher,
70        request_tx.clone(),
71        initial_value,
72    );
73    let task = audio_controller.handle(request_rx).await;
74    SetupResult { audio_fidl_handler, request_tx, task }
75}