Пример #1
0
 static void DoListDevices(SoundIO api)
 {
     Console.WriteLine("Inputs");
     for (int i = 0; i < api.InputDeviceCount; i++)
     {
         PrintDevice(api.GetInputDevice(i));
     }
     Console.WriteLine("Outputs");
     for (int i = 0; i < api.OutputDeviceCount; i++)
     {
         PrintDevice(api.GetInputDevice(i));
     }
 }
Пример #2
0
        public SoundioInput(SoundIOBackend?backend = null, TimeSpan?bufferDuration = null)
        {
            _bufferDuration = bufferDuration ?? TimeSpan.FromSeconds(30);

            if (backend.HasValue)
            {
                _api.ConnectBackend(backend.Value);
            }
            else
            {
                _api.Connect();
            }
            _api.FlushEvents();

            for (int i = 0; _api.InputDeviceCount > i; i++)
            {
                var device = _api.GetInputDevice(i);
                if (i == _api.DefaultInputDeviceIndex)
                {
                    DefaultDevice = device;
                }

                Devices.Add(device);
            }
        }
Пример #3
0
        static int ListDevices(SoundIO soundIo)
        {
            int outputCount = soundIo.GetOutputDeviceCount();
            int inputCount  = soundIo.GetInputDeviceCount();

            int defaultOutput = soundIo.GetDefaultOutputDeviceIndex();
            int defaultInput  = soundIo.GetDefaultInputDeviceIndex();

            Console.WriteLine("--------Input Devices--------");
            for (int i = 0; i < inputCount; i++)
            {
                SoundIODevice device = soundIo.GetInputDevice(i);
                PrintDevice(device, defaultInput == i);
                device.Release();
            }
            Console.WriteLine("\n--------Output Devices--------\n");
            for (int i = 0; i < outputCount; i++)
            {
                SoundIODevice device = soundIo.GetOutputDevice(i);
                PrintDevice(device, defaultOutput == i);
                device.Release();
            }

            Console.WriteLine("\n{0} devices found.", inputCount + outputCount);
            return(0);
        }
        public void Devices()
        {
            var api = new SoundIO();

            api.Connect();
            try {
                api.FlushEvents();
                Assert.IsTrue(api.DefaultInputDeviceIndex >= -1, "default input device index");
                Assert.IsTrue(api.DefaultOutputDeviceIndex >= -1, "default output device index");
                for (int i = 0; i < api.OutputDeviceCount; i++)
                {
                    var dev = api.GetOutputDevice(i);
                }
                for (int i = 0; i < api.InputDeviceCount; i++)
                {
                    var dev = api.GetInputDevice(i);
                }
            } finally {
                api.Disconnect();
            }
        }
        public void Properties()
        {
            var api = new SoundIO();

            api.Connect();
            try {
                api.FlushEvents();
                var dev = api.GetInputDevice(api.DefaultInputDeviceIndex);
                using (var stream = dev.CreateInStream()) {
                    foreach (var p in typeof(SoundIOInStream).GetProperties())
                    {
                        try {
                            p.GetValue(stream);
                        } catch (Exception ex) {
                            Assert.Fail("Failed to get property " + p + " : " + ex);
                        }
                    }
                }
            } finally {
                api.Disconnect();
                api.Dispose();
            }
        }
Пример #6
0
        public static int Main(string [] args)
        {
            string device_id    = null;
            string backend_name = null;
            bool   raw          = false;
            string outfile      = null;

            foreach (var arg in args)
            {
                switch (arg)
                {
                case "--raw":
                    raw = true;
                    continue;

                default:
                    if (arg.StartsWith("--backend:"))
                    {
                        backend_name = arg.Substring(arg.IndexOf(':') + 1);
                    }
                    else if (arg.StartsWith("--device:"))
                    {
                        device_id = arg.Substring(arg.IndexOf(':') + 1);
                    }
                    else
                    {
                        outfile = arg;
                    }
                    continue;
                }
            }

            var api = new SoundIO();

            var backend = backend_name == null ? SoundIOBackend.None : (SoundIOBackend)Enum.Parse(typeof(SoundIOBackend), backend_name);

            if (backend == SoundIOBackend.None)
            {
                api.Connect();
            }
            else
            {
                api.ConnectBackend(backend);
            }
            Console.WriteLine("backend: " + api.CurrentBackend);

            api.FlushEvents();

            var device = device_id == null?api.GetInputDevice(api.DefaultInputDeviceIndex) :
                             Enumerable.Range(0, api.InputDeviceCount)
                             .Select(i => api.GetInputDevice(i))
                             .FirstOrDefault(d => d.Id == device_id && d.IsRaw == raw);

            if (device == null)
            {
                Console.Error.WriteLine("device " + device_id + " not found.");
                return(1);
            }
            Console.WriteLine("device: " + device.Name);
            if (device.ProbeError != 0)
            {
                Console.Error.WriteLine("Cannot probe device " + device_id + ".");
                return(1);
            }

            var sample_rate = prioritized_sample_rates.First(sr => device.SupportsSampleRate(sr));

            var fmt = prioritized_formats.First(f => device.SupportsFormat(f));

            var instream = device.CreateInStream();

            instream.Format           = fmt;
            instream.SampleRate       = sample_rate;
            instream.ReadCallback     = (fmin, fmax) => read_callback(instream, fmin, fmax);
            instream.OverflowCallback = () => overflow_callback(instream);

            instream.Open();

            const int ring_buffer_duration_seconds = 30;
            int       capacity = (int)(ring_buffer_duration_seconds * instream.SampleRate * instream.BytesPerFrame);

            ring_buffer = api.CreateRingBuffer(capacity);
            var buf = ring_buffer.WritePointer;

            instream.Start();

            Console.WriteLine("Type CTRL+C to quit by killing process...");
            using (var fs = File.OpenWrite(outfile)) {
                var arr = new byte [capacity];
                unsafe
                {
                    fixed(void *arrptr = arr)
                    {
                        for (; ;)
                        {
                            api.FlushEvents();
                            Thread.Sleep(1000);
                            int fill_bytes = ring_buffer.FillCount;
                            var read_buf   = ring_buffer.ReadPointer;

                            Buffer.MemoryCopy((void *)read_buf, arrptr, fill_bytes, fill_bytes);
                            fs.Write(arr, 0, fill_bytes);
                            ring_buffer.AdvanceReadPointer(fill_bytes);
                        }
                    }
                }
            }
            instream.Dispose();
            device.RemoveReference();
            api.Dispose();
            return(0);
        }
Пример #7
0
        public static int Main(string [] args)
        {
            string in_device_id = null, out_device_id = null;
            string backend_name = null;
            bool   in_raw = false, out_raw = false;

            double microphone_latency = 0.2;             // seconds

            foreach (var arg in args)
            {
                switch (arg)
                {
                case "--in_raw":
                    in_raw = true;
                    continue;

                case "--out_raw":
                    out_raw = true;
                    continue;

                default:
                    if (arg.StartsWith("--backend:"))
                    {
                        backend_name = arg.Substring(arg.IndexOf(':') + 1);
                    }
                    else if (arg.StartsWith("--in-device:"))
                    {
                        in_device_id = arg.Substring(arg.IndexOf(':') + 1);
                    }
                    else if (arg.StartsWith("--out-device:"))
                    {
                        out_device_id = arg.Substring(arg.IndexOf(':') + 1);
                    }
                    else if (arg.StartsWith("--latency:"))
                    {
                        microphone_latency = double.Parse(arg.Substring(arg.IndexOf(':') + 1));
                    }
                    continue;
                }
            }

            var api = new SoundIO();

            var backend = backend_name == null ? SoundIOBackend.None : (SoundIOBackend)Enum.Parse(typeof(SoundIOBackend), backend_name);

            if (backend == SoundIOBackend.None)
            {
                api.Connect();
            }
            else
            {
                api.ConnectBackend(backend);
            }
            Console.WriteLine("backend: " + api.CurrentBackend);

            api.FlushEvents();

            var in_device = in_device_id == null?api.GetInputDevice(api.DefaultInputDeviceIndex) :
                                Enumerable.Range(0, api.InputDeviceCount)
                                .Select(i => api.GetInputDevice(i))
                                .FirstOrDefault(d => d.Id == in_device_id && d.IsRaw == in_raw);

            if (in_device == null)
            {
                Console.Error.WriteLine("Input device " + in_device_id + " not found.");
                return(1);
            }
            Console.WriteLine("input device: " + in_device.Name);
            if (in_device.ProbeError != 0)
            {
                Console.Error.WriteLine("Cannot probe input device " + in_device_id + ".");
                return(1);
            }

            var out_device = out_device_id == null?api.GetOutputDevice(api.DefaultOutputDeviceIndex) :
                                 Enumerable.Range(0, api.OutputDeviceCount)
                                 .Select(i => api.GetOutputDevice(i))
                                 .FirstOrDefault(d => d.Id == out_device_id && d.IsRaw == out_raw);

            if (out_device == null)
            {
                Console.Error.WriteLine("Output device " + out_device_id + " not found.");
                return(1);
            }
            Console.WriteLine("output device: " + out_device.Name);
            if (out_device.ProbeError != 0)
            {
                Console.Error.WriteLine("Cannot probe output device " + out_device_id + ".");
                return(1);
            }

            out_device.SortDeviceChannelLayouts();
            var layout = SoundIODevice.BestMatchingChannelLayout(out_device, in_device);

            if (layout.IsNull)
            {
                throw new InvalidOperationException("channel layouts not compatible");                  // panic()
            }
            var sample_rate = prioritized_sample_rates.FirstOrDefault(sr => in_device.SupportsSampleRate(sr) && out_device.SupportsSampleRate(sr));

            if (sample_rate == default(int))
            {
                throw new InvalidOperationException("incompatible sample rates");                  // panic()
            }
            var fmt = prioritized_formats.FirstOrDefault(f => in_device.SupportsFormat(f) && out_device.SupportsFormat(f));

            if (fmt == default(SoundIOFormat))
            {
                throw new InvalidOperationException("incompatible sample formats");                  // panic()
            }
            var instream = in_device.CreateInStream();

            instream.Format          = fmt;
            instream.SampleRate      = sample_rate;
            instream.Layout          = layout;
            instream.SoftwareLatency = microphone_latency;
            instream.ReadCallback    = (fmin, fmax) => read_callback(instream, fmin, fmax);

            instream.Open();

            var outstream = out_device.CreateOutStream();

            outstream.Format            = fmt;
            outstream.SampleRate        = sample_rate;
            outstream.Layout            = layout;
            outstream.SoftwareLatency   = microphone_latency;
            outstream.WriteCallback     = (fmin, fmax) => write_callback(outstream, fmin, fmax);
            outstream.UnderflowCallback = () => underflow_callback(outstream);

            outstream.Open();

            int capacity = (int)(microphone_latency * 2 * instream.SampleRate * instream.BytesPerFrame);

            ring_buffer = api.CreateRingBuffer(capacity);
            var buf        = ring_buffer.WritePointer;
            int fill_count = (int)(microphone_latency * outstream.SampleRate * outstream.BytesPerFrame);

            // FIXME: there should be more efficient way for memset()
            for (int i = 0; i < fill_count; i++)
            {
                Marshal.WriteByte(buf, i, 0);
            }
            ring_buffer.AdvanceWritePointer(fill_count);

            instream.Start();
            outstream.Start();

            for (;;)
            {
                api.WaitEvents();
            }

            outstream.Dispose();
            instream.Dispose();
            in_device.RemoveReference();
            out_device.RemoveReference();
            api.Dispose();
            return(0);
        }