mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-22 16:26:39 +00:00
ac87bfc370
Original commit message from CVS: adding modplug
140 lines
3.2 KiB
C++
140 lines
3.2 KiB
C++
/*
|
|
* This source code is public domain.
|
|
*
|
|
* Authors: Kenton Varda <temporal@gauge3d.org> (C interface wrapper)
|
|
*/
|
|
|
|
#include "modplug.h"
|
|
#include "stdafx.h"
|
|
#include "sndfile.h"
|
|
|
|
struct _ModPlugFile
|
|
{
|
|
CSoundFile mSoundFile;
|
|
};
|
|
|
|
namespace ModPlug
|
|
{
|
|
ModPlug_Settings gSettings =
|
|
{
|
|
MODPLUG_ENABLE_OVERSAMPLING | MODPLUG_ENABLE_NOISE_REDUCTION,
|
|
|
|
2,
|
|
16,
|
|
44100,
|
|
MODPLUG_RESAMPLE_LINEAR,
|
|
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0,
|
|
0
|
|
};
|
|
|
|
int gSampleSize;
|
|
|
|
void UpdateSettings(bool updateBasicConfig)
|
|
{
|
|
if(gSettings.mFlags & MODPLUG_ENABLE_REVERB)
|
|
{
|
|
CSoundFile::SetReverbParameters(gSettings.mReverbDepth,
|
|
gSettings.mReverbDelay);
|
|
}
|
|
|
|
if(gSettings.mFlags & MODPLUG_ENABLE_MEGABASS)
|
|
{
|
|
CSoundFile::SetXBassParameters(gSettings.mBassAmount,
|
|
gSettings.mBassRange);
|
|
}
|
|
else // modplug seems to ignore the SetWaveConfigEx() setting for bass boost
|
|
CSoundFile::SetXBassParameters(0, 0);
|
|
|
|
if(gSettings.mFlags & MODPLUG_ENABLE_SURROUND)
|
|
{
|
|
CSoundFile::SetSurroundParameters(gSettings.mSurroundDepth,
|
|
gSettings.mSurroundDelay);
|
|
}
|
|
|
|
if(updateBasicConfig)
|
|
{
|
|
CSoundFile::SetWaveConfig(gSettings.mFrequency,
|
|
gSettings.mBits,
|
|
gSettings.mChannels);
|
|
|
|
gSampleSize = gSettings.mBits / 8 * gSettings.mChannels;
|
|
}
|
|
|
|
CSoundFile::SetWaveConfigEx(gSettings.mFlags & MODPLUG_ENABLE_SURROUND,
|
|
!(gSettings.mFlags & MODPLUG_ENABLE_OVERSAMPLING),
|
|
gSettings.mFlags & MODPLUG_ENABLE_REVERB,
|
|
true,
|
|
gSettings.mFlags & MODPLUG_ENABLE_MEGABASS,
|
|
gSettings.mFlags & MODPLUG_ENABLE_NOISE_REDUCTION,
|
|
false);
|
|
CSoundFile::SetResamplingMode(gSettings.mResamplingMode);
|
|
}
|
|
}
|
|
|
|
ModPlugFile* ModPlug_Load(const void* data, int size)
|
|
{
|
|
ModPlugFile* result = new ModPlugFile;
|
|
ModPlug::UpdateSettings(true);
|
|
if(result->mSoundFile.Create((const BYTE*)data, size))
|
|
{
|
|
result->mSoundFile.SetRepeatCount(ModPlug::gSettings.mLoopCount);
|
|
return result;
|
|
}
|
|
else
|
|
{
|
|
delete result;
|
|
return NULL;
|
|
}
|
|
}
|
|
|
|
void ModPlug_Unload(ModPlugFile* file)
|
|
{
|
|
file->mSoundFile.Destroy();
|
|
delete file;
|
|
}
|
|
|
|
int ModPlug_Read(ModPlugFile* file, void* buffer, int size)
|
|
{
|
|
return file->mSoundFile.Read(buffer, size) * ModPlug::gSampleSize;
|
|
}
|
|
|
|
const char* ModPlug_GetName(ModPlugFile* file)
|
|
{
|
|
return file->mSoundFile.GetTitle();
|
|
}
|
|
|
|
int ModPlug_GetLength(ModPlugFile* file)
|
|
{
|
|
return file->mSoundFile.GetSongTime() * 1000;
|
|
}
|
|
|
|
void ModPlug_Seek(ModPlugFile* file, int millisecond)
|
|
{
|
|
int maxpos;
|
|
int maxtime = file->mSoundFile.GetSongTime() * 1000;
|
|
float postime;
|
|
|
|
if(millisecond > maxtime)
|
|
millisecond = maxtime;
|
|
maxpos = file->mSoundFile.GetMaxPosition();
|
|
postime = (float)maxpos / (float)maxtime;
|
|
|
|
file->mSoundFile.SetCurrentPos((int)(millisecond * postime));
|
|
}
|
|
|
|
void ModPlug_GetSettings(ModPlug_Settings* settings)
|
|
{
|
|
memcpy(settings, &ModPlug::gSettings, sizeof(ModPlug_Settings));
|
|
}
|
|
|
|
void ModPlug_SetSettings(const ModPlug_Settings* settings)
|
|
{
|
|
memcpy(&ModPlug::gSettings, settings, sizeof(ModPlug_Settings));
|
|
ModPlug::UpdateSettings(false);
|
|
}
|