Blame |
Last modification |
View Log
| RSS feed
#include "BassLoader.h"
#include <stdlib.h>
using namespace Sexy;
BASS_INSTANCE* Sexy::gBass = NULL;
static long gBassLoadCount = 0;
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
static void CheckBassFunction(unsigned int theFunc, const char *theName)
{
if (theFunc==0)
{
char aBuf[1024];
sprintf(aBuf,"%s function not found in bass.dll",theName);
MessageBoxA(NULL,aBuf,"Error",MB_OK | MB_ICONERROR);
exit(0);
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
BASS_INSTANCE::BASS_INSTANCE(const char *dllName)
{
mModule = LoadLibrary(dllName);
if (!mModule)
return;
#define GETPROC(_x) CheckBassFunction(*((unsigned int *)&_x) = (unsigned int)GetProcAddress(mModule, #_x),#_x)
GETPROC(BASS_Init);
GETPROC(BASS_Free);
GETPROC(BASS_Stop);
GETPROC(BASS_Start);
*((unsigned int*) &BASS_SetGlobalVolumes) = (unsigned int) GetProcAddress(mModule, "BASS_SetGlobalVolumes");
*((unsigned int*) &BASS_SetVolume) = (unsigned int) GetProcAddress(mModule, "BASS_SetVolume");
if ((BASS_SetVolume == NULL) && (BASS_SetGlobalVolumes == NULL))
{
MessageBoxA(NULL,"Neither BASS_SetGlobalVolumes or BASS_SetVolume found in bass.dll","Error",MB_OK | MB_ICONERROR);
exit(0);
}
*((unsigned int*) &BASS_SetConfig) = (unsigned int) GetProcAddress(mModule, "BASS_SetConfig");
*((unsigned int*) &BASS_GetConfig) = (unsigned int) GetProcAddress(mModule, "BASS_GetConfig");
GETPROC(BASS_GetVolume);
GETPROC(BASS_GetInfo);
GETPROC(BASS_GetVersion);
GETPROC(BASS_ChannelStop);
GETPROC(BASS_ChannelPlay);
GETPROC(BASS_ChannelPause);
GETPROC(BASS_ChannelSetAttributes);
GETPROC(BASS_ChannelGetAttributes);
GETPROC(BASS_ChannelSetPosition);
GETPROC(BASS_ChannelGetPosition);
GETPROC(BASS_ChannelIsActive);
GETPROC(BASS_ChannelSetFlags);
GETPROC(BASS_ChannelSlideAttributes);
GETPROC(BASS_ChannelIsSliding);
GETPROC(BASS_ChannelGetLevel);
GETPROC(BASS_ChannelSetSync);
GETPROC(BASS_ChannelRemoveSync);
GETPROC(BASS_ChannelGetData);
// supported by BASS 1.1 and higher. Only work if the user has DX8 or higher though.
GETPROC(BASS_FXSetParameters);
GETPROC(BASS_FXGetParameters);
GETPROC(BASS_ChannelSetFX);
GETPROC(BASS_ChannelRemoveFX);
GETPROC(BASS_MusicLoad);
GETPROC(BASS_MusicFree);
GETPROC(BASS_MusicGetAttribute);
GETPROC(BASS_MusicSetAttribute);
GETPROC(BASS_StreamCreateFile);
GETPROC(BASS_StreamFree);
GETPROC(BASS_MusicGetOrders);
GETPROC(BASS_MusicGetOrderPosition);
GETPROC(BASS_SampleLoad);
GETPROC(BASS_SampleFree);
GETPROC(BASS_SampleSetInfo);
GETPROC(BASS_SampleGetInfo);
GETPROC(BASS_SampleGetChannel);
GETPROC(BASS_SampleStop);
GETPROC(BASS_ErrorGetCode);
mVersion2 = BASS_SetConfig != NULL;
if (mVersion2)
{
// Version 2 has different BASS_Init params
*((unsigned int*) &BASS_Init2) = (unsigned int) BASS_Init;
BASS_Init = NULL;
*((unsigned int*) &BASS_MusicLoad2) = (unsigned int) BASS_MusicLoad;
BASS_MusicLoad = NULL;
// The following are only supported in 2.2 and higher
*((unsigned int*) &BASS_PluginLoad) = (unsigned int) GetProcAddress(mModule, "BASS_PluginLoad");
*((unsigned int*) &BASS_ChannelGetLength) = (unsigned int) GetProcAddress(mModule, "BASS_ChannelGetLength");
// 2.1 and higher only
*((unsigned int*) &BASS_ChannelPreBuf) = (unsigned int) GetProcAddress(mModule, "BASS_ChannelPreBuf");
}
else
{
BASS_PluginLoad = NULL;
BASS_ChannelPreBuf = NULL;
}
#undef GETPROC
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
BASS_INSTANCE::~BASS_INSTANCE()
{
if (mModule)
FreeLibrary(mModule);
}
BOOL BASS_INSTANCE::BASS_MusicSetAmplify(HMUSIC handle, DWORD amp)
{
BASS_MusicSetAttribute(handle, BASS_MUSIC_ATTRIB_AMPLIFY, amp);
return true;
}
BOOL BASS_INSTANCE::BASS_MusicPlay(HMUSIC handle)
{
return BASS_ChannelPlay(handle, true);
}
BOOL BASS_INSTANCE::BASS_MusicPlayEx(HMUSIC handle, DWORD pos, int flags, BOOL reset)
{
int anOffset = MAKEMUSICPOS(pos,0);
BASS_ChannelStop(handle);
BASS_ChannelSetPosition(handle, anOffset);
BASS_ChannelSetFlags(handle, flags);
return BASS_ChannelPlay(handle, false/*reset*/);
}
BOOL BASS_INSTANCE::BASS_ChannelResume(DWORD handle)
{
return BASS_ChannelPlay(handle, false);
}
BOOL BASS_INSTANCE::BASS_StreamPlay(HSTREAM handle, BOOL flush, DWORD flags)
{
BASS_ChannelSetFlags(handle, flags);
return BASS_ChannelPlay(handle, flush);
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Sexy::LoadBassDLL()
{
InterlockedIncrement(&gBassLoadCount);
if (gBass!=NULL)
return;
gBass = new BASS_INSTANCE(".\\bass.dll");
if (gBass->mModule==NULL)
{
MessageBoxA(NULL,"Can't find bass.dll." ,"Error",MB_OK | MB_ICONERROR);
exit(0);
}
}
///////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////
void Sexy::FreeBassDLL()
{
if (gBass!=NULL)
{
if (InterlockedDecrement(&gBassLoadCount) <= 0)
{
delete gBass;
gBass = NULL;
}
}
}