Click here to Skip to main content
15,885,278 members
Articles / Desktop Programming / MFC
Article

Media Player

Rate me:
Please Sign up or sign in to vote.
1.25/5 (73 votes)
20 Sep 2003CPOL1 min read 256.7K   11.9K   52   46
Its a media player which plays all media audio and video files.

Sample image

Sample image

Introduction

Media Player

This is a simple media player which plays all audio and video formats .I am updating it becouse there were many of many complaints about it . Actually i had not time to do it , now found some ,so updating it . It uses Media Control Interface(MCI) Functions in the MFC .It is very simple , that is we only have to give the path and file name and other parameters to the function and the function will play that file .

Description

First the file names are taken from the user using the file dialog .These file name are stored in an array of CString type Files[Index] ; Index is the the index of files .Multiple files can be selected at a time . Now to Create window of playing the file is created in the following  function

MC++
void CMP3Dlg::CreateWindowplay(CString str)
{
if(m_Video!=NULL)    // m_video is handler of HWND type which is 
MC++
			//checked wether it has already some window data 
OnFileClose();  
m_Path=str;
MCIWndRegisterClass();
KillTimer(0);
SetTimer(0,1000,NULL);   //  Set Timer 
m_Path=str;
if(m_Video == NULL &&flag==0)
{
m_Video =MCIWndCreate(m_screen.GetSafeHwnd(),AfxGetInstanceHandle()
MC++
,MCIWNDF_NOOPEN|MCIWNDF_NOPLAYBAR |MCIWNDF_NOMENU,m_Path);   
MC++
// Create the Window for playing m_Path  is file name
::ShowWindow(m_Video,SW_MAXIMIZE);
}
m_SVolume.SetRange( 0, 1000, TRUE );  // Set Slider range
m_SVolume.SetPos(500);   // Set volume Position initially 
m_mute.SetCheck(1);  // Set Checked the Volume check box 
ptr=FromHandle(m_Video);   // Get handler of Window created 
ptr->UpdateWindow();

MCIWndSetTimeFormat(m_Video ,"ms");   // Set time Format 
m_length=MCIWndGetLength(m_Video );   // Get Video Length
TotalTime=m_length/1000;
TotalTime=TotalTime/100;
m_Seek.SetRange( 0, m_length, TRUE );   // Set Seek slider bar range
m_Seek.SetPos(0);
MCIWndPlay(m_Video);   // Play the File
flag=1;
UpdateData(FALSE);
MCIWndSetVolume(m_Video, m_Volume);   // Set Volume to m_Volume 
e=0; // Check for previus created window
}

So now Our window is created and file is played . Now there is a option for pause that is

void CMP3Dlg::Onpause() 
{
// TODO: Add your control notification handler code here
if(flag==0)
{
flag=1;
MCIWndResume(m_Video);

}
else
{
flag=0;
MCIWndPause(m_Video);

}

}
to stop 
MCIWndSeek(m_Video,MCIWND_START);

To move to next file ,

OnFileClose() ;
SongNo++;
if(Files[SongNo]!="" )
{
CreateWindowplay(Files[SongNo]);  // again Create the window 
MCIWndPlay(m_Video);
flag=1;
}
else 
if(Index==0)
OnOpen();
else 
{
SongNo=0;
OnPlayPrevius() ;   // check if Index is full play previous 
}
}
The is a Implemenation for CD ROM door open and close . this is done as ,
// mciSendString("set cdaudio door open",NULL,NULL,NULL);

To Increase the Speed of Play

int a;
a=MCIWndGetSpeed(m_Video);
a=a+200;
if(a<2000)
MCIWndSetSpeed(m_Video,a);

Similarly there is a function to decrease the speed

For full screen option,  there is another dialog upon which the window is created . The dialog is maximized so full screen is got . It is done as

void CMP3Dlg::OnViewFullscreen() 
{
// TODO: Add your command handler code here
FullScreen=1;   // flag of full screen , Mode is Full screen
KillTimer(0);   // Kill timer
MCIWndDestroy(m_Video);  // destroy previous window 

// Now save the Context of Current file for full screen through FS object of 
//FullScreen Dialog
FS.SeekPos=SeekPos;   // Get seek position of previous window for new dialog 
 			//(Full screen)
FS.m_Volume=m_Volume;   // Get 
FS.m_Path=m_Path;
FS.DoModal();           // Create New dialog
SeekPos=FS.SeekPos;  // Return Back to Normal size and get New 
      			//Context from Full screen 
if(SeekPos==m_length )
{
if( repeat==1) 
{
OnPlayNext();    // Check whether the file has ended or seek is at end so 
                 //next file will also be played in the full //screen mode
Onfullscreen() ;
}
else
{
OnFileClose();
}

}
else
{
SetTimer(0,1000,NULL);

flag=1;   // Re-create Window for normal size play   
m_Video=MCIWndCreate(m_screen.GetSafeHwnd(),AfxGetInstanceHandle(),
MCIWNDF_NOOPEN|MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU ,m_Path);
::ShowWindow(m_Video,SW_MAXIMIZE);  // Restore the all Conext , volume value 
					//, seek postion ,,etc
MCIWndSetVolume(m_Video,m_Volume);
MCIWndSetTimeFormat(m_Video ,"ms");
MCIWndSetActiveTimer(m_Video,500);
ptr=FromHandle(m_Video);
m_length=MCIWndGetLength(m_Video); 
m_Seek.SetRange(0,m_length,TRUE);
MCIWndPlay(m_Video);
flag=1;
MCIWndSeek(m_Video,SeekPos);
MCIWndPlay(m_Video);
FullScreen=0;
ptr->UpdateWindow();
}
}
Now In new dialog Create Window and play according to previous context,
We will do it in the ShowWindow Function which is called first time when the
 dialog is created .
void FScreen::OnShowWindow(BOOL bShow, UINT nStatus) 
{
CDialog::OnShowWindow(bShow, nStatus);
CWnd* desk=GetDesktopWindow();  // Get the Desktop window's pointer
RECT re;
desk->GetClientRect(&re);
SetTimer(0,1000,NULL);
::ShowWindow(this->GetSafeHwnd(),SW_MAXIMIZE);   // Maximize window
// Now Create window for playing the file 
m_Video=MCIWndCreate(this->GetSafeHwnd(),AfxGetInstanceHandle(),
MCIWNDF_NOOPEN|MCIWNDF_NOPLAYBAR|MCIWNDF_NOMENU ,m_Path);
::ShowWindow(m_Video,SW_MAXIMIZE);  // Now set the previous saved context 
MCIWndSetTimeFormat(m_Video ,"ms");
MCIWndSetVolume(m_Video, m_Volume);
MCIWndSetActiveTimer(m_Video,500);
MCIWndSeek(m_Video,SeekPos);
MCIWndPlay(m_Video);
Length=MCIWndGetLength(m_Video);
}

We can add and remove  files to the Play list . There is another dialog for 
play list . 

To add files :

void playlist1::OnAdd() 
{
POSITION currPos;
CFileDialog avi(TRUE,NULL,NULL,OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY
,"All Files(*.*)|*.*|MP3 Files (*.mp3)|*.mp3|AVI Files(*.avi)|*.avi|");
if(avi.DoModal() == IDOK)
{
currPos = avi.GetStartPosition();
while(currPos != NULL)              // Get file names while now end of 
					//selection
{
m_Path = avi.GetNextPathName(currPos);
((CMP3Dlg *)GetParent())->Files[((CMP3Dlg*)GetParent())->m_Index]=m_Path;
m_control.AddString(m_Path);  // Add to List box
((CMP3Dlg*)GetParent())->m_Index=((CMP3Dlg*)GetParent())->m_Index+1;
}
UpdateData(FALSE);
}

}
Similary we can remove file through function 
void playlist1::OnRemove() 
{
// TODO: Add your control notification handler code here
i=m_control.GetCurSel();
m_control.DeleteString( i );
for(int j=0;j<=((CMP3Dlg*)GetParent())->m_Index;j++)
{
if(i==j)
{
((CMP3Dlg*)GetParent())->Files[i]=((CMP3Dlg*)GetParent())->Files[i+1];
for(int h=i;h<((CMP3Dlg*)GetParent())->m_Index;h++)
((CMP3Dlg*)GetParent())->Files[h]=((CMP3Dlg*)GetParent())->Files[h+1];
}
}
((CMP3Dlg*)GetParent())->m_Index--;

}

We can play a file  by double clicking on  File name

i=m_control.GetCurSel();
m_control.GetText(i,str);

if(((CMP3Dlg*)GetParent())->m_Video!=NULL)
{
MCIWndStop(((CMP3Dlg*)GetParent())->m_Video);
MCIWndDestroy(((CMP3Dlg*)GetParent())->m_Video);
((CMP3Dlg*)GetParent())->m_Video=NULL;
((CMP3Dlg*)GetParent())->m_Path=((CMP3Dlg*)GetParent())->OldFileName2; 
}
((CMP3Dlg*)GetParent())->NewFileName2=st;
((CMP3Dlg*)GetParent())->OldFilename=st;
((CMP3Dlg*)GetParent())->flag=0;
((CMP3Dlg*)GetParent())->CreateWindowplay(str);
The Shape of Dialog is got through
CRect r;
GetClientRect(r);
m_rgn.CreateEllipticRgn(04,04,r.Width(),r.Height());
SetWindowRgn(m_rgn,TRUE);
<P>
 

So thats all from me .What  could be done more in it ? that could be

1. We does not know about the file in the program ,whether its audio or video ,if audio to dont go to full screen

2. The full screen mechanism is not efficient , also it needs menu in full screen on right click .

3. Implementation of VCD cutter

and much more !!!!!!!!!!!!!

 


License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Unknown
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions

 
QuestionWindows Media Player example in win32? Pin
Member 67270830-Oct-03 2:15
Member 67270830-Oct-03 2:15 
AnswerRe: Windows Media Player example in win32? Pin
Anonymous1-Dec-03 23:44
Anonymous1-Dec-03 23:44 
GeneralError in resource Pin
FahadAsh22-Sep-03 19:09
FahadAsh22-Sep-03 19:09 
GeneralRe: Error in resource Pin
Tahir Naeem30-Sep-03 1:24
Tahir Naeem30-Sep-03 1:24 
GeneralI wouldn't call this an article. Pin
Elias Bachaalany19-Jun-03 22:17
Elias Bachaalany19-Jun-03 22:17 
GeneralHelp regarding Skin and others Pin
AYSHA SAEED22-Feb-03 4:15
AYSHA SAEED22-Feb-03 4:15 
GeneralAakhir Bahrian Hi Ho Nan,Code Nahin Dia Pin
XclusiveGuy7-Feb-03 23:16
XclusiveGuy7-Feb-03 23:16 
GeneralWelcome to CodeProject!! Pin
WREY3-Feb-03 23:47
WREY3-Feb-03 23:47 
If I were to show up one day at your door with something that looks like a chair, and all I did was left a note asking, "Have you ever dreamt of going places and not having to worry about how to get there? Worry no more. Just sit in the chair and press the button."

Would you be suspicious of such an offer? Shoot! For all you know it could be an electric chair that's going to end your life!

The point is, without more explanation about what the product is all about, and the overall benefits it's supposed to provide, not a lot of people is going to buy into what you believe is a great piece of work.

Then in addition, to not providing the source code for those who might be interested in learning more about what you're talking about, puts you at zero with regards to what you originally thought others would find useful. It amounts to nothing!

Whatever you post here at CodeProject, belongs to you! Nobody is going to steal it. You own the copyright to it, and people at CodeProject would only be too happy to give you credit for your work should they decide to use it in some other application.

There are literally thousands of very good and useful samples here at CodeProject that members have provided for others to use (and benefit from), with only the request that the user give them some sort of credit for the usefulness of their work. That's it! That's all! And it's not unreasonable for others to comply with such a request either.

If you believe you have something worthwhile to share with the other members, then we welcome it. It is then for you to provide everything necessary, if benefit is to come from it, and benefit is not just a one way process: From you to us.

By submitting your source code, you will also gain from others suggesting or advising you on a better (or different) way of doing something, pointing out errors in your work, or directing you to some other article from which you, yourself might benefit.

Cool | :cool:

William
GeneralThis could be a really interesting article if... Pin
Jim Crafton3-Feb-03 5:45
Jim Crafton3-Feb-03 5:45 
GeneralRe: This could be a really interesting article if... Pin
Tahir Naeem4-Feb-03 6:38
Tahir Naeem4-Feb-03 6:38 
GeneralRe: This could be a really interesting article if... Pin
Jim Crafton3-Jul-03 3:50
Jim Crafton3-Jul-03 3:50 
GeneralRe: This could be a really interesting article if... Pin
Tahir Naeem3-Jul-03 11:38
Tahir Naeem3-Jul-03 11:38 
GeneralRe: This could be a really interesting article if... Pin
nn_10524-Oct-05 9:12
nn_10524-Oct-05 9:12 
Questionwhere's the source? Pin
Member 101614662-Feb-03 20:56
Member 101614662-Feb-03 20:56 
AnswerRe: where's the source? Pin
Simon Brown3-Feb-03 1:42
Simon Brown3-Feb-03 1:42 
GeneralRe: where's the source? Pin
Tahir Naeem27-Jul-03 12:18
Tahir Naeem27-Jul-03 12:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.