| // Copyright (c) 2013 The Chromium Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #ifndef MEDIA_BASE_FAKE_AUDIO_WORKER_H_ |
| #define MEDIA_BASE_FAKE_AUDIO_WORKER_H_ |
| |
| #include "base/callback_forward.h" |
| #include "base/macros.h" |
| #include "base/memory/ref_counted.h" |
| #include "media/base/media_export.h" |
| |
| namespace base { |
| class SingleThreadTaskRunner; |
| class TimeDelta; |
| class TimeTicks; |
| } |
| |
| namespace media { |
| class AudioParameters; |
| |
| // A fake audio worker. Using a provided message loop, FakeAudioWorker will |
| // call back the provided callback like a real audio consumer or producer would. |
| class MEDIA_EXPORT FakeAudioWorker { |
| public: |
| // The worker callback, which is run at regular intervals. |ideal_time| is |
| // when the callback was scheduled to run, while |now| is when the callback is |
| // actually being run. |
| using Callback = base::RepeatingCallback<void(base::TimeTicks ideal_time, |
| base::TimeTicks now)>; |
| |
| // |worker_task_runner| is the task runner on which the closure provided to |
| // Start() will be executed on. This may or may not be the be for the same |
| // thread that invokes the Start/Stop methods. |
| // |params| is used to determine the frequency of callbacks. |
| FakeAudioWorker( |
| const scoped_refptr<base::SingleThreadTaskRunner>& worker_task_runner, |
| const AudioParameters& params); |
| |
| FakeAudioWorker(const FakeAudioWorker&) = delete; |
| FakeAudioWorker& operator=(const FakeAudioWorker&) = delete; |
| |
| ~FakeAudioWorker(); |
| |
| // Start executing |worker_cb| at a regular intervals. Stop() must be called |
| // by the same thread before destroying FakeAudioWorker. |
| void Start(Callback worker_cb); |
| |
| // Stop executing the closure provided to Start(). Blocks until the worker |
| // loop is not inside a closure invocation. Safe to call multiple times. |
| // Must be called on the same thread that called Start(). |
| void Stop(); |
| |
| // Returns a reasonable fixed output delay value for a "sink" using a |
| // FakeAudioWorker. |
| static base::TimeDelta ComputeFakeOutputDelay(const AudioParameters& params); |
| |
| private: |
| // All state and implementation is kept within this ref-counted class because |
| // cancellation of posted tasks must happen on the worker thread some time |
| // after the call to Stop() (on the main thread) returns. |
| class Worker; |
| const scoped_refptr<Worker> worker_; |
| }; |
| |
| } // namespace media |
| |
| #endif // MEDIA_BASE_FAKE_AUDIO_WORKER_H_ |