settings_audio/
lib.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::{
7    AudioInfoLoader, ModifiedCounters, build_audio_default_settings, create_default_audio_stream,
8    create_default_modified_counters,
9};
10pub use self::stream_volume_control::StreamVolumeControl;
11pub use self::types::AUDIO_STREAM_TYPE_COUNT;
12pub mod audio_controller;
13pub mod types;
14
15mod audio_default_settings;
16mod audio_fidl_handler;
17mod stream_volume_control;
18
19#[cfg(test)]
20mod test_fakes;
21
22/// Mod containing utility functions for audio-related functionality.
23pub(crate) mod utils;
24
25use self::audio_controller::AudioController;
26use self::audio_fidl_handler::AudioFidlHandler;
27use futures::channel::mpsc::{self, UnboundedSender};
28use settings_common::inspect::event::{
29    ExternalEventPublisher, SettingValuePublisher, UsagePublisher,
30};
31use settings_common::service_context::ServiceContext;
32use settings_storage::device_storage::DeviceStorage;
33use settings_storage::storage_factory::StorageFactory;
34use std::rc::Rc;
35use types::AudioInfo;
36
37pub struct SetupResult {
38    pub audio_fidl_handler: AudioFidlHandler,
39    pub request_tx: UnboundedSender<Request>,
40    pub task: fuchsia_async::Task<()>,
41}
42
43pub async fn setup_audio_api<F>(
44    service_context: Rc<ServiceContext>,
45    audio_info_loader: AudioInfoLoader,
46    storage_factory: Rc<F>,
47    setting_value_publisher: SettingValuePublisher<AudioInfo>,
48    usage_publisher: UsagePublisher<AudioInfo>,
49    external_publisher: ExternalEventPublisher,
50) -> SetupResult
51where
52    F: StorageFactory<Storage = DeviceStorage>,
53{
54    let (request_tx, request_rx) = mpsc::unbounded();
55    let mut audio_controller = AudioController::new(
56        service_context,
57        audio_info_loader,
58        storage_factory,
59        setting_value_publisher.clone(),
60        external_publisher,
61    )
62    .await;
63    let initial_value = audio_controller.restore().await;
64    let _ = setting_value_publisher.publish(&initial_value);
65
66    let audio_fidl_handler = AudioFidlHandler::new(
67        &mut audio_controller,
68        usage_publisher,
69        request_tx.clone(),
70        initial_value,
71    );
72    let task = audio_controller.handle(request_rx).await;
73    SetupResult { audio_fidl_handler, request_tx, task }
74}