Changeset 330 for trunk


Ignore:
Timestamp:
09/02/14 08:45:01 (11 years ago)
Author:
epyon
Message:
  • implemented positional sound interface for audio
  • rudimentary implementations of positional sound for fmod and sdl
Location:
trunk
Files:
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/nv/fmod/fmod_audio.hh

    r329 r330  
    3232                public:
    3333                        audio();
    34                         virtual channel play_sound( sound a_sound );
     34                        virtual channel play_sound( sound a_sound, float volume = 1.0f, float pan = 0.0f );
     35                        virtual channel play_sound( sound a_sound, vec3 position );
    3536                        virtual sound load_sound( const std::string& a_path );
    3637                        virtual void release( sound a_sound );
    37                         virtual void update();
     38                        virtual void set_orientation( vec3 forward, vec3 up );
     39                        virtual void update( vec3 position );
    3840                        virtual ~audio();
    3941                private:
    4042                        entity_store< sound_info, sound >     m_sounds;
     43                        vec3                                  m_position;
    4144                        void* m_system;
    4245                };
  • trunk/nv/interface/audio.hh

    r329 r330  
    2828        {
    2929        public:
    30                 virtual channel play_sound( sound a_sound ) = 0;
     30                virtual channel play_sound( sound a_sound, float volume = 1.0f, float pan = 0.0f ) = 0;
     31                virtual channel play_sound( sound a_sound, vec3 position ) = 0;
    3132                // temporary - use streams later
    3233                virtual sound load_sound( const std::string& a_path ) = 0;
    3334                virtual void release( sound a_sound ) = 0;
    34                 virtual void update() {}
     35                virtual void set_orientation( vec3 forward, vec3 up ) = 0;
     36                virtual void update( vec3 ) {}
    3537                virtual ~audio() {}
    3638        };
  • trunk/nv/sdl/sdl_audio.hh

    r329 r330  
    3030                public:
    3131                        audio();
    32                         virtual channel play_sound( sound a_sound );
     32                        virtual channel play_sound( sound a_sound, float volume = 1.0f, float pan = 0.0f );
     33                        virtual channel play_sound( sound a_sound, vec3 position );
    3334                        virtual sound load_sound( const std::string& a_path );
    3435                        virtual void release( sound a_sound );
    35                         virtual void update();
     36                        virtual void set_orientation( vec3 forward, vec3 up );
     37                        virtual void update( vec3 position );
    3638                        virtual ~audio();
    3739                private:
     40                        vec3                                  m_position;
     41                        vec3                                  m_forward;
     42                        vec3                                  m_up;
    3843                        entity_store< sound_info, sound >     m_sounds;
    3944                };
  • trunk/src/fmod/fmod_audio.cc

    r329 r330  
    2727                return;
    2828        }
    29         result = FMOD_System_Init( system, 64, FMOD_INIT_NORMAL, 0 );
     29        result = FMOD_System_Init( system, 64, FMOD_3D | FMOD_INIT_3D_RIGHTHANDED, 0 );
    3030        if ( result != FMOD_OK )
    3131        {
     
    3636}
    3737
    38 
    39 nv::channel fmod::audio::play_sound( nv::sound a_sound )
     38nv::channel nv::fmod::audio::play_sound( sound a_sound, float volume, float pan /*= 0.0f */ )
    4039{
    4140        sound_info* info = m_sounds.get( a_sound );
    4241        if ( info )
    4342        {
    44                 FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
    45                 FMOD_SOUND* sample  = (FMOD_SOUND*)( info->fmod_sound );
    46                 FMOD_RESULT result  = FMOD_System_PlaySound( system, FMOD_CHANNEL_FREE, sample, false, 0 );
     43                FMOD_SYSTEM* system   = (FMOD_SYSTEM*)m_system;
     44                FMOD_SOUND* sample    = (FMOD_SOUND*)( info->fmod_sound );
     45                FMOD_CHANNEL* channel = nullptr;
     46                FMOD_RESULT result    = FMOD_System_PlaySound( system, FMOD_CHANNEL_FREE, sample, true, &channel );
    4747                if ( result != FMOD_OK )
    4848                {
    4949                        NV_LOG( LOG_WARNING, "FMOD failed to play sound -- " << FMOD_ErrorString( result ) );
     50                }
     51                else
     52                {
     53                        FMOD_Channel_SetVolume( channel, volume );
     54                        FMOD_Channel_SetPan( channel, pan );
     55                        FMOD_Channel_SetPaused( channel, false );
    5056                }
    5157        }
     
    5359}
    5460
     61nv::channel nv::fmod::audio::play_sound( sound a_sound, vec3 position )
     62{
     63        sound_info* info = m_sounds.get( a_sound );
     64        if ( info )
     65        {
     66                FMOD_SYSTEM* system   = (FMOD_SYSTEM*)m_system;
     67                FMOD_SOUND* sample    = (FMOD_SOUND*)( info->fmod_sound );
     68                FMOD_CHANNEL* channel = nullptr;
     69                FMOD_RESULT result    = FMOD_System_PlaySound( system, FMOD_CHANNEL_FREE, sample, true, &channel );
     70                if ( result != FMOD_OK )
     71                {
     72                        NV_LOG( LOG_WARNING, "FMOD failed to play sound -- " << FMOD_ErrorString( result ) );
     73                }
     74                else
     75                {
     76                        FMOD_VECTOR fmod_position;
     77                        fmod_position.x = position.x;
     78                        fmod_position.y = position.y;
     79                        fmod_position.z = position.z;
     80                        FMOD_Channel_Set3DMinMaxDistance( channel, 1, 100000 );
     81                        FMOD_Channel_Set3DAttributes( channel, &fmod_position, 0 );
     82                        FMOD_Channel_SetPaused( channel, false );
     83                }
     84        }
     85        return channel();
     86}
     87
     88
     89
    5590nv::sound fmod::audio::load_sound( const std::string& a_path )
    5691{
    5792        FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
    5893        FMOD_SOUND* sample;
    59         FMOD_RESULT fm_result = FMOD_System_CreateSound( system, a_path.c_str(), FMOD_DEFAULT, 0, &sample );
     94        FMOD_RESULT fm_result = FMOD_System_CreateSound( system, a_path.c_str(), FMOD_3D, 0, &sample );
    6095        if ( fm_result != FMOD_OK )
    6196        {
     
    79114}
    80115
    81 void fmod::audio::update()
     116void nv::fmod::audio::set_orientation( vec3 forward, vec3 up )
    82117{
     118        FMOD_VECTOR fmod_forward;
     119        fmod_forward.x = forward.x;
     120        fmod_forward.y = forward.y;
     121        fmod_forward.z = forward.z;
     122        FMOD_VECTOR fmod_up;
     123        fmod_up.x = up.x;
     124        fmod_up.y = up.y;
     125        fmod_up.z = up.z;
     126        // TODO: we also need to setup orientation!
     127        FMOD_System_Set3DListenerAttributes( (FMOD_SYSTEM*)m_system, 0, 0, 0, &fmod_forward, &fmod_up );
     128}
     129
     130void fmod::audio::update( vec3 position )
     131{
     132        m_position = position;
     133        FMOD_VECTOR fmod_position;
     134        fmod_position.x = position.x;
     135        fmod_position.y = position.y;
     136        fmod_position.z = position.z;
     137//      FMOD_VECTOR fmod_up;
     138//      fmod_up.x = 0.0f;
     139//      fmod_up.y = 0.0f;
     140//      fmod_up.z = 0.0f;
     141        // TODO: we also need to setup orientation!
     142        FMOD_System_Set3DListenerAttributes( (FMOD_SYSTEM*)m_system, 0, &fmod_position, 0, 0, 0 );
    83143        FMOD_System_Update( (FMOD_SYSTEM*)m_system );
    84         // no-op
    85144}
    86145
  • trunk/src/sdl/sdl_audio.cc

    r329 r330  
    77#include "nv/sdl/sdl_audio.hh"
    88
     9#include <glm/gtx/vector_angle.hpp>
    910#include "nv/lib/sdl.hh"
    1011#include "nv/lib/sdl_mixer.hh"
     
    3132}
    3233
    33 
    34 nv::channel sdl::audio::play_sound( sound a_sound )
     34nv::channel nv::sdl::audio::play_sound( sound a_sound, float volume, float pan /*= 0.0f */ )
    3535{
    3636        sound_info* info = m_sounds.get( a_sound );
    3737        if ( info )
    3838        {
    39                 if ( Mix_PlayChannel(-1, (Mix_Chunk*)( info->sdl_sound), 0) == -1 )
     39                int channel = Mix_PlayChannel(-1, (Mix_Chunk*)( info->sdl_sound), 0);
     40                if ( channel == -1 )
    4041                {
    4142                        NV_LOG( LOG_WARNING, "SDL_mixer failed to play -- " << Mix_GetError() );
     43                }
     44                else
     45                {
     46                        Mix_Volume( channel, int( volume * 128.0f ) );
     47                        if ( pan != 0.0f)
     48                        {
     49                                uint8 right = (uint8)( (pan + 1.0f) * 127.0f );
     50                                Mix_SetPanning( channel, 254-right, right );
     51                        }
     52                        else
     53                        {
     54                                Mix_SetPanning( channel, 255, 255 );
     55                        }
     56                }
     57        }
     58        return channel();
     59}
     60
     61nv::channel nv::sdl::audio::play_sound( sound a_sound, vec3 position )
     62{
     63        sound_info* info = m_sounds.get( a_sound );
     64        if ( info )
     65        {
     66                int channel = Mix_PlayChannel(-1, (Mix_Chunk*)( info->sdl_sound), 0);
     67                if ( channel == -1 )
     68                {
     69                        NV_LOG( LOG_WARNING, "SDL_mixer failed to play -- " << Mix_GetError() );
     70                }
     71                else
     72                {
     73                        vec3 relative = position - m_position;
     74                        float angle = 0;
     75                        float distance = 0;
     76                        if ( relative != vec3() )
     77                        {
     78                                angle = -glm::orientedAngle( m_forward, glm::normalize( relative ), m_up );
     79                                distance = glm::clamp( 20.0f * glm::length( relative ), 0.0f, 255.0f );
     80                        }
     81                        if ( angle < 0.0f ) angle += 360.0f;
     82                        Mix_SetPosition( channel, sint16(angle), uint8(distance) );
    4283                }
    4384        }
     
    4788nv::sound nv::sdl::audio::load_sound( const std::string& a_path )
    4889{
    49         // TODO: this is a really wierd error - if we remove this check, all hell gets loose
     90        // TODO: this is a really weird error - if we remove this check, all hell gets loose
    5091        if ( Mix_LoadWAV_RW == nullptr || SDL_RWFromFile == nullptr )
    5192        {
     
    64105}
    65106
    66 void nv::sdl::audio::update()
     107void nv::sdl::audio::update( vec3 position )
    67108{
    68         // no-op
     109        m_position = position;
    69110}
    70111
     
    88129}
    89130
     131void nv::sdl::audio::set_orientation( vec3 forward, vec3 up )
     132{
     133        m_forward = forward;
     134        m_up      = up;
     135}
     136
Note: See TracChangeset for help on using the changeset viewer.