title: Trying to stream 2 way audio over TCP?
body: <p>I'm trying to make a video conferencing application (written in c#) that would allow 2 users to video conference using TCP. In addition, users can text chat separately. Right now, I have a working video stream, yet don't have the audio working yet. I'm unsure of how to access the microphone, stream it using TCP, and then play it on the other user's speakers as I'm relatively new to c# and brand new to using media. </p>
  
  <p>If anyone could point me towards sample code, help me know how to access the mic, or anything else you think would help me, that'd be great. </p>
  
  <p>I'm attaching my code as is for reference. </p>
  
  <p>WEBCAM.cs</p>
  
  <pre><code>using System;
  using System.IO;
  using System.Linq;
  using System.Text;
  using WebCam_Capture;
  using System.Windows.Controls;
  using System.Collections.Generic;
  using System.Windows.Media.Imaging;
  using System.Net;
  using System.Net.Sockets;
  using System.Windows; 
  
  namespace DuckTalk
  {
  
  class WebCam
  {       
      const int TEXT_VIDEO_NUM = 45674;
      private System.Windows.Controls.TextBox _hostIpAddressBox;
  
  
      private WebCamCapture webcam;
      private int FrameNumber = 30;
  
  
  
  
  
      public void InitializeWebCam(ref System.Windows.Controls.TextBox hostIpAddressBox)
      {
  
          webcam = new WebCamCapture();
          webcam.FrameNumber = ((ulong)(0ul));
          webcam.TimeToCapture_milliseconds = FrameNumber;
          webcam.ImageCaptured += new WebCamCapture.WebCamEventHandler(webcam_ImageCaptured);
  
  
          _hostIpAddressBox = hostIpAddressBox;            
      }
  
  
  
      void webcam_ImageCaptured(object source, WebcamEventArgs e)
      {
          TcpClient connection = null;
          NetworkStream stream = null;
          byte[] imgBytes;
  
          try
          {
              //Set up IPAddress
              IPAddress ipAddress = IPAddress.Parse(_hostIpAddressBox.Text);
              IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, TEXT_VIDEO_NUM);
  
              //Connect to TCP
              connection = new TcpClient();
              connection.Connect(ipLocalEndPoint);
  
              // Get a client stream for reading and writing. 
              stream = connection.GetStream();
  
              //Send image as bytes
              imgBytes = ImageByteConverter.ImageToBytes((System.Drawing.Bitmap)e.WebCamImage);
              stream.Write(imgBytes, 0, imgBytes.Length);
          }
          catch (Exception error)
          {
              MessageBox.Show("ERROR: " + error.Message);
          }
          finally
          {
              // Close everything.
              if (connection != null)
                  connection.Close();
  
              if (stream != null)
                  stream.Close();
          }            
      }
  
  
      public void Start()
      {
          webcam.TimeToCapture_milliseconds = FrameNumber;
          webcam.Start(0);
      }
  
  
      public void Stop()
      {
          webcam.Stop();
      }
  
  }
  }
  </code></pre>
  
  <p>ImageByteConverter.cs</p>
  
  <pre><code>using System;
  using System.IO;
  using System.Linq;
  using System.Text;
  using System.Drawing;
  using System.Collections.Generic;
  using System.Windows.Media.Imaging;
  
  
  namespace DuckTalk
  {
  class ImageByteConverter
  {               
      public static byte[] ImageToBytes(System.Drawing.Bitmap bitmap)
      {
          byte[] byteArray;
  
          using (MemoryStream stream = new MemoryStream())
          {
              bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
              stream.Close();
  
              byteArray = stream.ToArray();
          }
  
          return byteArray;
      }
  
      public static BitmapImage BytesToImage(byte[] imgBytes)
      {
          var image = new BitmapImage();
  
          image.BeginInit();
          image.StreamSource = new System.IO.MemoryStream(imgBytes);
          image.EndInit();
  
          return image;
      }
  }
  }
  </code></pre>
  
  <p>Window1.xaml.cs</p>
  
  <pre><code>using System;
  using System.Collections.Generic;
  using System.Linq;
  using System.Text;
  using System.Windows;
  using System.Windows.Controls;
  using System.Windows.Data;
  using System.Windows.Documents;
  using System.Windows.Input;
  using System.Windows.Media;
  using System.Windows.Media.Imaging;
  using System.Windows.Navigation;
  using System.Windows.Shapes;
  using System.ComponentModel;
  using System.Net;
  using System.Net.Sockets;
  
  namespace DuckTalk
  {
  /// &lt;summary&gt;
  /// Interaction logic for Window1.xaml
  /// &lt;/summary&gt;
  public partial class MainWindow : Window
  {
      const int TEXT_PORT_NUM = 45673;
      const int TEXT_VIDEO_NUM = 45674;
      WebCam webcam;
  
      public MainWindow()
      {
          InitializeComponent();
      }
  
      private void mainWindow_Loaded(object sender, System.Windows.RoutedEventArgs e)
      {
          webcam = new WebCam();
          webcam.InitializeWebCam(ref xaml_hostTextBox);
  
          var _backgroundIMWorker = new BackgroundWorker();
          var _backgroundVidWorker = new BackgroundWorker();
  
          _backgroundIMWorker.WorkerReportsProgress = true;
          _backgroundVidWorker.WorkerReportsProgress = true;
  
          // Set up the Background Worker Events
          _backgroundIMWorker.DoWork += new DoWorkEventHandler(keepListeningForInstantMessages);
          _backgroundVidWorker.DoWork += new DoWorkEventHandler(keepListeningForVideoMessages);
  
          // Run the Background Workers
          _backgroundIMWorker.RunWorkerAsync();
          _backgroundVidWorker.RunWorkerAsync(); 
      }
  
      ///////////////////////////////////////////////////////////////////////////////////////////////
      //
      //
      //  The next 2 functions take care of the instant messaging part of the program
      //
      //
      //
      ///////////////////////////////////////////////////////////////////////////////////////////////
      private void keepListeningForInstantMessages(object sender, DoWorkEventArgs e)
      {
          Action&lt;string&gt; displayIncomingMessage = (incomingMsg) =&gt;
          {
              xaml_incomingTextBox.Text += "\n\nINCOMING MESSAGE:   " + incomingMsg;
              xaml_incomingTextScroll.ScrollToBottom();
          };
  
          Socket connection;
          Byte[] data;
          String msg;
  
          // create the socket
          Socket listenSocket = new Socket(AddressFamily.InterNetwork,
                                           SocketType.Stream,
                                           ProtocolType.Tcp);
  
          // bind the listening socket to the port
          IPEndPoint ep = new IPEndPoint(IPAddress.Any, TEXT_PORT_NUM);
          listenSocket.Bind(ep);
  
          while (true)
          {
              msg = "";
              data = new Byte[3000];
  
              // start listening
              listenSocket.Listen(1);
  
              //Received a connection
              connection = listenSocket.Accept();
  
              //Get Data
              connection.Receive(data);
  
              //Get the message in string format
              msg = System.Text.Encoding.Default.GetString(data);
              msg = msg.Substring(0,msg.IndexOf((char)0));
  
              //Send message to the UI
              xaml_incomingTextBox.Dispatcher.BeginInvoke(displayIncomingMessage, msg);
  
              connection.Close();
          }
      }//end of keepListeningForInstantMessages
  
      void SendInstantMsg(object sender, RoutedEventArgs e)
      {
          TcpClient connection = null;
          NetworkStream stream = null;
          byte[] data;
  
          xaml_incomingTextBox.Text += "\n\nOUTGOING MESSAGE:   " + xaml_outgoingTextBox.Text;
  
          try
          {
              //Set up IPAddress
              IPAddress ipAddress = IPAddress.Parse(xaml_hostTextBox.Text);
              IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, TEXT_PORT_NUM);
  
              //Connect to TCP
              connection = new TcpClient();
              connection.Connect(ipLocalEndPoint);
  
              //Convert text to bytes
              data = System.Text.Encoding.ASCII.GetBytes(xaml_outgoingTextBox.Text);                               
  
              // Get a client stream for reading and writing. 
              stream = connection.GetStream();
  
              // Send the message to the connected TcpServer. 
              stream.Write(data, 0, data.Count());
  
              xaml_outgoingTextBox.Text = "";
          }
          catch (Exception error)
          {
              MessageBox.Show("ERROR: " + error.Message);
          }
          finally
          {
              // Close everything.
              if (connection != null)
                  connection.Close();
  
              if (stream != null)
                  stream.Close();
          }
      }//end of SendInstantMsg
  
      ///////////////////////////////////////////////////////////////////////////////////////////////
      //
      //
      //  The next 2 functions take care of the video part of the program
      //
      //
      //
      ///////////////////////////////////////////////////////////////////////////////////////////////
      private void keepListeningForVideoMessages(object sender, DoWorkEventArgs e)
      {
          Action&lt;Byte[]&gt; displayIncomingVideo = (incomingImgBytes) =&gt;
          {
              xaml_incomingVideo.Source = ImageByteConverter.BytesToImage(incomingImgBytes);
          };
  
          Socket connection;
          Byte[] incomingBytes;
          Byte[] data;
          int offset;
          int numOfBytesRecieved;
  
          // create the socket
          Socket listenSocket = new Socket(AddressFamily.InterNetwork,
                                           SocketType.Stream,
                                           ProtocolType.Tcp);
  
          // bind the listening socket to the port
          IPEndPoint ep = new IPEndPoint(IPAddress.Any, TEXT_VIDEO_NUM);
          listenSocket.Bind(ep);
  
          while (true)
          {
              offset = 0;
              numOfBytesRecieved = -1;
              incomingBytes = new Byte[300000];
  
              // start listening
              listenSocket.Listen(1);
  
              //Received a connection
              connection = listenSocket.Accept();
  
              //Get all the data from the connection stream
              while (numOfBytesRecieved != 0)
              {
                  numOfBytesRecieved = connection.Receive(incomingBytes, offset, 10000, SocketFlags.None);
  
                  offset += numOfBytesRecieved;
              }
  
              data = new Byte[offset];
              Array.Copy(incomingBytes, data, offset);
  
              //Send image to the UI
              xaml_incomingTextBox.Dispatcher.BeginInvoke(displayIncomingVideo, data);
  
              connection.Close();
          }
      }//end of keepListeningForVideoMessages
  
  
      private void SendVideoMsg(object sender, RoutedEventArgs e)
      {
          xaml_incomingVideo.Visibility   = Visibility.Visible;
          xaml_StopVideoButton.Visibility = Visibility.Visible;
          xaml_SendTextButton.Visibility  = Visibility.Hidden;
          webcam.Start(); 
      }
  
  
      private void StopVideoMsg(object sender, RoutedEventArgs e)
      {
          xaml_incomingVideo.Visibility   = Visibility.Hidden;
          xaml_StopVideoButton.Visibility = Visibility.Hidden;
          xaml_SendTextButton.Visibility  = Visibility.Visible;
          webcam.Stop();
      }
  
  }//end of Class
  }//end of NameSpace
  </code></pre>