/// <summary> /// Initializes the audio renderer. /// Call the Play Method to start reading samples. /// </summary> private void Initialize() { Destroy(); // Check the wave format if (WaveFormat.BitsPerSample != 16 || WaveFormat.Channels != 2) { throw new NotSupportedException("Wave Format has to be 16-bit and 2-channel."); } // Release the audio device always upon exiting if (Application.Current is Application app) { app.Dispatcher?.BeginInvoke(new Action(() => { app.Exit += OnApplicationExit; })); } // Enumerate devices. The default device is the first one so we check // that we have more than 1 device (other than the default stub) var hasAudioDevices = MediaElement.RendererOptions.UseLegacyAudioOut ? LegacyAudioPlayer.EnumerateDevices().Count > 1 : DirectSoundPlayer.EnumerateDevices().Count > 1; // Check if we have an audio output device. if (hasAudioDevices == false) { HasFiredAudioDeviceStopped = true; this.LogWarning(Aspects.AudioRenderer, "No audio device found for output."); return; } // Initialize the SoundTouch Audio Processor (if available) AudioProcessor = (SoundTouch.IsAvailable == false) ? null : new SoundTouch(); if (AudioProcessor != null) { AudioProcessor.SetChannels(Convert.ToUInt32(WaveFormat.Channels)); AudioProcessor.SetSampleRate(Convert.ToUInt32(WaveFormat.SampleRate)); } // Initialize the Audio Device AudioDevice = MediaElement.RendererOptions.UseLegacyAudioOut ? new LegacyAudioPlayer(this, MediaElement.RendererOptions.LegacyAudioDevice?.DeviceId ?? -1) as IWavePlayer : new DirectSoundPlayer(this, MediaElement.RendererOptions.DirectSoundDevice?.DeviceId ?? DirectSoundPlayer.DefaultPlaybackDeviceId); // Create the Audio Buffer SampleBlockSize = Constants.AudioBytesPerSample * Constants.AudioChannelCount; var bufferLength = WaveFormat.ConvertMillisToByteSize(2000); // 2-second buffer AudioBuffer = new CircularBuffer(bufferLength); AudioDevice.Start(); }
/// <summary> /// Initializes the audio renderer. /// Call the Play Method to start reading samples /// </summary> private void Initialize() { Destroy(); // Release the audio device always upon exiting if (Application.Current != null) { GuiContext.Current.EnqueueInvoke(DispatcherPriority.Render, () => Application.Current.Exit += OnApplicationExit); } // Enumerate devices. The default device is the first one so we check // that we have more than 1 device (other than the default stub) var hasAudioDevices = MediaElement.RendererOptions.UseLegacyAudioOut ? LegacyAudioPlayer.EnumerateDevices().Count > 1 : DirectSoundPlayer.EnumerateDevices().Count > 1; // Check if we have an audio output device. if (hasAudioDevices == false) { WaitForReadyEvent.Complete(); HasFiredAudioDeviceStopped = true; this.LogWarning(Aspects.AudioRenderer, "No audio device found for output."); return; } // Initialize the SoundTouch Audio Processor (if available) AudioProcessor = (SoundTouch.IsAvailable == false) ? null : new SoundTouch(); if (AudioProcessor != null) { AudioProcessor.SetChannels(Convert.ToUInt32(WaveFormat.Channels)); AudioProcessor.SetSampleRate(Convert.ToUInt32(WaveFormat.SampleRate)); } // Initialize the Audio Device AudioDevice = MediaElement.RendererOptions.UseLegacyAudioOut ? new LegacyAudioPlayer(this, MediaElement.RendererOptions.LegacyAudioDevice?.DeviceId ?? -1) as IWavePlayer : new DirectSoundPlayer(this, MediaElement.RendererOptions.DirectSoundDevice?.DeviceId ?? DirectSoundPlayer.DefaultPlaybackDeviceId); // Create the Audio Buffer SampleBlockSize = Constants.Audio.BytesPerSample * Constants.Audio.ChannelCount; var bufferLength = WaveFormat.ConvertMillisToByteSize(2000); // 2-second buffer AudioBuffer = new CircularBuffer(bufferLength); AudioDevice.Start(); }