Actually, that code could perhaps be expanded to use a BASS_SYNC_POS sync to delay the metadata processing, something like this..
QWORD buffered=BASS_StreamGetFilePosition(stream, BASS_FILEPOS_DOWNLOAD)
-BASS_StreamGetFilePosition(stream, BASS_FILEPOS_CURRENT); // buffered encoded data
QWORD delay=BASS_ChannelSeconds2Bytes(stream, (double)buffered/bitrate); // translate it to decoded data (bitrate=bytes/sec)
QWORD pos=BASS_ChannelGetPosition(stream, BASS_POS_BYTE|BASS_POS_DECODE); // get current decoding position
BASS_ChannelSetSync(stream, BASS_SYNC_POS|BASS_SYNC_ONETIME, pos+delay, MetaDelaySyncProc, 0); // set a sync after the delay
...
void CALLBACK MetaDelaySyncProc(HSYNC handle, DWORD channel, DWORD data, void *user)
{
const char *meta=BASS_ChannelGetTags(channel, BASS_TAG_META); // get the metadata
// process it...
}