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}