函数代码如下
void SoundPlay(LPCTSTR pszSound)
{
unsigned char* m_sndCrickets;
FILE *SndFile = fopen(pszSound, "r");
fseek(SndFile, 0, SEEK_END);
unsigned int uiFileSize = ftell(SndFile);
fseek(SndFile, 0, SEEK_SET);
m_sndCrickets = new unsigned char [uiFileSize];
fread(m_sndCrickets, uiFileSize, 1, SndFile);
fclose(SndFile);PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);//PlaySound(pszSound, NULL, SND_FILENAME | SND_ASYNC);}主要问题是:
PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);PlaySound(pszSound, NULL, SND_FILENAME | SND_ASYNC);
两种方法播放一个文件时,如果是使用内存播放那么就会在声音的结尾就会出现好像开关音箱的噪音
现在急需要从内存播放声音;或者你有其它方法在内存中播放声音又不会出理噪音也可以告诉我

解决方案 »

  1.   

    可以用MCIWndPlay来播放,用这个函数有个优点是可以对播放的音乐进行实时控制。其调用方法如下:
    1、首先在你的头文件中定义一个窗口句柄,来用保存音乐播放句柄:HWND m_hPlayWnd;
    2、在CPP中添加如下代码:m_hPlayWnd = MCIWndCreate(this->GetSafeHwnd(), AfxGetInstanceHandle(), WS_CHILD | MCIWNDF_NOMENU, strMusicFileName);
    if(m_hWnd == NULL)
    return;
    MCIWndPlay(m_hPlayWnd);
      

  2.   


    上述方法适合于播放一个文件,而我不是要播放一个文件,我要播放的内容不是以文件方式存在的,自己也想过最笨的方法:把内存中的播放内容存到tmp目录然后去播放文件。但这样十在即无效率又太笨,所以现在要找到一种能播放内存中数据的方法,而SND_MEMORY 可以播出声音但是多出一段噪声
      

  3.   

    估计是你的声音文件的问题,文件头记录的声音数据长度和文件中应该有的长度不一致,你可以从文件头中取出长度参数对比一下,或者找一个标准wave文件试下。
      

  4.   

    看了下代码,问题出在你的读取方式并没把数据全部读进来,噪音是后面的随机数据。
    MFC下还是CFile类要好用些
    CFile file;
    unsigned char* m_sndCrickets;
    file.Open(pszSound, CFile::modeRead|CFile::typeBinary);
    unsigned int uiFileSize = file.GetLength();
    file.Seek(0,CFile::begin); m_sndCrickets = new unsigned char [uiFileSize];
    int n=file.Read(m_sndCrickets, uiFileSize);
    PlaySound((const char *)m_sndCrickets, NULL, SND_MEMORY | SND_ASYNC|SND_NOSTOP);
    file.Close();
      

  5.   

    啊,果然,楼上的方法正解
    ,我用两种方法都根了一下:如果用
    FILE读,当读到86016 以后就全不对了,这个位置正好是84K的位置,难到
    fread(m_sndCrickets, uiFileSize, 1, SndFile); 
    参数二不能大于84K吗?值得再去查查,
      

  6.   

    终于找到真证的原因了,和soundplay根本没有关系,只是程序中少写了一个字

    FILE *SndFile = fopen(pszSound, "r"); 
    改成
    FILE *SndFile = fopen(pszSound, "rb"); 
    即可,原因是因为没有用二制制打开文件,所以seek起来有问题
    准备结帖,
    分不太多大家别嫌弃,
    再次感谢大家,特别是bottlebox帮我找到的原因所在