public HardwareDeviceImpl(IHardwareDeviceDriver deviceDriver, uint channelCount, uint sampleRate, float volume) { _session = deviceDriver.OpenDeviceSession(IHardwareDeviceDriver.Direction.Output, null, SampleFormat.PcmInt16, sampleRate, channelCount, volume); _channelCount = channelCount; _sampleRate = sampleRate; _currentBufferTag = 0; _buffer = new byte[Constants.TargetSampleCount * channelCount * sizeof(ushort)]; _session.Start(); }
/// <summary> /// Open a new <see cref="AudioOutputSystem"/>. /// </summary> /// <param name="outputDeviceName">The output device name selected by the <see cref="AudioOutputSystem"/></param> /// <param name="outputConfiguration">The output audio configuration selected by the <see cref="AudioOutputSystem"/></param> /// <param name="obj">The new <see cref="AudioOutputSystem"/></param> /// <param name="memoryManager">The memory manager that will be used for all guest memory operations</param> /// <param name="inputDeviceName">The input device name wanted by the user</param> /// <param name="sampleFormat">The sample format to use</param> /// <param name="parameter">The user configuration</param> /// <param name="appletResourceUserId">The applet resource user id of the application</param> /// <param name="processHandle">The process handle of the application</param> /// <returns>A <see cref="ResultCode"/> reporting an error or a success</returns> public ResultCode OpenAudioOut(out string outputDeviceName, out AudioOutputConfiguration outputConfiguration, out AudioOutputSystem obj, IVirtualMemoryManager memoryManager, string inputDeviceName, SampleFormat sampleFormat, ref AudioInputConfiguration parameter, ulong appletResourceUserId, uint processHandle, float volume) { int sessionId = AcquireSessionId(); _sessionsBufferEvents[sessionId].Clear(); IHardwareDeviceSession deviceSession = _deviceDriver.OpenDeviceSession(IHardwareDeviceDriver.Direction.Output, memoryManager, sampleFormat, parameter.SampleRate, parameter.ChannelCount, volume); AudioOutputSystem audioOut = new AudioOutputSystem(this, _lock, deviceSession, _sessionsBufferEvents[sessionId]); ResultCode result = audioOut.Initialize(inputDeviceName, sampleFormat, ref parameter, sessionId); if (result == ResultCode.Success) { outputDeviceName = audioOut.DeviceName; outputConfiguration = new AudioOutputConfiguration { ChannelCount = audioOut.ChannelCount, SampleFormat = audioOut.SampleFormat, SampleRate = audioOut.SampleRate, AudioOutState = audioOut.GetState(), }; obj = audioOut; Register(audioOut); } else { ReleaseSessionId(sessionId); obj = null; outputDeviceName = null; outputConfiguration = default; } return(result); }
/// <summary> /// Create a new <see cref="AudioDeviceSession"/>. /// </summary> /// <param name="deviceSession">The device driver session associated</param> /// <param name="bufferEvent">The release buffer event</param> /// <param name="bufferRegisteredLimit">The max number of buffers that can be registered to the device driver at a time</param> public AudioDeviceSession(IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent, uint bufferRegisteredLimit = 4) { _bufferEvent = bufferEvent; _hardwareDeviceSession = deviceSession; _bufferRegisteredLimit = bufferRegisteredLimit; _buffers = new AudioBuffer[Constants.AudioDeviceBufferCountMax]; _serverBufferIndex = 0; _hardwareBufferIndex = 0; _releasedBufferIndex = 0; _bufferAppendedCount = 0; _bufferRegisteredCount = 0; _bufferReleasedCount = 0; _volume = 1.0f; _state = AudioDeviceState.Stopped; }
/// <summary> /// Create a new <see cref="AudioOutputSystem"/>. /// </summary> /// <param name="manager">The manager instance</param> /// <param name="parentLock">The lock of the manager</param> /// <param name="deviceSession">The hardware device session</param> /// <param name="bufferEvent">The buffer release event of the audio output</param> public AudioOutputSystem(AudioOutputManager manager, object parentLock, IHardwareDeviceSession deviceSession, IWritableEvent bufferEvent) { _manager = manager; _parentLock = parentLock; _session = new AudioDeviceSession(deviceSession, bufferEvent); }