Index: trunk/src/fmod/fmod_audio.cc
===================================================================
--- trunk/src/fmod/fmod_audio.cc	(revision 319)
+++ trunk/src/fmod/fmod_audio.cc	(revision 329)
@@ -37,27 +37,44 @@
 
 
-nv::channel* fmod::audio::play_sound( nv::sound* a_sound )
+nv::channel fmod::audio::play_sound( nv::sound a_sound )
 {
-	FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
-	FMOD_SOUND* sample  = (FMOD_SOUND*)( down_cast< fmod::sound >( a_sound )->m_sound );
-	FMOD_RESULT result  = FMOD_System_PlaySound( system, FMOD_CHANNEL_FREE, sample, false, 0 );
-	if ( result != FMOD_OK )
+	sound_info* info = m_sounds.get( a_sound );
+	if ( info )
 	{
-		NV_LOG( LOG_WARNING, "FMOD failed to play sound -- " << FMOD_ErrorString( result ) );
+		FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
+		FMOD_SOUND* sample  = (FMOD_SOUND*)( info->fmod_sound );
+		FMOD_RESULT result  = FMOD_System_PlaySound( system, FMOD_CHANNEL_FREE, sample, false, 0 );
+		if ( result != FMOD_OK )
+		{
+			NV_LOG( LOG_WARNING, "FMOD failed to play sound -- " << FMOD_ErrorString( result ) );
+		}
 	}
-	return nullptr;
+	return channel();
 }
 
-nv::sound* fmod::audio::load_sound( const std::string& a_path )
+nv::sound fmod::audio::load_sound( const std::string& a_path )
 {
 	FMOD_SYSTEM* system = (FMOD_SYSTEM*)m_system;
 	FMOD_SOUND* sample;
-	FMOD_RESULT result = FMOD_System_CreateSound( system, a_path.c_str(), FMOD_DEFAULT, 0, &sample );
-	if ( result != FMOD_OK )
+	FMOD_RESULT fm_result = FMOD_System_CreateSound( system, a_path.c_str(), FMOD_DEFAULT, 0, &sample );
+	if ( fm_result != FMOD_OK )
 	{
-		NV_LOG( LOG_ERROR, "FMOD failed to load sample '" << a_path << "' -- " << FMOD_ErrorString( result ) );
-		return nullptr;
+		NV_LOG( LOG_ERROR, "FMOD failed to load sample '" << a_path << "' -- " << FMOD_ErrorString( fm_result ) );
+		return sound();
 	}
-	return new fmod::sound( sample );
+	sound result = m_sounds.create();
+	sound_info* info = m_sounds.get( result );
+	info->fmod_sound = sample;
+	return result;
+}
+
+void nv::fmod::audio::release( sound a_sound )
+{
+	sound_info* info = m_sounds.get( a_sound );
+	if ( info )
+	{
+		FMOD_Sound_Release( (FMOD_SOUND*)info->fmod_sound );
+		m_sounds.destroy( a_sound );
+	}
 }
 
@@ -70,9 +87,7 @@
 fmod::audio::~audio()
 {
+	while ( m_sounds.size() > 0 )
+		release( m_sounds.get_handle(0) );
 	FMOD_System_Release( (FMOD_SYSTEM*)m_system );
 }
 
-fmod::sound::~sound()
-{
-	FMOD_Sound_Release( (FMOD_SOUND*)m_sound );
-}
