How to play multiple audio sources simultaneously in Silverlight

Posted by Shurup on Stack Overflow See other posts from Stack Overflow or by Shurup
Published on 2010-05-05T16:26:21Z Indexed on 2010/05/07 1:18 UTC
Read the original article Hit count: 566

Filed under:
|

I want to play simultaneous multiply audio sources in Silverlight. So I've created a prototype in Silverlight 4 that should play a two mp3 files containing the same ticks sound with an intervall 1 second. So these files must be sounded as one sound if they will be played together with any whole second offsets (0 and 1, 0 and 2, 1 and 1 seconds, etc.)

I my prototype I use two MediaElement (me and me2) objects.

DateTime startTime;

private void Play_Clicked(object sender, RoutedEventArgs e) {
  me.SetSource(new FileStream(file1), FileMode.Open)));
  me2.SetSource(new FileStream(file2), FileMode.Open)));
  var timer = new DispatcherTimer { Interval = TimeSpan.FromMilliseconds(1) };
  timer.Tick += RefreshData;
  timer.Start();
}

First file should be played at 00:00 sec. and the second in 00:02 second.

void RefreshData(object sender, EventArgs e) {
    if(me.CurrentState != MediaElementState.Playing) {
      startTime = DateTime.Now;
      me.Play();
      return;
    }

    var elapsed = DateTime.Now - startTime;
    if(me2.CurrentState != MediaElementState.Playing && 
      elapsed >= TimeSpan.FromSeconds(2)) {
      me2.Play();
      ((DispatcherTimer)sender).Stop();
    }
  }

The tracks played every time different and not simultaneous as they should (as one sound).

Addition: I've tested a code from the Bobby's answer.

private void Play_Clicked(object sender, RoutedEventArgs e) { 
  me.SetSource(new FileStream(file1), FileMode.Open))); 
  me2.SetSource(new FileStream(file2), FileMode.Open)));
  // This code plays well enough.
  // me.Play(); 
  // me2.Play();

  // But adding the 2 second offset using the timer, 
  // they play no simultaneous.
  var timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(2) }; 
  timer.Tick += (source, arg) => { 
    me2.Play(); 
    ((DispatcherTimer)source).Stop(); 
  };
  timer.Start();
}

Is it possible to play them together using only one MediaElement or any implementation of MediaStreamSource that can play multiply sources?

© Stack Overflow or respective owner

Related posts about Silverlight

Related posts about audio