Ejemplo n.º 1
0
 internal DeviceInfo(string deviceId, string name, EDataFlow flow, DeviceState state, WAVEFORMATEXTENSIBLE format)
 {
     _deviceId     = deviceId;
     _friendlyName = name;
     _dataFlow     = flow;
     _state        = state;
     _format       = new WAVEFORMATEXTENSIBLE(format);
 }
Ejemplo n.º 2
0
        private static bool TryGetWaveFormat(AudioFormat format, out WAVEFORMATEXTENSIBLE wfx)
        {
            unsafe
            {
                if (format.SampleFormat == SampleFormat.IeeeFloat32)
                {
                    wfx = new WAVEFORMATEXTENSIBLE
                    {
                        WaveFormatEx = new WAVEFORMATEX
                        {
                            cbSize          = (ushort)sizeof(WAVEFORMATEXTENSIBLE),
                            wBitsPerSample  = 32,
                            nChannels       = (ushort)format.Channels,
                            nBlockAlign     = (ushort)(format.Channels * 4u),
                            nSamplesPerSec  = (uint)format.SampleRate,
                            nAvgBytesPerSec = (uint)format.Channels * 4u * (uint)format.SampleRate,
                            wFormatTag      = WAVE_FORMAT_EXTENSIBLE
                        },
                        wValidBitsPerSample = 32,
                        dwChannelMask       = 3,
                        SubFormat           = Guids.KSDATAFORMAT_SUBTYPE_IEEE_FLOAT
                    };

                    return(true);
                }
                else if (format.SampleFormat == SampleFormat.UnsignedPcm8 || format.SampleFormat == SampleFormat.SignedPcm16)
                {
                    ushort bitsPerSample = format.SampleFormat == SampleFormat.SignedPcm16 ? (ushort)16 : (ushort)8;

                    wfx = new WAVEFORMATEXTENSIBLE
                    {
                        WaveFormatEx = new WAVEFORMATEX
                        {
                            cbSize          = (ushort)sizeof(WAVEFORMATEX),
                            wBitsPerSample  = bitsPerSample,
                            nChannels       = (ushort)format.Channels,
                            nBlockAlign     = (ushort)(format.Channels * (bitsPerSample / 8u)),
                            nSamplesPerSec  = (uint)format.SampleRate,
                            nAvgBytesPerSec = (uint)format.Channels * (bitsPerSample / 8u) * (uint)format.SampleRate,
                            wFormatTag      = WAVE_FORMAT_PCM
                        }
                    };

                    return(true);
                }
                else
                {
                    wfx = default;
                    return(false);
                }
            }
        }
Ejemplo n.º 3
0
        private void selectDeviceImpl(string devId)
        {
            releaseDevice();

            _capDevice = _devices.GetDevice(devId.Trim());
            int idx = _deviceInfos.FindIndex((di) => { return(di.DeviceId == devId); });

            if (_capDevice == null)
            {
#warning 例外
            }
            _capDeviceId = _capDevice.Id;

            // デバイスに適した初期化方法を決定
            AudioClientStreamFlags streamFlags = AudioClientStreamFlags.NoPersist;
            if (_capDevice.DataFlow == EDataFlow.eRender)
            {
                streamFlags = AudioClientStreamFlags.Loopback |
                              AudioClientStreamFlags.EventCallback; // 実際は発生してくれない
            }
            // フォーマット
            if (_audioClient != null)
            {
                _capDevice.ReleaseAudioClient();
            }

            try
            {
                _audioClient = _capDevice.AudioClient;
                _capFormat   = _audioClient.MixFormat;
                _pitchAnalyzer.SampleFrequency = (double)(_capFormat.nSamplesPerSec);

                // 初期化
                _audioClient.Initialize(AudioClientShareMode.Shared,
                                        streamFlags, 300 /*ms*/ * 10000, 0, _capFormat, Guid.Empty);
                _capClient = _audioClient.AudioCaptureClient;

                // イベント発火
                DeviceSelectedEventHandler del = DeviceSelected;
                if (del != null)
                {
                    del.Invoke(this, new DeviceSelectedEventArgs(_capDevice, idx));
                }
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
#warning エラー処理
                _audioClient = null;
                _capClient   = null;
            }
        }
Ejemplo n.º 4
0
        private void UpdateWaveFormatInfo(IntPtr defaultFormat)
        {
            WAVEFORMATEX format = Marshal.PtrToStructure <WAVEFORMATEX>(defaultFormat);

            this.SampleRate    = (int)format.nSamplesPerSec;
            this.BitsPerSample = format.wBitsPerSample;
            this.Channels      = format.nChannels;

            switch (format.wFormatTag)
            {
            case Constants.WAVE_FORMAT_PCM:
                this.IsFloatFormat = false;
                break;

            case Constants.WAVE_FORMAT_EXTENSIBLE:
            {
                WAVEFORMATEXTENSIBLE formatEx = Marshal.PtrToStructure <WAVEFORMATEXTENSIBLE>(defaultFormat);
                if (formatEx.SubFormat == Constants.KSDATAFORMAT_SUBTYPE_PCM)
                {
                    this.IsFloatFormat = false;
                }
                else if (formatEx.SubFormat == Constants.KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)
                {
                    this.IsFloatFormat = true;
                }
                else
                {
                    Debug.Fail("Unknown value for WAVEFORMATEXTENSIBLE.SubFormat!");
                }
            }
            break;

            default:
                Debug.Fail("Unknown value for WAVEFORMATEX.wFormatTag!");
                break;
            }

            if (this.FormatChanged != null)
            {
                this.FormatChanged(this, EventArgs.Empty);
            }
        }
Ejemplo n.º 5
0
        public void SelectDevice(string devId)
        {
            _capDevice = _devices.GetDevice(devId.Trim());

            if (_capDevice == null)
            {
                _audioClient = null;
                _capClient = null;
                return;
            }

            _capDeviceId = _capDevice.Id;

            // モード
            AudioClientShareMode shareMode = AudioClientShareMode.Exclusive;
            AudioClientStreamFlags streamFlags = AudioClientStreamFlags.NoPersist;

            if (_audioClient != null)
                _capDevice.ReleaseAudioClient();

            try
            {
                _audioClient = _capDevice.AudioClient;
                _capFormat = _audioClient.MixFormat;

                _capFormat.wFormatTag = WaveFormatTag.WAVE_FORMAT_EXTENSIBLE;
                _capFormat.nChannels = 2;
                _capFormat.nSamplesPerSec = 16000;
                _capFormat.wBitsPerSample = 16;
                _capFormat.SubFormat = CoreAudioApi.AudioMediaSubtypes.MEDIASUBTYPE_PCM;

                _capFormat.wValidBitsPerSample = _capFormat.wBitsPerSample;
                _capFormat.nBlockAlign = (ushort)(_capFormat.wBitsPerSample / 8.0 * _capFormat.nChannels);
                _capFormat.nAvgBytesPerSec = _capFormat.nSamplesPerSec * _capFormat.nBlockAlign;

                long tmp1; long tmp2;
                _audioClient.GetDevicePeriod(out tmp1, out tmp2);

                // 初期化
                try
                {
                    WAVEFORMATEXTENSIBLE tmpFmt = new WAVEFORMATEXTENSIBLE();
                    if (!_audioClient.IsFormatSupported(shareMode, _capFormat, ref tmpFmt))
                        _capFormat = tmpFmt;
                    _audioClient.Initialize(shareMode, streamFlags,
                        tmp2, tmp2,
                        _capFormat, Guid.Empty);
                }
                catch (System.Runtime.InteropServices.COMException ex)
                {
                    try
                    {
                        AudioClientError error = (AudioClientError)ex.ErrorCode;
                        switch (error)
                        {
                            case AudioClientError.BufferSizeNotAligned:
                                uint bufSize = _audioClient.BufferSize;
                                tmp2 = (long)((10000.0 * 1000 / _capFormat.nSamplesPerSec * bufSize) + 0.5);
                                _audioClient.Initialize(shareMode,
                                    streamFlags, tmp2, tmp2, _capFormat, Guid.Empty);
                                break;

                            case AudioClientError.UnsupportedFormat:

                                break;
                        }
                    }
                    catch (InvalidCastException)
                    {

                    }
                }

                _capClient = _audioClient.AudioCaptureClient;

            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                _audioClient = null;
                _capClient = null;
                throw ex;
            }
        }
Ejemplo n.º 6
0
        public MultiCaptureViewModel()
        {
            //ExclusiveAudioInput ai = new ExclusiveAudioInput();

            _audioInput = new SharedMultiAudioInput();

            _audioInput.DeviceInfoUpdated += (s, e) =>
            {
                Devices = new ObservableCollection <DeviceInfoViewModel>(
                    e.DeviceInfo.FindAll(di => true)//di.DataFlow == EDataFlow.eCapture)
                    .Select(di => new DeviceInfoViewModel(di)));
                addMessage("Devices updated");

                Volumes = new ObservableCollection <VolumeViewModel>(Devices.Select(di => new VolumeViewModel(di.DeviceId)));
                foreach (var di in e.DeviceInfo)
                {
                    if (!_selecting.ContainsKey(di.DeviceId))
                    {
                        _selecting.Add(di.DeviceId, false);
                    }
                }
            };

            _audioInput.DeviceSelected += (s, e) =>
            {
                addMessage("Device selected: " + e.Device.Id + "/" + e.Device.FriendlyName);
                _selecting[e.Device.Id] = true;
            };
            _audioInput.CaptureStarted += (s, e) =>
            {
                addMessage("Capture started: " + e.DeviceId);
            };
            _audioInput.CaptureStopped += (s, e) =>
            {
                addMessage("Capture stopped: " + e.DeviceId);
                lock (_wavWriters)
                {
                    if (_wavWriters.ContainsKey(e.DeviceId))
                    {
                        _wavWriters[e.DeviceId].Close();
                    }
                }
            };

            _audioInput.DataUpdated += (s, e) =>
            {
                lock (_wavWriters)
                {
                    if (_wavWriters.ContainsKey(e.DeviceId))
                    {
                        _wavWriters[e.DeviceId].Write(e.Data);
                    }
                }
            };
            _audioInput.VolumeChanged += (s, e) =>
            {
                foreach (var v in Volumes)
                {
                    if (v.DeviceId == e.DeviceId)
                    {
                        v.Master = e.Master;
                    }
                }
            };

            _audioInput.ErrorOccured += (s, e) =>
            {
                addMessage(e.Exception.Message);
            };

            #region initialize commands
            SelectCommand = new DelegateCommand <string>(
                devId => _audioInput.SelectDevice(devId),
                devId => devId != null && _selecting.ContainsKey(devId) && !_selecting[devId] && !_audioInput.Capturing(devId));
            ReleaseCommand = new DelegateCommand <string>(
                devId =>
            {
                _audioInput.ReleaseDevice(devId);
                _selecting[devId] = false;
            },
                devId => devId != null && _selecting.ContainsKey(devId) && _selecting[devId] && !_audioInput.Capturing(devId));

            StartCaptureCommand = new DelegateCommand <string>(
                devId =>
            {
                lock (_wavWriters)
                {
                    if (_wavWriters.ContainsKey(devId))
                    {
                        _wavWriters[devId].Close();
                        _wavWriters.Remove(devId);
                    }
                }

                WAVEFORMATEXTENSIBLE fmt = new WAVEFORMATEXTENSIBLE(_audioInput.GetCapFormat(devId));
                fmt.wFormatTag           = WaveFormatTag.WAVE_FORMAT_PCM;
                fmt.wBitsPerSample       = 16;
                fmt.wValidBitsPerSample  = 16;
                fmt.nAvgBytesPerSec      = (uint)(fmt.nChannels * fmt.nSamplesPerSec * fmt.wBitsPerSample / 8.0);

                WaveFileWriter writer = new WaveFileWriter(fmt.nChannels, (int)fmt.nSamplesPerSec, fmt.wBitsPerSample,
                                                           string.Format("{0}.wav", devId));
                lock (_wavWriters)
                {
                    _wavWriters.Add(devId, writer);
                }

                _audioInput.StartCapture(devId);
            },
                devId =>
            {
                if (devId != null && !_audioInput.Capturing(devId))
                {
                    DeviceInfo di = _audioInput.getDeviceInfo(devId);
                    return(_selecting.ContainsKey(devId) && _selecting[devId] &&
                           di != null && di.State == DeviceState.DEVICE_STATE_ACTIVE);
                }
                return(false);
            });

            StopCaptureCommand = new DelegateCommand <string>(
                devId => _audioInput.StopCapture(devId),
                devId =>
            {
                return(devId != null && _audioInput.Capturing(devId));
            });
            #endregion

            Devices = new ObservableCollection <DeviceInfoViewModel>();
            _audioInput.UpdateDeviceInfo();
        }
Ejemplo n.º 7
0
        public AudioCaptureViewModel()
        {
            _audioInput = new SharedAudioInput();

            _audioInput.DeviceInfoUpdated += (s, e) =>
            {
                Devices = new ObservableCollection <DeviceInfoViewModel>(
                    e.DeviceInfo.FindAll(di => true)//di.DataFlow == EDataFlow.eCapture)
                    .Select(di => new DeviceInfoViewModel(di)));
                addMessage("Devices updated");
            };

            _audioInput.DeviceSelected += (s, e) =>
            {
                addMessage("Device selected: " + e.Device.FriendlyName);
            };
            _audioInput.CaptureStarted += (s, e) =>
            {
                addMessage("Capture started");
            };
            _audioInput.CaptureStopped += (s, e) =>
            {
                addMessage("Capture stopped");

                if (_wavWriters != null)
                {
                    foreach (var wr in _wavWriters)
                    {
                        wr.Close();
                    }
                }
                _wavWriters = null;
                if (_wavRawWriter != null)
                {
                    _wavRawWriter.Close(); _wavRawWriter = null;
                }
                if (_writer != null)
                {
                    _writer.Close(); _writer = null;
                }
            };

            _audioInput.DataUpdated += (s, e) =>
            {
                if (_wavWriters != null)
                {
                    for (int i = 0; i < _wavWriters.Length; i++)
                    {
                        _wavWriters[i].Write(e.Data[i]);
                    }
                }
                if (_wavRawWriter != null)
                {
                    _wavRawWriter.WriteRawData(e.RawData);
                }
                if (_writer != null)
                {
                    _writer.Write(e.RawData);
                }
            };
            _audioInput.VolumeChanged += (s, e) =>
            {
                Volume = e.Master;
            };

            _audioInput.ErrorOccured += (s, e) =>
            {
                addMessage(e.Exception.Message);
            };

            #region initialize commands
            StartCaptureCommand = new DelegateCommand(
                () =>
            {
                if (_wavWriters != null)
                {
                    foreach (var wr in _wavWriters)
                    {
                        wr.Close();
                    }
                }

                _wavWriters = new WaveFileWriter[_audioInput.CapFormat.nChannels];
                WAVEFORMATEXTENSIBLE fmt = new WAVEFORMATEXTENSIBLE(_audioInput.CapFormat);
                fmt.wFormatTag           = WaveFormatTag.WAVE_FORMAT_PCM;
                fmt.nChannels            = 1;
                fmt.wBitsPerSample       = 16;
                fmt.wValidBitsPerSample  = 16;
                fmt.nAvgBytesPerSec      = (uint)(fmt.nChannels * fmt.nSamplesPerSec * fmt.wBitsPerSample / 8.0);

                for (int i = 0; i < _wavWriters.Length; i++)
                {
                    _wavWriters[i] = new WaveFileWriter(fmt.nChannels, (int)fmt.nSamplesPerSec, fmt.wBitsPerSample,
                                                        DateTime.Now.ToString("yyyyMMdd-HHmmss") + string.Format("_{0}.wav", i));
                }

                WAVEFORMATEXTENSIBLE rawFmt = new WAVEFORMATEXTENSIBLE(_audioInput.CapFormat);
                _wavRawWriter = new WaveFileWriter(rawFmt.nChannels, (int)rawFmt.nSamplesPerSec, rawFmt.wBitsPerSample,
                                                   DateTime.Now.ToString("yyyyMMdd-HHmmss") + "_raw.wav");

                _writer = new System.IO.BinaryWriter(new System.IO.FileStream("test.wav", System.IO.FileMode.Create));

                _audioInput.StartCapture();
            },
                () => { return(_selectedDev != null && !_audioInput.Capturing &&
                               _selectedDev.State == DeviceState.DEVICE_STATE_ACTIVE); });

            StopCaptureCommand = new DelegateCommand(
                () =>
            {
                _audioInput.StopCapture();
            },
                () => { return(SelectedDev != null && _audioInput.Capturing); });
            #endregion

            Devices = new ObservableCollection <DeviceInfoViewModel>();
            _audioInput.UpdateDeviceInfo();
        }
Ejemplo n.º 8
0
        private void selectDeviceImpl(string devId)
        {
            if (_capDevice != null && _capDevice.Id == devId)
            {
                return;
            }

            releaseDeviceImpl();

            _capDevice = _devices.GetDevice(devId.Trim());
            int idx = _deviceInfos.FindIndex((di) => { return di.DeviceId == devId; });
            if (_capDevice == null)
            {
            #warning 例外
                _audioClient = null;
                _capClient = null;
                return;
            }
            _capDeviceId = _capDevice.Id;

            // モード
            AudioClientShareMode shareMode = AudioClientShareMode.Shared;

            // デバイスに適した初期化方法を決定
            AudioClientStreamFlags streamFlags = AudioClientStreamFlags.NoPersist;
            switch (shareMode)
            {
                case AudioClientShareMode.Shared:
                    switch (_capDevice.DataFlow)
                    {
                        case EDataFlow.eCapture:
                            streamFlags = 0;
                            break;
                        case EDataFlow.eRender:
                            streamFlags = AudioClientStreamFlags.Loopback;
                            break;
                    }
                    break;
                case AudioClientShareMode.Exclusive:
                    streamFlags = AudioClientStreamFlags.NoPersist;
                    break;
            }

            // フォーマット
            if (_audioClient != null) _capDevice.ReleaseAudioClient();

            // ボリューム
            _masterVolume = 0;
            _channelVolumes = new double[_capDevice.AudioMeterInformation.PeakValues.Count];
            var h = VolumeChanged;
            if (h != null)
            {
                h(this, new VolumeChangedEventArgs(_capDeviceId, _masterVolume, _channelVolumes));
            }

            try
            {
                _audioClient = _capDevice.AudioClient;
                _capFormat = _audioClient.MixFormat;

                _capFormat.wFormatTag = WaveFormatTag.WAVE_FORMAT_EXTENSIBLE;
                _capFormat.nChannels = 1;
                _capFormat.nSamplesPerSec = 44100;
                _capFormat.wBitsPerSample = 16;
                _capFormat.SubFormat = CoreAudioApi.AudioMediaSubtypes.MEDIASUBTYPE_PCM;

                _capFormat.wValidBitsPerSample = _capFormat.wBitsPerSample;
                _capFormat.nBlockAlign = (ushort)(_capFormat.wBitsPerSample / 8.0 * _capFormat.nChannels);
                _capFormat.nAvgBytesPerSec = _capFormat.nSamplesPerSec * _capFormat.nBlockAlign;

                long tmp1; long tmp2;
                _audioClient.GetDevicePeriod(out tmp1, out tmp2);

                // 初期化

                try
                {
                    WAVEFORMATEXTENSIBLE tmpFmt = new WAVEFORMATEXTENSIBLE();
                    if (!_audioClient.IsFormatSupported(shareMode, _capFormat, ref tmpFmt)) _capFormat = tmpFmt;
                    _audioClient.Initialize(shareMode,
                            streamFlags, tmp2, tmp2, _capFormat, Guid.Empty);
                }
                catch (System.Runtime.InteropServices.COMException ex)
                {
                    if ((uint)ex.ErrorCode == 0x88890019)
                    {
                        uint bufSize = _audioClient.BufferSize;
                        tmp2 = (long)((10000.0 * 1000 / _capFormat.nSamplesPerSec * bufSize) + 0.5);
                        _audioClient.Initialize(shareMode,
                            streamFlags, tmp2, tmp2, _capFormat, Guid.Empty);
                    }
                }
                clearBuffer();

                _capClient = _audioClient.AudioCaptureClient;

                // イベント発火
                var del = DeviceSelected;
                if (del != null)
                {
                    del.Invoke(this, new DeviceSelectedEventArgs(_capDevice, idx));
                }
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                _audioClient = null;
                _capClient = null;
                throw ex;
            }
        }
Ejemplo n.º 9
0
 internal DeviceInfo(string deviceId, string name, EDataFlow flow, DeviceState state, WAVEFORMATEXTENSIBLE format)
 {
     _deviceId = deviceId;
     _friendlyName = name;
     _dataFlow = flow;
     _state = state;
     _format = new WAVEFORMATEXTENSIBLE(format);
 }
Ejemplo n.º 10
0
        public void SelectDevice(string devId)
        {
            _capDevice = _devices.GetDevice(devId.Trim());

            if (_capDevice == null)
            {
                _audioClient = null;
                _capClient   = null;
                return;
            }

            _capDeviceId = _capDevice.Id;

            // モード
            AudioClientShareMode   shareMode   = AudioClientShareMode.Exclusive;
            AudioClientStreamFlags streamFlags = AudioClientStreamFlags.NoPersist;

            if (_audioClient != null)
            {
                _capDevice.ReleaseAudioClient();
            }

            try
            {
                _audioClient = _capDevice.AudioClient;
                _capFormat   = _audioClient.MixFormat;

                _capFormat.wFormatTag     = WaveFormatTag.WAVE_FORMAT_EXTENSIBLE;
                _capFormat.nChannels      = 2;
                _capFormat.nSamplesPerSec = 16000;
                _capFormat.wBitsPerSample = 16;
                _capFormat.SubFormat      = CoreAudioApi.AudioMediaSubtypes.MEDIASUBTYPE_PCM;

                _capFormat.wValidBitsPerSample = _capFormat.wBitsPerSample;
                _capFormat.nBlockAlign         = (ushort)(_capFormat.wBitsPerSample / 8.0 * _capFormat.nChannels);
                _capFormat.nAvgBytesPerSec     = _capFormat.nSamplesPerSec * _capFormat.nBlockAlign;

                long tmp1; long tmp2;
                _audioClient.GetDevicePeriod(out tmp1, out tmp2);

                // 初期化
                try
                {
                    WAVEFORMATEXTENSIBLE tmpFmt = new WAVEFORMATEXTENSIBLE();
                    if (!_audioClient.IsFormatSupported(shareMode, _capFormat, ref tmpFmt))
                    {
                        _capFormat = tmpFmt;
                    }
                    _audioClient.Initialize(shareMode, streamFlags,
                                            tmp2, tmp2,
                                            _capFormat, Guid.Empty);
                }
                catch (System.Runtime.InteropServices.COMException ex)
                {
                    try
                    {
                        AudioClientError error = (AudioClientError)ex.ErrorCode;
                        switch (error)
                        {
                        case AudioClientError.BufferSizeNotAligned:
                            uint bufSize = _audioClient.BufferSize;
                            tmp2 = (long)((10000.0 * 1000 / _capFormat.nSamplesPerSec * bufSize) + 0.5);
                            _audioClient.Initialize(shareMode,
                                                    streamFlags, tmp2, tmp2, _capFormat, Guid.Empty);
                            break;

                        case AudioClientError.UnsupportedFormat:

                            break;
                        }
                    }
                    catch (InvalidCastException)
                    {
                    }
                }

                _capClient = _audioClient.AudioCaptureClient;
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                _audioClient = null;
                _capClient   = null;
                throw ex;
            }
        }
Ejemplo n.º 11
0
        private void selectDeviceImpl(string devId)
        {
            if (_capDevice != null && _capDevice.Id == devId)
            {
                return;
            }

            releaseDeviceImpl();

            _capDevice = _devices.GetDevice(devId.Trim());
            int idx = _deviceInfos.FindIndex((di) => { return(di.DeviceId == devId); });

            if (_capDevice == null)
            {
#warning 例外
                _audioClient = null;
                _capClient   = null;
                return;
            }
            _capDeviceId = _capDevice.Id;

            // モード
            AudioClientShareMode shareMode = AudioClientShareMode.Shared;

            // デバイスに適した初期化方法を決定
            AudioClientStreamFlags streamFlags = AudioClientStreamFlags.NoPersist;
            switch (shareMode)
            {
            case AudioClientShareMode.Shared:
                switch (_capDevice.DataFlow)
                {
                case EDataFlow.eCapture:
                    streamFlags = 0;
                    break;

                case EDataFlow.eRender:
                    streamFlags = AudioClientStreamFlags.Loopback;
                    break;
                }
                break;

            case AudioClientShareMode.Exclusive:
                streamFlags = AudioClientStreamFlags.NoPersist;
                break;
            }

            // フォーマット
            if (_audioClient != null)
            {
                _capDevice.ReleaseAudioClient();
            }

            // ボリューム
            _masterVolume   = 0;
            _channelVolumes = new double[_capDevice.AudioMeterInformation.PeakValues.Count];
            var h = VolumeChanged;
            if (h != null)
            {
                h(this, new VolumeChangedEventArgs(_capDeviceId, _masterVolume, _channelVolumes));
            }

            try
            {
                _audioClient = _capDevice.AudioClient;
                _capFormat   = _audioClient.MixFormat;

                _capFormat.wFormatTag     = WaveFormatTag.WAVE_FORMAT_EXTENSIBLE;
                _capFormat.nChannels      = 1;
                _capFormat.nSamplesPerSec = 44100;
                _capFormat.wBitsPerSample = 16;
                _capFormat.SubFormat      = CoreAudioApi.AudioMediaSubtypes.MEDIASUBTYPE_PCM;

                _capFormat.wValidBitsPerSample = _capFormat.wBitsPerSample;
                _capFormat.nBlockAlign         = (ushort)(_capFormat.wBitsPerSample / 8.0 * _capFormat.nChannels);
                _capFormat.nAvgBytesPerSec     = _capFormat.nSamplesPerSec * _capFormat.nBlockAlign;

                long tmp1; long tmp2;
                _audioClient.GetDevicePeriod(out tmp1, out tmp2);

                // 初期化

                try
                {
                    WAVEFORMATEXTENSIBLE tmpFmt = new WAVEFORMATEXTENSIBLE();
                    if (!_audioClient.IsFormatSupported(shareMode, _capFormat, ref tmpFmt))
                    {
                        _capFormat = tmpFmt;
                    }
                    _audioClient.Initialize(shareMode,
                                            streamFlags, tmp2, tmp2, _capFormat, Guid.Empty);
                }
                catch (System.Runtime.InteropServices.COMException ex)
                {
                    if ((uint)ex.ErrorCode == 0x88890019)
                    {
                        uint bufSize = _audioClient.BufferSize;
                        tmp2 = (long)((10000.0 * 1000 / _capFormat.nSamplesPerSec * bufSize) + 0.5);
                        _audioClient.Initialize(shareMode,
                                                streamFlags, tmp2, tmp2, _capFormat, Guid.Empty);
                    }
                }
                clearBuffer();

                _capClient = _audioClient.AudioCaptureClient;

                // イベント発火
                var del = DeviceSelected;
                if (del != null)
                {
                    del.Invoke(this, new DeviceSelectedEventArgs(_capDevice, idx));
                }
            }
            catch (System.Runtime.InteropServices.COMException ex)
            {
                _audioClient = null;
                _capClient   = null;
                throw ex;
            }
        }