• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 #ifndef MEDIA_MOJO_SERVICES_MOJO_RENDERER_SERVICE_H_
6 #define MEDIA_MOJO_SERVICES_MOJO_RENDERER_SERVICE_H_
7 
8 #include "base/callback.h"
9 #include "base/macros.h"
10 #include "base/memory/scoped_ptr.h"
11 #include "base/memory/weak_ptr.h"
12 #include "media/base/audio_decoder_config.h"
13 #include "media/base/audio_hardware_config.h"
14 #include "media/base/buffering_state.h"
15 #include "media/base/pipeline_status.h"
16 #include "media/mojo/interfaces/media_renderer.mojom.h"
17 #include "mojo/public/cpp/bindings/interface_impl.h"
18 
19 namespace mojo {
20 class ApplicationConnection;
21 }
22 
23 namespace media {
24 
25 class AudioRenderer;
26 class MojoDemuxerStreamAdapter;
27 
28 // A mojo::MediaRenderer implementation that uses media::AudioRenderer to
29 // decode and render audio to a sink obtained from the ApplicationConnection.
30 class MojoRendererService : public mojo::InterfaceImpl<mojo::MediaRenderer> {
31  public:
32   // |connection| is a pointer to the connection back to our embedder. The
33   // embedder should have configured it (via ConfigureOutgoingConnection) to
34   // allow |this| to connect to a sink that will receive decoded data ready
35   // for playback.
36   explicit MojoRendererService(mojo::ApplicationConnection* connection);
37   virtual ~MojoRendererService();
38 
39   // mojo::MediaRenderer implementation.
40   virtual void Initialize(mojo::DemuxerStreamPtr stream,
41                           const mojo::Callback<void()>& callback) MOJO_OVERRIDE;
42   virtual void Flush(const mojo::Callback<void()>& callback) MOJO_OVERRIDE;
43   virtual void StartPlayingFrom(int64_t time_delta_usec) MOJO_OVERRIDE;
44   virtual void SetPlaybackRate(float playback_rate) MOJO_OVERRIDE;
45   virtual void SetVolume(float volume) MOJO_OVERRIDE;
46 
47  private:
48   // Called when the MojoDemuxerStreamAdapter is ready to go (has a config,
49   // pipe handle, etc) and can be handed off to a renderer for use.
50   void OnStreamReady();
51 
52   // Called when |audio_renderer_| initialization has completed.
53   void OnAudioRendererInitializeDone(PipelineStatus status);
54 
55   // Callback executed by filters to update statistics.
56   void OnUpdateStatistics(const PipelineStatistics& stats);
57 
58   // Callback executed by audio renderer to update clock time.
59   void OnAudioTimeUpdate(base::TimeDelta time, base::TimeDelta max_time);
60 
61   // Callback executed by audio renderer when buffering state changes.
62   // TODO(tim): Need old and new.
63   void OnBufferingStateChanged(BufferingState new_buffering_state);
64 
65   // Callback executed when a renderer has ended.
66   void OnAudioRendererEnded();
67 
68   // Callback executed when a runtime error happens.
69   void OnError(PipelineStatus error);
70 
71   scoped_ptr<MojoDemuxerStreamAdapter> stream_;
72   scoped_ptr<AudioRenderer> audio_renderer_;
73 
74   mojo::Callback<void()> init_cb_;
75 
76   // TODO(tim): Figure out how to set up hardware config.
77   // NOTE: AudioRendererImpl stores a const& to the config we pass in (hmm..).
78   // Hence stack-allocating one and passing it to Initialize results in
79   // undefined badness (e.g, hangs trying to acquire config_lock_);
80   media::AudioHardwareConfig hardware_config_;
81 
82   base::WeakPtrFactory<MojoRendererService> weak_factory_;
83   base::WeakPtr<MojoRendererService> weak_this_;
84   DISALLOW_COPY_AND_ASSIGN(MojoRendererService);
85 };
86 
87 }  // namespace media
88 
89 #endif  // MEDIA_MOJO_SERVICES_MOJO_RENDERER_SERVICE_H_
90