答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' );
}


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

Java百问

程序员经常可以通过搜索或者记忆来完成代码,但是许多时候并不真正理解为什么这样写。也就是说,有经验的程序员不会犯一些低级的错误(语法错误),但是因为不理解有可能造成一些高级错误(比如说运行无效率,代码难...
  • Mr_Data_Mining
  • Mr_Data_Mining
  • 2013年12月11日 10:46
  • 796

CI框架百问百答:让你选择的理由?让你爱上的理由?-第1问

说说我目前的情况吧:接到领导们的指令,需要开发一套WEB应用,起初建议Yii+Ext JS构建。而经过一个月的挣扎发现Yii不是我们这些小民能快速入手的。 不是因为做不出来东西,而是怕做出来的东西对...
  • haor2756
  • haor2756
  • 2013年05月28日 09:30
  • 594

问&答

  1. interface 和 abstract 的区别?abstract 可不可以继承 interface, interface 可不可以继承 interface?答案:一个是接口,一个是虚函数 ...
  • wuyingziyren
  • wuyingziyren
  • 2008年08月06日 21:29
  • 1152

答读者问

自从新书《Cisco/H3C交换机配置与管理完全手册》(第二版)上市后,就没有间断过有读者向我询问,第二版与第一版有什么区别。现在此集中对各位进行解答。    第二版与第一版的主要区别如下:    (...
  • lycb_gz
  • lycb_gz
  • 2012年02月20日 21:03
  • 1991

答师弟问

    很久前的,贴贴。   1.刚进入大学时是否满意?    比较满意。学校“当时”的学风给我印象深刻,也很符合我的口味。2.过了一段时间后又是怎样的感觉?    虽然对某些方面有些不满,然而总体感...
  • bripengandre
  • bripengandre
  • 2008年03月09日 20:26
  • 904

女孩问,男孩答

午后,慵懒的阳光洒落地面,      纵长路上,男孩骑车载着女孩.....      [你会爱我多久?]      女孩紧抱着男孩,侧着头在他耳边这样甜甜的问,      她知道,这个问题没有100分...
  • jonas20
  • jonas20
  • 2006年09月23日 09:28
  • 758

我答同行问

本片文章出自http://blog.csdn.net/andywuchuanlong,转载请说明出处,谢谢!     之前遇到同行问的一些问题,能记住的我都将其写出来,供初学者参考。问题如下:   ...
  • andywuchuanlong
  • andywuchuanlong
  • 2015年03月11日 08:50
  • 1969

问和答

.String类和StringBuffer类的区别?2.abstract 和 interface的区别?3.Collection 和Collections和区别?4.JSP中动态INCLUDE与静态I...
  • lxgood8
  • lxgood8
  • 2007年03月20日 16:42
  • 779

JAVA容器-自问自答学ArrayList

JAVA容器-自问自答学ArrayList 前言 这次我和大家一起学习HashMap,HashMap我们在工作中经常会使用,而且面试中也很频繁会问到,因为它里面蕴含着很多知识点,可...
  • huangshulang1234
  • huangshulang1234
  • 2018年02月02日 10:20
  • 56

答网友问~

window.onload = function(){ //简单模拟的一个例子,不完善,指在模拟ext的监听中的回调参数是怎么传值的 var Component = functi...
  • xiaohan1990718
  • xiaohan1990718
  • 2013年06月21日 12:46
  • 641
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:答loveMFC19760708问
举报原因:
原因补充:

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