#ifndef H_ADPLUG_DBEMUOPL
#define H_ADPLUG_DBEMUOPL
#include <opl.h>
#include <stdlib.h>
#include "dbopl.h"
#define clip(s) if ( (s) != (short)(s) ) (s) = (((s) >> 31) ^ 0x7FFF)
class DBemuopl: public Copl
{
public:
DBemuopl(int rate, bool stereo)
: usestereo( stereo )
{
chip.Setup( rate );
currType = TYPE_OPL3;
};
~DBemuopl()
{
}
void update(short *buf, int total)
{
Bit32s buffer[256 * 2];
while (total > 0)
{
unsigned int samples = total;
if ( samples > 256 ) samples = 256;
if ( !chip.opl3Active )
{
chip.GenerateBlock2( samples, buffer );
if ( ! usestereo )
{
for ( unsigned i = 0; i < samples; i++ )
{
int sample = buffer [i] << 1;
clip(sample);
buf [i] = sample;
}
}
else
{
for ( unsigned i = 0; i < samples; i++ )
{
int sample = buffer [i] << 1;
clip(sample);
buf [i * 2 + 0] = sample;
buf [i * 2 + 1] = sample;
}
}
}
else
{
chip.GenerateBlock3( samples, buffer );
if ( usestereo )
{
for ( unsigned i = 0, j = samples * 2; i < j; i++ )
{
int sample = buffer [i] << 1;
clip(sample);
buf [i] = sample;
}
}
else
{
for ( unsigned i = 0; i < samples; i++ )
{
int sample = ( buffer [i * 2 + 0] + buffer [i * 2 + 1] ) ;
clip(sample);
buf [i] = sample;
}
}
}
total -= samples;
if ( usestereo ) buf += samples * 2;
else buf += samples;
}
}
void write(int reg, int val)
{
chip.WriteReg( currChip * 0x100 + reg, val );
};
void init() {};
void settype(ChipType type)
{
currType = type;
}
private:
bool usestereo;
DBOPL::Chip chip;
};
#endif