Home | History | Annotate | Download | only in media
      1 // Copyright (c) 2012 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 // AudioRendererHost serves audio related requests from AudioRenderer which
      6 // lives inside the render process and provide access to audio hardware.
      7 //
      8 // This class is owned by BrowserRenderProcessHost, and instantiated on UI
      9 // thread, but all other operations and method calls happen on IO thread, so we
     10 // need to be extra careful about the lifetime of this object. AudioManager is a
     11 // singleton and created in IO thread, audio output streams are also created in
     12 // the IO thread, so we need to destroy them also in IO thread. After this class
     13 // is created, a task of OnInitialized() is posted on IO thread in which
     14 // singleton of AudioManager is created.
     15 //
     16 // Here's an example of a typical IPC dialog for audio:
     17 //
     18 //   Renderer                     AudioRendererHost
     19 //      |                               |
     20 //      |         CreateStream >        |
     21 //      |     < NotifyStreamCreated     |
     22 //      |                               |
     23 //      |          PlayStream >         |
     24 //      |  < NotifyStreamStateChanged   | kAudioStreamPlaying
     25 //      |                               |
     26 //      |         PauseStream >         |
     27 //      |  < NotifyStreamStateChanged   | kAudioStreamPaused
     28 //      |                               |
     29 //      |          PlayStream >         |
     30 //      |  < NotifyStreamStateChanged   | kAudioStreamPlaying
     31 //      |             ...               |
     32 //      |         CloseStream >         |
     33 //      v                               v
     34 
     35 // A SyncSocket pair is used to signal buffer readiness between processes.
     36 
     37 #ifndef CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_RENDERER_HOST_H_
     38 #define CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_RENDERER_HOST_H_
     39 
     40 #include <map>
     41 
     42 #include "base/atomic_ref_count.h"
     43 #include "base/gtest_prod_util.h"
     44 #include "base/memory/ref_counted.h"
     45 #include "base/memory/scoped_ptr.h"
     46 #include "base/process/process.h"
     47 #include "base/sequenced_task_runner_helpers.h"
     48 #include "content/common/content_export.h"
     49 #include "content/public/browser/browser_message_filter.h"
     50 #include "content/public/browser/browser_thread.h"
     51 #include "content/public/browser/render_view_host.h"
     52 #include "media/audio/audio_io.h"
     53 #include "media/audio/audio_logging.h"
     54 #include "media/audio/audio_output_controller.h"
     55 #include "media/audio/simple_sources.h"
     56 
     57 namespace media {
     58 class AudioManager;
     59 class AudioParameters;
     60 }
     61 
     62 namespace content {
     63 
     64 class AudioMirroringManager;
     65 class MediaInternals;
     66 class MediaStreamManager;
     67 class ResourceContext;
     68 
     69 class CONTENT_EXPORT AudioRendererHost : public BrowserMessageFilter {
     70  public:
     71   // Called from UI thread from the owner of this object.
     72   AudioRendererHost(int render_process_id,
     73                     media::AudioManager* audio_manager,
     74                     AudioMirroringManager* mirroring_manager,
     75                     MediaInternals* media_internals,
     76                     MediaStreamManager* media_stream_manager);
     77 
     78   // Calls |callback| with the list of AudioOutputControllers for this object.
     79   void GetOutputControllers(
     80       int render_view_id,
     81       const RenderViewHost::GetAudioOutputControllersCallback& callback) const;
     82 
     83   // BrowserMessageFilter implementation.
     84   virtual void OnChannelClosing() OVERRIDE;
     85   virtual void OnDestruct() const OVERRIDE;
     86   virtual bool OnMessageReceived(const IPC::Message& message) OVERRIDE;
     87 
     88   // Returns true if any streams managed by this host are actively playing.  Can
     89   // be called from any thread.
     90   bool HasActiveAudio();
     91 
     92  private:
     93   friend class AudioRendererHostTest;
     94   friend class BrowserThread;
     95   friend class base::DeleteHelper<AudioRendererHost>;
     96   friend class MockAudioRendererHost;
     97   friend class TestAudioRendererHost;
     98   FRIEND_TEST_ALL_PREFIXES(AudioRendererHostTest, CreateMockStream);
     99   FRIEND_TEST_ALL_PREFIXES(AudioRendererHostTest, MockStreamDataConversation);
    100 
    101   class AudioEntry;
    102   typedef std::map<int, AudioEntry*> AudioEntryMap;
    103 
    104   virtual ~AudioRendererHost();
    105 
    106   // Methods called on IO thread ----------------------------------------------
    107 
    108   // Audio related IPC message handlers.
    109 
    110   // Creates an audio output stream with the specified format whose data is
    111   // produced by an entity in the render view referenced by |render_view_id|.
    112   // |session_id| is used for unified IO to find out which input device to be
    113   // opened for the stream. For clients that do not use unified IO,
    114   // |session_id| will be ignored.
    115   // Upon success/failure, the peer is notified via the NotifyStreamCreated
    116   // message.
    117   void OnCreateStream(int stream_id,
    118                       int render_view_id,
    119                       int render_frame_id,
    120                       int session_id,
    121                       const media::AudioParameters& params);
    122 
    123   // Play the audio stream referenced by |stream_id|.
    124   void OnPlayStream(int stream_id);
    125 
    126   // Pause the audio stream referenced by |stream_id|.
    127   void OnPauseStream(int stream_id);
    128 
    129   // Close the audio stream referenced by |stream_id|.
    130   void OnCloseStream(int stream_id);
    131 
    132   // Set the volume of the audio stream referenced by |stream_id|.
    133   void OnSetVolume(int stream_id, double volume);
    134 
    135   // Complete the process of creating an audio stream. This will set up the
    136   // shared memory or shared socket in low latency mode and send the
    137   // NotifyStreamCreated message to the peer.
    138   void DoCompleteCreation(int stream_id);
    139 
    140   // Send playing/paused status to the renderer.
    141   void DoNotifyStreamStateChanged(int stream_id, bool is_playing);
    142 
    143   RenderViewHost::AudioOutputControllerList DoGetOutputControllers(
    144       int render_view_id) const;
    145 
    146   // Send an error message to the renderer.
    147   void SendErrorMessage(int stream_id);
    148 
    149   // Delete an audio entry, notifying observers first.  This is called by
    150   // AudioOutputController after it has closed.
    151   void DeleteEntry(scoped_ptr<AudioEntry> entry);
    152 
    153   // Send an error message to the renderer, then close the stream.
    154   void ReportErrorAndClose(int stream_id);
    155 
    156   // A helper method to look up a AudioEntry identified by |stream_id|.
    157   // Returns NULL if not found.
    158   AudioEntry* LookupById(int stream_id);
    159 
    160   // ID of the RenderProcessHost that owns this instance.
    161   const int render_process_id_;
    162 
    163   media::AudioManager* const audio_manager_;
    164   AudioMirroringManager* const mirroring_manager_;
    165   scoped_ptr<media::AudioLog> audio_log_;
    166 
    167   // Used to access to AudioInputDeviceManager.
    168   MediaStreamManager* media_stream_manager_;
    169 
    170   // A map of stream IDs to audio sources.
    171   AudioEntryMap audio_entries_;
    172 
    173   // The number of streams in the playing state.
    174   base::AtomicRefCount num_playing_streams_;
    175 
    176   DISALLOW_COPY_AND_ASSIGN(AudioRendererHost);
    177 };
    178 
    179 }  // namespace content
    180 
    181 #endif  // CONTENT_BROWSER_RENDERER_HOST_MEDIA_AUDIO_RENDERER_HOST_H_
    182