/// <summary> /// Flush server buffers to hardware. /// </summary> private void FlushToHardware() { uint bufferToFlushCount = Math.Min(Math.Min(_bufferAppendedCount, 4), _bufferRegisteredLimit - _bufferRegisteredCount); AudioBuffer[] buffersToFlush = new AudioBuffer[bufferToFlushCount]; uint hardwareBufferIndex = _hardwareBufferIndex; for (int i = 0; i < buffersToFlush.Length; i++) { buffersToFlush[i] = _buffers[_hardwareBufferIndex]; _bufferAppendedCount--; _bufferRegisteredCount++; hardwareBufferIndex = (hardwareBufferIndex + 1) % Constants.AudioDeviceBufferCountMax; } _hardwareBufferIndex = hardwareBufferIndex; for (int i = 0; i < buffersToFlush.Length; i++) { _hardwareDeviceSession.QueueBuffer(buffersToFlush[i]); } }
public void AppendBuffer(ReadOnlySpan <short> data, uint channelCount) { data.CopyTo(MemoryMarshal.Cast <byte, short>(_buffer)); _session.QueueBuffer(new AudioBuffer { DataPointer = _currentBufferTag++, Data = _buffer, DataSize = (ulong)_buffer.Length, }); _currentBufferTag = _currentBufferTag % 4; }