/* Copyright (c) 2011 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.
 */

/* From trusted/ppb_audio_trusted.idl modified Sat Jul 16 16:51:03 2011. */

#ifndef PPAPI_C_TRUSTED_PPB_AUDIO_TRUSTED_H_
#define PPAPI_C_TRUSTED_PPB_AUDIO_TRUSTED_H_

#include "ppapi/c/pp_completion_callback.h"
#include "ppapi/c/pp_instance.h"
#include "ppapi/c/pp_macros.h"
#include "ppapi/c/pp_resource.h"
#include "ppapi/c/pp_stdint.h"

#define PPB_AUDIO_TRUSTED_INTERFACE_0_6 "PPB_AudioTrusted;0.6"
#define PPB_AUDIO_TRUSTED_INTERFACE PPB_AUDIO_TRUSTED_INTERFACE_0_6

/**
 * @file
 * This file defines the trusted audio interface.
 */


/**
 * @addtogroup Interfaces
 * @{
 */
/**
 * This interface is to be used by proxy implementations.  All
 * functions should be called from the main thread only.  The
 * resource returned is an Audio resource; most of the PPB_Audio
 * interface is also usable on this resource.
 */
struct PPB_AudioTrusted {
  /** Returns an audio resource. */
  PP_Resource (*CreateTrusted)(PP_Instance instance);
  /**
   * Opens a paused audio interface, used by trusted side of proxy.
   * Returns PP_ERROR_WOULD_BLOCK on success, and invokes
   * the |create_callback| asynchronously to complete.
   * As this function should always be invoked from the main thread,
   * do not use the blocking variant of PP_CompletionCallback.
   */
  int32_t (*Open)(PP_Resource audio,
                  PP_Resource config,
                  struct PP_CompletionCallback create_callback);
  /**
   * Get the sync socket.  Use once Open has completed.
   * Returns PP_OK on success.
   */
  int32_t (*GetSyncSocket)(PP_Resource audio, int* sync_socket);
  /**
   * Get the shared memory interface.  Use once Open has completed.
   * Returns PP_OK on success.
   */
  int32_t (*GetSharedMemory)(PP_Resource audio,
                             int* shm_handle,
                             uint32_t* shm_size);
};
/**
 * @}
 */

#endif  /* PPAPI_C_TRUSTED_PPB_AUDIO_TRUSTED_H_ */

