Skip to content

Commit

Permalink
Add Audio cgame syscalls
Browse files Browse the repository at this point in the history
  • Loading branch information
Kangz committed Sep 3, 2014
1 parent 83bb31f commit 79101d2
Show file tree
Hide file tree
Showing 3 changed files with 193 additions and 224 deletions.
44 changes: 37 additions & 7 deletions src/engine/client/cg_api.h
Original file line number Diff line number Diff line change
Expand Up @@ -151,17 +151,12 @@ typedef enum cgameImport_s
CG_S_CLEARLOOPINGSOUNDS,
CG_S_CLEARSOUNDS,
CG_S_ADDLOOPINGSOUND,
CG_S_ADDREALLOOPINGSOUND,
CG_S_STOPLOOPINGSOUND,
CG_S_STOPSTREAMINGSOUND,
CG_S_UPDATEENTITYPOSITION,
CG_S_RESPATIALIZE,
CG_S_REGISTERSOUND,
CG_S_STARTBACKGROUNDTRACK,
CG_S_FADESTREAMINGSOUND,
CG_S_STARTSTREAMINGSOUND,
CG_S_STOPBACKGROUNDTRACK,
CG_S_FADEALLSOUNDS,
CG_S_UPDATEENTITYVELOCITY,
CG_S_SETREVERB,
CG_S_BEGINREGISTRATION,
Expand Down Expand Up @@ -452,6 +447,43 @@ typedef IPC::SyncMessage<
IPC::Reply<bool>
> GetNewsMsg;

// All Sounds

namespace Audio {
// StartSoundMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_STARTSOUND>, std::array<float, 3>, int, int> StartSoundMsg;
// StartLocalSoundMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_STARTLOCALSOUND>, int> StartLocalSoundMsg;
// ClearLoopingSoundsMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_CLEARLOOPINGSOUNDS>> ClearLoopingSoundsMsg;
// ClearSoundsMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_CLEARSOUNDS>> ClearSoundsMsg;
// AddLoopingSoundMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_ADDLOOPINGSOUND>, int, int> AddLoopingSoundMsg;
// StopLoopingSoundMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_STOPLOOPINGSOUND>, int> StopLoopingSoundMsg;
// UpdateEntityPositionMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_UPDATEENTITYPOSITION>, int, std::array<float, 3>> UpdateEntityPositionMsg;
// RespatializeMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_RESPATIALIZE>, int, std::array<float, 9>> RespatializeMsg;
// RegisterSoundMsg
typedef IPC::SyncMessage<
IPC::Message<IPC::Id<VM::QVM, CG_S_REGISTERSOUND>, std::string>,
IPC::Reply<int>
> RegisterSoundMsg;
// StartBackgroundTrackMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_STARTBACKGROUNDTRACK>, std::string, std::string> StartBackgroundTrackMsg;
// StopBackgroundTrackMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_STOPBACKGROUNDTRACK>> StopBackgroundTrackMsg;
// UpdateEntityVelocityMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_UPDATEENTITYVELOCITY>, int, std::array<float, 3>> UpdateEntityVelocityMsg;
// SetReverbMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_SETREVERB>, int, std::string, float> SetReverbMsg;
// BeginRegistrationMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_BEGINREGISTRATION>> BeginRegistrationMsg;
// EndRegistrationMsg
typedef IPC::Message<IPC::Id<VM::QVM, CG_S_ENDREGISTRATION>> EndRegistrationMsg;
}

typedef enum
{
Expand Down Expand Up @@ -639,7 +671,6 @@ int trap_S_GetCurrentSoundTime( void );
void trap_S_Respatialize( int entityNum, const vec3_t origin, vec3_t axis[ 3 ], int inwater );
sfxHandle_t trap_S_RegisterSound( const char *sample, qboolean compressed );
void trap_S_StartBackgroundTrack( const char *intro, const char *loop );
void trap_S_FadeBackgroundTrack( float targetvol, int time, int num );
int trap_S_StartStreamingSound( const char *intro, const char *loop, int entnum, int channel, int attenuation );
void trap_R_LoadWorldMap( const char *mapname );
qhandle_t trap_R_RegisterModel( const char *name );
Expand Down Expand Up @@ -717,7 +748,6 @@ int trap_Parse_ReadToken( int handle, pc_token_t *pc_token );
int trap_Parse_SourceFileAndLine( int handle, char *filename, int *line );
void trap_Key_KeynumToStringBuf( int keynum, char *buf, int buflen );
void trap_CG_TranslateString( const char *string, char *buf );
void trap_S_FadeAllSound( float targetvol, int time, qboolean stopsounds );
qboolean trap_R_inPVS( const vec3_t p1, const vec3_t p2 );
qboolean trap_R_inPVVS( const vec3_t p1, const vec3_t p2 );
qboolean trap_R_LoadDynamicShader( const char *shadername, const char *shadertext );
Expand Down
199 changes: 90 additions & 109 deletions src/engine/client/cl_cgame.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1453,85 +1453,6 @@ intptr_t CL_CgameSystemCalls( intptr_t *args )
re.ClearDecals();
return 0;
case CG_S_STARTSOUND:
cls.nCgameSoundSyscalls ++;
Audio::StartSound( args[ 2 ], (float*) VMA( 1 ), args[ 4 ] );
return 0;
case CG_S_STARTLOCALSOUND:
cls.nCgameSoundSyscalls ++;
Audio::StartLocalSound( args[ 1 ] );
return 0;
case CG_S_CLEARLOOPINGSOUNDS:
cls.nCgameSoundSyscalls ++;
Audio::ClearAllLoopingSounds();
return 0;
case CG_S_CLEARSOUNDS:
cls.nCgameSoundSyscalls ++;
return 0;
case CG_S_ADDLOOPINGSOUND:
case CG_S_ADDREALLOOPINGSOUND:
cls.nCgameSoundSyscalls ++;
if( args[ 2 ] )
{
Audio::UpdateEntityPosition( args[ 1 ], (float*) VMA( 2 ) );
}
if( args[ 3 ] )
{
Audio::UpdateEntityVelocity( args[ 1 ], (float*) VMA( 3 ) );
}
Audio::AddEntityLoopingSound( args[ 1 ], args[ 4 ]);
return 0;
case CG_S_STOPLOOPINGSOUND:
cls.nCgameSoundSyscalls ++;
Audio::ClearLoopingSoundsForEntity( args[ 1 ] );
return 0;
case CG_S_STOPSTREAMINGSOUND:
cls.nCgameSoundSyscalls ++;
// FIXME
//S_StopEntStreamingSound(args[1]);
return 0;
case CG_S_UPDATEENTITYPOSITION:
cls.nCgameSoundSyscalls ++;
Audio::UpdateEntityPosition( args[ 1 ], (float*) VMA( 2 ) );
return 0;
case CG_S_RESPATIALIZE:
cls.nCgameSoundSyscalls ++;
if (args[ 1 ] >= 0 and args[ 1 ] < MAX_GENTITIES) {
Audio::UpdateEntityPosition( args[ 1 ], (float*) VMA( 2 ));
}
Audio::UpdateListener(args[ 1 ], (vec3_t*) VMA( 3 ) );
return 0;
case CG_S_REGISTERSOUND:
cls.nCgameSoundSyscalls ++;
return Audio::RegisterSFX( (char*) VMA( 1 ) );
case CG_S_STARTBACKGROUNDTRACK:
cls.nCgameSoundSyscalls ++;
Audio::StartMusic( (char*) VMA( 1 ), (char*) VMA( 2 ) );
return 0;
case CG_S_FADESTREAMINGSOUND:
cls.nCgameSoundSyscalls ++;
// FIXME
//S_FadeStreamingSound(VMF(1), args[2], args[3]); //----(SA) added music/all-streaming options
return 0;
case CG_S_STARTSTREAMINGSOUND:
cls.nCgameSoundSyscalls ++;
// FIXME
//return S_StartStreamingSound(VMA(1), VMA(2), args[3], args[4], args[5]);
return 0;
case CG_R_LOADWORLDMAP:
cls.nCgameRenderSyscalls ++;
re.SetWorldVisData( CM_ClusterPVS( -1 ) );
Expand Down Expand Up @@ -1695,11 +1616,6 @@ intptr_t CL_CgameSystemCalls( intptr_t *args )
Key_SetOverstrikeMode( args[ 1 ] );
return 0;
case CG_S_STOPBACKGROUNDTRACK:
cls.nCgameSoundSyscalls ++;
Audio::StopMusic();
return 0;
case CG_CIN_PLAYCINEMATIC:
return CIN_PlayCinematic( (char*) VMA( 1 ), args[ 2 ], args[ 3 ], args[ 4 ], args[ 5 ], args[ 6 ] );
Expand Down Expand Up @@ -1766,12 +1682,6 @@ intptr_t CL_CgameSystemCalls( intptr_t *args )
Key_KeynumToStringBuf( args[ 1 ], (char*) VMA( 2 ), args[ 3 ] );
return 0;
case CG_S_FADEALLSOUNDS:
cls.nCgameSoundSyscalls ++;
// FIXME
//S_FadeAllSounds(VMF(1), args[2], args[3]);
return 0;
case CG_R_INPVS:
cls.nCgameRenderSyscalls ++;
return re.inPVS( (float*) VMA( 1 ), (float*) VMA( 2 ) );
Expand Down Expand Up @@ -2082,25 +1992,6 @@ intptr_t CL_CgameSystemCalls( intptr_t *args )
re.SetAltShaderTokens( ( const char * )VMA(1) );
return 0;
case CG_S_UPDATEENTITYVELOCITY:
cls.nCgameSoundSyscalls ++;
Audio::UpdateEntityVelocity( args[ 1 ], (float*) VMA( 2 ) );
return 0;
case CG_S_SETREVERB:
cls.nCgameSoundSyscalls ++;
Audio::SetReverb( args[ 1 ], (const char*) VMA( 2 ), VMF( 3 ) );
return 0;
case CG_S_BEGINREGISTRATION:
cls.nCgameSoundSyscalls ++;
Audio::BeginRegistration();
return 0;
case CG_S_ENDREGISTRATION:
cls.nCgameSoundSyscalls ++;
Audio::EndRegistration();
return 0;
case CG_ROCKET_REGISTERPROPERTY:
Rocket_RegisterProperty( ( const char * ) VMA( 1 ), ( const char * ) VMA( 2 ), args[ 3 ], args[ 4 ], ( const char * ) VMA( 5 ) );
return 0;
Expand Down Expand Up @@ -3012,6 +2903,96 @@ void CGameVM::QVMSyscall(int index, IPC::Reader& reader, IPC::Channel& channel)
});
break;

case CG_S_STARTSOUND:
IPC::HandleMsg<Audio::StartSoundMsg>(channel, std::move(reader), [this] (std::array<float, 3> origin, int entityNum, int sfx) {
Audio::StartSound(entityNum, origin.data(), sfx);
});
break;

case CG_S_STARTLOCALSOUND:
IPC::HandleMsg<Audio::StartLocalSoundMsg>(channel, std::move(reader), [this] (int sfx) {
Audio::StartLocalSound(sfx);
});
break;

case CG_S_CLEARLOOPINGSOUNDS:
IPC::HandleMsg<Audio::ClearLoopingSoundsMsg>(channel, std::move(reader), [this] {
Audio::ClearAllLoopingSounds();
});
break;

case CG_S_CLEARSOUNDS:
IPC::HandleMsg<Audio::ClearSoundsMsg>(channel, std::move(reader), [this] {
Audio::ClearAllLoopingSounds();
});
break;

case CG_S_ADDLOOPINGSOUND:
IPC::HandleMsg<Audio::AddLoopingSoundMsg>(channel, std::move(reader), [this] (int entityNum, int sfx) {
Audio::AddEntityLoopingSound(entityNum, sfx);
});
break;

case CG_S_STOPLOOPINGSOUND:
IPC::HandleMsg<Audio::StopLoopingSoundMsg>(channel, std::move(reader), [this] (int entityNum) {
Audio::ClearLoopingSoundsForEntity(entityNum);
});
break;

case CG_S_UPDATEENTITYPOSITION:
IPC::HandleMsg<Audio::UpdateEntityPositionMsg>(channel, std::move(reader), [this] (int entityNum, std::array<float, 3> position) {
Audio::UpdateEntityPosition(entityNum, position.data());
});
break;

case CG_S_RESPATIALIZE:
IPC::HandleMsg<Audio::RespatializeMsg>(channel, std::move(reader), [this] (int entityNum, std::array<float, 9> axis) {
Audio::UpdateListener(entityNum, (vec3_t*) axis.data());
});
break;

case CG_S_REGISTERSOUND:
IPC::HandleMsg<Audio::RegisterSoundMsg>(channel, std::move(reader), [this] (std::string sample, int& handle) {
handle = Audio::RegisterSFX(sample.c_str());
});
break;

case CG_S_STARTBACKGROUNDTRACK:
IPC::HandleMsg<Audio::StartBackgroundTrackMsg>(channel, std::move(reader), [this] (std::string intro, std::string loop) {
Audio::StartMusic(intro.c_str(), loop.c_str());
});
break;

case CG_S_STOPBACKGROUNDTRACK:
IPC::HandleMsg<Audio::StopBackgroundTrackMsg>(channel, std::move(reader), [this] {
Audio::StopMusic();
});
break;

case CG_S_UPDATEENTITYVELOCITY:
IPC::HandleMsg<Audio::UpdateEntityVelocityMsg>(channel, std::move(reader), [this] (int entityNum, std::array<float, 3> velocity) {
Audio::UpdateEntityVelocity(entityNum, velocity.data());
});
break;

case CG_S_SETREVERB:
IPC::HandleMsg<Audio::SetReverbMsg>(channel, std::move(reader), [this] (int slotNum, std::string name, float ratio) {
Audio::SetReverb(slotNum, name.c_str(), ratio);
});
break;

case CG_S_BEGINREGISTRATION:
IPC::HandleMsg<Audio::BeginRegistrationMsg>(channel, std::move(reader), [this] {
Audio::BeginRegistration();
});
break;

case CG_S_ENDREGISTRATION:
IPC::HandleMsg<Audio::EndRegistrationMsg>(channel, std::move(reader), [this] {
Audio::EndRegistration();
});
break;

default:
Com_Error(ERR_DROP, "Bad game system trap: %d", index);
}
Expand Down
Loading

0 comments on commit 79101d2

Please sign in to comment.