private void ReadData(byte[] buffer, AudioCaptureClient captureClient, uint frameSize) { int nextPacketSize = captureClient.GetNextPacketSize(); int read = 0; int offset = 0; while (nextPacketSize != 0) { int framesAvailable; AudioClientBufferFlags flags; IntPtr nativeBuffer = captureClient.GetBuffer(out framesAvailable, out flags); int bytesAvailable = (int)(framesAvailable * frameSize); int bytesToCopy = Math.Min(bytesAvailable, buffer.Length); if (Math.Max(buffer.Length - read, 0) < bytesAvailable && read > 0) { RaiseDataAvailable(buffer, 0, read); read = offset = 0; } if ((flags & AudioClientBufferFlags.Silent) == AudioClientBufferFlags.Silent) { Array.Clear(buffer, offset, bytesToCopy); } else { Marshal.Copy(nativeBuffer, buffer, offset, bytesToCopy); } read += bytesToCopy; offset += bytesToCopy; captureClient.ReleaseBuffer(framesAvailable); nextPacketSize = captureClient.GetNextPacketSize(); } RaiseDataAvailable(buffer, 0, read); }
private void UninitializeAudioClients() { if (_audioClient != null) { _audioClient.Dispose(); _audioClient = null; } if (_audioCaptureClient != null) { _audioCaptureClient.Dispose(); _audioCaptureClient = null; } if(_eventWaitHandle != null) { _eventWaitHandle.Close(); _eventWaitHandle = null; } _isInitialized = false; }
private void InitializeInternal() { var defaultFormat = _waveFormat; _audioClient = AudioClient.FromMMDevice(Device); /*if (_shareMode == AudioClientShareMode.Exclusive) { _waveFormat = _waveFormat ?? _audioClient.MixFormat; } else { _waveFormat = _waveFormat ?? _audioClient.MixFormat; }*/ _waveFormat = _waveFormat ?? _audioClient.MixFormat; _waveFormat = SetupWaveFormat(_waveFormat, _audioClient); if (!_eventSync) { _audioClient.Initialize(_shareMode, AudioClientStreamFlags.None | GetStreamFlags(), _latency * ReftimesPerMillisecond, 0, _waveFormat, Guid.Empty); } else { if (_shareMode == AudioClientShareMode.Exclusive) { try { _audioClient.Initialize(_shareMode, AudioClientStreamFlags.StreamFlagsEventCallback | GetStreamFlags(), _latency * ReftimesPerMillisecond, _latency * ReftimesPerMillisecond, _waveFormat, Guid.Empty); } catch (CoreAudioAPIException e) { if (e.ErrorCode == unchecked((int)0x88890019)) //AUDCLNT_E_BUFFER_SIZE_NOT_ALIGNED { int bufferSize = _audioClient.BufferSize; _audioClient.Dispose(); long hnsRequestedDuration = (long)(((double)ReftimesPerMillisecond * 1000 / _waveFormat.SampleRate * bufferSize) + 0.5); _audioClient = AudioClient.FromMMDevice(Device); if (defaultFormat == null) _waveFormat = _audioClient.MixFormat; _audioClient.Initialize(_shareMode, AudioClientStreamFlags.StreamFlagsEventCallback | GetStreamFlags(), hnsRequestedDuration, hnsRequestedDuration, _waveFormat, Guid.Empty); } } } else { _audioClient.Initialize(_shareMode, AudioClientStreamFlags.StreamFlagsEventCallback | GetStreamFlags(), 0, 0, _waveFormat, Guid.Empty); if(_audioClient.StreamLatency > 0) { _latency = (int) (_audioClient.StreamLatency / ReftimesPerMillisecond); } } _eventWaitHandle = new EventWaitHandle(false, EventResetMode.AutoReset); _audioClient.SetEventHandle(_eventWaitHandle.SafeWaitHandle.DangerousGetHandle()); } _audioCaptureClient = AudioCaptureClient.FromAudioClient(_audioClient); }