OK. In that case, you could use the recording functions to capture the mix (eg. with the "Stereo Mix" input), but that will capture the output from other processes too. Perhaps you could modify your app to use a mixer instead? That would also have the advantage of more precise timing, eg. you can set the drum positions to the exact byte.
To trigger a drum, you would set a mixtime POS sync on the mixer at the wanted position, and then add the drum to the mixer in the SYNCPROC. It could look something like this...
typedef structure {
float time; // start time in seconds
HSTREAM handle; // stream to play (must be a decoding channel - see BASS_STREAM_DECODE)
} event;
event events[num_events]; // array of events
...
mixer=BASS_Mixer_StreamCreate(...); // create the mixer
// set a sync to trigger each event
for (n=0; n<num_events; n++) {
QWORD syncpos=BASS_ChannelSeconds2Bytes(mixer, events[n].time); // convert seconds to bytes
BASS_ChannelSetSync(mixer, BASS_SYNC_POS|BASS_SYNC_MIXTIME, syncpos, TriggerSyncProc, (void*)n); // set a mixtime POS sync there
}
...
void CALLBACK TriggerSyncProc(HSYNC handle, DWORD channel, DWORD data, void *user)
{
int n=(int)user; // event number
BASS_ChannelSetPosition(events[n].handle, 0, BASS_POS_BYTE); // rewind the stream (eg. in case it has already been played)
BASS_Mixer_StreamAddChannel(mixer, events[n].handle, 0); // add it to the mixer
}