Subversion Repositories AndroidProjects

Rev

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;
                }
        }
}