When you say you create 2 or 3 instances of a form, does that also mean 2 or 3 instances of BASS.DLL?
You can verify whether or not it's a problem with your STREAMPROC by replacing the custom streams with normal file streams - if they play fine, then you know it's a problem with the STREAMPROC.
Also, can you reproduce the problem running 2 copies of the SPEAKERS example?
Regarding the original buffering question, something like this should work (untested though

)...
BYTE *buf=0; // decoding buffer
DWORD buflen=0; // buffer length
DWORD writepos,readpos[NO_OF_STREAMS]; // write/read pointers
HSTREAM decoder; // decoding channel
DWORD CALLBACK streamproc(HSTREAM handle, BYTE *buffer, DWORD length, DWORD user)
{
DWORD pos=readpos[user]+length;
if (pos>writepos) { // need to decode more data
int a,o=readpos[0];
for (a=1;a<NO_OF_STREAMS;a++) if (o>readpos[a]) o=readpos[a];
if (o) { // discard used data
writepos-=o;
memmove(buf,buf+o,writepos);
for (a=0;a<NO_OF_STREAMS;a++) readpos[a]-=o;
pos-=o;
}
if (pos>buflen) { // need to enlarge buffer
buflen=pos;
buf=realloc(buf,buflen);
}
// decode upto requested position
o=BASS_ChannelGetData(decoder,buf+writepos,pos-writepos);
if (o>0) writepos+=o;
}
if (length>writepos-readpos[user]) length=writepos-readpos[user];
// copy decoded data to stream
memcpy(buffer,buf+readpos[user],length);
readpos[user]+=length;
return length;
}
When you create the custom streams, they all use the same STREAMPROC, but with a different number (0=1st,1=2nd,etc) passed in the user parameter. Before starting playback, reset
writepos and all the
readpos to 0.