Android-cuttlefish cvd tool
audio_mixer.h
Go to the documentation of this file.
1#pragma once
2
3#include <atomic>
4#include <condition_variable>
5#include <memory>
6#include <mutex>
7#include <thread>
8#include <unordered_map>
9#include <vector>
10
13
14namespace cuttlefish {
15
17 public:
18 AudioMixer(std::shared_ptr<webrtc_streaming::AudioSink> audio_sink,
19 const AudioMixerSettings& settings);
21
22 void Start();
23 void Stop();
24
25 // Called by auido_handler whenever new playback data chunk is given
26 // Can be called on different threads
27 void OnPlayback(uint32_t stream_id, uint32_t stream_sample_rate,
28 uint8_t stream_channels_count,
29 uint8_t stream_bits_per_channel, float volume, const uint8_t* buffer,
30 size_t size);
31 void OnStreamStopped(uint32_t stream_id);
32
33 private:
34 // The main mixing loop that runs on its own thread.
35 void MixerLoop();
36
37 const uint8_t channels_count_;
38 const uint32_t sample_rate_;
39 const size_t sample_size_bytes_ = sizeof(int16_t);
41 // Frames count for 10ms at mixer's sample rate
42 const size_t chunk_frames_count_ = sample_rate_ / 100;
43
44 std::shared_ptr<webrtc_streaming::AudioSink> audio_sink_;
45
46 std::mutex mutex_;
50
51 // Buffer stores mixed auido data for every active stream. Consumed by
52 // MixerLoop
53 std::vector<uint8_t> mixed_buffer_;
54
55 // Index of the last frame with available (i.e. not yet played) audio data
57
58 // Frame index per stream to put next available data to
59 std::unordered_map<uint32_t, size_t> next_frame_;
60
61 // Used to remap channels and apply volume levels
62 std::vector<std::vector<float>> channles_map = {{
63 {1, 0, 0, 0, 0, 0},
64 {0, 1, 0, 0, 0, 0},
65 {0, 0, 1, 0, 0, 0},
66 {0, 0, 0, 1, 0, 0},
67 {0, 0, 0, 0, 1, 0},
68 {0, 0, 0, 0, 0, 1},
69 }};
70
73
74 std::thread mixer_thread_;
75 std::atomic<bool> stop_mixer_{false};
76 std::condition_variable mixer_cv_;
77};
78
79} // namespace cuttlefish
Definition: audio_mixer.h:16
std::unordered_map< uint32_t, size_t > next_frame_
Definition: audio_mixer.h:59
void MixerLoop()
Definition: audio_mixer.cpp:220
const uint8_t channels_count_
Definition: audio_mixer.h:37
const uint32_t sample_rate_
Definition: audio_mixer.h:38
std::thread mixer_thread_
Definition: audio_mixer.h:74
AudioMixer(std::shared_ptr< webrtc_streaming::AudioSink > audio_sink, const AudioMixerSettings &settings)
Definition: audio_mixer.cpp:138
size_t last_active_frame_
Definition: audio_mixer.h:56
const size_t chunk_frames_count_
Definition: audio_mixer.h:42
std::vector< std::vector< float > > channles_map
Definition: audio_mixer.h:62
void OnStreamStopped(uint32_t stream_id)
Definition: audio_mixer.cpp:159
void Start()
Definition: audio_mixer.cpp:147
~AudioMixer()
Definition: audio_mixer.cpp:145
const size_t sample_size_bytes_
Definition: audio_mixer.h:39
const size_t frame_size_bytes_
Definition: audio_mixer.h:40
void Stop()
Definition: audio_mixer.cpp:151
std::mutex mutex_
Definition: audio_mixer.h:46
std::vector< uint8_t > mixed_buffer_
Definition: audio_mixer.h:53
std::shared_ptr< webrtc_streaming::AudioSink > audio_sink_
Definition: audio_mixer.h:44
void OnPlayback(uint32_t stream_id, uint32_t stream_sample_rate, uint8_t stream_channels_count, uint8_t stream_bits_per_channel, float volume, const uint8_t *buffer, size_t size)
Definition: audio_mixer.cpp:164
std::atomic< bool > stop_mixer_
Definition: audio_mixer.h:75
std::condition_variable mixer_cv_
Definition: audio_mixer.h:76
uint32_t size
Definition: io.h:2
Definition: alloc_driver.h:20
Definition: audio_settings.h:50