// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef PPAPI_PROXY_PPB_AUDIO_PROXY_H_
#define PPAPI_PROXY_PPB_AUDIO_PROXY_H_

#include <stdint.h>

#include <utility>

#include "base/macros.h"
#include "base/memory/unsafe_shared_memory_region.h"
#include "base/sync_socket.h"
#include "ipc/ipc_platform_file.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/ppb_audio.h"
#include "ppapi/c/ppb_audio_config.h"
#include "ppapi/proxy/interface_proxy.h"
#include "ppapi/proxy/proxy_completion_callback_factory.h"
#include "ppapi/utility/completion_callback_factory.h"

namespace ppapi {

class AudioCallbackCombined;
class HostResource;

namespace proxy {

class SerializedHandle;

class PPB_Audio_Proxy : public InterfaceProxy {
 public:
  explicit PPB_Audio_Proxy(Dispatcher* dispatcher);
  ~PPB_Audio_Proxy() override;

  // Creates an Audio object in the plugin process.
  static PP_Resource CreateProxyResource(
      PP_Instance instance_id,
      PP_Resource config_id,
      const AudioCallbackCombined& audio_callback,
      void* user_data);

  // InterfaceProxy implementation.
  bool OnMessageReceived(const IPC::Message& msg) override;

  static const ApiID kApiID = API_ID_PPB_AUDIO;

 private:
  // Plugin->renderer message handlers.
  void OnMsgCreate(PP_Instance instance_id,
                   int32_t sample_rate,
                   uint32_t sample_frame_count,
                   ppapi::HostResource* result);
  void OnMsgStartOrStop(const ppapi::HostResource& audio_id, bool play);

  // Renderer->plugin message handlers.
  void OnMsgNotifyAudioStreamCreated(
      const ppapi::HostResource& audio_id,
      int32_t result_code,
      ppapi::proxy::SerializedHandle socket_handle,
      ppapi::proxy::SerializedHandle handle);

  void AudioChannelConnected(int32_t result,
                             const ppapi::HostResource& resource);

  // In the renderer, this is called in response to a stream created message.
  // It will retrieve the shared memory and socket handles and place them into
  // the given out params. The return value is a PPAPI error code.
  //
  // The input arguments should be initialized to 0 or -1, depending on the
  // platform's default invalid handle values. On error, some of these
  // arguments may be written to, and others may be untouched, depending on
  // where the error occurred.
  int32_t GetAudioConnectedHandles(
      const ppapi::HostResource& resource,
      IPC::PlatformFileForTransit* foreign_socket_handle,
      base::UnsafeSharedMemoryRegion* foreign_shared_memory_region);

  ProxyCompletionCallbackFactory<PPB_Audio_Proxy> callback_factory_;

  DISALLOW_COPY_AND_ASSIGN(PPB_Audio_Proxy);
};

}  // namespace proxy
}  // namespace ppapi

#endif  // PPAPI_PROXY_PPB_AUDIO_PROXY_H_
