X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=simgear%2Fsound%2Fsoundmgr_openal.hxx;h=749d84272bffd28f78e313f96d9819a058c375e7;hb=2cc2a857a2cc2daff30601e0f8f697c768dd5b30;hp=24e8f1590d33f074ff0ab0ff88f5b42b2ccd163b;hpb=4cc6bd69ae1385d830822d7621d8f9a1b5623319;p=simgear.git diff --git a/simgear/sound/soundmgr_openal.hxx b/simgear/sound/soundmgr_openal.hxx index 24e8f159..749d8427 100644 --- a/simgear/sound/soundmgr_openal.hxx +++ b/simgear/sound/soundmgr_openal.hxx @@ -4,8 +4,10 @@ // 2001 // // C++-ified by Curtis Olson, started March 2001. +// Modified for the new SoundSystem by Erik Hofman, October 2009 // // Copyright (C) 2001 Curtis L. Olson - http://www.flightgear.org/~curt +// Copyright (C) 2009 Erik Hofman // // This program is free software; you can redistribute it and/or // modify it under the terms of the GNU General Public License as @@ -33,24 +35,19 @@ #ifndef _SG_SOUNDMGR_OPENAL_HXX #define _SG_SOUNDMGR_OPENAL_HXX 1 -#ifndef __cplusplus -# error This library requires C++ -#endif - #include #include #include #if defined(__APPLE__) -# define AL_ILLEGAL_ENUM AL_INVALID_ENUM -# define AL_ILLEGAL_COMMAND AL_INVALID_OPERATION # include # include -# include +#elif defined(OPENALSDK) +# include +# include #else # include # include -# include #endif #include @@ -58,16 +55,24 @@ #include #include "sample_group.hxx" -#include "sample_openal.hxx" -using std::map; -using std::string; +struct refUint { + unsigned int refctr; + ALuint id; + + refUint() { refctr = 0; id = (ALuint)-1; }; + refUint(ALuint i) { refctr = 1; id = i; }; + ~refUint() {}; +}; + +typedef std::map < std::string, refUint > buffer_map; +typedef buffer_map::iterator buffer_map_iterator; +typedef buffer_map::const_iterator const_buffer_map_iterator; -typedef map < string, SGSharedPtr > sample_group_map; +typedef std::map < std::string, SGSharedPtr > sample_group_map; typedef sample_group_map::iterator sample_group_map_iterator; typedef sample_group_map::const_iterator const_sample_group_map_iterator; - /** * Manage a collection of SGSampleGroup instances */ @@ -78,11 +83,10 @@ public: SGSoundMgr(); ~SGSoundMgr(); - void init(); + void init(const char *devname = NULL); void bind(); void unbind(); void update(double dt); - void update_late(double dt); void suspend(); void resume(); @@ -91,59 +95,107 @@ public: inline void reinit() { stop(); init(); } /** - * is audio working? + * Test is the sound manager is in a working condition. + * @return true is the sound manager is working */ inline bool is_working() const { return _working; } /** - * add a sample group, return true if successful + * Set the sound manager to a working condition. + */ + void activate(); + + /** + * Test is the sound manager is in an active and working condition. + * @return true is the sound manager is active + */ + inline bool is_active() const { return _active; } + + /** + * Register a sample group to the sound manager. + * @para sgrp Pointer to a sample group to add + * @param refname Reference name of the sample group + * @return true if successful, false otherwise */ - bool add( SGSampleGroup *sgrp, const string& refname ); + bool add( SGSampleGroup *sgrp, const std::string& refname ); /** - * remove a sample group, return true if successful + * Remove a sample group from the sound manager. + * @param refname Reference name of the sample group to remove + * @return true if successful, false otherwise */ - bool remove( const string& refname ); + bool remove( const std::string& refname ); /** - * return true of the specified sound exists in the sound manager system + * Test if a specified sample group is registered at the sound manager + * @param refname Reference name of the sample group test for + * @return true if the specified sample group exists */ - bool exists( const string& refname ); + bool exists( const std::string& refname ); /** - * return a pointer to the SGSampleGroup if the specified sound - * exists in the sound manager system, otherwise return NULL + * Find a specified sample group in the sound manager + * @param refname Reference name of the sample group to find + * @return A pointer to the SGSampleGroup */ SGSampleGroup *find( const string& refname, bool create = false ); /** - * set the position of the listener (in opengl coordinates) + * Set the Cartesian position of the sound manager. + * @param pos OpenAL listener position */ - inline void set_position( SGVec3d pos ) { - _listener_pos = pos; - _changed = true; + void set_position( const SGVec3d& pos, const SGGeod& pos_geod ) { + _base_pos = pos; _geod_pos = pos_geod; _changed = true; + } + + void set_position_offset( const SGVec3d& pos ) { + _offset_pos = pos; _changed = true; } - inline double *get_position() { return _listener_pos.data(); } - inline SGVec3d get_position_vec() { return _listener_pos; }; + /** + * Get the position of the sound manager. + * This is in the same coordinate system as OpenGL; y=up, z=back, x=right + * @return OpenAL listener position + */ + SGVec3d& get_position() { return _absolute_pos; } /** - * set the velocity of the listener (in opengl coordinates) + * Set the velocity vector (in meters per second) of the sound manager + * This is the horizontal local frame; x=north, y=east, z=down + * @param Velocity vector */ - inline void set_velocity( SGVec3f vel ) { - _listener_vel = vel; - _changed = true; + void set_velocity( const SGVec3d& vel ) { + _velocity = vel; _changed = true; } - inline SGVec3f get_velocity() { return _listener_vel; } + /** + * Get the velocity vector of the sound manager + * This is in the same coordinate system as OpenGL; y=up, z=back, x=right. + * @return Velocity vector of the OpenAL listener + */ + inline SGVec3f get_velocity() { return toVec3f(_velocity); } + + /** + * Set the orientation of the sound manager + * @param ori Quaternation containing the orientation information + */ + void set_orientation( const SGQuatd& ori ) { + _orientation = ori; _changed = true; + } /** - * set the orientation of the listener (in opengl coordinates) + * Get the orientation of the sound manager + * @return Quaternation containing the orientation information */ - void set_orientation( SGQuatd ori ); + inline const SGQuatd& get_orientation() { return _orientation; } - inline SGVec3f get_direction() { - return SGVec3f(_listener_ori[0], _listener_ori[1], _listener_ori[2]); + /** + * Get the direction vector of the sound manager + * This is in the same coordinate system as OpenGL; y=up, z=back, x=right. + * @return Look-at direction of the OpenAL listener + */ + SGVec3f get_direction() { + return SGVec3f(_at_up_vec[0], _at_up_vec[1], _at_up_vec[2]); } enum { @@ -151,35 +203,87 @@ public: NO_BUFFER = (unsigned int)-1 }; - void set_volume( float v ); + /** + * Set the master volume. + * @param vol Volume (must be between 0.0 and 1.0) + */ + void set_volume( float vol ); + + /** + * Get the master volume. + * @return Volume (must be between 0.0 and 1.0) + */ inline float get_volume() { return _volume; } /** - * get a new OpenAL source id - * returns NO_SOURCE is no source is available + * Get a free OpenAL source-id + * @return NO_SOURCE if no source is available */ unsigned int request_source(); /** - * give back an OpenAL source id for further use. + * Free an OpenAL source-id for future use + * @param source OpenAL source-id to free */ void release_source( unsigned int source ); + /** + * Get a free OpenAL buffer-id + * The buffer-id will be asigned to the sample by calling this function. + * @param sample Pointer to an audio sample to assign the buffer-id to + * @return NO_BUFFER if loading of the buffer failed. + */ + unsigned int request_buffer(SGSoundSample *sample); + + /** + * Free an OpenAL buffer-id for this sample + * @param sample Pointer to an audio sample for which to free the buffer + */ + void release_buffer( SGSoundSample *sample ); /** - * returns true if the position has changed + * Test if the position of the sound manager has changed. + * The value will be set to false upon the next call to update_late() + * @return true if the position has changed */ inline bool has_changed() { return _changed; } - static bool load(string &samplepath, void **data, int *format, - unsigned int*size, int *freq ); + /** + * Some implementations seem to need the velocity miltyplied by a + * factor of 100 to make them distinct. I've not found if this is + * a problem in the implementation or in out code. Until then + * this function is used to detect the problematic implementations. + */ + inline bool bad_doppler_effect() { return _bad_doppler; } + /** + * Load a sample file and return it's configuration and data. + * @param samplepath Path to the file to load + * @param data Pointer to a variable that points to the allocated data + * @param format Pointer to a vairable that gets the OpenAL format + * @param size Pointer to a vairable that gets the sample size in bytes + * @param freq Pointer to a vairable that gets the sample frequency in Herz + * @return true if succesful, false on error + */ + bool load(string &samplepath, void **data, int *format, + size_t *size, int *freq ); + /** + * Get a list of available playback devices. + */ + std::vector get_available_devices(); + + /** + * Get the current OpenAL vendor or rendering backend. + */ + const std::string& get_vendor() { return _vendor; } + const std::string& get_renderer() { return _renderer; } private: static int _alut_init; bool _working; + bool _active; bool _changed; float _volume; @@ -187,26 +291,35 @@ private: ALCcontext *_context; // Position of the listener. - SGVec3d _listener_pos; + SGVec3d _absolute_pos; + SGVec3d _offset_pos; + SGVec3d _base_pos; + SGGeod _geod_pos; // Velocity of the listener. - SGVec3f _listener_vel; + SGVec3d _velocity; // Orientation of the listener. // first 3 elements are "at" vector, second 3 are "up" vector - ALfloat _listener_ori[6]; + SGQuatd _orientation; + ALfloat _at_up_vec[6]; sample_group_map _sample_groups; + buffer_map _buffers; + + std::vector _free_sources; + std::vector _sources_in_use; - vector _free_sources; - vector _sources_in_use; + bool _bad_doppler; + std::string _renderer; + std::string _vendor; - char *_devname; + bool testForALError(std::string s); + bool testForALCError(std::string s); + bool testForALUTError(std::string s); + bool testForError(void *p, std::string s); - bool testForALError(string s); - bool testForALCError(string s); - bool testForALUTError(string s); - bool testForError(void *p, string s); + void update_pos_and_orientation(); void update_sample_config( SGSampleGroup *sound ); };