Example #1
0
        public AudioCapture()
        {
            SampleFormat = ALFormat.Mono16;
            BufferLength = 10;
            SampleRate   = 44100;

            source = Observable.Create <Mat>((observer, cancellationToken) =>
            {
                return(Task.Factory.StartNew(() =>
                {
                    var sampleRate = SampleRate;
                    var bufferLength = BufferLength;
                    var sampleFormat = SampleFormat;
                    var channelCount = SampleFormat == ALFormat.Stereo16 ? 2 : 1;
                    var bufferSize = (int)Math.Ceiling(sampleRate * bufferLength / 1000);
                    var readBuffer = sampleFormat == ALFormat.Stereo16 ? new Mat(bufferSize, channelCount, Depth.S16, 1) : null;
                    var captureInterval = TimeSpan.FromMilliseconds((int)(bufferLength / 2 + 0.5));
                    var captureBufferSize = bufferSize * 4;

                    lock (captureLock)
                    {
                        using (var capture = new OpenTK.Audio.AudioCapture(DeviceName, sampleRate, sampleFormat, captureBufferSize))
                            using (var captureSignal = new ManualResetEvent(false))
                            {
                                capture.Start();
                                while (!cancellationToken.IsCancellationRequested)
                                {
                                    while (capture.AvailableSamples >= bufferSize)
                                    {
                                        var buffer = new Mat(channelCount, bufferSize, Depth.S16, 1);
                                        if (readBuffer != null)
                                        {
                                            capture.ReadSamples(readBuffer.Data, bufferSize);
                                            CV.Transpose(readBuffer, buffer);
                                        }
                                        else
                                        {
                                            capture.ReadSamples(buffer.Data, bufferSize);
                                        }
                                        observer.OnNext(buffer);
                                    }

                                    captureSignal.WaitOne(captureInterval);
                                }
                                capture.Stop();
                            }
                    }
                },
                                             cancellationToken,
                                             TaskCreationOptions.LongRunning,
                                             TaskScheduler.Default));
            })
                     .PublishReconnectable()
                     .RefCount();
        }
Example #2
0
        public void ReadSamples(int offset, int count, float[] buffer)
        {
            AssertNotDisposed();

            if (count < 0)
            {
                throw new ArgumentOutOfRangeException("count", "count must be >= 0.");
            }
            if (offset < 0)
            {
                throw new ArgumentOutOfRangeException("offset");
            }
            if (offset + count > buffer.Length)
            {
                throw new ArgumentOutOfRangeException("count", "offset + count must be <= buffer.Length.");
            }

            count = Math.Min(count, (int)(TotalSamples - Position));

            switch (NativeFormat)
            {
            case AudioFormat.Byte8:
            {
                var arr = new byte[count];
                handle.ReadSamples(arr, count);
                Parallel.For(0, arr.Length, (i) => buffer[offset + i] = (float)(arr[i] / (float)byte.MaxValue * 2) - 1);
                break;
            }

            case AudioFormat.Short16:
            {
                var arr = new short[count];
                handle.ReadSamples(arr, count);
                Parallel.For(0, arr.Length, (i) => buffer[offset + i] = arr[i] / (float)short.MaxValue - 1);
                break;
            }
            }
        }