Click here to Skip to main content
15,881,600 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.6K   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

 
Questiontoyou Pin
zhangxiangxixi6-Dec-11 1:57
zhangxiangxixi6-Dec-11 1:57 

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.