Android-cuttlefish cvd tool
audio_handler.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2020 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#pragma once
18
19#include <cstddef>
20#include <cstdint>
21#include <memory>
22#include <mutex>
23#include <optional>
24#include <thread>
25#include <vector>
26
32
33namespace cuttlefish {
34
36 struct StreamDesc {
37 std::mutex mtx;
38 std::vector<uint8_t> holding_buffer;
39 uint32_t sample_rate = 0;
40 uint8_t bits_per_sample = 0;
41 uint8_t channels = 0;
42 bool active = false;
43
44 // Controls
45 struct Volume {
46 uint32_t min = 0;
47 uint32_t max = 1;
48 uint32_t current = max;
49
51 return static_cast<float>(current - min) /
52 static_cast<float>(max - min);
53 };
54 };
56 bool muted = false;
57 };
58
59 struct ControlDesc {
60 enum class Type {
61 Mute,
62 Volume,
63 };
64
66 size_t stream_id = 0;
67 };
68
69 public:
70 AudioHandler(std::unique_ptr<AudioServer> audio_server,
71 std::shared_ptr<webrtc_streaming::AudioSink> audio_sink,
72 std::shared_ptr<webrtc_streaming::AudioSource> audio_source,
73 const std::vector<AudioStreamSettings>& stream_settings,
74 const AudioMixerSettings& mixer_settings);
75 ~AudioHandler() override;
76
77 void Start();
78
79 // AudioServerExecutor implementation
80 void StreamsInfo(StreamInfoCommand& cmd) override;
82 void PrepareStream(StreamControlCommand& cmd) override;
83 void ReleaseStream(StreamControlCommand& cmd) override;
84 void StartStream(StreamControlCommand& cmd) override;
85 void StopStream(StreamControlCommand& cmd) override;
86 void ChmapsInfo(ChmapInfoCommand& cmd) override;
87 void JacksInfo(JackInfoCommand& cmd) override;
88 void ControlsInfo(ControlInfoCommand& cmd) override;
89 void OnControlCommand(ControlCommand& cmd) override;
90
91 void OnPlaybackBuffer(TxBuffer buffer) override;
92 void OnCaptureBuffer(RxBuffer buffer) override;
93
94 private:
95 [[noreturn]] void Loop();
96 bool IsCapture(uint32_t stream_id) const;
97
100
101 std::unique_ptr<AudioServer> audio_server_;
102 std::thread server_thread_;
103 std::shared_ptr<webrtc_streaming::AudioSource> audio_source_;
104 std::vector<virtio_snd_pcm_info> streams_;
105 std::vector<StreamDesc> stream_descs_ = {};
106 std::vector<virtio_snd_chmap_info> chmaps_;
107 std::vector<virtio_snd_ctl_info> controls_;
108 std::vector<ControlDesc> controls_to_streams_map_;
109 std::unique_ptr<AudioMixer> audio_mixer_;
110};
111} // namespace cuttlefish
Definition: audio_handler.h:35
std::unique_ptr< AudioMixer > audio_mixer_
Definition: audio_handler.h:109
void Loop()
Definition: audio_handler.cpp:369
std::shared_ptr< webrtc_streaming::AudioSource > audio_source_
Definition: audio_handler.h:103
std::vector< ControlDesc > controls_to_streams_map_
Definition: audio_handler.h:108
void ReleaseStream(StreamControlCommand &cmd) override
Definition: audio_handler.cpp:435
std::thread server_thread_
Definition: audio_handler.h:102
AudioStatus HandleControlMute(ControlCommand &cmd)
Definition: audio_handler.cpp:495
std::vector< StreamDesc > stream_descs_
Definition: audio_handler.h:105
void Start()
Definition: audio_handler.cpp:364
void OnPlaybackBuffer(TxBuffer buffer) override
Definition: audio_handler.cpp:567
void PrepareStream(StreamControlCommand &cmd) override
Definition: audio_handler.cpp:427
std::vector< virtio_snd_chmap_info > chmaps_
Definition: audio_handler.h:106
AudioHandler(std::unique_ptr< AudioServer > audio_server, std::shared_ptr< webrtc_streaming::AudioSink > audio_sink, std::shared_ptr< webrtc_streaming::AudioSource > audio_source, const std::vector< AudioStreamSettings > &stream_settings, const AudioMixerSettings &mixer_settings)
Definition: audio_handler.cpp:308
void ControlsInfo(ControlInfoCommand &cmd) override
Definition: audio_handler.cpp:485
void OnControlCommand(ControlCommand &cmd) override
Definition: audio_handler.cpp:548
~AudioHandler() override
Definition: audio_handler.cpp:362
void SetStreamParameters(StreamSetParamsCommand &cmd) override
Definition: audio_handler.cpp:403
std::vector< virtio_snd_pcm_info > streams_
Definition: audio_handler.h:104
void StreamsInfo(StreamInfoCommand &cmd) override
Definition: audio_handler.cpp:392
void OnCaptureBuffer(RxBuffer buffer) override
Definition: audio_handler.cpp:603
void StopStream(StreamControlCommand &cmd) override
Definition: audio_handler.cpp:453
void JacksInfo(JackInfoCommand &cmd) override
Definition: audio_handler.cpp:475
std::unique_ptr< AudioServer > audio_server_
Definition: audio_handler.h:101
void StartStream(StreamControlCommand &cmd) override
Definition: audio_handler.cpp:443
AudioStatus HandleControlVolume(ControlCommand &cmd)
Definition: audio_handler.cpp:522
bool IsCapture(uint32_t stream_id) const
Definition: audio_handler.cpp:722
std::vector< virtio_snd_ctl_info > controls_
Definition: audio_handler.h:107
void ChmapsInfo(ChmapInfoCommand &cmd) override
Definition: audio_handler.cpp:464
Definition: server.h:32
Definition: commands.h:64
Definition: commands.h:134
Definition: commands.h:82
Definition: commands.h:73
Definition: buffers.h:69
Definition: buffers.h:39
Definition: commands.h:90
Definition: alloc_driver.h:20
AudioStatus
Definition: shm_layout.h:51
Definition: audio_handler.h:59
size_t stream_id
Definition: audio_handler.h:66
Type type
Definition: audio_handler.h:65
Type
Definition: audio_handler.h:60
Definition: audio_handler.h:45
uint32_t current
Definition: audio_handler.h:48
uint32_t min
Definition: audio_handler.h:46
float GetCurrentVolumeLevel()
Definition: audio_handler.h:50
uint32_t max
Definition: audio_handler.h:47
Definition: audio_handler.h:36
Volume volume
Definition: audio_handler.h:55
bool muted
Definition: audio_handler.h:56
std::mutex mtx
Definition: audio_handler.h:37
uint32_t sample_rate
Definition: audio_handler.h:39
bool active
Definition: audio_handler.h:42
uint8_t channels
Definition: audio_handler.h:41
std::vector< uint8_t > holding_buffer
Definition: audio_handler.h:38
uint8_t bits_per_sample
Definition: audio_handler.h:40
Definition: audio_settings.h:50
Definition: commands.h:100
Definition: commands.h:112