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); }