private AudioClipPlayerSystemState CreateState(DSPCommandBlock block)
        {
            DSPNode node;

            if (this._available.Count > 0)
            {
                node = this._available.Dequeue();
            }
            else
            {
                Debug.Log($"Creating additional OneShot PlayAudioSampleNode #{this._all.Length}");
                node = block.CreateDSPNode <Parameters, Providers, PlayAudioSampleReaderNode>();
                block.AddOutletPort(node, 2);
                this._all.Add(node);
            }

            var connection = block.Connect(
                node,
                0,
                this._graph.RootDSP,
                0
                );

            return(new AudioClipPlayerSystemState(node, connection));
        }
        public static NodeData CreateGeneratorNode(DSPCommandBlock block, DSPNode consumer, int channelCount, SoundFormat soundFormat)
        {
            var node = block.CreateDSPNode <NoParameters, NoProviders, GenerateOne>();

            block.AddOutletPort(node, channelCount, soundFormat);
            var connection = block.Connect(node, 0, consumer, 0);

            return(new NodeData
            {
                Node = node,
                Connection = connection
            });
        }
        public static NodeData CreatePassthroughNode(DSPCommandBlock block, DSPGraph graph, int channelCount, SoundFormat soundFormat)
        {
            var node = block.CreateDSPNode <NoParameters, NoProviders, PassThrough>();

            block.AddInletPort(node, channelCount, soundFormat);
            block.AddOutletPort(node, channelCount, soundFormat);
            var connection = block.Connect(node, 0, graph.RootDSP, 0);

            return(new NodeData
            {
                Node = node,
                Connection = connection
            });
        }
Exemple #4
0
        private AudioClipPlayerSystemState CreateNode(DSPCommandBlock block)
        {
            var node = block.CreateDSPNode <Parameters, Providers, PlayAudioSampleReaderNode>();

            block.AddOutletPort(node, 2);
            var connection = block.Connect(
                node,
                0,
                this._graph.RootDSP,
                0
                );

            return(new AudioClipPlayerSystemState(node, connection));
        }
Exemple #5
0
    // Script load constructor
    private void Awake()
    {
        AudioConfiguration audioConfig = AudioSettings.GetConfiguration();

        m_sampleRate = audioConfig.sampleRate;
        m_bufferSize = audioConfig.dspBufferSize;

        switch (audioConfig.speakerMode)
        {
        case AudioSpeakerMode.Mono:
        {
            m_channels = 1;
            break;
        }

        case AudioSpeakerMode.Stereo:
        {
            m_channels = 2;
            break;
        }

        default:
        {
            m_channels = 2;
            break;
        }
        }

        // Create output
        m_driver = new DSPGraphDriver();
        m_driver.Initialize(m_channels, SoundFormat.Stereo, m_sampleRate, m_bufferSize);
        int bufferAllocationSize = (m_channels * m_bufferSize);

        m_buffer = new NativeArray <float>(bufferAllocationSize, Allocator.Persistent, NativeArrayOptions.ClearMemory);

        // Connect internal node to the output
        DSPCommandBlock commandBlock = m_driver.m_graph.CreateCommandBlock();

        m_oscNode = commandBlock.CreateDSPNode <OscParameters, OscProviders, OscillatorNode>();
        commandBlock.AddOutletPort(m_oscNode, 1, SoundFormat.Mono);
        commandBlock.SetFloat <OscParameters, OscProviders, OscillatorNode>(m_oscNode, OscParameters.Wave, (float)OscWave.Sine);
        commandBlock.SetFloat <OscParameters, OscProviders, OscillatorNode>(m_oscNode, OscParameters.Frequency, 440.0f);

        // SVF (2nd order low pass) node
        m_filterNode = commandBlock.CreateDSPNode <SVFParameters, SVFProviders, SVFNode>();
        commandBlock.AddInletPort(m_filterNode, 1, SoundFormat.Mono);
        commandBlock.AddOutletPort(m_filterNode, 1, SoundFormat.Mono);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Cutoff, 100.0f);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Q, 0.707f);
        commandBlock.SetFloat <SVFParameters, SVFProviders, SVFNode>(m_filterNode, SVFParameters.Amplitude, 0.8f);

        // VCA (amplitude control) node
        m_vcaNode = commandBlock.CreateDSPNode <VCAParameters, VCAProviders, VCANode>();
        commandBlock.AddInletPort(m_vcaNode, 1, SoundFormat.Mono);
        commandBlock.AddOutletPort(m_vcaNode, 1, SoundFormat.Mono);
        commandBlock.SetFloat <VCAParameters, VCAProviders, VCANode>(m_vcaNode, VCAParameters.Amplitude, 0.0f);

        // Mono to stereo node setup
        m_stereoNode = commandBlock.CreateDSPNode <MonoToStereoParameters, MonoToStereoProviders, MonoToStereoNode>();
        commandBlock.AddInletPort(m_stereoNode, 1, SoundFormat.Mono);
        commandBlock.AddOutletPort(m_stereoNode, m_channels, SoundFormat.Stereo);
        commandBlock.SetFloat <MonoToStereoParameters, MonoToStereoProviders, MonoToStereoNode>(m_stereoNode, MonoToStereoParameters.Pan, 0.0f);

        // Connect the nodes together
        // VCO -> SVF -> VCA -> Pan -> Output
        commandBlock.Connect(m_oscNode, 0, m_filterNode, 0);
        commandBlock.Connect(m_filterNode, 0, m_vcaNode, 0);
        commandBlock.Connect(m_vcaNode, 0, m_stereoNode, 0);
        commandBlock.Connect(m_stereoNode, 0, m_driver.m_graph.RootDSP, 0);

        // Send the command the atomic/asynchronous handler
        commandBlock.Complete();
    }