void StopSoundByHandle( int entindex, const char *soundname, HSOUNDSCRIPTHANDLE& handle ) { if ( handle == SOUNDEMITTER_INVALID_HANDLE ) { handle = (HSOUNDSCRIPTHANDLE)soundemitterbase->GetSoundIndex( soundname ); } if ( handle == SOUNDEMITTER_INVALID_HANDLE ) return; CSoundParametersInternal *params; params = soundemitterbase->InternalGetParametersForSound( (int)handle ); if ( !params ) { return; } // HACK: we have to stop all sounds if there are > 1 in the rndwave section... int c = params->NumSoundNames(); for ( int i = 0; i < c; ++i ) { char const *wavename = soundemitterbase->GetWaveName( params->GetSoundNames()[ i ].symbol ); Assert( wavename ); enginesound->StopSound( entindex, params->GetChannel(), wavename ); TraceEmitSound( "StopSound: '%s' stopped as '%s' (ent %i)\n", soundname, wavename, entindex ); } }
void EmitAmbientSound( int entindex, const Vector& origin, const char *soundname, float flVolume, int iFlags, int iPitch, float soundtime /*= 0.0f*/, float *duration /*=NULL*/ ) { // Pull data from parameters CSoundParameters params; if ( !soundemitterbase->GetParametersForSound( soundname, params, GENDER_NONE ) ) { return; } if( iFlags & SND_CHANGE_PITCH ) { params.pitch = iPitch; } if( iFlags & SND_CHANGE_VOL ) { params.volume = flVolume; } #if defined( CLIENT_DLL ) enginesound->EmitAmbientSound( params.soundname, params.volume, params.pitch, iFlags, soundtime ); #else engine->EmitAmbientSound(entindex, origin, params.soundname, params.volume, params.soundlevel, iFlags, params.pitch, soundtime ); #endif bool needsCC = !( iFlags & ( SND_STOP | SND_CHANGE_VOL | SND_CHANGE_PITCH ) ); float soundduration = 0.0f; if ( duration || needsCC ) { soundduration = enginesound->GetSoundDuration( params.soundname ); if ( duration ) { *duration = soundduration; } } TraceEmitSound( "EmitAmbientSound: '%s' emitted as '%s' (ent %i)\n", soundname, params.soundname, entindex ); // We only want to trigger the CC on the start of the sound, not on any changes or halting of the sound if ( needsCC ) { CRecipientFilter filter; filter.AddAllPlayers(); filter.MakeReliable(); CUtlVector< Vector > dummy; EmitCloseCaption( filter, entindex, false, soundname, dummy, soundduration, false ); } }
void EmitAmbientSound(int entindex, const Vector &origin, const char *pSample, float volume, soundlevel_t soundlevel, int flags, int pitch, float soundtime /*= 0.0f*/, float *duration /*=NULL*/) { #ifdef STAGING_ONLY if ( sv_snd_filter.GetString()[ 0 ] && !V_stristr( pSample, sv_snd_filter.GetString() )) { return; } #endif // STAGING_ONLY #if !defined( CLIENT_DLL ) CUtlVector< Vector > dummyorigins; // Loop through all registered microphones and tell them the sound was just played // NOTE: This means that pitch shifts/sound changes on the original ambient will not be reflected in the re-broadcasted sound bool bSwallowed = CEnvMicrophone::OnSoundPlayed( entindex, pSample, soundlevel, volume, flags, pitch, &origin, soundtime, dummyorigins); if (bSwallowed) return; #endif if (pSample && (Q_stristr(pSample, ".wav") || Q_stristr(pSample, ".mp3"))) { #if defined( CLIENT_DLL ) enginesound->EmitAmbientSound( pSample, volume, pitch, flags, soundtime ); #else engine->EmitAmbientSound(entindex, origin, pSample, volume, soundlevel, flags, pitch, soundtime); #endif if (duration) { *duration = enginesound->GetSoundDuration(pSample); } TraceEmitSound("EmitAmbientSound: Raw wave emitted '%s' (ent %i)\n", pSample, entindex); } else { EmitAmbientSound(entindex, origin, pSample, volume, flags, pitch, soundtime, duration); } }
void StopSound( int iEntIndex, int iChannel, const char *pSample ) { if ( pSample && ( Q_stristr( pSample, ".wav" ) || Q_stristr( pSample, ".mp3" ) || pSample[0] == '!' ) ) { enginesound->StopSound( iEntIndex, iChannel, pSample ); TraceEmitSound( "StopSound: Raw wave stopped '%s' (ent %i)\n", pSample, iEntIndex ); } else { // Look it up in sounds.txt and ignore other parameters StopSound( iEntIndex, pSample ); } }
void EmitSound( IRecipientFilter& filter, int entindex, const EmitSound_t & ep ) { VPROF( "CSoundEmitterSystem::EmitSound (calls engine)" ); if ( ep.m_pSoundName && ( Q_stristr( ep.m_pSoundName, ".wav" ) || Q_stristr( ep.m_pSoundName, ".mp3" ) || ep.m_pSoundName[0] == '!' ) ) { #if !defined( CLIENT_DLL ) bool bSwallowed = CEnvMicrophone::OnSoundPlayed( entindex, ep.m_pSoundName, ep.m_SoundLevel, ep.m_flVolume, ep.m_nFlags, ep.m_nPitch, ep.m_pOrigin, ep.m_flSoundTime, ep.m_UtlVecSoundOrigin ); if ( bSwallowed ) return; #endif if ( ep.m_bWarnOnDirectWaveReference && Q_stristr( ep.m_pSoundName, ".wav" ) ) { WaveTrace( ep.m_pSoundName, "Emitsound" ); } #if defined( _DEBUG ) && !defined( CLIENT_DLL ) if ( !enginesound->IsSoundPrecached( ep.m_pSoundName ) ) { Msg( "Sound %s was not precached\n", ep.m_pSoundName ); } #endif enginesound->EmitSound( filter, entindex, ep.m_nChannel, ep.m_pSoundName, ep.m_flVolume, ep.m_SoundLevel, ep.m_nFlags, ep.m_nPitch, ep.m_pOrigin, NULL, &ep.m_UtlVecSoundOrigin, true, ep.m_flSoundTime, ep.m_nSpeakerEntity ); if ( ep.m_pflSoundDuration ) { *ep.m_pflSoundDuration = enginesound->GetSoundDuration( ep.m_pSoundName ); } TraceEmitSound( "EmitSound: Raw wave emitted '%s' (ent %i)\n", ep.m_pSoundName, entindex ); return; } if ( ep.m_hSoundScriptHandle == SOUNDEMITTER_INVALID_HANDLE ) { ep.m_hSoundScriptHandle = (HSOUNDSCRIPTHANDLE)soundemitterbase->GetSoundIndex( ep.m_pSoundName ); } if ( ep.m_hSoundScriptHandle == -1 ) return; EmitSoundByHandle( filter, entindex, ep, ep.m_hSoundScriptHandle ); }
void EmitSoundByHandle( IRecipientFilter& filter, int entindex, const EmitSound_t & ep, HSOUNDSCRIPTHANDLE& handle ) { // Pull data from parameters CSoundParameters params; // Try to deduce the actor's gender gender_t gender = GENDER_NONE; CBaseEntity *ent = CBaseEntity::Instance( entindex ); if ( ent ) { char const *actorModel = STRING( ent->GetModelName() ); gender = soundemitterbase->GetActorGender( actorModel ); } if ( !soundemitterbase->GetParametersForSoundEx( ep.m_pSoundName, handle, params, gender, true ) ) { return; } if ( !params.soundname[0] ) return; if ( !Q_strncasecmp( params.soundname, "vo", 2 ) && !( params.channel == CHAN_STREAM || params.channel == CHAN_VOICE ) ) { DevMsg( "EmitSound: Voice wave file %s doesn't specify CHAN_VOICE or CHAN_STREAM for sound %s\n", params.soundname, ep.m_pSoundName ); } // handle SND_CHANGEPITCH/SND_CHANGEVOL and other sound flags.etc. if( ep.m_nFlags & SND_CHANGE_PITCH ) { params.pitch = ep.m_nPitch; } if( ep.m_nFlags & SND_CHANGE_VOL ) { params.volume = ep.m_flVolume; } #if !defined( CLIENT_DLL ) bool bSwallowed = CEnvMicrophone::OnSoundPlayed( entindex, params.soundname, params.soundlevel, params.volume, ep.m_nFlags, params.pitch, ep.m_pOrigin, ep.m_flSoundTime, ep.m_UtlVecSoundOrigin ); if ( bSwallowed ) return; #endif #if defined( _DEBUG ) && !defined( CLIENT_DLL ) if ( !enginesound->IsSoundPrecached( params.soundname ) ) { Msg( "Sound %s:%s was not precached\n", ep.m_pSoundName, params.soundname ); } #endif float st = ep.m_flSoundTime; if ( !st && params.delay_msec != 0 ) { st = gpGlobals->curtime + (float)params.delay_msec / 1000.f; } enginesound->EmitSound( filter, entindex, params.channel, params.soundname, params.volume, (soundlevel_t)params.soundlevel, ep.m_nFlags, params.pitch, ep.m_pOrigin, NULL, &ep.m_UtlVecSoundOrigin, true, st, ep.m_nSpeakerEntity ); if ( ep.m_pflSoundDuration ) { *ep.m_pflSoundDuration = enginesound->GetSoundDuration( params.soundname ); } TraceEmitSound( "EmitSound: '%s' emitted as '%s' (ent %i)\n", ep.m_pSoundName, params.soundname, entindex ); // Don't caption modulations to the sound if ( !( ep.m_nFlags & ( SND_CHANGE_PITCH | SND_CHANGE_VOL ) ) ) { EmitCloseCaption( filter, entindex, params, ep ); } }