audio_output_ipc.h revision 868fa2fe829687343ffae624259930155e16dbd8
1b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// Copyright (c) 2012 The Chromium Authors. All rights reserved.
2b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// Use of this source code is governed by a BSD-style license that can be
3b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// found in the LICENSE file.
4b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
5b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#ifndef MEDIA_AUDIO_AUDIO_OUTPUT_IPC_H_
6b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#define MEDIA_AUDIO_AUDIO_OUTPUT_IPC_H_
7b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
8b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include "base/shared_memory.h"
9b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include "base/sync_socket.h"
10b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include "media/audio/audio_parameters.h"
11b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent#include "media/base/media_export.h"
12b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
13b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentnamespace media {
14b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
15b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// Contains IPC notifications for the state of the server side
16b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// (AudioOutputController) audio state changes and when an AudioOutputController
17b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent// has been created.  Implemented by AudioOutputDevice.
18b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurentclass MEDIA_EXPORT AudioOutputIPCDelegate {
19b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent public:
20b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Current status of the audio output stream in the browser process. Browser
21b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // sends information about the current playback state and error to the
22b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // renderer process using this type.
23b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  enum State {
24b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    kPlaying,
25b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    kPaused,
26b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent    kError
27b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  };
28b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
29b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Called when state of an audio stream has changed.
30df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  virtual void OnStateChanged(State state) = 0;
31df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
32b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Called when an audio stream has been created.
33b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // The shared memory |handle| points to a memory section that's used to
34b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // transfer audio buffers from the AudioOutputIPCDelegate back to the
35b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // AudioRendererHost.  The implementation of OnStreamCreated takes ownership.
36b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // The |socket_handle| is used by AudioRendererHost to signal requests for
37b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // audio data to be written into the shared memory. The AudioOutputIPCDelegate
38b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // must read from this socket and provide audio whenever data (search for
39b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // "pending_bytes") is received.
40b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual void OnStreamCreated(base::SharedMemoryHandle handle,
41b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                               base::SyncSocket::Handle socket_handle,
42b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent                               int length) = 0;
43b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
44b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Called when the AudioOutputIPC object is going away and/or when the IPC
45b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // channel has been closed and no more ipc requests can be made.
46b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Implementations should delete their owned AudioOutputIPC instance
47b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // immediately.
48b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual void OnIPCClosed() = 0;
49b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
50b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent protected:
51b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual ~AudioOutputIPCDelegate();
52df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent};
53df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
54df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent// Provides the IPC functionality for an AudioOutputIPCDelegate (e.g., an
55df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent// AudioOutputDevice).  The implementation should asynchronously deliver the
56df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent// messages to an AudioOutputController object (or create one in the case of
57df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent// CreateStream()), that may live in a separate process.
58df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurentclass MEDIA_EXPORT AudioOutputIPC {
59df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent public:
60df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  virtual ~AudioOutputIPC();
61df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
62df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  // Sends a request to create an AudioOutputController object in the peer
63df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  // process and configures it to use the specified audio |params| including
64df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  // number of synchronized input channels.|session_id| is used by the browser
65df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  // to select the correct input device if the input channel in |params| is
66df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  // valid, otherwise it will be ignored.  Once the stream has been created,
67df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  // the implementation will notify |delegate| by calling OnStreamCreated().
68df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent  virtual void CreateStream(AudioOutputIPCDelegate* delegate,
69df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                            const AudioParameters& params,
70df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent                            int session_id) = 0;
71b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
72b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Starts playing the stream.  This should generate a call to
73b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // AudioOutputController::Play().
74b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual void PlayStream() = 0;
75b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
76b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Pauses an audio stream.  This should generate a call to
77b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // AudioOutputController::Pause().
78b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual void PauseStream() = 0;
79b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
80b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Closes the audio stream which should shut down the corresponding
81b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // AudioOutputController in the peer process.
82b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual void CloseStream() = 0;
83b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
84b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  // Sets the volume of the audio stream.
85b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent  virtual void SetVolume(double volume) = 0;
86b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent};
87b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent
88b7a11d83f749ad0200778c4815e907d011d4b5d3Eric Laurent}  // namespace media
89df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent
90df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent#endif  // MEDIA_AUDIO_AUDIO_OUTPUT_IPC_H_
91df3dc7e2fe6c639529b70e3f3a7d2bf0f4c6e871Eric Laurent