That would there is no proper initialisation done - the BASS_Initialisation code should be (for Windows) :
extern char BASSInitialise(int device,int freq,int flags,DWORD windowHandle)
{
memset(&channelInfo,(char) 0,sizeof(channelInfo));
specpos=0;
memset(&diff,(char) 0,sizeof(diff));
#ifdef WIN32
bass=LoadLibrary("BASS.DLL"); // load BASS
if (bass)
{
BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
if (BASS_Init)
{
BASS_Free=GetProcAddress(bass,"BASS_Free");
//BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");
BASS_Start=GetProcAddress(bass,"BASS_Start");
BASS_ErrorGetCode=GetProcAddress(bass,"BASS_ErrorGetCode");
BASS_SampleLoad=GetProcAddress(bass,"BASS_SampleLoad");
BASS_SampleGetChannel=GetProcAddress(bass,"BASS_SampleGetChannel");
BASS_SampleStop=GetProcAddress(bass,"BASS_SampleStop");
BASS_StreamCreateFile=GetProcAddress(bass,"BASS_StreamCreateFile");
BASS_ChannelPlay=GetProcAddress(bass,"BASS_ChannelPlay");
BASS_ChannelPause=GetProcAddress(bass,"BASS_ChannelPause");
BASS_ChannelGetPosition=GetProcAddress(bass,"BASS_ChannelGetPosition");
BASS_ChannelPreBuf=GetProcAddress(bass,"BASS_ChannelPreBuf");
BASS_StreamFree=GetProcAddress(bass,"BASS_StreamFree");
BASS_ChannelGetLength=GetProcAddress(bass,"BASS_ChannelGetLength");
BASS_ChannelGetInfo=GetProcAddress(bass,"BASS_ChannelGetInfo");
BASS_ChannelGetData=GetProcAddress(bass,"BASS_ChannelGetData");
BASS_ChannelIsActive=GetProcAddress(bass,"BASS_ChannelIsActive");
BASS_ChannelStop=GetProcAddress(bass,"BASS_ChannelStop");
BASS_ChannelSetPosition=GetProcAddress(bass,"BASS_ChannelSetPosition");
BASS_ChannelSetAttributes=GetProcAddress(bass,"BASS_ChannelSetAttributes");
BASS_ChannelBytes2Seconds=GetProcAddress(bass,"BASS_ChannelBytes2Seconds");
BASS_ChannelGetTags=GetProcAddress(bass,"BASS_ChannelGetTags");
return BASS_Init(device,freq,flags,(HWND) windowHandle,NULL);
}
else
{
BASS_Free=NULL;
BASS_ErrorGetCode=NULL;
}
}
return -1;
#else
return BASS_Init(device,freq,flags,0,NULL);
#endif
}This is so the DLL is loaded when the initilisation routine is called, and without it your trying to call functions that dont exist.
This is the Windows (and updated Mac) version :
/*
* BASS.c
* BASS
*
* Created by Nicholas Kingsley on 20/07/2007.
* Copyright 2007 __MyCompanyName__. All rights reserved.
*
*/
//#define WIN32
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "math.h"
#ifdef WIN32
// Windows
#define BASSDEF(f) (WINAPI *f) // define the functions as pointers
#include "c:\program files\BASS\c\bass.h"
HINSTANCE bass=NULL;
#else
// OSX Version
#include "/Developer/bass23-osx/bass.h"
#endif
BASS_CHANNELINFO channelInfo;
int specpos;
int diff[4];
//----------System
extern DWORD BASSGetVersion(void)
{
return BASSVERSION;
}
extern char BASSInitialise(int device,int freq,int flags,DWORD windowHandle)
{
memset(&channelInfo,(char) 0,sizeof(channelInfo));
specpos=0;
memset(&diff,(char) 0,sizeof(diff));
#ifdef WIN32
bass=LoadLibrary("BASS.DLL"); // load BASS
if (bass)
{
BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
if (BASS_Init)
{
BASS_Free=GetProcAddress(bass,"BASS_Free");
//BASS_GetVersion=GetProcAddress(bass,"BASS_GetVersion");
BASS_Start=GetProcAddress(bass,"BASS_Start");
BASS_ErrorGetCode=GetProcAddress(bass,"BASS_ErrorGetCode");
BASS_SampleLoad=GetProcAddress(bass,"BASS_SampleLoad");
BASS_SampleGetChannel=GetProcAddress(bass,"BASS_SampleGetChannel");
BASS_SampleStop=GetProcAddress(bass,"BASS_SampleStop");
BASS_StreamCreateFile=GetProcAddress(bass,"BASS_StreamCreateFile");
BASS_ChannelPlay=GetProcAddress(bass,"BASS_ChannelPlay");
BASS_ChannelPause=GetProcAddress(bass,"BASS_ChannelPause");
BASS_ChannelGetPosition=GetProcAddress(bass,"BASS_ChannelGetPosition");
BASS_ChannelPreBuf=GetProcAddress(bass,"BASS_ChannelPreBuf");
BASS_StreamFree=GetProcAddress(bass,"BASS_StreamFree");
BASS_ChannelGetLength=GetProcAddress(bass,"BASS_ChannelGetLength");
BASS_ChannelGetInfo=GetProcAddress(bass,"BASS_ChannelGetInfo");
BASS_ChannelGetData=GetProcAddress(bass,"BASS_ChannelGetData");
BASS_ChannelIsActive=GetProcAddress(bass,"BASS_ChannelIsActive");
BASS_ChannelStop=GetProcAddress(bass,"BASS_ChannelStop");
BASS_ChannelSetPosition=GetProcAddress(bass,"BASS_ChannelSetPosition");
BASS_ChannelSetAttributes=GetProcAddress(bass,"BASS_ChannelSetAttributes");
BASS_ChannelBytes2Seconds=GetProcAddress(bass,"BASS_ChannelBytes2Seconds");
BASS_ChannelGetTags=GetProcAddress(bass,"BASS_ChannelGetTags");
return BASS_Init(device,freq,flags,(HWND) windowHandle,NULL);
}
else
{
BASS_Free=NULL;
BASS_ErrorGetCode=NULL;
}
}
return -1;
#else
return BASS_Init(device,freq,flags,0,NULL);
#endif
}
extern char BASSStart()
{
return BASS_Start();
}
extern int BASSErrorGetCode(void)
{
if (BASS_ErrorGetCode)
{
return BASS_ErrorGetCode();
}
else
{
return -1;
}
}
extern char BASSFree(void)
{
BOOL result;
if (BASS_Free)
{
result=BASS_Free();
}
else
{
result=-1;
}
#ifdef WIN32
FreeLibrary(bass);
bass=NULL;
#endif
return (char) result;
}
extern char *BASSGetDeviceDescription(DWORD device)
{
return (char *) BASS_GetDeviceDescription(device);
}
//------------Samples
extern DWORD BASSSampleLoad(char *fileName,DWORD offset,DWORD length,DWORD max,DWORD flags)
{
return (DWORD) BASS_SampleLoad(0,fileName,offset,length,max,flags);
}
//------------Streams
extern DWORD BASSStreamCreateFile(char *fileName,DWORD offset,DWORD length,DWORD flags)
{
return ((DWORD) BASS_StreamCreateFile(0,fileName,offset,length,flags));
}
extern char BASSStreamFree(DWORD handle)
{
return BASS_StreamFree((HSTREAM) handle);
}
extern DWORD BASSSampleGetChannel(DWORD handle,char onlyNew)
{
return (DWORD) BASS_SampleGetChannel((HSAMPLE) handle,(BOOL) onlyNew);
}
extern char BASSSampleStop(DWORD handle)
{
return BASS_SampleStop(handle);
}
//------------Channels
extern char BASSChannelPlay(DWORD handle,char restart)
{
return BASS_ChannelPlay(handle,restart);
}
extern char BASSChannelPause(DWORD handle)
{
return BASS_ChannelPause(handle);
}
extern QWORD BASSChannelGetPosition(DWORD handle)
{
return BASS_ChannelGetPosition(handle);
}
extern char BASSChannelSetPosition(DWORD handle,QWORD position)
{
return BASS_ChannelSetPosition(handle,position);
}
extern QWORD BASSChannelGetLength(DWORD handle)
{
return BASS_ChannelGetLength(handle);
}
extern char BASSGetChannelInfo(DWORD handle)
{
return BASS_ChannelGetInfo(handle,&channelInfo);
}
extern char BASSChannelGetData(DWORD handle,char *buffer,DWORD length)
{
return BASS_ChannelGetData(handle,buffer,length);
}
extern DWORD BASSChannelIsActive(DWORD handle)
{
return BASS_ChannelIsActive(handle);
}
extern char BASSChannelStop(DWORD handle)
{
return BASS_ChannelStop(handle);
}
extern char BASSChannelSetAttributes(DWORD handle,int freq,int volume,int pan)
{
return BASS_ChannelSetAttributes(handle,freq,volume,pan);
}
extern DWORD BASSChannelBytes2Seconds(DWORD handle,QWORD pos)
{
float length;
// Cant return a float for some reason to BlitzMax
length=BASS_ChannelBytes2Seconds(handle,pos);
return (DWORD) length;
}
extern char *BASSChannelGetTags(DWORD handle,DWORD tags)
{
return BASS_ChannelGetTags(handle,tags);
}
extern char BASSChannelPreBuf(DWORD handle,DWORD length)
{
return BASS_ChannelPreBuf(handle,length);
}
//-----------Get information from structures
extern DWORD BASS_ReturnNumberOfChannels(void)
{
return channelInfo.chans;
}
extern DWORD BASS_ReturnPlaybackFreq(void)
{
return channelInfo.freq;
}
extern DWORD BASS_ReturnFlags(void)
{
return channelInfo.flags;
}
extern DWORD BASS_ReturnCType(void)
{
return channelInfo.ctype;
}
extern DWORD BASS_ReturnOriginalResolution(void)
{
return channelInfo.origres;
}
extern void BASS_ClearDiff(void)
{
memset(&diff,(char) 0,sizeof(diff));
}
extern DWORD BASS_Spectrograph5(DWORD handle,DWORD diffValue,char *storeSpec,DWORD SPECHEIGHT,DWORD BANDS)
{
register int b0,x,sc,b1,y;
float fft[1024];
float sum;
DWORD result;
result=0;
if (BASS_ChannelGetData(handle,fft,BASS_DATA_FFT2048))
{
b0=0;
for (x=0;x<BANDS;x++)
{
sum=0.0;
b1=pow(2,x*10.0/(BANDS-1));
if (b1>1023)
{
b1=1023;
}
if (b1<=b0)
{
b1=b0+1; // make sure it uses at least 1 FFT bin
}
sc=10+b1-b0;
for (;b0<b1;b0++)
{
sum+=fft[1+b0];
}
y=(int) ((sqrt(sum/log10(sc))*1.7*SPECHEIGHT)-4.0); // scale it
y=(y>SPECHEIGHT ? SPECHEIGHT : \
y<0 ? 0 : y);
*(storeSpec+x)=(char) y;
if (labs(diff[x]-y)>diffValue)
{
diff[x]=y;
result=(x==0 ? result | 1 : \
x==1 ? result | 2 : \
x==2 ? result | 4 : result | 8);
}
}
}
return result;
}
extern void BASS_Spectrograph4(DWORD handle,DWORD SPECWIDTH,DWORD SPECHEIGHT,char *specBuff)
{
float fft[1024];
register int x,y;
if (specBuff==NULL) return;
BASS_ChannelGetData(handle,fft,BASS_DATA_FFT2048); // get the FFT data
for (x=0;x<SPECHEIGHT;x++)
{
y=sqrt(fft[x+1])*3*127; // scale it (sqrt to make low values more visible)
if (y>127)
{
y=127; // cap it
}
specBuff[x*SPECWIDTH+specpos]=128+y; // plot it
}
// move marker onto next position
specpos=(specpos+1)%SPECWIDTH;
for (x=0;x<SPECHEIGHT;x++)
{
specBuff[x*SPECWIDTH+specpos]=255;
}
}
extern void BASS_Spectrograph3(DWORD handle,DWORD SPECWIDTH,DWORD SPECHEIGHT,char *specBuff,DWORD BANDS)
{
register int b0,x,sc,b1,y;
float fft[1024];
float sum;
if (specBuff==NULL) return;
BASS_ChannelGetData(handle,fft,BASS_DATA_FFT2048); // get the FFT data
b0=0;
memset(specBuff,0,SPECWIDTH*SPECHEIGHT);
for (x=0;x<BANDS;x++)
{
sum=0.0;
b1=pow(2,x*10.0/(BANDS-1));
if (b1>1023)
{
b1=1023;
}
if (b1<=b0)
{
b1=b0+1; // make sure it uses at least 1 FFT bin
}
sc=10+b1-b0;
for (;b0<b1;b0++)
{
sum+=fft[1+b0];
}
y=(sqrt(sum/log10(sc))*1.7*SPECHEIGHT)-4; // scale it
if (y>SPECHEIGHT)
{
y=SPECHEIGHT; // cap it
}
while (--y>=0)
{
memset(specBuff+y*SPECWIDTH+x*(SPECWIDTH/BANDS),y+1,SPECWIDTH/BANDS-2); // draw bar
}
}
}
extern void BASS_Spectrograph2(DWORD handle,DWORD SPECWIDTH,DWORD SPECHEIGHT,char *specBuff)
{
float fft[1024];
register int x,y,y1;
if (specBuff==NULL) return;
BASS_ChannelGetData(handle,fft,BASS_DATA_FFT2048); // get the FFT data
memset(specBuff,0,SPECWIDTH*SPECHEIGHT);
for (x=0;x<SPECWIDTH/2;x++)
{
y=sqrt(fft[x+1])*3*SPECHEIGHT-4; // scale it (sqrt to make low values more visible)
//#else
// y=fft[x+1]*10*SPECHEIGHT; // scale it (linearly)
//#endif
if (y>SPECHEIGHT)
{
y=SPECHEIGHT; // cap it
}
if (x && (y1=(y+y1)/2))
{
// interpolate from previous to make the display smoother
while (--y1>=0)
{
specBuff[y1*SPECWIDTH+x*2-1]=y1+1;
}
}
y1=y;
while (--y>=0)
{
specBuff[y*SPECWIDTH+x*2]=y+1; // draw level
}
}
}
extern void BASS_Spectrograph1(DWORD handle,DWORD SPECWIDTH,DWORD SPECHEIGHT,char *specBuff)
{
register int c,x,v,y;
float *buf;
if (specBuff==NULL) return;
BASS_ChannelGetInfo(handle,&channelInfo);
buf=alloca(channelInfo.chans*SPECWIDTH*sizeof(float)); // allocate buffer for data
if (buf==NULL)
{
return;
}
BASS_ChannelGetData(handle,buf,(channelInfo.chans*SPECWIDTH*sizeof(float))|BASS_DATA_FLOAT);
memset(specBuff,(char) 0,SPECWIDTH*SPECHEIGHT);
y=0;
for (c=0; c<channelInfo.chans; c++)
{
for (x=0;x<SPECWIDTH;x++)
{
v=(1-buf[x*channelInfo.chans+c])*SPECHEIGHT/2; // invert and scale to fit display
if (v<0)
{
v=0;
}
else
if (v>=SPECHEIGHT)
{
v=SPECHEIGHT-1;
}
if (!x)
{
y=v;
}
do { // draw line from previous sample...
if (y<v)
{
y++;
}
else
if (y>v)
{
y--;
}
specBuff[y*SPECWIDTH+x]=c&1?127:1; // left=green, right=red (could add more colours to palette for more chans)
} while (y!=v);
}
}
}Uncommend the //WIN32 part for Windows