Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1065)

Unified Diff: media/audio/audio_output_resampler.h

Issue 11298006: Browser-wide audio mirroring for TabCapture API (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 8 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: media/audio/audio_output_resampler.h
diff --git a/media/audio/audio_output_resampler.h b/media/audio/audio_output_resampler.h
index 764343777b3bcf888fd1700b6b72c47361dd464b..926198858b1b31d830dee4c1c39e6fe5e87b5402 100644
--- a/media/audio/audio_output_resampler.h
+++ b/media/audio/audio_output_resampler.h
@@ -9,15 +9,91 @@
#include "base/basictypes.h"
#include "base/memory/ref_counted.h"
+#include "base/message_loop.h"
#include "base/time.h"
#include "media/audio/audio_io.h"
#include "media/audio/audio_manager.h"
#include "media/audio/audio_output_dispatcher.h"
#include "media/audio/audio_parameters.h"
+#include "media/base/audio_pull_fifo.h"
+#include "media/base/channel_mixer.h"
+#include "media/base/multi_channel_resampler.h"
namespace media {
-class OnMoreDataResampler;
+class OnMoreDataResampler : public AudioOutputStream::AudioSourceCallback {
+ public:
+ OnMoreDataResampler(double io_ratio,
+ const AudioParameters& input_params,
+ const AudioParameters& output_params);
+ virtual ~OnMoreDataResampler();
+
+ // AudioSourceCallback interface.
+ virtual int OnMoreData(AudioBus* dest,
+ AudioBuffersState buffers_state) OVERRIDE;
+ virtual int OnMoreIOData(AudioBus* source,
+ AudioBus* dest,
+ AudioBuffersState buffers_state) OVERRIDE;
+ virtual void OnError(AudioOutputStream* stream, int code) OVERRIDE;
+ virtual void WaitTillDataReady() OVERRIDE;
+
+ // Sets |source_callback_|. If this is not a new object, then Stop() must be
+ // called before Start().
+ void Start(AudioOutputStream::AudioSourceCallback* callback);
+
+ // Clears |source_callback_| and flushes the resampler.
+ void Stop();
+
+ private:
+ // Called by MultiChannelResampler when more data is necessary.
+ void ProvideInput(AudioBus* audio_bus);
+
+ // Called by AudioPullFifo when more data is necessary. Requires
+ // |source_lock_| to have been acquired.
+ void SourceCallback_Locked(AudioBus* audio_bus);
+
+ // Passes through |source| to the |source_callback_| OnMoreIOData() call.
+ void SourceIOCallback_Locked(AudioBus* source, AudioBus* dest);
+
+ // Ratio of input bytes to output bytes used to correct playback delay with
+ // regard to buffering and resampling.
+ double io_ratio_;
+
+ // Source callback and associated lock.
+ base::Lock source_lock_;
+ AudioOutputStream::AudioSourceCallback* source_callback_;
+
+ // Last AudioBuffersState object received via OnMoreData(), used to correct
+ // playback delay by ProvideInput() and passed on to |source_callback_|.
+ AudioBuffersState current_buffers_state_;
+
+ // Total number of bytes (in terms of output parameters) stored in resampler
+ // or FIFO buffers which have not been sent to the audio device.
+ int outstanding_audio_bytes_;
+
+ // Used to buffer data between the client and the output device in cases where
+ // the client buffer size is not the same as the output device buffer size.
+ // Bound to SourceCallback_Locked() so must only be used when |source_lock_|
+ // has already been acquired.
+ scoped_ptr<AudioPullFifo> audio_fifo_;
+
+ // Handles resampling.
+ scoped_ptr<MultiChannelResampler> resampler_;
+
+ // Handles channel transforms. |unmixed_audio_| is a temporary destination
+ // for audio data before it goes into the channel mixer.
+ scoped_ptr<ChannelMixer> channel_mixer_;
+ scoped_ptr<AudioBus> unmixed_audio_;
+
+ int output_bytes_per_frame_;
+ int input_bytes_per_frame_;
+
+ // Since resampling is expensive, figure out if we should downmix channels
+ // before resampling.
+ bool downmix_early_;
+
+ DISALLOW_COPY_AND_ASSIGN(OnMoreDataResampler);
+};
// AudioOutputResampler is a browser-side resampling and rebuffering solution
// which ensures audio data is always output at given parameters. The rough

Powered by Google App Engine
This is Rietveld 408576698