private void EnsureAudioStreamSetup(AudioBuffer buffer)
        {
            uint bufferSampleCount = (uint)GetSampleCount(buffer);
            bool needAudioSetup    = _outputStream == 0 ||
                                     (bufferSampleCount >= Constants.TargetSampleCount && bufferSampleCount < _sampleCount);

            if (needAudioSetup)
            {
                _sampleCount = Math.Max(Constants.TargetSampleCount, bufferSampleCount);

                uint newOutputStream = SDL2HardwareDeviceDriver.OpenStream(RequestedSampleFormat, RequestedSampleRate, RequestedChannelCount, _sampleCount, _callbackDelegate);

                if (newOutputStream == 0)
                {
                    // No stream in place, this is unexpected.
                    throw new InvalidOperationException($"OpenStream failed with error: \"{SDL_GetError()}\"");
                }
                else
                {
                    if (_outputStream != 0)
                    {
                        SDL_CloseAudioDevice(_outputStream);
                    }

                    _outputStream = newOutputStream;

                    SDL_PauseAudioDevice(_outputStream, _started ? 0 : 1);

                    Logger.Info?.Print(LogClass.Audio, $"New audio stream setup with a target sample count of {_sampleCount}");
                }
            }
        }
 public SDL2HardwareDeviceSession(SDL2HardwareDeviceDriver driver, IVirtualMemoryManager memoryManager, SampleFormat requestedSampleFormat, uint requestedSampleRate, uint requestedChannelCount, float requestedVolume) : base(memoryManager, requestedSampleFormat, requestedSampleRate, requestedChannelCount)
 {
     _driver = driver;
     _updateRequiredEvent = _driver.GetUpdateRequiredEvent();
     _queuedBuffers       = new ConcurrentQueue <SDL2AudioBuffer>();
     _ringBuffer          = new DynamicRingBuffer();
     _callbackDelegate    = Update;
     _bytesPerFrame       = BackendHelper.GetSampleSize(RequestedSampleFormat) * (int)RequestedChannelCount;
     _nativeSampleFormat  = SDL2HardwareDeviceDriver.GetSDL2Format(RequestedSampleFormat);
     _sampleCount         = uint.MaxValue;
     _started             = false;
     _volume = requestedVolume;
 }