It sounds like you want the mixer to process sources gaplessly one after another? If so, you should use a BASS_SYNC_END sync on the mixer (not the source), to have the sync triggered when the mixer reaches the end. You don't want the sync triggered when the source reaches the end because that will be slightly before the mixer does, ie. the mixer hasn't processed the source's final data yet, so there would be some overlap if you add the next source to the mix then.
It could look something like this:
BASS_ChannelSetSync(mixer, BASS_SYNC_END|BASS_SYNC_MIXTIME, 0, EndSyncProc, 0); // set a mixtime END sync on the mixer
...
void CALLBACK EndSyncProc(HSYNC handle, DWORD channel, DWORD data, void *user)
{
if (nextsource) { // got another source to play
BASS_Mixer_StreamAddChannel(mixer, nextsource, 0); // add it to the mixer
BASS_ChannelSetPosition(mixer, 0, BASS_POS_BYTE); // reset the mixer to continue (it's currently ended)
}
}
Note that in order for the BASS_SYNC_END sync to be triggered when the mixer reaches the end of its sources, the BASS_MIXER_END flag needs to be used in the BASS_Mixer_StreamCreate call.