Index: chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
diff --git a/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h b/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
index 53a48911f72ae92fe6fed42b1db7703d52aab2fd..80f7658cca985b4b86ef666d04e06faf37668dbf 100644 |
--- a/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
+++ b/chromecast/media/cma/backend/alsa/stream_mixer_alsa.h |
@@ -29,6 +29,8 @@ namespace chromecast { |
namespace media { |
class AlsaWrapper; |
+const int kNumFilterGroups = 2; |
+ |
// Mixer implementation. The mixer has one or more input queues; these can be |
// added/removed at any time. When an input source pushes frames to an input |
// queue, the queue should call StreamMixerAlsa::WriteFrames(); this causes |
@@ -38,7 +40,28 @@ class AlsaWrapper; |
// uses the minimum value). Assuming that all primary inputs have some data |
// available, the calculated number of frames are pulled from each input (maybe |
// resampled, if the input's incoming sample rate is not equal to the mixer's |
-// output sample rate) and written to the ALSA stack. |
+// output sample rate), mixed and written to the ALSA stack. |
+// |
+// MIXER ARCHITECTURE |
+// The mixer allows multiple streams to be grouped together for post-processing |
+// purposes. Each group has a single AudioFilterInterface instance that |
+// is used to post-process the data before a final mixing stage. |
+// |
+// Stream Stream Stream Stream Stream <- Input streams |
+// | | | | | |
+// --------------------- ---------------- |
+// | Media Mixer | | System Mixer | <- Intermediate mix |
+// --------------------- ---------------- |
+// | | |
+// --------------------- ----------------- |
+// | Media Filter | | System Filter | |
+// --------------------- ----------------- |
+// \ / |
+// ----------------- |
+// | Final Mixer | |
+// ----------------- |
+// | |
+// ALSA |
// |
// The rendering delay is recalculated after every successful write to the ALSA |
// stack. This delay is passed up to the input sources whenever some new data |
@@ -67,6 +90,11 @@ class StreamMixerAlsa { |
// precedence for sample rates and will dictate when data is polled. |
virtual bool primary() const = 0; |
+ // Returns a string describing the content type class. |
+ // Should be from chromecast/public/media/audio_device_ids.h |
+ // or media/audio/audio_device_description.h |
+ virtual std::string name() const = 0; |
+ |
// Returns true if PrepareToDelete() has been called. |
virtual bool IsDeleting() const = 0; |
@@ -195,10 +223,20 @@ class StreamMixerAlsa { |
void WriteFrames(); |
bool TryWriteFrames(); |
- void WriteMixedPcm(const ::media::AudioBus& mixed, int frames, |
- bool is_silence); |
+ |
+ // Mixes |active_inputs| and processes the resulting buffer |
+ // with pre_loopback_filter_[|filter|]. |
+ // If |accumulate| is false, |interleaved_| will be overwritten |
+ // (rather than summed). |
+ // Returns |true| if non-zero data was written to |interleaved_|. |
+ bool MixAndFilterGroup(const std::vector<InputQueue*>& active_inputs, |
+ int filter, |
+ int frames, |
+ bool accumulate); |
+ void WriteMixedPcm(int frames); |
void UpdateRenderingDelay(int newly_pushed_frames); |
ssize_t BytesPerOutputFormatSample(); |
+ void ResizeBuffersIfNecessary(int chunk_size); |
static bool single_threaded_for_test_; |
@@ -229,6 +267,8 @@ class StreamMixerAlsa { |
std::vector<std::unique_ptr<InputQueue>> inputs_; |
std::vector<std::unique_ptr<InputQueue>> ignored_inputs_; |
MediaPipelineBackendAlsa::RenderingDelay rendering_delay_; |
+ // Buffer to write intermediate mixes during post-processing. |
+ std::vector<uint8_t> interleaved_intermediate_; |
// Buffer to write final interleaved data before sending to snd_pcm_writei(). |
std::vector<uint8_t> interleaved_; |
@@ -245,9 +285,8 @@ class StreamMixerAlsa { |
std::vector<CastMediaShlib::LoopbackAudioObserver*> loopback_observers_; |
- std::unique_ptr<AudioFilterInterface> pre_loopback_filter_; |
- std::unique_ptr<AudioFilterInterface> post_loopback_filter_; |
- int silence_frames_filtered_ = 0; |
+ std::unique_ptr<AudioFilterInterface> pre_loopback_filter_[kNumFilterGroups]; |
tianyuwang1
2017/02/18 00:17:08
Since there's no post_loopback_filter_ anymore, ju
bshaya
2017/02/21 23:30:14
Done.
|
+ int silence_frames_filtered_[kNumFilterGroups]; |
DISALLOW_COPY_AND_ASSIGN(StreamMixerAlsa); |
}; |