blob: 93a90397bada56bb142d86d9735db89dd90ed6d1 [file] [log] [blame]
/* Copyright 2016 Google Inc. All rights reserved.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#ifndef VR_GVR_CAPI_INCLUDE_GVR_AUDIO_H_
#define VR_GVR_CAPI_INCLUDE_GVR_AUDIO_H_
#if __ANDROID__
#include <jni.h>
#endif // __ANDROID__
#include <stdint.h>
#include "vr/gvr/capi/include/gvr.h"
#include "vr/gvr/capi/include/gvr_types.h"
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
/// @defgroup Audio Spatial Audio API
/// @brief This is the GVR Audio C API, a spatial audio rendering engine,
/// optimized for mobile VR.
///
/// It allows the user to spatialize sound sources in 3D space, including
/// distance and elevation cues. Specifically, the API is capable of playing
/// back spatial sound in three ways:
///
/// - **Sound object rendering**: This allows the user to create a virtual sound
/// source in 3D space. These sources, while spatialized, are fed with mono
/// audio data.
///
/// - **Ambisonic soundfields**: Ambisonic recordings are multi-channel audio
/// files which are spatialized all around the listener in 360 degrees. These
/// can be thought of as recorded or pre-baked soundfields. They can be of
/// great use for background effects which sound perfectly spatial. Examples
/// include rain noise, crowd noise or even the sound of the ocean off to one
/// side.
///
/// - **Stereo Sounds**: This allows the user to directly play back
/// non-spatialized mono or stereo audio files. This is useful for music and
/// other such audio.
///
/// **Initialization**
///
/// gvr_audio_context* gvr_audio_create(int32_t rendering_mode);
///
/// The rendering_mode argument corresponds to a `gvr_audio_rendering_mode` enum
/// value, which specifies a rendering configuration setting:
///
/// - `GVR_AUDIO_RENDERING_STEREO_PANNING`:
/// Stereo panning of all sound objects. This disables HRTF-based rendering.
/// - `GVR_AUDIO_RENDERING_BINAURAL_LOW_QUALITY`:
/// This renders sound objects over a virtual array of 8 loudspeakers arranged
/// in a cube configuration around the listener’s head. HRTF-based rendering
/// is enabled.
/// - `GVR_AUDIO_RENDERING_BINAURAL_HIGH_QUALITY`:
/// This renders sound objects over a virtual array of 16 loudspeakers
/// arranged in an approximate equidistribution about the listener’s
/// head. HRTF-based rendering is enabled.
///
/// For most modern phones, the high quality mode offers a good balance between
/// performance and audio quality. To optimize the rendering performance for
/// headphones *and* speaker playback, the stereo speaker mode can be enabled
/// which automatically switches to stereo panning when no headphone is plugin.
/// Note that this can lead to varying CPU usage based on headphone and speaker
/// playback.
///
/// **Sound engine control**
///
/// Audio playback on the default audio device can be started and stopped by
/// calling the following two methods:
///
/// void gvr_audio_pause(gvr_audio_context* api);
/// void gvr_audio_resume(gvr_audio_context* api);
///
/// Note that:
///
/// void gvr_audio_update(gvr_audio_context* api);
///
/// must be called from the main thread at a regular rate. It is used to execute
/// background operations outside of the audio thread.
///
/// **Listener position and rotation**
///
/// To ensure that the audio in your application reacts to listener head
/// movement, it is important to update the listener's head orientation in the
/// graphics callback using the head orientation matrix.
///
/// The following methods can be used to control the listener’s head position
/// and orientation with the audio engine:
///
/// void gvr_audio_set_head_position(gvr_audio_context* api, float x,
/// float y, float z);
/// or
///
/// void gvr_audio_set_head_position_gvr(gvr_audio_context* api,
/// const gvr_vec3f& position);
///
/// and
///
/// void gvr_audio_set_head_rotation(gvr_audio_context* api,
/// float x, float y, float z, float w);
/// or
///
/// void gvr_audio_set_head_rotation_gvr(gvr_audio_context* api,
/// const gvr_quatf& rotation);
///
/// **Preloading Sounds**
///
/// Both mono sound files for use with Sound Objects and multi-channel Ambisonic
/// soundfield files can be preloaded into memory before playback or
/// alternatively streamed during playback. Preloading can be useful to reduce
/// CPU usage especially if the same audio clip is likely to be played back many
/// times. In this case playback latency is also reduced.
///
/// Sound files can be preloaded into memory by calling:
///
/// bool gvr_audio_preload_soundfile(gvr_audio_context* api,
/// const char* filename);
///
/// Unused sound files can be unloaded with a call to:
///
/// void gvr_audio_unload_soundfile(gvr_audio_context* api,
/// const char* filename);
///
/// NOTE: If a sound object, soundfield or stereo sound is created with a file
/// that has not been preloaded, that audio will be streamed.
///
/// **Spatializtion of sound objects**
///
/// The GVR Audio System allows the user to create virtual sound objects which
/// can be placed anywhere in space around the listener.
///
/// To create a new sound object, call:
///
/// gvr_audio_source_id
/// gvr_audio_create_sound_object(gvr_audio_context* api,
/// const char* filename);
///
/// This returns a handle that can be used to set properties such as the
/// position and the volume of the sound object via calls to the following two
/// functions:
///
/// void
/// gvr_audio_set_sound_object_position(gvr_audio_context* api,
/// gvr_audio_source_id sound_object_id,
/// float x, float y, float z);
///
/// void
/// gvr_audio_set_sound_volume(gvr_audio_context* api,
/// gvr_audio_source_id source_id, float volume);
///
/// The behavior of Sound Objects with respect to their distance from the
/// listener can be controlled via calls to the following method:
///
/// void gvr_audio_set_sound_object_distance_rolloff_model(
/// gvr_audio_context* api, gvr_audio_source_id sound_object_id,
/// int32_t rolloff_model, float min_distance, float max_distance);
///
/// This enables a user to choose between logarithmic and linear distance
/// rolloff methods, or to completely disable distance rolloff effects.
///
///
/// The spatialized playback of a sound object can be triggered with a call to:
///
/// void gvr_audio_play_sound(gvr_audio_context* api,
/// gvr_audio_source_id source_id,
/// bool looping_enabled);
///
/// and stopped with a call to:
///
/// void gvr_audio_stop_sound(gvr_audio_context* api,
/// gvr_audio_source_id source_id);
///
/// Note that the sound object handle destroys itself at the moment the sound
/// playback has stopped. This way, no clean up of sound object handles is
/// needed. On subsequent calls to this function the corresponding
/// gvr_audio_source_id no longer refers to a valid sound object.
///
/// The following function can be used to check if a sound object is currently
/// active:
///
/// bool gvr_audio_is_sound_playing(const gvr_audio_context* api,
/// gvr_audio_source_id source_id);
///
/// **Rendering of ambisonic soundfields**
///
/// The GVR Audio System also provides the user with the ability to play back
/// ambisonic soundfields. Ambisonic soundfields are captured or pre-rendered
/// 360 degree recordings. It is best to think of them as equivalent to 360
/// degree video. While they envelop and surround the listener, they only react
/// to the listener's rotational movement. That is, one cannot walk towards
/// features in the soundfield. Soundfields are ideal for accompanying 360
/// degree video playback, for introducing background and environmental effects
/// such as rain or crowd noise, or even for pre baking 3D audio to reduce
/// rendering costs. The GVR Audio System supports full 3D First Order
/// Ambisonic recordings using ACN channel ordering and SN3D normalization. For
/// more information please see our Spatial Audio specification at:
/// https://github.com/google/spatial-media/blob/master/docs/spatial-audio-rfc.md#semantics
///
/// Note that Soundfield playback is directly streamed from the sound file and
/// no sound file preloading is needed.
///
/// To obtain a soundfield handler, call:
///
/// gvr_audio_source_id gvr_audio_create_soundfield(gvr_audio_context* api,
/// const char* filename);
///
/// This returns a gvr_audio_source_id handle that allows the user to begin
/// playback of the soundfield, to alter the soundfield’s volume or to stop
/// soundfield playback and as such destroy the object. These actions can be
/// achieved with calls to the following functions:
///
/// void gvr_audio_play_sound(gvr_audio_context* api,
/// gvr_audio_source_id source_id,
/// bool looping_enabled);
///
/// void gvr_audio_set_sound_volume(gvr_audio_context* api,
/// gvr_audio_source_id source_id,
/// float volume);
///
/// void gvr_audio_stop_sound(gvr_audio_context* api,
/// gvr_audio_source_id source_id);
///
/// Ambisonic soundfields can also be rotated about the listener's head in order
/// to align the components of the soundfield with the visuals of the game/app.
///
/// void gvr_audio_set_soundfield_rotation(gvr_audio_context* api,
/// gvr_audio_source_id soundfield_id,
/// const gvr_quatf&
/// soundfield_rotation);
///
/// **Direct Playback of Stereo or Mono Sounds**
///
/// The GVR Audio System allows the direct non-spatialized playback of both
/// stereo and mono audio. Such audio is often used for music or sound effects
/// that should not be spatialized.
///
/// A stereo sound can be created with a call to:
///
/// gvr_audio_source_id gvr_audio_create_stereo_sound(gvr_audio_context* api,
/// const char* filename);
///
/// **Room effects**
///
/// The GVR Audio System provides a powerful reverb engine which can be used to
/// create customized room effects by specifying the size of a room and a
/// material for each surface of the room from the gvr_audio_material_name enum.
/// Each of these surface materials has unique absorption properties which
/// differ with frequency. The room created will be centered around the
/// listener. Note that the Google VR Audio System uses meters as the unit of
/// distance throughout.
///
/// The following methods are used to control room effects:
///
/// void gvr_audio_enable_room(gvr_audio_context* api, bool enable);
///
/// enables or disables room effects with smooth transitions.
///
/// and
///
/// void
/// gvr_audio_set_room_properties(gvr_audio_context* api, float size_x,
/// float size_y, float size_z,
/// gvr_audio_material_name wall_material,
/// gvr_audio_material_name ceiling_material,
/// gvr_audio_material_name floor_material);
///
/// allows the user to describe the room based on its dimensions and its surface
/// properties. For example, one can expect very large rooms to be more
/// reverberant than smaller rooms, and a room with with hard surface materials
/// such as brick to be more reverberant than one with soft absorbent materials
/// such as heavy curtains on every surface.
///
/// Note that when a sound source is located outside of the listener's room,
/// it will sound different from sources located within the room due to
/// attenuation of both the direct sound and the reverb on that source. Sources
/// located far outside of the listener's room will not be audible to the
/// listener.
///
/// The following method can be used to subtly adjust the reverb in a room by
/// changing the gain/attenuation on the reverb, setting a multiplier on the
/// reverberation time to control the reverb's length, or adjusting the balance
/// between the low and high frequency components of the reverb.
///
/// void gvr_audio_set_room_reverb_adjustments(gvr_audio_context* api,
/// float gain,
/// float time_adjust,
/// float brightness_adjust);
///
/// If you are writing C++ code, you might prefer to use the C++ wrapper
/// rather than implement this C API directly.
///
/// **Example usage (C++ API)**
///
/// Construction:
///
/// std::unique_ptr<gvr::AudioApi> gvr_audio_api(new gvr::AudioApi);
/// gvr_audio_api->Init(GVR_AUDIO_RENDERING_BINAURAL_HIGH_QUALITY);
///
/// Update head rotation in DrawFrame():
///
/// head_pose_ = gvr_api_->GetHeadSpaceFromStartSpaceRotation(target_time);
/// gvr_audio_api_->SetHeadPose(head_pose_);
/// gvr_audio_api_->Update();
///
/// Preload sound file, create sound handle and start playback:
///
/// gvr_audio_api->PreloadSoundfile(kSoundFile);
/// AudioSourceId source_id =
/// gvr_audio_api_->CreateSoundObject("sound.wav");
/// gvr_audio_api->SetSoundObjectPosition(source_id,
/// position_x,
/// position_y,
/// position_z);
/// gvr_audio_api->PlaySound(source_id, true /* looped playback */);
///
/// @{
typedef struct gvr_audio_context_ gvr_audio_context;
/// Creates and initializes a gvr_audio_context. This call also initializes
/// the audio interface and starts the audio engine. Note that the returned
/// instance must be deleted with gvr_audio_destroy.
///
#ifdef __ANDROID__
/// @param env The JNI Env associated with the current thread.
/// @param android_context The Android application context. This must be the
/// application context, NOT an Activity context (Note: from any Android
/// Activity in your app, you can call getApplicationContext() to
/// retrieve the application context).
/// @param class_loader The class loader to use when loading Java
/// classes. This must be your app's main class loader (usually
/// accessible through activity.getClassLoader() on any of your Activities).
/// @param rendering_mode The gvr_audio_rendering_mode value which determines
/// the rendering configuration preset. This is passed as an int32_t to
/// ensure API compatibility.
/// @return gvr_audio_context instance.
gvr_audio_context* gvr_audio_create(JNIEnv* env, jobject android_context,
jobject class_loader,
int32_t rendering_mode);
#else
/// @param rendering_mode The gvr_audio_rendering_mode value which determines
/// the rendering configuration preset. This is passed as an int32_t to
/// ensure API compatibility.
/// @return gvr_audio_context instance.
gvr_audio_context* gvr_audio_create(int32_t rendering_mode);
#endif // #ifdef __ANDROID__
/// Destroys a gvr_audio_context that was previously created with
/// gvr_audio_create or gvr_audio_create_android.
///
/// @param api Pointer to a pointer to a gvr_audio_context. The pointer
/// will be set to NULL after destruction.
void gvr_audio_destroy(gvr_audio_context** api);
/// Resumes the VR Audio system.
/// Call this when your app/game loses focus.
/// Calling this when not paused is a no-op.
/// Thread-safe (call from any thread).
///
/// @param api Pointer to a gvr_audio_context.
void gvr_audio_resume(gvr_audio_context* api);
/// Pauses the VR Audio system.
/// Calling this when already paused is a no-op.
/// Thread-safe (call from any thread).
///
/// @param api Pointer to a gvr_audio_context.
void gvr_audio_pause(gvr_audio_context* api);
/// This method must be called from the main thread at a regular rate. It is
/// used to execute background operations outside of the audio thread.
///
/// @param api Pointer to a gvr_audio_context.
void gvr_audio_update(gvr_audio_context* api);
/// Preloads a local sound file. Note that the local file access method
/// depends on the target platform.
///
/// @param api Pointer to a gvr_audio_context.
/// @param filename Name of the file, used as identifier.
/// @return True on success or if file has already been preloaded.
bool gvr_audio_preload_soundfile(gvr_audio_context* api, const char* filename);
/// Unloads a previously preloaded sample from memory. Note that if the sample
/// is currently used, the memory is freed at the moment playback stops.
///
/// @param api Pointer to a gvr_audio_context.
/// @param filename Name of the file, used as identifier.
void gvr_audio_unload_soundfile(gvr_audio_context* api, const char* filename);
/// Returns a new sound object. Note that the sample should only contain a
/// single audio channel (stereo sources are automatically downmixed to mono).
/// The handle automatically destroys itself at the moment the sound playback
/// has stopped.
///
/// @param api Pointer to a gvr_audio_context.
/// @param filename The path/name of the file to be played.
/// @return Id of new sound object. Returns kInvalidId if the sound file has not
/// been preloaded or if the number of input channels is > 1.
gvr_audio_source_id gvr_audio_create_sound_object(gvr_audio_context* api,
const char* filename);
/// Returns a new ambisonic sound field. Note that the sample needs to be
/// preloaded and must have 4 separate audio channels. The handle automatically
/// destroys itself at the moment the sound playback has stopped.
///
/// @param api Pointer to a gvr_audio_context.
/// @param filename The path/name of the file to be played.
/// @return Id of new soundfield. Returns kInvalidId if the sound file has not
/// been preloaded or if the number of input channels does not match that
/// required.
gvr_audio_source_id gvr_audio_create_soundfield(gvr_audio_context* api,
const char* filename);
/// Returns a new stereo non-spatialized source, which directly plays back mono
/// or stereo audio. Note the sample needs to be preloaded and may contain only
/// one (mono) or two (stereo) audio channels.
///
/// @param api Pointer to a gvr_audio_context.
/// @param filename The path/name of the file to be played..
/// @return Id of new stereo non-spatialized source. Returns kInvalidId if the
/// sound file has not been preloaded or if the number of input channels is
/// > 2;
gvr_audio_source_id gvr_audio_create_stereo_sound(gvr_audio_context* api,
const char* filename);
/// Starts the playback of a sound.
///
/// @param api Pointer to a gvr_audio_context.
/// @param source_id Id of the audio source to be stopped.
/// @param looping_enabled Enables looped audio playback.
void gvr_audio_play_sound(gvr_audio_context* api, gvr_audio_source_id source_id,
bool looping_enabled);
/// Pauses the playback of a sound.
///
/// @param api Pointer to a gvr_audio_context.
/// @param source_id Id of the audio source to be paused.
void gvr_audio_pause_sound(gvr_audio_context* api,
gvr_audio_source_id source_id);
/// Resumes the playback of a sound.
///
/// @param api Pointer to a gvr_audio_context.
/// @param source_id Id of the audio source to be resumed.
void gvr_audio_resume_sound(gvr_audio_context* api,
gvr_audio_source_id source_id);
/// Stops the playback of a sound and destroys the corresponding sound object
/// or Soundfield.
///
/// @param api Pointer to a gvr_audio_context.
/// @param source_id Id of the audio source to be stopped.
void gvr_audio_stop_sound(gvr_audio_context* api,
gvr_audio_source_id source_id);
/// Repositions an existing sound object.
///
/// @param api Pointer to a gvr_audio_context.
/// @param sound_object_id Id of the sound object to be moved.
/// @param x X coordinate the sound will be placed at.
/// @param y Y coordinate the sound will be placed at.
/// @param z Z coordinate the sound will be placed at.
void gvr_audio_set_sound_object_position(gvr_audio_context* api,
gvr_audio_source_id sound_object_id,
float x, float y, float z);
/// Sets the given ambisonic soundfields's rotation.
///
/// @param api Pointer to a gvr_audio_context.
/// @param soundfield_id Id of the soundfield source to be rotated.
/// @param soundfield_rotation Quaternion representing the soundfield rotation.
void gvr_audio_set_soundfield_rotation(gvr_audio_context* api,
gvr_audio_source_id soundfield_id,
const gvr_quatf& soundfield_rotation);
/// Sets the given sound object source's distance attenuation method with
/// minimum and maximum distances. Maximum distance must be greater than the
/// minimum distance for the method to be set.
///
/// @param api Pointer to a gvr_audio_context.
/// @param sound_object_id Id of sound object source.
/// @param rolloff_model Linear or logarithmic distance rolloff models. Note
/// setting the rolloff model to |GVR_AUDIO_ROLLOFF_NONE| will allow
/// distance attenuation values to be set manually.
/// @param min_distance Minimum distance to apply distance attenuation method.
/// @param max_distance Maximum distance to apply distance attenuation method.
void gvr_audio_set_sound_object_distance_rolloff_model(
gvr_audio_context* api, gvr_audio_source_id sound_object_id,
int32_t rolloff_model, float min_distance, float max_distance);
/// Changes the volume of an existing sound.
///
/// @param api Pointer to a gvr_audio_context.
/// @param source_id Id of the audio source to be modified.
/// @param volume Volume value. Should range from 0 (mute) to 1 (max).
void gvr_audio_set_sound_volume(gvr_audio_context* api,
gvr_audio_source_id source_id, float volume);
/// Checks if a sound is playing.
///
/// @param api Pointer to a gvr_audio_context.
/// @param source_id Id of the audio source to be checked.
/// @return True if the sound is being played.
bool gvr_audio_is_sound_playing(const gvr_audio_context* api,
gvr_audio_source_id source_id);
/// Sets the head pose from a matrix representation of the same.
///
/// @param api Pointer to a gvr_audio_context on which to set the pose.
/// @param head_pose_matrix Matrix representing the head transform to be set.
void gvr_audio_set_head_pose(gvr_audio_context* api,
const gvr_mat4f& head_pose_matrix);
/// Turns on/off the room reverberation effect.
///
/// @param api Pointer to a gvr_audio_context.
/// @param enable True to enable room effect.
void gvr_audio_enable_room(gvr_audio_context* api, bool enable);
/// Sets the room properties describing the dimensions and surface materials of
/// a given room.
///
/// @param api Pointer to a gvr_audio_context.
/// @param size_x Dimension along X axis.
/// @param size_y Dimension along Y axis.
/// @param size_z Dimension along Z axis.
/// @param wall_material Surface gvr_audio_material_type for the four walls.
/// @param ceiling_material Surface gvr_audio_material_type for the ceiling.
/// @param floor_material Surface gvr_audio_material_type for the floor.
void gvr_audio_set_room_properties(gvr_audio_context* api, float size_x,
float size_y, float size_z,
int32_t wall_material,
int32_t ceiling_material,
int32_t floor_material);
/// Adjusts the properties of the current reverb, allowing changes to the
/// reverb's gain, duration and low/high frequency balance.
///
/// @param api Pointer to a gvr_audio_context.
/// @param gain Reverb volume (linear) adjustment in range [0, 1] for
/// attenuation, range [1, inf) for gain boost.
/// @param time_adjust Reverb time adjustment multiplier to scale the
/// reverberation tail length. This value should be >= 0.
/// @param brightness_adjust Reverb brightness adjustment that controls the
/// reverberation ratio across low and high frequency bands.
void gvr_audio_set_room_reverb_adjustments(gvr_audio_context* api, float gain,
float time_adjust,
float brightness_adjust);
/// Enables the stereo speaker mode. It enforces stereo-panning when headphones
/// are *not* plugged into the phone. This helps to avoid HRTF-based coloring
/// effects and reduces computational complexity when speaker playback is
/// active. By default the stereo speaker mode optimization is disabled.
///
/// @param api Pointer to a gvr_audio_context.
/// @param enable True to enable the stereo speaker mode.
void gvr_audio_enable_stereo_speaker_mode(gvr_audio_context* api, bool enable);
/// @}
#ifdef __cplusplus
} // extern "C"
#endif
// Convenience C++ wrapper.
#if defined(__cplusplus) && !defined(GVR_NO_CPP_WRAPPER)
#include <memory>
#include <string>
namespace gvr {
/// This is a convenience C++ wrapper for the Audio C API.
///
/// This wrapper strategy prevents ABI compatibility issues between compilers
/// by ensuring that the interface between client code and the implementation
/// code in libgvr.so is a pure C interface. The translation from C++ calls
/// to C calls provided by this wrapper runs entirely in the client's binary
/// and is compiled by the client's compiler.
///
/// Methods in this class are only documented insofar as the C++ wrapping logic
/// is concerned; for information about the method itself, please refer to the
/// corresponding function in the C API.
///
///
/// THREADING: this class is thread-safe and reentrant after initialized
/// with Init().
class AudioApi {
public:
/// Creates an (uninitialized) ControllerApi object. You must initialize
/// it by calling Init() before interacting with it.
AudioApi() : context_(nullptr) {}
~AudioApi() {
if (context_) {
gvr_audio_destroy(&context_);
}
}
/// Creates and initializes a gvr_audio_context.
/// For more information, see gvr_audio_create().
#ifdef __ANDROID__
bool Init(JNIEnv* env, jobject android_context, jobject class_loader,
AudioRenderingMode rendering_mode) {
context_ =
gvr_audio_create(env, android_context, class_loader, rendering_mode);
return context_ != nullptr;
}
#else
bool Init(AudioRenderingMode rendering_mode) {
context_ = gvr_audio_create(rendering_mode);
return context_ != nullptr;
}
#endif // #ifdef __ANDROID__
/// Pauses the audio engine.
/// For more information, see gvr_audio_pause().
void Pause() { gvr_audio_pause(context_); }
/// Resumes the audio engine.
/// For more information, see gvr_audio_resume().
void Resume() { gvr_audio_resume(context_); }
/// For more information, see gvr_audio_update().
void Update() { gvr_audio_update(context_); }
/// Preloads a local sound file.
/// For more information, see gvr_audio_preload_soundfile().
bool PreloadSoundfile(const std::string& filename) {
return gvr_audio_preload_soundfile(context_, filename.c_str());
}
/// Unloads a previously preloaded sample from memory.
/// For more information, see gvr_audio_preload_soundfile().
void UnloadSoundfile(const std::string& filename) {
gvr_audio_unload_soundfile(context_, filename.c_str());
}
/// Returns a new sound object.
/// For more information, see gvr_audio_create_sound_object().
AudioSourceId CreateSoundObject(const std::string& filename) {
return gvr_audio_create_sound_object(context_, filename.c_str());
}
/// Returns a new sound field.
/// For more information, see gvr_audio_create_soundfield().
AudioSourceId CreateSoundfield(const std::string& filename) {
return gvr_audio_create_soundfield(context_, filename.c_str());
}
/// Returns a new stereo soound.
/// For more information, see gvr_audio_create_stereo_sound().
AudioSourceId CreateStereoSound(const std::string& filename) {
return gvr_audio_create_stereo_sound(context_, filename.c_str());
}
/// Starts the playback of a sound.
/// For more information, see gvr_audio_play_sound().
void PlaySound(AudioSourceId source_id, bool looping_enabled) {
gvr_audio_play_sound(context_, source_id, looping_enabled);
}
/// Pauses the playback of a sound.
/// For more information, see gvr_audio_pause_sound().
void PauseSound(AudioSourceId source_id) {
gvr_audio_pause_sound(context_, source_id);
}
/// Resumes the playback of a sound.
/// For more information, see gvr_audio_resume_sound().
void ResumeSound(AudioSourceId source_id) {
gvr_audio_resume_sound(context_, source_id);
}
/// Stops the playback of a sound.
/// For more information, see gvr_audio_stop_sound().
void StopSound(AudioSourceId source_id) {
gvr_audio_stop_sound(context_, source_id);
}
/// Repositions an existing sound object.
/// For more information, see gvr_audio_set_sound_object_position().
void SetSoundObjectPosition(AudioSourceId sound_object_id, float x, float y,
float z) {
gvr_audio_set_sound_object_position(context_, sound_object_id, x, y, z);
}
void SetSoundObjectDistanceRolloffModel(
AudioSourceId sound_object_id,
gvr_audio_distance_rolloff_type rolloff_model, float min_distance,
float max_distance) {
gvr_audio_set_sound_object_distance_rolloff_model(
context_, sound_object_id, rolloff_model, min_distance, max_distance);
}
/// Rotates an existing soundfield.
/// For more information, see gvr_audio_set_soundfield_rotation().
void SetSoundfieldRotation(AudioSourceId soundfield_id,
const Quatf& soundfield_rotation) {
gvr_audio_set_soundfield_rotation(context_, soundfield_id,
soundfield_rotation);
}
/// Changes the volume of an existing sound.
/// For more information, see gvr_audio_set_sound_volume().
void SetSoundVolume(AudioSourceId source_id, float volume) {
gvr_audio_set_sound_volume(context_, source_id, volume);
}
/// Checks if a sound is playing.
/// For more information, see gvr_audio_is_sound_playing().
bool IsSoundPlaying(AudioSourceId source_id) const {
return gvr_audio_is_sound_playing(context_, source_id);
}
/// Sets the head position from a matrix representation.
/// For more information, see gvr_audio_set_head_pose().
void SetHeadPose(const Mat4f& head_pose_matrix) {
gvr_audio_set_head_pose(context_, head_pose_matrix);
}
/// Turns on/off the room reverberation effect.
/// For more information, see gvr_audio_enable_room().
void EnableRoom(bool enable) { gvr_audio_enable_room(context_, enable); }
/// Sets the room properties describing the dimensions and surface materials
/// of a given room. For more information, see
/// gvr_audio_set_room_properties().
void SetRoomProperties(float size_x, float size_y, float size_z,
gvr_audio_material_type wall_material,
gvr_audio_material_type ceiling_material,
gvr_audio_material_type floor_material) {
gvr_audio_set_room_properties(context_, size_x, size_y, size_z,
wall_material, ceiling_material,
floor_material);
}
/// Adjusts the properties of the current reverb, allowing changes to the
/// reverb's gain, duration and low/high frequency balance. For more
/// information see gvr_audio_set_room_reverb_adjustments().
void SetRoomReverbAdjustments(float gain, float time_adjust,
float brightness_adjust) {
gvr_audio_set_room_reverb_adjustments(context_, gain, time_adjust,
brightness_adjust);
}
/// Enables the stereo speaker mode. For more information see
/// gvr_audio_enable_stereo_speaker_mode().
void EnableStereoSpeakerMode(bool enable) {
gvr_audio_enable_stereo_speaker_mode(context_, enable);
}
/// @name Wrapper manipulation
/// @{
/// Creates a C++ wrapper for a C object and takes ownership.
explicit AudioApi(gvr_audio_context* context)
: context_(context) {}
/// Returns the wrapped C object. Does not affect ownership.
gvr_audio_context* cobj() { return context_; }
const gvr_audio_context* cobj() const { return context_; }
/// Returns the wrapped C object and transfers its ownership to the caller.
/// The wrapper becomes invalid and should not be used.
gvr_audio_context* Release() {
auto result = context_;
context_ = nullptr;
return result;
}
/// @}
private:
gvr_audio_context* context_;
// Disallow copy and assign:
AudioApi(const AudioApi&);
void operator=(const AudioApi&);
};
} // namespace gvr
#endif // #if defined(__cplusplus) && !defined(GVR_NO_CPP_WRAPPER)
#endif // VR_GVR_CAPI_INCLUDE_GVR_AUDIO_H_