You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

209 lines
3.6 KiB
C++

//
// G A M E.O.N.E - LOW LEVEL LIB V1.0
// Copyright (C) 2001 LEVEL ONE ENTERTAINMENT,
// Licensed under the terms of LGPL.
//:---------------------------------------------------------------------------
//:Description
//
// FRAMEWORK global object waveplayer
//
// CActor
// +--CWavePlayer : CAWave
//
// Loads and plays wave files named by an alias
//
//////////////////////////////////////////////////////////////////////
#ifndef _WAVEPLAYER_H
#define _WAVEPLAYER_H
#include "../lib_base.h"
#include "../llsound.h"
#include "llfrm_actor.h"
#include "../llirq.h"
#define MAX_EFFEKT (8) // Anzahl simultaner explosionen
enum {
EFFEKTRULE_FIRST = 0,
EFFEKTRULE_STILL,
EFFEKTRULE_LAST,
EFFEKTRULE_RANDOM
};
class CAWave
{
public:
char * m_wave_name;
llsound_id m_array[MAX_EFFEKT];
int m_cnt_channels; // anzahl Effekte gleichzeitig
int m_rule; // Bei voller Anzahl von Channels
// rule 0 = der längst gespielte wird ersetzt
// rule 1 = keiner wird ersetzt
// rule 2 = der jüngste wird ersetzt
// rule 3 = per Zufall wird ersetzt
CAWave()
{
int i = MAX_EFFEKT;
while( i-- > 0 )
m_array[i] = 0;
m_wave_name = 0;
m_rule = EFFEKTRULE_FIRST;
}
~CAWave()
{
ReleaseAll();
}
void ReleaseAll()
{
if(m_wave_name)
free(m_wave_name);
m_wave_name = 0;
int i = m_cnt_channels;
while( i-- > 0 )
{
llsound_ReleaseSnd(m_array[i]);
m_array[i] = 0;
}
}
void PlayOneofArray(int mode)
{
int i = m_cnt_channels;
while( i-- > 0 )
{
if( 0 == llsound_GetStatus(m_array[i]) )
{
llsound_Play(m_array[i],mode);
return;
}
}
switch(m_rule){
case EFFEKTRULE_FIRST:
llsound_Play(GetSound_MaxPlaytime(),mode);
break;
case EFFEKTRULE_LAST:
llsound_Play(GetSound_MinPlaytime(),mode);
break;
case EFFEKTRULE_RANDOM:
llsound_Play(m_array[ llirq_GetRand()%m_cnt_channels ],mode);
break;
default:
case EFFEKTRULE_STILL:
break;
}
}
void Stop(){
//alle
int i = m_cnt_channels;
while( i-- > 0 )
{
llsound_Stop(m_array[i]);
}
}
llsound_id GetSound_MaxPlaytime(){
int i = m_cnt_channels;
int index=0;
int playtime = 0;
while( i-- > 0 )
{
int pt = llsound_GetStatus(m_array[i]);
if( pt > playtime )
{
playtime = pt;
index = i;
}
}
return m_array[index];
}
llsound_id GetSound_MinPlaytime(){
int i = m_cnt_channels;
int index=0;
int playtime = 0;
while( i-- > 0 )
{
int pt = llsound_GetStatus(m_array[i]);
if( pt < playtime )
{
playtime = pt;
index = i;
}
}
return m_array[index];
}
void SetVolume(float volume )
{
int i = m_cnt_channels;
while( i -- > 0 )
{
llsound_SetVolume(m_array[i],volume);
}
}
void SetAlias(const char *name )
{
if( m_wave_name )
free(m_wave_name);
m_wave_name = strdup(name);
}
void FillSoundArray(llsound_id id, int channels )
{
m_array[0] = id;
m_cnt_channels = channels;
if( m_cnt_channels > MAX_EFFEKT )
m_cnt_channels = MAX_EFFEKT;
for(int i = 1 ; i < m_cnt_channels; i ++ )
{
m_array[i] = llsound_CloneSnd(id);
}
}
};
class CWavePlayer : public CActor
{
public:
CWavePlayer();
virtual ~CWavePlayer();
bool Message(const char * Type );
void Init();
void SetVolume( float volume ); // 0.0f - 1.0f
void SetVolume( int volpercent); // 0 - 100
float GetVolume();
void Clear();
private:
void FillSoundArray(llsound_id *array,int max_elements, const char * Filename );
CAWave * FindWave(const char * wavename );
float m_snd_volume;
bool m_enableOutput;
queue<CAWave> m_waves;
};
#endif // _WAVEPLAYER_H