# GeneratorInstance

> A ProcessorInstance that generates audio data.

## Definition

* **Type:** Struct
* **Namespace:** [UnityEngine.Audio](/engine/6000.6/script-reference/unityengine/audio.md)
* **Assembly:** UnityEngine.AudioModule
* **Implements:** [IEquatable\<GeneratorInstance>](https://learn.microsoft.com/dotnet/api/system.iequatable-1)

```csharp
public struct GeneratorInstance : IEquatable<GeneratorInstance>
```

## Remarks

A [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md) can be defined through implementing the [GeneratorInstance.IControl\<TRealtime>](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/icontrol1.md) and [GeneratorInstance.IRealtime](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/irealtime.md) interfaces, which defines the control and real-time thread behaviour respectively.

To use a generator in a scene, for example with an [AudioSource](/engine/6000.6/script-reference/unityengine/audiosource.md), it must have an associated [IAudioGenerator](/engine/6000.6/script-reference/unityengine/audio/iaudiogenerator.md) that will instantiate it. In the Unity Audio system they are used with an [AudioSource](/engine/6000.6/script-reference/unityengine/audiosource.md) by setting the [\_generator](/engine/6000.6/script-reference/unityengine/audiosource/generator.md) property to the associated [IAudioGenerator](/engine/6000.6/script-reference/unityengine/audio/iaudiogenerator.md).

It is also possible to create your own generators through code using a [ControlContext](/engine/6000.6/script-reference/unityengine/audio/controlcontext.md). Interacting with an instantiated generator depends on the ownership of the [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md): If the generator has been created from an [AudioSource](/engine/6000.6/script-reference/unityengine/audiosource.md), you would interact with it through the instance obtained from [\_generatorInstance](/engine/6000.6/script-reference/unityengine/audiosource/generatorinstance.md).

## Examples

```csharp
using Unity.Burst;
using Unity.IntegerTime;
using UnityEngine;
using UnityEngine.Audio;
using static UnityEngine.Audio.ProcessorInstance;

[BurstCompile(CompileSynchronously = true)]
public struct SineProcessor : GeneratorInstance.IRealtime
{
    private const float k_Tau = Mathf.PI * 2;
    private float m_Frequency;
    private float m_Phase;

    public static GeneratorInstance Allocate(ControlContext context, float frequency)
    {
        return context.AllocateGenerator(new SineProcessor(frequency), new Control());
    }

    public bool isFinite => false;
    public bool isRealtime => true;
    public DiscreteTime? length => null;

    private GeneratorInstance.Setup m_Setup;

    SineProcessor(float initialFrequency)
    {
        m_Frequency = initialFrequency;
        m_Phase = 0.0f;
        m_Setup = new GeneratorInstance.Setup();
    }

    public void Update(UpdatedDataContext context, Pipe pipe)
    {
        foreach (var data in pipe.GetAvailableData(context))
        {
            if (data.TryGetData(out FrequencyData freq))
            {
                m_Frequency = freq.Value;
            }
        }
    }

    public GeneratorInstance.Result Process(in RealtimeContext ctx, Pipe pipe, ChannelBuffer buffer, GeneratorInstance.Arguments args)
    {
        for (var frame = 0; frame < buffer.frameCount; frame++)
        {
            for (var channel = 0; channel < buffer.channelCount; channel++)
                buffer[channel, frame] = Mathf.Sin(m_Phase * k_Tau);

            m_Phase += m_Frequency / m_Setup.sampleRate;

            if (m_Phase > 1.0f) m_Phase -= 1.0f;
        }

        return buffer.frameCount;
    }

    struct Control : GeneratorInstance.IControl<SineProcessor>
    {
        public void Configure(ControlContext context, ref SineProcessor generator, in AudioFormat format, out GeneratorInstance.Setup setup, ref GeneratorInstance.Properties p)
        {
            generator.m_Setup = new GeneratorInstance.Setup(speakerMode: AudioSpeakerMode.Mono, sampleRate: format.sampleRate);
            setup = generator.m_Setup;
        }

        public void Dispose(ControlContext context, ref SineProcessor processor) { }

        public void Update(ControlContext context, Pipe pipe) { }

        public ProcessorInstance.Response OnMessage(ControlContext context, Pipe pipe, Message message)
        {
            return ProcessorInstance.Response.Unhandled;
        }
    }

    public struct FrequencyData
    {
        public readonly float Value;
        public FrequencyData(float value)
        {
            Value = value;
        }
    }
}
```

## Methods

| Method                                                                                            | Description                                    |
| ------------------------------------------------------------------------------------------------- | ---------------------------------------------- |
| [Equals](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/equals.md)           | Checks if this instance equals a given object. |
| [GetHashCode](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/gethashcode.md) | Retrieves a hash code based on this instance.  |

## Operators

| Operator                                                                                                | Description                                                                                                                                                                                                                              |
| ------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [operator ==](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/op-equality.md)       | Checks if two instances are equal.                                                                                                                                                                                                       |
| [ProcessorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/op-implicit.md) | Convert this [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md) to its more general [ProcessorInstance](/engine/6000.6/script-reference/unityengine/audio/processorinstance.md) representation. |
| [operator !=](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/op-inequality.md)     | Checks if two instances are not equal.                                                                                                                                                                                                   |

## Structs

| Struct                                                                                                                  | Description                                                                                                                                                                                                              |
| ----------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| [GeneratorInstance.Arguments](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/arguments.md)         | Additional arguments passed to the [RealtimeContext.Process](/engine/6000.6/script-reference/unityengine/audio/realtimecontext/process.md) method.                                                                       |
| [GeneratorInstance.Configuration](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/configuration.md) | The configuration of a specific instance of a [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md).                                                                               |
| [GeneratorInstance.Properties](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/properties.md)       | Represents optional or additional metadata about the [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md).                                                                        |
| [GeneratorInstance.Result](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/result.md)               | The result returned from a GeneratorInstance.IRealtime.Process call.                                                                                                                                                     |
| [GeneratorInstance.Setup](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/setup.md)                 | Information on the audio setup of the [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md) passed back to the instantiator from GeneratorInstance.IControl\<TRealtime>.Configure. |

## Interfaces

| Interface                                                                                                                  | Description                                                                                                                                                                                                      |
| -------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| [GeneratorInstance.ICapabilities](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/icapabilities.md)    | Describes the runtime behaviour of the [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md). These reported values are cached in the beginning and assumed to not change. |
| [GeneratorInstance.IControl\<TRealtime>](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/icontrol1.md) | The control interface an implementation of a [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md) must implement on a struct to be fully formed.                          |
| [GeneratorInstance.IRealtime](/engine/6000.6/script-reference/unityengine/audio/generatorinstance/irealtime.md)            | The processing interface an implementation of a [GeneratorInstance](/engine/6000.6/script-reference/unityengine/audio/generatorinstance.md) must implement on a struct to be fully formed.                       |
