Beispiel #1
0
 public override Audio.Stream Open(Audio.Stream.SampleHandler Callback, Audio.Channel[] Input, Audio.Channel[] Output)
 {
     return(new Stream(
                classid,
                Callback,
                Input.Cast <Channel>().ToArray(),
                Output.Cast <Channel>().ToArray()));
 }
Beispiel #2
0
        public Stream(Guid DeviceId, Audio.Stream.SampleHandler Callback, Channel[] Input, Channel[] Output)
            : base(Input, Output)
        {
            Log.Global.WriteLine(MessageType.Info, "Instantiating ASIO stream with {0} input channels and {1} output channels.", Input.Length, Output.Length);
            asio = new AsioObject(DeviceId);
            asio.Init(IntPtr.Zero);
            callback = Callback;

            // Just use the driver's preferred buffer size.
            bufferSize = asio.BufferSize.Preferred;

            ASIOBufferInfo[] infos = new ASIOBufferInfo[Input.Length + Output.Length];
            for (int i = 0; i < Input.Length; ++i)
            {
                infos[i].isInput    = ASIOBool.True;
                infos[i].channelNum = Input[i].Index;
            }
            for (int i = 0; i < Output.Length; ++i)
            {
                infos[Input.Length + i].isInput    = ASIOBool.False;
                infos[Input.Length + i].channelNum = Output[i].Index;
            }

            ASIOCallbacks callbacks = new ASIOCallbacks()
            {
                bufferSwitch         = OnBufferSwitch,
                sampleRateDidChange  = OnSampleRateChange,
                asioMessage          = OnAsioMessage,
                bufferSwitchTimeInfo = OnBufferSwitchTimeInfo
            };

            asio.CreateBuffers(infos, bufferSize, callbacks);

            // Create input buffers.
            input        = new BufferInfo[Input.Length];
            inputBuffers = new Audio.SampleBuffer[Input.Length];
            for (int i = 0; i < Input.Length; ++i)
            {
                input[i]        = new BufferInfo(infos[i], Input[i].Type);
                inputBuffers[i] = new Audio.SampleBuffer(bufferSize);
            }

            // Create output buffers.
            output        = new BufferInfo[Output.Length];
            outputBuffers = new Audio.SampleBuffer[Output.Length];
            for (int i = 0; i < Output.Length; ++i)
            {
                output[i]        = new BufferInfo(infos[Input.Length + i], Output[i].Type);
                outputBuffers[i] = new Audio.SampleBuffer(bufferSize);
            }

            sampleRate = asio.SampleRate;

            asio.Start();
        }
Beispiel #3
0
        public Stream(Guid DeviceId, Audio.Stream.SampleHandler Callback, Channel[] Input, Channel[] Output)
            : base(Input, Output)
        {
            Log.Global.WriteLine(MessageType.Info, "Instantiating ASIO stream with {0} input channels and {1} output channels.", Input.Length, Output.Length);
            asio = new AsioObject(DeviceId);
            asio.Init(IntPtr.Zero);
            callback = Callback;

            buffer = asio.BufferSize.Preferred;
            ASIOBufferInfo[] infos = new ASIOBufferInfo[Input.Length + Output.Length];
            for (int i = 0; i < Input.Length; ++i)
            {
                infos[i].isInput = ASIOBool.True;
                infos[i].channelNum = Input[i].Index;
            }
            for (int i = 0; i < Output.Length; ++i)
            {
                infos[Input.Length + i].isInput = ASIOBool.False;
                infos[Input.Length + i].channelNum = Output[i].Index;
            }

            ASIOCallbacks callbacks = new ASIOCallbacks()
            {
                bufferSwitch = OnBufferSwitch,
                sampleRateDidChange = OnSampleRateChange,
                asioMessage = OnAsioMessage,
                bufferSwitchTimeInfo = OnBufferSwitchTimeInfo
            };
            asio.CreateBuffers(infos, buffer, callbacks);

            input = new Buffer[Input.Length];
            for (int i = 0; i < Input.Length; ++i)
                input[i] = new Buffer(infos[i], Input[i].Type, buffer);
            output = new Buffer[Output.Length];
            for (int i = 0; i < Output.Length; ++i)
                output[i] = new Buffer(infos[Input.Length + i], Output[i].Type, buffer);

            sampleRate = asio.SampleRate;
            asio.Start();
        }