There isn't currently any way to check whether a sync handle is valid, except using it in a BASS_ChannelRemoveSync call, but of course it won't be valid any more after that. Are you using ONETIME syncs? If not, the syncs shouldn't ever be freed automatically, so should stay valid until you free them (or the stream). If you are using a ONETIME sync then perhaps you could reset your sync handle variable to 0 in the SYNCPROC callback?