/*
** Command & Conquer Generals(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: audlevel.cpp **
** **
** Created by: 11/16/95 TR **
** **
** Description: **
** **
*****************************************************************************/
/*****************************************************************************
** Includes **
*****************************************************************************/
#include
#include
#include
// 'assignment within condition expression'.
#pragma warning(disable : 4706)
DBG_DECLARE_TYPE ( AudioLevel )
/*****************************************************************************
** Externals **
*****************************************************************************/
/*****************************************************************************
** Defines **
*****************************************************************************/
/*****************************************************************************
** Private Types **
*****************************************************************************/
/*****************************************************************************
** Private Data **
*****************************************************************************/
/*****************************************************************************
** Public Data **
*****************************************************************************/
/*****************************************************************************
** Private Prototypes **
*****************************************************************************/
/*****************************************************************************
** Private Functions **
*****************************************************************************/
/*****************************************************************************
** Public Functions **
*****************************************************************************/
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioLevelInit ( AudioLevel *level, int startLevel )
{
DBG_ASSERT ( level != NULL );
DBG_SET_TYPE ( level, AudioLevel );
level->flags = 0;
level->lastTime = AudioGetTime ();
AudioLevelSetDuration ( level, SECONDS(1), AUDIO_LEVEL_MAX);
AudioLevelSet ( level, startLevel );
AudioLevelUpdate ( level );
}
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioLevelSet ( AudioLevel *level, int newLevel )
{
DBG_ASSERT_TYPE ( level, AudioLevel );
DBG_ASSERT (newLevel>=AUDIO_LEVEL_MIN);
DBG_ASSERT (newLevel<=AUDIO_LEVEL_MAX);
level->flags |= AUDIO_LEVEL_SET;
level->newLevel = (newLevel<flags |= AUDIO_LEVEL_SET;
}
#ifdef _DEBUG
/******************************************************************/
/* */
/* */
/******************************************************************/
int AudioLevelApply ( AudioLevel *level, int val )
{
DBG_ASSERT_TYPE ( level, AudioLevel );
DBG_ASSERT (val >= AUDIO_LEVEL_MIN_VAL);
DBG_ASSERT (val <= AUDIO_LEVEL_MAX_VAL);
return AUDIO_LEVEL_APPLY(level,val);
}
#endif
/******************************************************************/
/* */
/* */
/******************************************************************/
void AudioLevelAdjust ( AudioLevel *level, int newLevel )
{
DBG_ASSERT_TYPE ( level, AudioLevel );
DBG_ASSERT (newLevel>=AUDIO_LEVEL_MIN);
DBG_ASSERT (newLevel<=AUDIO_LEVEL_MAX);
level->flags &= ~AUDIO_LEVEL_SET;
if ( level->newLevel == level->level)
{
level->lastTime = AudioGetTime ();
}
level->newLevel = newLevel< 0);
DBG_ASSERT (range <= AUDIO_LEVEL_MAX);
level->change = (range<< AUDIO_LEVEL_SCALE) / (uint) time;
level->duration = time;
}
/******************************************************************/
/* */
/* */
/******************************************************************/
int AudioLevelUpdate ( AudioLevel *level )
{
int dif;
int delta; // amount to move by this update
TimeStamp time, thisTime;
DBG_ASSERT_TYPE ( level, AudioLevel );
if ( (dif = (level->newLevel - level->level)) )
{
if (level->flags & AUDIO_LEVEL_SET )
{
level->level = level->newLevel;
}
else
{
// calculate what the delta change is for this update
thisTime = AudioGetTime ( ) ;
time = thisTime - level->lastTime;
level->lastTime = thisTime; // remember time of this update
// the next check avoid overflowing the delta
if (time > level->duration)
{
time = level->duration;
}
delta = level->change * (uint) time;
if (dif<0)
{
if ( delta > (-dif))
{
level->level += dif;
}
else
{
level->level -= delta;
}
}
else
{
if ( delta > dif )
{
level->level += dif;
}
else
{
level->level += delta;
}
}
}
// there was a change in the level
level->flags |= AUDIO_LEVEL_CHANGED;
return TRUE;
}
// there has been no change this update
return FALSE;
}
/******************************************************************/
/* */
/* */
/******************************************************************/
int AudioLevelGetVal( AudioLevel *level )
{
return (level->newLevel>>AUDIO_LEVEL_SCALE);
}