Changeset 329 for trunk


Ignore:
Timestamp:
09/02/14 06:16:30 (11 years ago)
Author:
epyon
Message:
  • audio now based on handles
Location:
trunk
Files:
6 edited

Legend:

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

    r319 r329  
    2323                class audio;
    2424
    25                 class sound : public nv::sound
     25                struct sound_info
    2626                {
    27                 private:
    28                         friend class nv::fmod::audio;
    29                         sound( void* data ) : m_sound( data ) {}
    30                 public:
    31                         virtual ~sound();
    32                 private:
    33                         void* m_sound;
    34                 };
    35 
    36                 class channel : public nv::channel
    37                 {
    38                 private:
    39                         friend class nv::fmod::audio;
    40                         virtual ~channel() {}
     27                        void* fmod_sound;
    4128                };
    4229
     
    4532                public:
    4633                        audio();
    47                         virtual nv::channel* play_sound( nv::sound* a_sound );
    48                         virtual nv::sound* load_sound( const std::string& a_path );
     34                        virtual channel play_sound( sound a_sound );
     35                        virtual sound load_sound( const std::string& a_path );
     36                        virtual void release( sound a_sound );
    4937                        virtual void update();
    5038                        virtual ~audio();
    5139                private:
     40                        entity_store< sound_info, sound >     m_sounds;
    5241                        void* m_system;
    5342                };
  • trunk/nv/interface/audio.hh

    r319 r329  
    1515#include <nv/core/common.hh>
    1616#include <nv/core/math.hh>
     17#include <nv/core/handle.hh>
    1718
    1819namespace nv
    1920{
    20         class sound
    21         {
    22         public:
    23                 virtual ~sound() {}
    24         };
    2521
    26         class channel
    27         {
    28         public:
    29                 virtual ~channel() {}
    30         };
    31 
     22        struct sound_tag {};
     23        struct channel_tag {};
     24        typedef handle< uint32, 16, 16, sound_tag >       sound;
     25        typedef handle< uint32, 16, 16, channel_tag >     channel;
     26       
    3227        class audio
    3328        {
    3429        public:
    35                 virtual channel* play_sound( sound* a_sound ) = 0;
    36                 virtual sound* load_sound( const std::string& a_path ) = 0;
     30                virtual channel play_sound( sound a_sound ) = 0;
     31                // temporary - use streams later
     32                virtual sound load_sound( const std::string& a_path ) = 0;
     33                virtual void release( sound a_sound ) = 0;
    3734                virtual void update() {}
    3835                virtual ~audio() {}
  • trunk/nv/sdl/sdl_audio.hh

    r319 r329  
    2121        namespace sdl
    2222        {
    23                 class audio;
    24 
    25                 class sound : public nv::sound
     23                struct sound_info
    2624                {
    27                 private:
    28                         friend class nv::sdl::audio;
    29                         sound( void* data ) : m_sound( data ) {}
    30                 public:
    31                         virtual ~sound();
    32                 private:
    33                         void* m_sound;
    34                 };
    35 
    36                 class channel : public nv::channel
    37                 {
    38                 private:
    39                         friend class nv::sdl::audio;
    40                         virtual ~channel() {}
     25                        void* sdl_sound;
    4126                };
    4227
     
    4530                public:
    4631                        audio();
    47                         virtual nv::channel* play_sound( nv::sound* a_sound );
    48                         virtual nv::sound* load_sound( const std::string& a_path );
     32                        virtual channel play_sound( sound a_sound );
     33                        virtual sound load_sound( const std::string& a_path );
     34                        virtual void release( sound a_sound );
    4935                        virtual void update();
    5036                        virtual ~audio();
     37                private:
     38                        entity_store< sound_info, sound >     m_sounds;
    5139                };
    5240        }
  • trunk/src/fmod/fmod_audio.cc

    r319 r329  
    3737
    3838
    39 nv::channel* fmod::audio::play_sound( nv::sound* a_sound )
     39nv::channel fmod::audio::play_sound( nv::sound a_sound )
    4040{
    41         FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
    42         FMOD_SOUND* sample  = (FMOD_SOUND*)( down_cast< fmod::sound >( a_sound )->m_sound );
    43         FMOD_RESULT result  = FMOD_System_PlaySound( system, FMOD_CHANNEL_FREE, sample, false, 0 );
    44         if ( result != FMOD_OK )
     41        sound_info* info = m_sounds.get( a_sound );
     42        if ( info )
    4543        {
    46                 NV_LOG( LOG_WARNING, "FMOD failed to play sound -- " << FMOD_ErrorString( result ) );
     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 );
     47                if ( result != FMOD_OK )
     48                {
     49                        NV_LOG( LOG_WARNING, "FMOD failed to play sound -- " << FMOD_ErrorString( result ) );
     50                }
    4751        }
    48         return nullptr;
     52        return channel();
    4953}
    5054
    51 nv::sound* fmod::audio::load_sound( const std::string& a_path )
     55nv::sound fmod::audio::load_sound( const std::string& a_path )
    5256{
    5357        FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
    5458        FMOD_SOUND* sample;
    55         FMOD_RESULT result = FMOD_System_CreateSound( system, a_path.c_str(), FMOD_DEFAULT, 0, &sample );
    56         if ( result != FMOD_OK )
     59        FMOD_RESULT fm_result = FMOD_System_CreateSound( system, a_path.c_str(), FMOD_DEFAULT, 0, &sample );
     60        if ( fm_result != FMOD_OK )
    5761        {
    58                 NV_LOG( LOG_ERROR, "FMOD failed to load sample '" << a_path << "' -- " << FMOD_ErrorString( result ) );
    59                 return nullptr;
     62                NV_LOG( LOG_ERROR, "FMOD failed to load sample '" << a_path << "' -- " << FMOD_ErrorString( fm_result ) );
     63                return sound();
    6064        }
    61         return new fmod::sound( sample );
     65        sound result = m_sounds.create();
     66        sound_info* info = m_sounds.get( result );
     67        info->fmod_sound = sample;
     68        return result;
     69}
     70
     71void nv::fmod::audio::release( sound a_sound )
     72{
     73        sound_info* info = m_sounds.get( a_sound );
     74        if ( info )
     75        {
     76                FMOD_Sound_Release( (FMOD_SOUND*)info->fmod_sound );
     77                m_sounds.destroy( a_sound );
     78        }
    6279}
    6380
     
    7087fmod::audio::~audio()
    7188{
     89        while ( m_sounds.size() > 0 )
     90                release( m_sounds.get_handle(0) );
    7291        FMOD_System_Release( (FMOD_SYSTEM*)m_system );
    7392}
    7493
    75 fmod::sound::~sound()
    76 {
    77         FMOD_Sound_Release( (FMOD_SOUND*)m_sound );
    78 }
  • trunk/src/sdl/sdl_audio.cc

    r322 r329  
    3232
    3333
    34 nv::channel* sdl::audio::play_sound( nv::sound* a_sound )
     34nv::channel sdl::audio::play_sound( sound a_sound )
    3535{
    36         if ( Mix_PlayChannel(-1, (Mix_Chunk*)( down_cast< sdl::sound >( a_sound )->m_sound), 0) == -1 )
     36        sound_info* info = m_sounds.get( a_sound );
     37        if ( info )
    3738        {
    38                 NV_LOG( LOG_WARNING, "SDL_mixer failed to play -- " << Mix_GetError() );
     39                if ( Mix_PlayChannel(-1, (Mix_Chunk*)( info->sdl_sound), 0) == -1 )
     40                {
     41                        NV_LOG( LOG_WARNING, "SDL_mixer failed to play -- " << Mix_GetError() );
     42                }
    3943        }
    40         return nullptr;
     44        return channel();
    4145}
    4246
    43 nv::sound* nv::sdl::audio::load_sound( const std::string& a_path )
     47nv::sound nv::sdl::audio::load_sound( const std::string& a_path )
    4448{
    4549        // TODO: this is a really wierd error - if we remove this check, all hell gets loose
     
    5256        {
    5357                NV_LOG( LOG_ERROR, "SDL_mixer failed to load sample '" << a_path << "' -- " << Mix_GetError() );
    54                 return nullptr;
     58                return sound();
    5559        }
    56         return new sdl::sound( sample );
     60        sound result = m_sounds.create();
     61        sound_info* info = m_sounds.get( result );
     62        info->sdl_sound = sample;
     63        return result;
    5764}
    5865
     
    6471nv::sdl::audio::~audio()
    6572{
     73        while ( m_sounds.size() > 0 )
     74                release( m_sounds.get_handle(0) );
    6675        Mix_CloseAudio();
    6776        // TODO: should we do it here?
     
    6978}
    7079
    71 nv::sdl::sound::~sound()
     80void nv::sdl::audio::release( sound a_sound )
    7281{
    73         Mix_FreeChunk( (Mix_Chunk*)m_sound );
     82        sound_info* info = m_sounds.get( a_sound );
     83        if ( info )
     84        {
     85                Mix_FreeChunk( (Mix_Chunk*)info->sdl_sound );
     86                m_sounds.destroy( a_sound );
     87        }
    7488}
     89
  • trunk/tests/gui_test/test.style.lua

    r328 r329  
    99                --border_color = { 0.2, 0.2, 0.4, 1.0 },
    1010                skin = "button.png",
     11
     12                [":hover"] = {
     13                        text_color = { 1.0, 1.0, 1.0, 1.0 },
     14                }
     15
    1116        }
    1217}
Note: See TracChangeset for help on using the changeset viewer.