Microsoft has given ability to its development tool to suit the requirement as per developer wish. I had a requirement which needs to play multiple instances of media player on a single monitor. As a feature we know Media player can have only one instance running at a time. So I was scratching my head and finally a solution struck me, which is embedding multiple Media player instances on a single Win Form.
I've used C#.net and Windows Media Player library to solve the problem. Let's a have a look in the below sample program, the code is quite self explanatory. This sample code created an array of 2 Windows Media player instances and playing two audio (mp3) files simultaneously.
The Recreate button destroys the previous instances and creates two more new one. This is a very basic code and it can be modified as per more complex requirement. However, running large number of multiple instances of Windows Media Player isn't advisable.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using AxWMPLib;
using WMPLib;
using System.Runtime.InteropServices;
namespace MediaPlayerDemo
{
public partial class Form1 : Form
{
AxWindowsMediaPlayer[] player;
private IWMPMedia theMedia;
private IWMPPlaylist mediaPlaylist;
public Form1()
{
InitializeComponent();
CreateMediaPlayer(2);
}
private void CreateMediaPlayer(int numOfPlayer)
{
this.player = new AxWindowsMediaPlayer[numOfPlayer];
for (int i = 0; i < numOfPlayer; i++)
{
player[i] = new AxWindowsMediaPlayer();
((System.ComponentModel.ISupportInitialize)(this.player[i])).BeginInit();
// Player
this.player[i].Enabled = true;
this.player[i].Location = new System.Drawing.Point((24 + (i*200)), 8);
this.player[i].Name = "Player";
this.player[i].Size = new System.Drawing.Size(192, 152);
this.player[i].TabIndex = 0;
this.player[i].TabStop = false;
this.player[i].PlayStateChange += new AxWMPLib.
_WMPOCXEvents_PlayStateChangeEventHandler(this.Player_PlayStateChange);
this.Controls.Add(this.player[i]);
((System.ComponentModel.ISupportInitialize)(this.player[i])).EndInit();
if (i == 0)
{
mediaPlaylist = player[i].mediaCollection.getByAttribute("MediaType", "audio");
}
theMedia = mediaPlaylist.get_Item(i);
player[i].currentMedia = theMedia;
}
}
private void Player_PlayStateChange(object sender, AxWMPLib.
_WMPOCXEvents_PlayStateChangeEvent e)
{
WMPPlayState newState = (WMPPlayState)e.newState;
switch (newState)
{
case WMPPlayState.wmppsBuffering:
break;
case WMPPlayState.wmppsMediaEnded:
break;
case WMPPlayState.wmppsPaused:
break;
case WMPPlayState.wmppsPlaying:
break;
case WMPPlayState.wmppsReady:
break;
case WMPPlayState.wmppsReconnecting:
break;
case WMPPlayState.wmppsScanForward:
break;
case WMPPlayState.wmppsScanReverse:
break;
case WMPPlayState.wmppsStopped:
break;
case WMPPlayState.wmppsTransitioning:
break;
case WMPPlayState.wmppsWaiting:
break;
default:
break;
}
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < player.Length; i++)
{
if (player[i] != null)
{
player[i].Ctlcontrols.stop();
if (player[i].playState == WMPLib.WMPPlayState.wmppsStopped)
{
player[i].close();
this.player[i].PlayStateChange -= new AxWMPLib.
_WMPOCXEvents_PlayStateChangeEventHandler(this.Player_PlayStateChange);
Marshal.FinalReleaseComObject(player[i].currentMedia);
Marshal.FinalReleaseComObject(player[i].mediaCollection);
Marshal.FinalReleaseComObject(player[i].playlistCollection);
Marshal.FinalReleaseComObject(player[i].Ctlcontrols);
Marshal.FinalReleaseComObject(player[i].currentPlaylist);
player[i].Dispose();
player[i] = null;
this.Controls.Remove(player[i]);
}
}
}
Marshal.FinalReleaseComObject(mediaPlaylist);
player = null;
GC.Collect();
CreateMediaPlayer(2);
}
}
}
I've used C#.net and Windows Media Player library to solve the problem. Let's a have a look in the below sample program, the code is quite self explanatory. This sample code created an array of 2 Windows Media player instances and playing two audio (mp3) files simultaneously.
The Recreate button destroys the previous instances and creates two more new one. This is a very basic code and it can be modified as per more complex requirement. However, running large number of multiple instances of Windows Media Player isn't advisable.
using System;
using System.Collections.Generic;
using System.Windows.Forms;
using AxWMPLib;
using WMPLib;
using System.Runtime.InteropServices;
namespace MediaPlayerDemo
{
public partial class Form1 : Form
{
AxWindowsMediaPlayer[] player;
private IWMPMedia theMedia;
private IWMPPlaylist mediaPlaylist;
public Form1()
{
InitializeComponent();
CreateMediaPlayer(2);
}
private void CreateMediaPlayer(int numOfPlayer)
{
this.player = new AxWindowsMediaPlayer[numOfPlayer];
for (int i = 0; i < numOfPlayer; i++)
{
player[i] = new AxWindowsMediaPlayer();
((System.ComponentModel.ISupportInitialize)(this.player[i])).BeginInit();
// Player
this.player[i].Enabled = true;
this.player[i].Location = new System.Drawing.Point((24 + (i*200)), 8);
this.player[i].Name = "Player";
this.player[i].Size = new System.Drawing.Size(192, 152);
this.player[i].TabIndex = 0;
this.player[i].TabStop = false;
this.player[i].PlayStateChange += new AxWMPLib.
_WMPOCXEvents_PlayStateChangeEventHandler(this.Player_PlayStateChange);
this.Controls.Add(this.player[i]);
((System.ComponentModel.ISupportInitialize)(this.player[i])).EndInit();
if (i == 0)
{
mediaPlaylist = player[i].mediaCollection.getByAttribute("MediaType", "audio");
}
theMedia = mediaPlaylist.get_Item(i);
player[i].currentMedia = theMedia;
}
}
private void Player_PlayStateChange(object sender, AxWMPLib.
_WMPOCXEvents_PlayStateChangeEvent e)
{
WMPPlayState newState = (WMPPlayState)e.newState;
switch (newState)
{
case WMPPlayState.wmppsBuffering:
break;
case WMPPlayState.wmppsMediaEnded:
break;
case WMPPlayState.wmppsPaused:
break;
case WMPPlayState.wmppsPlaying:
break;
case WMPPlayState.wmppsReady:
break;
case WMPPlayState.wmppsReconnecting:
break;
case WMPPlayState.wmppsScanForward:
break;
case WMPPlayState.wmppsScanReverse:
break;
case WMPPlayState.wmppsStopped:
break;
case WMPPlayState.wmppsTransitioning:
break;
case WMPPlayState.wmppsWaiting:
break;
default:
break;
}
}
private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < player.Length; i++)
{
if (player[i] != null)
{
player[i].Ctlcontrols.stop();
if (player[i].playState == WMPLib.WMPPlayState.wmppsStopped)
{
player[i].close();
this.player[i].PlayStateChange -= new AxWMPLib.
_WMPOCXEvents_PlayStateChangeEventHandler(this.Player_PlayStateChange);
Marshal.FinalReleaseComObject(player[i].currentMedia);
Marshal.FinalReleaseComObject(player[i].mediaCollection);
Marshal.FinalReleaseComObject(player[i].playlistCollection);
Marshal.FinalReleaseComObject(player[i].Ctlcontrols);
Marshal.FinalReleaseComObject(player[i].currentPlaylist);
player[i].Dispose();
player[i] = null;
this.Controls.Remove(player[i]);
}
}
}
Marshal.FinalReleaseComObject(mediaPlaylist);
player = null;
GC.Collect();
CreateMediaPlayer(2);
}
}
}
Comments