先有你MM的录音吧?转成wave格式的,这会吧?
在VC中新建一个空的win32项目,然后添加一个资源,把wave文件加进去,取个ID:MY_WAVE
新建一个CPP文件叫WinMain.cpp,然后添加到源文件文件夹里,在里面写下面的代码:
#include <windows.h>
int WinMain( HINSTANCE hInstance, HINSTANCE, LPSTR, int )
{
return PlaySound( MAKEINTRESOURCE(MY_WAVE), hInstance, SND_RESOURCE|SND_NOWAIT );
}
编译运行就好了
BOOL PlayResource(LPSTR lpName)
{
BOOL bRtn;
LPSTR lpRes;
HANDLE hResInfo, hRes;
// Find the WAVE resource.
hResInfo = FindResource(hInst, lpName, "WAVE");
if (hResInfo == NULL)
return FALSE;
// Load the WAVE resource.
hRes = LoadResource(hInst, hResInfo);
if (hRes == NULL)
return FALSE;
// Lock the WAVE resource and play it.
lpRes = LockResource(hRes);
if (lpRes != NULL) {
bRtn = sndPlaySound(lpRes, SND_MEMORY | SND_SYNC |
SND_NODEFAULT);
UnlockResource(hRes);
}
else
bRtn = 0;
// Free the WAVE resource and return success or failure.
FreeResource(hRes);
return bRtn;
}
===============
PlaySound("C://SOUNDS//BELLS.WAV", NULL, SND_SYNC);
下面这段程序可以在Windows的控制台窗口中播放mp3,支持列表。编译一下就可以运行。
class Globals
{
public:
//## Constructors
Globals(){};
//## Destructor
virtual ~Globals(){};
//## Other Operations (specified)
// This method copies a file.
static bool copyFile (const CString& sourceFilename, const CString& destinationFilename);
//## This method removes a file.
static void removeFile (const CString& filename);
};
class Player
{
public:
//## Constructors
Player(){ srand( (unsigned)time( NULL ) );};
//## Destructor
~Player(){};
//## Other Operations (specified)
#define MAX_FILES 10000
void printinfo ();
void printerror (char * programname);
long fillplaylist (CString& file);
void playmp3(long entries, bool randomplay, bool copy);
protected:
private:
CString playlist[MAX_FILES];
int randomindex[MAX_FILES];
};
#include <stdlib.h>
#include <conio.h>
#include <io.h>
#include <stdio.h>
#include <time.h>
#include <iostream.h>
#include <afx.h>
#include <fstream.h>
#include <mmsystem.h>
#include <winbase.h>
void main (int ArgC, char *ArgV[])
{
Player play;
long entries;
bool randomplay = false;
bool copy = false;
int LV_Option;
play.printinfo ();
if (ArgC < 2)
play.printerror(ArgV[0]);
for(int i = 2; i<ArgC; i++)
{
if(strlen(ArgV[i]) == 1)
{
LV_Option = ArgV[i][0];
switch (LV_Option)
{
case 'r': randomplay = true;
cout << "Note: Playing titles in random order." << endl;
break;
case 'c': copy = true;
cout << "Note: Copy files before playing." << endl;
break;
}
}
}
entries=play.fillplaylist((CString) ArgV[1]);
if (entries > 0)
play.playmp3(entries,randomplay,copy);
cout << "End reached, program terminated normally."<< endl;
};
bool Globals::copyFile (const CString& sourceFilename, const CString& destinationFilename)
{
const int BUF_SIZE = 10480;
ifstream sourceFile;
ofstream destinationFile;
unsigned char *buffer = NULL;
errno = 0;
//cout << "copy file: " << sourceFilename << " to " << destinationFilename<< endl;
sourceFile.open((const char *)sourceFilename,ios::nocreate);
if (sourceFile.fail())
{
cout << "Error opening source file: " << sourceFilename << " Reason: " << strerror(errno) << endl;
return false;
}
sourceFile.setmode(filebuf::binary);
destinationFile.open((const char *)destinationFilename);
if (destinationFile.fail())
{
cout << "Error opening destination file: " << destinationFilename << " Reason: " << strerror(errno) << endl;
return false;
}
destinationFile.setmode(filebuf::binary );
buffer = new unsigned char[BUF_SIZE];
while (!sourceFile.eof())
{
sourceFile.read(buffer, BUF_SIZE);
if ((sourceFile.fail()) && (!sourceFile.eof()))
{
delete buffer;
cout << "Error reading source file: " << sourceFilename << " Reason: " << strerror(errno) << endl;
return false;
}
if (sourceFile.eof())
destinationFile.write(buffer, sourceFile.gcount());
else
destinationFile.write(buffer, BUF_SIZE);
if (destinationFile.fail())
{
delete buffer;
cout << "Error writing to destination file: " << destinationFilename << " Reason: " << strerror(errno) << endl;
return false;
}
} // End-while (!sourceFile.eof())
sourceFile.close();
destinationFile.close();
delete buffer;
return true;
}
void Globals::removeFile (const CString& filename)
{
//cout << "remove file: " << filename << endl;
if (filename.GetLength() > 0)
{
errno = 0;
if (remove((const char *)filename) != 0)
{
cout << "Error deleting file: " << filename << " Reason: " << strerror(errno) << endl;
exit (-1);
}
}
}
void Player::printinfo ()
{
cout << "==========================================================================" << endl;
cout << "=== Simple mp3 player for WIN-DOS ===" << endl;
cout << "=== Version 1.2 ===" << endl;
cout << "=== R. Luff - (c)DG2HL ([email protected]) (http://visumod.freeshell.org) ===" << endl;
cout << "==========================================================================" << endl <<endl;
}
void Player::printerror (char * programname)
{
cout << "Usage: " << programname << " listfile.lst/m3u, *.mp3 or mp3file.mp3 [r] [c]" << endl << endl;
cout << "Options:" << endl;
cout << "r: random play." << endl;
cout << "c: copy file temporary to hard disk before playing." << endl;
cout << "e.g. " << programname << " c://music//playlist.m3u r" << endl;
cout << "plays titles from playlist file playlist.m3u in random order, do not copy file." << endl << endl;
cout << "During execution press:" << endl;
cout << "q to terminate the program." << endl;
cout << "s to skip a song, the program will continue with the next song in playlist." << endl;
cout << "p for pause mode, press any key to continue playing." << endl;
exit (-1);
}
long Player::fillplaylist (CString& file)
{
long lv_entries = 0;
long i = 0;
if ((file.Find( ".lst" ) > 0 ) || (file.Find( ".m3u" ) > 0 ))
{
//load a playlist
char buffer[200];
ifstream ifile (file);
if (!ifile.fail())
{
cout << "Loading list file: " << file << " .....";
while ((!ifile.eof()) && (i < MAX_FILES))
{
ifile.getline(buffer,sizeof(buffer));
if (buffer[0] != '#')
{
playlist[i] = buffer;
i++;
}
}
cout << " done!" << endl;
lv_entries = i-1;
}
else
{
cout << "Error loading list-file" << endl;
exit (-1);
}
}
if (file.Find(".mp3") > 0)
{
cout << "Getting playlist from directory: " << file << " .....";
//load the directory
struct _finddata_t c_file;
long hFile;
int lastslash;
CString path ="";
//a path given ?? separate it
lastslash = file.ReverseFind('//');
if (lastslash > 0)
{
path = file.Left(lastslash+1);
}
// Find first file in current directory
if( (hFile = _findfirst( file, &c_file )) == -1L )
{
cout << endl << "No file: " << file << " found !" << endl;
exit (-1);
}
else
{
playlist[i] = path + c_file.name;
/* Find the rest of the files */
while( _findnext( hFile, &c_file ) == 0 )
{
i++;
playlist[i] = path + c_file.name;
}
_findclose( hFile );
lv_entries = i+1;
}
cout << " done!" << endl;
}
for ( i = 0; i < lv_entries; i++ )
{
randomindex[i] = 0;
}
return lv_entries;
}
<接上>
void Player::playmp3(long entries, bool randomplay, bool copy)
{
long i;
long stop = 0;
long random;
int ch;
CString title;
//this path is exists everywhere and prevents me to search environment variables
CString tmpplayfile = "c://mp3player.mp3";
CString mci_command;
bool OK;
LPTSTR lpszReturnString =" ";
DWORD fdwError = 0;
UINT cchErrorText=50;
i = 0;
do
{
if (randomplay)
{
do
{
//play playlist in random order, but play all titles once
random = rand()%entries;
}
while (randomindex[random] != 0);
randomindex[random] = 1;
title = playlist[random];
}
else
{
//play playlist in normal order
title = playlist[i];
}
i = i + 1;
OK = false;
if (copy)
{
OK = Globals::copyFile(title, tmpplayfile);
}
else
{
//when the file do not needed to copy, mciSendString do not like the long names with spaces, convert it:
char buf[256];
if (GetShortPathName( title, buf, 256 ) > 0)
{
tmpplayfile = buf;
OK = true;
}
}
if (OK)
{
ch = ' ';
cout << "Playing: " << title << " " << i << " of " << entries << endl;
mci_command = "open ";
mci_command += tmpplayfile;
mci_command += " type MPEGVideo Alias Mp3 wait";
//mciSendString("open c://TEMP//player//Debug//a.mp3 type MPEGVideo Alias Mp3", "", 0, 0);
mciSendString(mci_command, "", 0, 0);
mciSendString("play Mp3", "", 0, 0);
fdwError = mciSendString("status Mp3 mode",lpszReturnString,50, 0);
while ((strcmp(lpszReturnString,"playing") == 0) && (stop == 0))
{
Sleep(2000);
fdwError = mciSendString("status Mp3 mode",lpszReturnString,50, 0);
//mciGetErrorString(fdwError, lpszReturnString, cchErrorText );
if( _kbhit() )
{
ch = _getch();
ch = toupper( ch );
if (ch == 'Q')
{
cout << "Note: Normal termination by user. Playlist not completely finnished" << endl;
stop = 1;
}
if (ch == 'S')
{
cout << "Note: Song skipped by user" << endl;
stop = 1;
}
if (ch == 'P')
{
mciSendString("pause Mp3", "", 0, 0);
cout << "Note: Pause, press any key to continue" << endl;
ch = _getch();
mciSendString("play Mp3", "", 0, 0);
}
}
//cout << "TEST>>" << lpszReturnString<< "<<TEST" << endl;
}
mciSendString("close Mp3 wait", "", 0, 0);
stop = 0;
if (copy)
Globals::removeFile(tmpplayfile);
else
Sleep(2000);
}
//check if q buttom has been pressed on keyboard
}
while (i != entries && ch != 'Q' );
}