C# Example

IrisSdkSample.cs

 1using System;
 2using System.IO;
 3
 4void ProgressCallback(Iris.ProgressEvent ev)
 5{
 6    switch (ev.Type)
 7    {
 8        case Iris.ProgressEventType.Start:
 9            Console.WriteLine("Processing: started");
10            break;
11        case Iris.ProgressEventType.Process:
12            Console.Write($"\rProcessing: {ev.Percentage:F2}%");
13            break;
14        case Iris.ProgressEventType.End:
15            Console.WriteLine("\nProcessing: ended");
16            break;
17    }
18}
19
20// Initialise iris sdk. Either pass in the licence and key as strings or let the sdk discover
21// them from its default data location. See readme.md for default locations.
22// string licence = File.ReadAllText("/full/path/to/iris.lic");
23// string key     = File.ReadAllText("/full/path/to/iris.key");
24// Iris.LicenceInfo licenceInfo = Iris.Sdk.Init(licence, key);
25Iris.LicenceInfo licenceInfo = Iris.Sdk.Init();
26Console.WriteLine($"Initialised iris-sdk {licenceInfo.Version} for {licenceInfo.Name}");
27SampleUtils.CheckLicenceInfo(licenceInfo);
28
29// Load some source audio and create somewhere to store the result.
30// In a real world application this will be an incoming audio stream.
31// Adjust sampleRate and channels to match your audio.
32int sampleRate = 48000;
33int channels   = 1;
34string inputFile  = Path.Combine("..", "sample_audio", "breaking_point_f32_48k.raw");
35string outputFile = Path.Combine("..", "sample_audio", "breaking_point_f32_48k_processed.raw");
36
37float[] audioIn  = SampleUtils.RawFloatsFromFile(inputFile);
38float[] audioOut = new float[audioIn.Length];
39
40// Create an audio processing context request.
41var request = new Iris.AudioContextRequest
42{
43    Processors    = new() { "passthrough" }, // set the processor chain to use
44    SampleRate    = sampleRate,              // set the sample rate of the input audio
45    ChannelCount  = channels,               // set the channel count of the input audio
46    ResamplerMode = Iris.ResamplerMode.HighQuality,
47};
48SampleUtils.CheckContextRequest(request);
49
50// Create an audio processing context using the context request.
51Iris.AudioContextConfig cfg = Iris.Sdk.CreateAudioContext(request);
52SampleUtils.CheckContextConfig(cfg);
53
54// Process the entire buffer in one go, accounting for any transport delay.
55// If processing a stream, call Iris.Sdk.Process() when each new buffer of stream data arrives instead.
56// In the streaming case, frames should be set to the size of the stream buffer.
57// If each buffer is the same size, set FixedFrameCount = true in the context request.
58// Streaming pseudocode:
59//   while (newStreamDataAvailable) {
60//     float[] processIn  = GetStreamSource();
61//     float[] processOut = new float[processIn.Length];
62//     Iris.Sdk.Process(cfg.ContextId, processIn, processOut, (uint)(processIn.Length / channels));
63//     PutStreamSink(processOut);
64//   }
65Console.WriteLine($"Processing {inputFile}");
66Iris.Sdk.ProcessOffline(cfg.ContextId, audioIn, audioOut, (uint)(audioIn.Length / channels), ProgressCallback);
67
68// Save the processed output alongside the input file.
69Console.WriteLine($"Saving {outputFile}");
70SampleUtils.RawFloatsToFile(outputFile, audioOut);
71
72// Release the context.
73Console.WriteLine("Cleaning up...");
74Iris.Sdk.ReleaseAudioContext(cfg.ContextId);
75Iris.Sdk.Cleanup();
76Console.WriteLine("Done.");

SampleUtils.cs

 1using System;
 2using System.IO;
 3using System.Runtime.InteropServices;
 4
 5internal static class SampleUtils
 6{
 7    internal static float[] RawFloatsFromFile(string path)
 8    {
 9        byte[] bytes = File.ReadAllBytes(path);
10        float[] data = new float[bytes.Length / sizeof(float)];
11        Buffer.BlockCopy(bytes, 0, data, 0, bytes.Length);
12        return data;
13    }
14
15    internal static void RawFloatsToFile(string path, float[] data)
16    {
17        byte[] bytes = new byte[data.Length * sizeof(float)];
18        Buffer.BlockCopy(data, 0, bytes, 0, bytes.Length);
19        File.WriteAllBytes(path, bytes);
20    }
21
22    internal static void CheckLicenceInfo(Iris.LicenceInfo info)
23    {
24        Console.WriteLine("Licence Info:");
25        Console.WriteLine($"  Name:           {info.Name}");
26        Console.WriteLine($"  SDK Version:    {info.Version}");
27        Console.WriteLine($"  Expiry:         {info.Expiry}");
28        Console.WriteLine($"  Licence Status: {info.Status}");
29        Console.WriteLine();
30        Console.WriteLine("Available processors:");
31        foreach (string p in info.AvailableProcessors)
32            Console.WriteLine($"  - {p}");
33        Console.WriteLine();
34
35        if (info.Status != Iris.LicenceStatus.Valid)
36        {
37            Console.WriteLine("Invalid licence - exiting");
38            Environment.Exit(0);
39        }
40    }
41
42    internal static void CheckContextRequest(Iris.AudioContextRequest req)
43    {
44        Console.WriteLine("Audio Context Request:");
45        Console.WriteLine($"  Sample Rate:    {req.SampleRate}");
46        Console.WriteLine($"  Buffer Length:  {req.BufferLength}");
47        Console.Write    (  "  Processors:     ");
48        Console.WriteLine(string.Join(", ", req.Processors ?? new()));
49        Console.WriteLine($"  Resampler Mode: {req.ResamplerMode}");
50        Console.WriteLine($"  Optimization:   {req.Optimization}");
51        Console.WriteLine($"  Fixed Frames:   {req.FixedFrameCount}");
52        Console.WriteLine();
53    }
54
55    internal static void CheckContextConfig(Iris.AudioContextConfig cfg)
56    {
57        Console.WriteLine("Audio Context Configuration:");
58        Console.WriteLine($"  Context Id:     {cfg.ContextId}");
59        Console.WriteLine($"  Description:    {cfg.Description}");
60        Console.WriteLine($"  Sample Rate:    {cfg.SampleRate}");
61        Console.WriteLine($"  Buffer Length:  {cfg.BufferLength}");
62        Console.WriteLine($"  Channels:       {cfg.ChannelCount}");
63        if (cfg.WillResample)
64        {
65            Console.WriteLine($"  Resampling:     {cfg.WillResample}");
66            Console.WriteLine($"  Resampler Mode: {cfg.ResamplerMode}");
67        }
68        Console.WriteLine($"  Optimization:   {cfg.Optimization}");
69        if (cfg.Error == 0)
70        {
71            Console.WriteLine("  Context Parameters:");
72            foreach (var proc in cfg.Parameters)
73            {
74                Console.WriteLine($"    {proc.Name}");
75                foreach (var param in proc.Parameters)
76                    Console.WriteLine($"      -> {param.Name}");
77            }
78        }
79        else
80        {
81            Console.WriteLine($"  Error: {cfg.Error}");
82            Console.WriteLine($"Context creation failed (error {cfg.Error}).");
83            Environment.Exit((int)cfg.Error);
84        }
85        Console.WriteLine();
86    }
87}