#include "base/macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/memory/weak_ptr.h"
+#include "base/timer/timer.h"
#include "media/base/audio_decoder_config.h"
-#include "media/base/audio_hardware_config.h"
#include "media/base/buffering_state.h"
#include "media/base/pipeline_status.h"
#include "media/mojo/interfaces/media_renderer.mojom.h"
namespace media {
-class AudioRenderer;
+class AudioRendererSink;
+class DemuxerStreamProviderShim;
class MojoDemuxerStreamAdapter;
+class Renderer;
// A mojo::MediaRenderer implementation that uses media::AudioRenderer to
// decode and render audio to a sink obtained from the ApplicationConnection.
// allow |this| to connect to a sink that will receive decoded data ready
// for playback.
explicit MojoRendererService(mojo::ApplicationConnection* connection);
- virtual ~MojoRendererService();
+ ~MojoRendererService() override;
// mojo::MediaRenderer implementation.
- virtual void Initialize(mojo::DemuxerStreamPtr stream,
- const mojo::Callback<void()>& callback) MOJO_OVERRIDE;
- virtual void Flush(const mojo::Callback<void()>& callback) MOJO_OVERRIDE;
- virtual void StartPlayingFrom(int64_t time_delta_usec) MOJO_OVERRIDE;
- virtual void SetPlaybackRate(float playback_rate) MOJO_OVERRIDE;
- virtual void SetVolume(float volume) MOJO_OVERRIDE;
+ void Initialize(mojo::DemuxerStreamPtr audio,
+ mojo::DemuxerStreamPtr video,
+ const mojo::Closure& callback) override;
+ void Flush(const mojo::Closure& callback) override;
+ void StartPlayingFrom(int64_t time_delta_usec) override;
+ void SetPlaybackRate(float playback_rate) override;
+ void SetVolume(float volume) override;
private:
+ enum State {
+ STATE_UNINITIALIZED,
+ STATE_INITIALIZING,
+ STATE_FLUSHING,
+ STATE_PLAYING,
+ STATE_ERROR
+ };
+
// Called when the MojoDemuxerStreamAdapter is ready to go (has a config,
// pipe handle, etc) and can be handed off to a renderer for use.
- void OnStreamReady();
+ void OnStreamReady(const mojo::Closure& callback);
// Called when |audio_renderer_| initialization has completed.
- void OnAudioRendererInitializeDone(PipelineStatus status);
+ void OnRendererInitializeDone(const mojo::Closure& callback);
// Callback executed by filters to update statistics.
void OnUpdateStatistics(const PipelineStatistics& stats);
- // Callback executed by audio renderer to update clock time.
- void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time);
+ // Periodically polls the media time from the renderer and notifies the client
+ // if the media time has changed since the last update. If |force| is true,
+ // the client is notified even if the time is unchanged.
+ void UpdateMediaTime(bool force);
+ void SchedulePeriodicMediaTimeUpdates();
// Callback executed by audio renderer when buffering state changes.
// TODO(tim): Need old and new.
void OnBufferingStateChanged(BufferingState new_buffering_state);
// Callback executed when a renderer has ended.
- void OnAudioRendererEnded();
+ void OnRendererEnded();
// Callback executed when a runtime error happens.
void OnError(PipelineStatus error);
- scoped_ptr<MojoDemuxerStreamAdapter> stream_;
- scoped_ptr<AudioRenderer> audio_renderer_;
+ State state_;
- mojo::Callback<void()> init_cb_;
+ scoped_refptr<AudioRendererSink> audio_renderer_sink_;
+ scoped_ptr<Renderer> renderer_;
+ scoped_ptr<DemuxerStreamProviderShim> stream_provider_;
- // TODO(tim): Figure out how to set up hardware config.
- // NOTE: AudioRendererImpl stores a const& to the config we pass in (hmm..).
- // Hence stack-allocating one and passing it to Initialize results in
- // undefined badness (e.g, hangs trying to acquire config_lock_);
- media::AudioHardwareConfig hardware_config_;
+ base::RepeatingTimer<MojoRendererService> time_update_timer_;
+ uint64_t last_media_time_usec_;
base::WeakPtrFactory<MojoRendererService> weak_factory_;
base::WeakPtr<MojoRendererService> weak_this_;
+
DISALLOW_COPY_AND_ASSIGN(MojoRendererService);
};