private void IDC_COMBO_CHAT_TRANSPORT_SelectedIndexChanged(object sender, EventArgs e)
        {
            var currentSel = IDC_COMBO_CHAT_TRANSPORT.SelectedIndex;

            // The user modified the chat transport. Delete the existing chat transport and create a new one.
            g_CurrentChat.Shutdown();
            g_CurrentChat = null;

            if (currentSel == g_WasapiComboBoxIndex)
            {
                // Instantiate the WASAPI transport.
                g_CurrentChat = new CWasapiChat(Handle);
            }
            else if (currentSel == g_WaveComboBoxIndex)
            {
                // Instantiate the wave transport.
                g_CurrentChat = new CWaveChat(Handle);
            }

            // Sync the UI to the transport choice
            SyncUIState(Handle, ChatState.ChatStateNotPlaying);

            // Initialize the chat object
            var useInputDevice = IDC_RADIO_CAPTURE.Checked;

            if (g_CurrentChat.Initialize(useInputDevice))
            {
                // Sync the UI to the state again - we're not playing but after initializing the state might change.
                SyncUIState(Handle, ChatState.ChatStateNotPlaying);
            }
            else
            {
                MessageBox.Show(this, "Unable to initialize chat", "Error", MessageBoxButtons.OK);
            }
        }
        private void IDOK_Click(object sender, EventArgs e)
        {
            g_CurrentChat?.StopChat();
            g_CurrentChat?.Shutdown();
            g_CurrentChat = null;

            Close();
        }
        private void IDC_RADIO_CAPTURE_CheckedChanged(object sender, EventArgs e)
        {
            var currentSel = IDC_COMBO_CHAT_TRANSPORT.SelectedIndex;

            // The radio button selection may change when the transport is changed to Wave because render is not an option for Wave. We
            // detect that here and only rebuild the transport for Wasapi
            if ((currentSel == g_WasapiComboBoxIndex) && (g_CurrentChat.TransportType == ChatTransportType.ChatTransportWasapi))
            {
                // The user switched between render and capture. Delete the existing chat transport and create a new one.
                g_CurrentChat.Shutdown();

                // Reinstantiate the WASAPI transport.
                //
                // Also update the state of the rendering options since the WASAPI transport supports them.
                g_CurrentChat = new CWasapiChat(Handle);
                g_CurrentChat.Initialize(IDC_CHECK_HIDE_FROM_VOLUME_MIXER.Checked);
            }
            SyncUIState(Handle, ChatState.ChatStateNotPlaying);
        }
        private void IDD_DIALOG_CHAT_Load(object sender, EventArgs e)
        {
            // Start by using the wave transport for "chat".

            // Allocate the WAVE chat transport. If we failed to startup, we're done.
            g_CurrentChat = new CWaveChat(Handle);
            if (!g_CurrentChat.Initialize(true))
            {
                Close();
            }

            // Set up the combobox and initialize the chat options to reflect that we've set the Wave chat transport by default.
            g_WaveComboBoxIndex   = IDC_COMBO_CHAT_TRANSPORT.Items.Add("WAVE API Transport");
            g_WasapiComboBoxIndex = IDC_COMBO_CHAT_TRANSPORT.Items.Add("WASAPI API Transport");
            IDC_COMBO_CHAT_TRANSPORT.SelectedIndex = g_WaveComboBoxIndex;

            // Simulate a "stop" event to get the UI in sync.
            SyncUIState(Handle, ChatState.ChatStateNotPlaying);
        }