/*
** Command & Conquer Generals Zero Hour(tm)
** Copyright 2025 Electronic Arts Inc.
**
** This program is free software: you can redistribute it and/or modify
** it under the terms of the GNU General Public License as published by
** the Free Software Foundation, either version 3 of the License, or
** (at your option) any later version.
**
** This program is distributed in the hope that it will be useful,
** but WITHOUT ANY WARRANTY; without even the implied warranty of
** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
** GNU General Public License for more details.
**
** You should have received a copy of the GNU General Public License
** along with this program. If not, see .
*/
/*****************************************************************************
** **
** Westwood Studios Pacific. **
** **
** Confidential Information **
** Copyright (C) 2000 - All Rights Reserved **
** **
******************************************************************************
** **
** Project: Dune Emperor **
** **
** Module: (_) **
** **
** Version: $ID$ **
** **
** File name: audattr.cpp **
** **
** Created by: 11/16/95 TR **
** **
** Description: **
** **
*****************************************************************************/
/*****************************************************************************
** Includes **
*****************************************************************************/
#include
#include
#include
DBG_DECLARE_TYPE ( AudioAttribs )
/*****************************************************************************
** Externals **
*****************************************************************************/
/*****************************************************************************
** Defines **
*****************************************************************************/
/*****************************************************************************
** Private Types **
*****************************************************************************/
/*****************************************************************************
** Private Data **
*****************************************************************************/
/*****************************************************************************
** Public Data **
*****************************************************************************/
/*****************************************************************************
** Private Prototypes **
*****************************************************************************/
/*****************************************************************************
** Private Functions **
*****************************************************************************/
/*****************************************************************************
** Public Functions **
*****************************************************************************/
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioAttribsInit ( AudioAttribs *attr )
{
DBG_ASSERT ( attr != NULL);
DBG_SET_TYPE ( attr, AudioAttribs );
AudioLevelInit ( &attr->VolumeLevel, AUDIO_VOLUME_MAX );
AudioLevelInit ( &attr->PitchLevel, 100);
AudioLevelInit ( &attr->PanPosition, AUDIO_PAN_CENTER);
AudioAttribsSetPitchDuration (attr, SECONDS(1), 10 );
AudioAttribsSetVolumeDuration (attr, SECONDS(1), AUDIO_LEVEL_MAX );
AudioAttribsSetPanDuration (attr, SECONDS(1), AUDIO_LEVEL_MAX );
AudioLevelSet ( &attr->VolumeLevel, AUDIO_VOLUME_MAX );
}
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioAttribsUpdate ( AudioAttribs *attr )
{
DBG_ASSERT_TYPE ( attr, AudioAttribs );
AudioLevelUpdate ( &attr->VolumeLevel );
AudioLevelUpdate ( &attr->PitchLevel );
AudioLevelUpdate ( &attr->PanPosition );
}
/******************************************************************/
/* */
/* */
/******************************************************************/
int AudioAttribsChanged ( AudioAttribs *attr )
{
DBG_ASSERT_TYPE ( attr, AudioAttribs );
return AudioLevelChanged ( &attr->VolumeLevel ) || AudioLevelChanged ( &attr->PitchLevel ) || AudioLevelChanged ( &attr->PanPosition );
}
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioAttribsApply ( AudioAttribs *attr, AudioAttribs *mod )
{
DBG_ASSERT_TYPE ( attr, AudioAttribs );
DBG_ASSERT_TYPE ( mod, AudioAttribs );
AudioLevelSet ( &attr->VolumeLevel, AudioLevelApply ( &mod->VolumeLevel, AudioAttribsGetVolume ( attr ) ));
AudioLevelUpdate ( &attr->VolumeLevel );
{
// apply pitch
int level;
int change;
level = AudioAttribsGetPitch ( attr );
change = AudioAttribsGetPitch ( mod );
level = (level * change) / 100;
AudioAttribsSetPitch ( attr, level );
AudioLevelUpdate ( &attr->PitchLevel );
}
{
// apply pan
int pos;
if ( (pos = AudioAttribsGetPan ( mod ) - AUDIO_PAN_CENTER) != 0 )
{
if ( ( pos = pos + AudioAttribsGetPan ( attr )) < AUDIO_PAN_LEFT )
{
pos = AUDIO_PAN_LEFT ;
}
else if ( pos > AUDIO_PAN_RIGHT )
{
pos = AUDIO_PAN_RIGHT ;
}
AudioAttribsSetPan ( attr, pos );
}
AudioLevelUpdate ( &attr->PanPosition );
}
}
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioAttribsUsed ( AudioAttribs *attr )
{
AudioLevelUsed ( &attr->VolumeLevel );
AudioLevelUsed ( &attr->PanPosition );
AudioLevelUsed ( &attr->PitchLevel );
}
/******************************************************************/
/* */
/* */
/******************************************************************/
int AudioAttribsCalcPitch ( AudioAttribs *attr, int pitch )
{
int level;
DBG_ASSERT_TYPE ( attr, AudioAttribs );
level = AudioAttribsGetPitch ( attr );
return ( pitch * level ) / 100;
}