Page 7: Send Local Changes to the Provider |
As you might expect, modifying a value is as easy as setting the IParameterValue property. However, as we've already seen on Page 6: React to Changes, getting to specific elements is rather cumbersome:
AsyncPump.Run( async () => { using (var client = await ConnectAsync("localhost", 9000)) using (var consumer = await Consumer<MyRoot>.CreateAsync(client)) { INode root = consumer.Root; // Navigate to the parameters we're interested in. var sapphire = (INode)root.Children.First(c => c.Identifier == "Sapphire"); var sources = (INode)sapphire.Children.First(c => c.Identifier == "Sources"); var fpgm1 = (INode)sources.Children.First(c => c.Identifier == "FPGM 1"); var fader = (INode)fpgm1.Children.First(c => c.Identifier == "Fader"); var level = (IParameter)fader.Children.First(c => c.Identifier == "dB Value"); var position = (IParameter)fader.Children.First(c => c.Identifier == "Position"); // Set parameters to the desired values. level.Value = -67.0; position.Value = 128L; // We send the changes back to the provider with the call below. Here, this is necessary so that // the changes are sent before Dispose is called on the consumer. In a real-world application // however, SendAsync often does not need to be called explicitly because it is automatically // called every 100ms as long as there are pending changes. See AutoSendInterval for more // information. await consumer.SendAsync(); } });
Note |
---|
As soon as a parameter is modified locally, provider changes are no longer applied to the parameter until the ConsumerTRootAutoSendInterval has elapsed or ConsumerTRootSendAsync is called. |
Proceed to Page 8: Handle Communication Errors.