| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef CHROMECAST_MEDIA_CMA_BACKEND_ALSA_STREAM_MIXER_ALSA_H_ | 5 #ifndef CHROMECAST_MEDIA_CMA_BACKEND_ALSA_STREAM_MIXER_ALSA_H_ |
| 6 #define CHROMECAST_MEDIA_CMA_BACKEND_ALSA_STREAM_MIXER_ALSA_H_ | 6 #define CHROMECAST_MEDIA_CMA_BACKEND_ALSA_STREAM_MIXER_ALSA_H_ |
| 7 | 7 |
| 8 #include <alsa/asoundlib.h> | 8 #include <alsa/asoundlib.h> |
| 9 #include <stdint.h> | 9 #include <stdint.h> |
| 10 | 10 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 23 #include "chromecast/public/volume_control.h" | 23 #include "chromecast/public/volume_control.h" |
| 24 | 24 |
| 25 namespace media { | 25 namespace media { |
| 26 class AudioBus; | 26 class AudioBus; |
| 27 } // namespace media | 27 } // namespace media |
| 28 | 28 |
| 29 namespace chromecast { | 29 namespace chromecast { |
| 30 namespace media { | 30 namespace media { |
| 31 class AlsaWrapper; | 31 class AlsaWrapper; |
| 32 class FilterGroup; | 32 class FilterGroup; |
| 33 class PostProcessingPipelineParser; |
| 33 | 34 |
| 34 // Mixer implementation. The mixer has one or more input queues; these can be | 35 // Mixer implementation. The mixer has one or more input queues; these can be |
| 35 // added/removed at any time. When an input source pushes frames to an input | 36 // added/removed at any time. When an input source pushes frames to an input |
| 36 // queue, the queue should call StreamMixerAlsa::WriteFrames(); this causes | 37 // queue, the queue should call StreamMixerAlsa::WriteFrames(); this causes |
| 37 // the mixer to attempt to mix and write out as many frames as possible. To do | 38 // the mixer to attempt to mix and write out as many frames as possible. To do |
| 38 // this, the mixer determines how many frames can be read from all inputs (ie, | 39 // this, the mixer determines how many frames can be read from all inputs (ie, |
| 39 // it gets the maximum number of frames that can be read from each input, and | 40 // it gets the maximum number of frames that can be read from each input, and |
| 40 // uses the minimum value). Assuming that all primary inputs have some data | 41 // uses the minimum value). Assuming that all primary inputs have some data |
| 41 // available, the calculated number of frames are pulled from each input (maybe | 42 // available, the calculated number of frames are pulled from each input (maybe |
| 42 // resampled, if the input's incoming sample rate is not equal to the mixer's | 43 // resampled, if the input's incoming sample rate is not equal to the mixer's |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 168 // RemoveInput(input) is called. Can be called on any thread. | 169 // RemoveInput(input) is called. Can be called on any thread. |
| 169 void AddInput(std::unique_ptr<InputQueue> input); | 170 void AddInput(std::unique_ptr<InputQueue> input); |
| 170 // Instructs the mixer to remove an input. The input should not be referenced | 171 // Instructs the mixer to remove an input. The input should not be referenced |
| 171 // after this is called. Can be called on any thread. | 172 // after this is called. Can be called on any thread. |
| 172 void RemoveInput(InputQueue* input); | 173 void RemoveInput(InputQueue* input); |
| 173 | 174 |
| 174 // Attempts to write some frames of audio to ALSA. Must only be called on the | 175 // Attempts to write some frames of audio to ALSA. Must only be called on the |
| 175 // mixer thread. | 176 // mixer thread. |
| 176 void OnFramesQueued(); | 177 void OnFramesQueued(); |
| 177 | 178 |
| 179 void ResetPostProcessorsForTest(const std::string& pipeline_json); |
| 178 void SetAlsaWrapperForTest(std::unique_ptr<AlsaWrapper> alsa_wrapper); | 180 void SetAlsaWrapperForTest(std::unique_ptr<AlsaWrapper> alsa_wrapper); |
| 179 void DisablePostProcessingForTest(); | |
| 180 void WriteFramesForTest(); // Can be called on any thread. | 181 void WriteFramesForTest(); // Can be called on any thread. |
| 181 void ClearInputsForTest(); // Removes all inputs. | 182 void ClearInputsForTest(); // Removes all inputs. |
| 182 | 183 |
| 183 void AddLoopbackAudioObserver( | 184 void AddLoopbackAudioObserver( |
| 184 CastMediaShlib::LoopbackAudioObserver* observer); | 185 CastMediaShlib::LoopbackAudioObserver* observer); |
| 185 | 186 |
| 186 void RemoveLoopbackAudioObserver( | 187 void RemoveLoopbackAudioObserver( |
| 187 CastMediaShlib::LoopbackAudioObserver* observer); | 188 CastMediaShlib::LoopbackAudioObserver* observer); |
| 188 | 189 |
| 189 // Sets the volume multiplier for the given content |type|. | 190 // Sets the volume multiplier for the given content |type|. |
| (...skipping 16 matching lines...) Expand all Loading... |
| 206 | 207 |
| 207 float volume = 0.0f; | 208 float volume = 0.0f; |
| 208 float limit = 1.0f; | 209 float limit = 1.0f; |
| 209 bool muted = false; | 210 bool muted = false; |
| 210 }; | 211 }; |
| 211 | 212 |
| 212 void ResetTaskRunnerForTest(); | 213 void ResetTaskRunnerForTest(); |
| 213 void FinalizeOnMixerThread(); | 214 void FinalizeOnMixerThread(); |
| 214 void FinishFinalize(); | 215 void FinishFinalize(); |
| 215 | 216 |
| 217 void CreatePostProcessors(PostProcessingPipelineParser* pipeline_parser); |
| 216 // Reads the buffer size, period size, start threshold, and avail min value | 218 // Reads the buffer size, period size, start threshold, and avail min value |
| 217 // from the provided command line flags or uses default values if no flags are | 219 // from the provided command line flags or uses default values if no flags are |
| 218 // provided. | 220 // provided. |
| 219 void DefineAlsaParameters(); | 221 void DefineAlsaParameters(); |
| 220 | 222 |
| 221 // Takes the provided ALSA config and sets all ALSA output hardware/software | 223 // Takes the provided ALSA config and sets all ALSA output hardware/software |
| 222 // playback parameters. It will try to select sane fallback parameters based | 224 // playback parameters. It will try to select sane fallback parameters based |
| 223 // on what the output hardware supports and will log warnings if it does so. | 225 // on what the output hardware supports and will log warnings if it does so. |
| 224 // If any ALSA function returns an unexpected error code, the error code will | 226 // If any ALSA function returns an unexpected error code, the error code will |
| 225 // be returned by this function. Otherwise, it will return 0. | 227 // be returned by this function. Otherwise, it will return 0. |
| 226 int SetAlsaPlaybackParams(); | 228 int SetAlsaPlaybackParams(); |
| 227 void Start(); | 229 void Start(); |
| 228 void Stop(); | 230 void Stop(); |
| 229 void Close(); | 231 void Close(); |
| 230 void SignalError(); | 232 void SignalError(); |
| 231 void CheckChangeOutputRate(int input_samples_per_second); | 233 void CheckChangeOutputRate(int input_samples_per_second); |
| 232 unsigned int DetermineOutputRate(unsigned int requested_rate); | 234 unsigned int DetermineOutputRate(unsigned int requested_rate); |
| 233 | 235 |
| 234 // Deletes an input queue that has finished preparing to delete itself. | 236 // Deletes an input queue that has finished preparing to delete itself. |
| 235 // May be called on any thread. | 237 // May be called on any thread. |
| 236 void DeleteInputQueue(InputQueue* input); | 238 void DeleteInputQueue(InputQueue* input); |
| 237 // Runs on mixer thread to complete input queue deletion. | 239 // Runs on mixer thread to complete input queue deletion. |
| 238 void DeleteInputQueueInternal(InputQueue* input); | 240 void DeleteInputQueueInternal(InputQueue* input); |
| 239 // Called after a timeout period to close the PCM handle if no inputs are | 241 // Called after a timeout period to close the PCM handle if no inputs are |
| 240 // present. | 242 // present. |
| 241 void CheckClose(); | 243 void CheckClose(); |
| 242 | 244 |
| 243 void WriteFrames(); | 245 void WriteFrames(); |
| 244 bool TryWriteFrames(); | 246 bool TryWriteFrames(); |
| 245 void WriteMixedPcm(std::vector<uint8_t>* interleaved, int frames); | 247 void WriteMixedPcm(int frames); |
| 246 void UpdateRenderingDelay(int newly_pushed_frames); | 248 void UpdateRenderingDelay(int newly_pushed_frames); |
| 247 size_t InterleavedSize(int frames); | 249 size_t InterleavedSize(int frames); |
| 248 ssize_t BytesPerOutputFormatSample(); | 250 ssize_t BytesPerOutputFormatSample(); |
| 249 void ResizeBuffersIfNecessary(int chunk_size); | 251 void ResizeBuffersIfNecessary(int chunk_size); |
| 250 | 252 |
| 251 static bool single_threaded_for_test_; | 253 static bool single_threaded_for_test_; |
| 252 | 254 |
| 253 std::unique_ptr<AlsaWrapper> alsa_; | 255 std::unique_ptr<AlsaWrapper> alsa_; |
| 254 std::unique_ptr<base::Thread> mixer_thread_; | 256 std::unique_ptr<base::Thread> mixer_thread_; |
| 255 scoped_refptr<base::SingleThreadTaskRunner> mixer_task_runner_; | 257 scoped_refptr<base::SingleThreadTaskRunner> mixer_task_runner_; |
| (...skipping 12 matching lines...) Expand all Loading... |
| 268 std::string alsa_device_name_; | 270 std::string alsa_device_name_; |
| 269 snd_pcm_uframes_t alsa_buffer_size_; | 271 snd_pcm_uframes_t alsa_buffer_size_; |
| 270 snd_pcm_uframes_t alsa_period_size_; | 272 snd_pcm_uframes_t alsa_period_size_; |
| 271 snd_pcm_uframes_t alsa_start_threshold_; | 273 snd_pcm_uframes_t alsa_start_threshold_; |
| 272 snd_pcm_uframes_t alsa_avail_min_; | 274 snd_pcm_uframes_t alsa_avail_min_; |
| 273 | 275 |
| 274 State state_; | 276 State state_; |
| 275 | 277 |
| 276 std::vector<std::unique_ptr<InputQueue>> inputs_; | 278 std::vector<std::unique_ptr<InputQueue>> inputs_; |
| 277 std::vector<std::unique_ptr<InputQueue>> ignored_inputs_; | 279 std::vector<std::unique_ptr<InputQueue>> ignored_inputs_; |
| 278 MediaPipelineBackendAlsa::RenderingDelay rendering_delay_; | 280 MediaPipelineBackendAlsa::RenderingDelay alsa_rendering_delay_; |
| 279 | 281 |
| 280 std::unique_ptr<base::Timer> retry_write_frames_timer_; | 282 std::unique_ptr<base::Timer> retry_write_frames_timer_; |
| 281 | 283 |
| 282 int check_close_timeout_; | 284 int check_close_timeout_; |
| 283 std::unique_ptr<base::Timer> check_close_timer_; | 285 std::unique_ptr<base::Timer> check_close_timer_; |
| 284 | 286 |
| 285 std::vector<std::unique_ptr<FilterGroup>> filter_groups_; | 287 std::vector<std::unique_ptr<FilterGroup>> filter_groups_; |
| 288 FilterGroup* default_filter_; |
| 289 FilterGroup* mix_filter_; |
| 290 FilterGroup* linearize_filter_; |
| 291 std::vector<uint8_t> interleaved_; |
| 292 |
| 286 std::vector<CastMediaShlib::LoopbackAudioObserver*> loopback_observers_; | 293 std::vector<CastMediaShlib::LoopbackAudioObserver*> loopback_observers_; |
| 287 | 294 |
| 288 std::map<AudioContentType, VolumeInfo> volume_info_; | 295 std::map<AudioContentType, VolumeInfo> volume_info_; |
| 289 | 296 |
| 290 DISALLOW_COPY_AND_ASSIGN(StreamMixerAlsa); | 297 DISALLOW_COPY_AND_ASSIGN(StreamMixerAlsa); |
| 291 }; | 298 }; |
| 292 | 299 |
| 293 } // namespace media | 300 } // namespace media |
| 294 } // namespace chromecast | 301 } // namespace chromecast |
| 295 | 302 |
| 296 #endif // CHROMECAST_MEDIA_CMA_BACKEND_ALSA_STREAM_MIXER_ALSA_H_ | 303 #endif // CHROMECAST_MEDIA_CMA_BACKEND_ALSA_STREAM_MIXER_ALSA_H_ |
| OLD | NEW |