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;
 }
        int ISoundPcmDriver.Initialize(int freq, int format)
        {
            int result = 0;

            this.sdlCallback = new SDL_AudioCallback(this.SdlCallback);

            SDL_AudioSpec desired = new SDL_AudioSpec
            {
                freq     = freq,
                format   = (ushort)format,
                samples  = SAMPLESIZE,
                channels = 1,
                userdata = IntPtr.Zero,
                callback = this.sdlCallback,
            };

            SDL_AudioSpec obtained = default(SDL_AudioSpec);

            //IntPtr desiredPtr = Marshal.AllocHGlobal(Marshal.SizeOf(desired));
            IntPtr obtainedPtr = Marshal.AllocHGlobal(Marshal.SizeOf(obtained));

            try
            {
                //Marshal.StructureToPtr(desired, desiredPtr, false);
                result = SDL_OpenAudio(ref desired, obtainedPtr);
                if (result == 0)
                {
                    obtained = (SDL_AudioSpec)Marshal.PtrToStructure(obtainedPtr, typeof(SDL_AudioSpec));

                    // pauses callback
                    (this as ISoundPcmDriver).SetState(false);
                }
                else
                {
                    Trace.WriteLine("pcthis.out_sdl_init(): unable to open audio.");
                }
            }
            finally
            {
                //Marshal.FreeHGlobal(desiredPtr);
                Marshal.FreeHGlobal(obtainedPtr);
            }

            return(result);
        }