答loveMFC19760708问

原创 2005年05月27日 12:38:00

先有你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 (rluff@gmx.de) (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' );
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

百问百答.doc

  • 2013年08月28日 10:01
  • 351KB
  • 下载

GIS坐标问题(百问百答)

  • 2015年11月03日 10:18
  • 101KB
  • 下载

操作系统基础训练十问十答

Q:简述Linux进程内存空间分为哪几个段?作用分别是什么? A:Linux中的进程内存空间分为“数据段”、“代码段”和“堆栈段”三段。 “数据段”存放的是全局变量、常数以及动态数据分配的数据空间...

C++百问百答(面试、考试相关)

  • 2011年04月20日 14:12
  • 308KB
  • 下载

ASP.NET百问百答

  • 2007年04月08日 15:14
  • 2.1MB
  • 下载

答学生问:研究生的论文工作需要创新吗?

 http://blog.sciencenet.cn/blog-53846-323785.html 某学生在我的上一篇博文中留言如下: 您好,我是计算机学院的研究生,之前对您的感觉一直是您学...

asp.net百问百答

  • 2007年04月18日 09:48
  • 384KB
  • 下载

6.09参考资料_EAS BOSV540百问百答

  • 2011年07月14日 21:36
  • 6.49MB
  • 下载

神经网络有什么理论支持? 本文作者:AI研习社 2017-11-08 18:30 导语:问:神经网络有什么理论支持? 答:目前为止(2017 年)没有什么特别靠谱的。 雷锋网按:本文原作者袁洋

神经网络有什么理论支持? 雷锋网按:本文原作者袁洋,本文原载于作者的知乎专栏——理论与机器学习。雷锋网已获得转载授权。 三秒钟理解本文主旨: 问:神经网络有什么理论支持? 答:目前为止(2...

android开发入门十问十答

  • 2012年04月23日 10:48
  • 32KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:答loveMFC19760708问
举报原因:
原因补充:

(最多只允许输入30个字)