15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* From ppb_audio.idl modified Mon Jul  9 12:03:36 2012. */
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef PPAPI_C_PPB_AUDIO_H_
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPAPI_C_PPB_AUDIO_H_
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_bool.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_instance.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_macros.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_resource.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "ppapi/c/pp_stdint.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPB_AUDIO_INTERFACE_1_0 "PPB_Audio;1.0"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define PPB_AUDIO_INTERFACE PPB_AUDIO_INTERFACE_1_0
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @file
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * This file defines the <code>PPB_Audio</code> interface, which provides
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * realtime stereo audio streaming capabilities.
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @addtogroup Typedefs
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @{
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <code>PPB_Audio_Callback</code> defines the type of an audio callback
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * function used to fill the audio buffer with data. Please see the
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Create() function in the <code>PPB_Audio</code> interface for
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * more details on this callback.
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef void (*PPB_Audio_Callback)(void* sample_buffer,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   uint32_t buffer_size_in_bytes,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                                   void* user_data);
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @}
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @addtogroup Interfaces
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @{
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * The <code>PPB_Audio</code> interface contains pointers to several functions
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * for handling audio resources. Refer to the
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <a href="/native-client/{{pepperversion}}/devguide/coding/audio">Audio</a>
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * chapter in the Developer's Guide for information on using this interface.
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Please see descriptions for each <code>PPB_Audio</code> and
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <code>PPB_AudioConfig</code> function for more details. A C example using
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <code>PPB_Audio</code> and <code>PPB_AudioConfig</code> follows.
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * <strong>Example: </strong>
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @code
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * void audio_callback(void* sample_buffer,
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                     uint32_t buffer_size_in_bytes,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *                     void* user_data) {
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   ... quickly fill in the buffer with samples and return to caller ...
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *  }
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ...Assume the application has cached the audio configuration interface in
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * audio_config_interface and the audio interface in
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * audio_interface...
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * uint32_t count = audio_config_interface->RecommendSampleFrameCount(
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     PP_AUDIOSAMPLERATE_44100, 4096);
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PP_Resource pp_audio_config = audio_config_interface->CreateStereo16Bit(
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     pp_instance, PP_AUDIOSAMPLERATE_44100, count);
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * PP_Resource pp_audio = audio_interface->Create(pp_instance, pp_audio_config,
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *     audio_callback, NULL);
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * audio_interface->StartPlayback(pp_audio);
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * ...audio_callback() will now be periodically invoked on a separate thread...
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @endcode
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct PPB_Audio_1_0 {
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * Create() creates an audio resource. No sound will be heard until
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * StartPlayback() is called. The callback is called with the buffer address
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * and given user data whenever the buffer needs to be filled. From within the
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * callback, you should not call <code>PPB_Audio</code> functions. The
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * callback will be called on a different thread than the one which created
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * the interface. For performance-critical applications (i.e. low-latency
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * audio), the callback should avoid blocking or calling functions that can
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * obtain locks, such as malloc. The layout and the size of the buffer passed
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * to the audio callback will be determined by the device configuration and is
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * specified in the <code>AudioConfig</code> documentation.
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] instance A <code>PP_Instance</code> identifying one instance
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * of a module.
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * config resource.
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] audio_callback A <code>PPB_Audio_Callback</code> callback
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * function that the browser calls when it needs more samples to play.
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] user_data A pointer to user data used in the callback function.
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return A <code>PP_Resource</code> containing the audio resource if
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * successful or 0 if the configuration cannot be honored or the callback is
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * null.
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource (*Create)(PP_Instance instance,
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        PP_Resource config,
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        PPB_Audio_Callback audio_callback,
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                        void* user_data);
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * IsAudio() determines if the provided resource is an audio resource.
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] resource A <code>PP_Resource</code> corresponding to a generic
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * resource.
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return A <code>PP_Bool</code> containing containing <code>PP_TRUE</code>
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * if the given resource is an Audio resource, otherwise
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * <code>PP_FALSE</code>.
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Bool (*IsAudio)(PP_Resource resource);
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * GetCurrrentConfig() returns an audio config resource for the given audio
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * resource.
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * resource.
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return A <code>PP_Resource</code> containing the audio config resource if
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * successful.
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Resource (*GetCurrentConfig)(PP_Resource audio);
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * StartPlayback() starts the playback of the audio resource and begins
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * periodically calling the callback.
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * resource.
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return A <code>PP_Bool</code> containing <code>PP_TRUE</code> if
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * successful, otherwise <code>PP_FALSE</code>. Also returns
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * <code>PP_TRUE</code> (and be a no-op) if called while playback is already
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * in progress.
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Bool (*StartPlayback)(PP_Resource audio);
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  /**
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * StopPlayback() stops the playback of the audio resource.
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @param[in] config A <code>PP_Resource</code> corresponding to an audio
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * resource.
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   *
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * @return A <code>PP_Bool</code> containing <code>PP_TRUE</code> if
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * successful, otherwise <code>PP_FALSE</code>. Also returns
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * <code>PP_TRUE</code> (and is a no-op) if called while playback is already
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * stopped. If a callback is in progress, StopPlayback() will block until the
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   * callback completes.
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   */
1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PP_Bool (*StopPlayback)(PP_Resource audio);
1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)typedef struct PPB_Audio_1_0 PPB_Audio;
1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/**
1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * @}
1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) */
1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif  /* PPAPI_C_PPB_AUDIO_H_ */
1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
167