Skip to content

Instantly share code, notes, and snippets.

Created May 27, 2020 11:18
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
Star You must be signed in to star a gist
What would you like to do?
Realtime Command usage for SoundFingerprinting
public class RealtimeCommandSample
public async Task Run(IModelService modelService, CancellationToken cancellationToken)
var collection = new BlockingCollection<AudioSamples>();
var producerTask = Task.Run(() => GetRealtimeData(collection, cancellationToken), cancellationToken);
var consumerTask = QueryRealtimeData(modelService, collection, 5d, cancellationToken);
var finished = await Task.WhenAny(producerTask, consumerTask);
await finished.ConfigureAwait(false);
public void GetRealtimeData(BlockingCollection<AudioSamples> producer, CancellationToken cancellationToken)
while (!cancellationToken.IsCancellationRequested)
// get realtime data in chunks
// each chunk has to contain 10240 samples, at 5512Hz, meaning each sample has to be 1.857 seconds length
// source of the realtime data is application dependent
float[] audioSamples = new float[10240];
var chunk = new AudioSamples(audioSamples, "", 5512);
producer.Add(chunk, cancellationToken);
public Task QueryRealtimeData(
IModelService modelService,
BlockingCollection<AudioSamples> source,
double lengthOfASuccessfulMatch,
CancellationToken cancellationToken)
var realtimeQuery = QueryCommandBuilder.Instance.BuildRealtimeQueryCommand()
.WithRealtimeQueryConfig(config =>
config.ResultEntryFilter = new QueryMatchLengthFilter(lengthOfASuccessfulMatch);
config.SuccessCallback = entry =>
Console.WriteLine($"Got successful match for {entry.Track.Id}");
return config;
return realtimeQuery;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment