qq_35733354 2016-07-31 09:47 采纳率: 0%
浏览 1184

waveout杂音 。 帮我看下这段代码,琢磨好久没有解决

#pragma comment(lib, "winmm.lib")
#include
#include"wavheader.h"
#include
#include
#include
#include

#include
using namespace std;
#define datesize riff.dwRiffSize-44
#define buffer 1024*4
U16 *pALL_Late;
LPSTR pwaveher[3];
U16 I=-1;
static void CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg,DWORD_PTR dwInstance,DWORD_PTR dwParam1, DWORD_PTR dwParam2);

PDWORD SPEED_A;
DWORD SPEED_1;

HWAVEOUT hWaveOu;

int main(int argc, char* argv[])
{
HWAVEOUT hWaveOut=NULL;

WAVEFORMATEX wfx;

PUINT p; /* 保存id的指针 /
UINT idnew; /
id值 /
p=&idnew; /
******************************************************************************** /
LPWAVEOUTCAPSW Poutnews; /
********************************************************************************** /
WAVEOUTCAPSW OUTmew; /
/
Poutnews =& OUTmew ; /
*/
wfx.nSamplesPerSec = 44100;
wfx.wBitsPerSample = 16;
wfx.nChannels = 2;

wfx.cbSize = 0;
wfx.wFormatTag = WAVE_FORMAT_PCM;
wfx.nBlockAlign =4;
wfx.nAvgBytesPerSec =4410*4;//缓冲

waveOutGetPlaybackRate (hWaveOut,SPEED_A);
SPEED_1=(U16)SPEED_A;
//waveOutSetPlaybackRate(hWaveOut,
cout<<endl<<SPEED_1;
waveOutOpen(&hWaveOut,WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc,1, CALLBACK_FUNCTION ); //打开波形输出
if (waveOutOpen(&hWaveOut,WAVE_MAPPER, &wfx, (DWORD_PTR)waveOutProc, 0, CALLBACK_FUNCTION)==0)
{cout<<" 能打开音频设备";
};

/**//**//*/*//*******************************************************/
ifstream iofile("1.wav",ios::in|ios::binary|ios::out);//open the wav
filebuf *pbuf;
pbuf=iofile.rdbuf();

if(!iofile.is_open())
cout<<"e";

iofile.read((char*)(&riff),sizeof(riff));

iofile.read((char*)(&fmt_block),sizeof(fmt_block));
iofile.read((char*)(&fact_block),sizeof(fact_block));
iofile.read((char*)(&date_block),sizeof(date_block));
U16 *ALL_Late=new U161024*1024*50;

pbuf->sgetn ((char*)ALL_Late,1024*1024*50);

pALL_Late=ALL_Late;
iofile.close();

hWaveOu=hWaveOut;
if((fmt_block.wBitsPerSample/16))
{ U16 i;U16 MAXnumberofnew;
MAXnumberofnew=(U16) ceil( float (riff.dwRiffSize/10485760));
//////*////////
// if( fmt_block.wChannels ) //声道判断

     // {

              //   U16* left_late= new U16[datesize/2]; //16bit 数据段/*************************************************************/
            //    U16* right_late= new U16[datesize/2];//**************************************************************/


           //   U32 i;
             //     cout<<ALL_Late[1]<<endl<<ALL_Late[20];
              //    for (i=0;i< 100/2;)
               //   {

             //     U16  alllate2i=ALL_Late[2*i];
              //    U16  alllate2i_1=ALL_Late[2*i+1];
            //      left_late[i]=alllate2i;
             //     right_late[i]=alllate2i_1;
             //     i++;
            //    } ;
//  for (i=0;i<2000;)   
//{cout<<ALL_Late[i]<<" ";
 // i++;
//};

     WAVEHDR waveher[3];
     pALL_Late=ALL_Late;

     for (i=0;i<3;)
 {    


     pwaveher[i]= (LPSTR)(ALL_Late+buffer*i);

    waveher[i].dwLoops=0;


  waveher[i].dwBufferLength=buffer;
  waveher[i].dwFlags=0;
  waveher[i].lpNext=NULL;
  waveher[i].dwBytesRecorded=0;
     waveOutPrepareHeader( hWaveOut,&waveher[i],sizeof(waveher)  );



       i++;
    };
 for (i=0;i<=100000;)

 {    
      waveher[0].lpData=pwaveher[0];
     waveOutWrite( hWaveOut,&waveher[0],sizeof(waveher)  );
 waveher[1].lpData=pwaveher[1];
     waveOutWrite( hWaveOut,&waveher[1],sizeof(waveher)  );
    waveher[2].lpData=pwaveher[2];
 waveOutWrite( hWaveOut,&waveher[2],sizeof(waveher)  );

i++;}

};}

static   void CALLBACK waveOutProc( HWAVEOUT hWaveOut, UINT uMsg, DWORD_PTR dwInstance, DWORD dwParam1, DWORD dwParam2 )

    {  
          LPWAVEHDR pWaveHeader = (LPWAVEHDR)dwParam1;

            if (WOM_DONE== uMsg)  
          {    

                I++; 
               if(I>=0)  
              {   switch(I%3)
               { case 0: pwaveher[0]+=buffer*3;break;
                 case 1:  pwaveher[1]+=buffer*3;break;
                 case 2:  pwaveher[2]+=buffer*3;break;
               }









            }
     }}

  • 写回答

1条回答 默认 最新

  • qq_35733354 2016-07-31 09:50
    关注

    回调函数 是不是那样写 ,而且我每次改变缓冲大小的时候,有时候重复,有时候跳段, 我怀疑这个声卡有个默认的缓冲区,但我不知道多大。现在我在缓冲设置4096 可以连续播放,但是有杂音。

    评论

报告相同问题?

悬赏问题

  • ¥15 用visual studi code完成html页面
  • ¥15 聚类分析或者python进行数据分析
  • ¥15 逻辑谓词和消解原理的运用
  • ¥15 三菱伺服电机按启动按钮有使能但不动作
  • ¥15 js,页面2返回页面1时定位进入的设备
  • ¥50 导入文件到网吧的电脑并且在重启之后不会被恢复
  • ¥15 (希望可以解决问题)ma和mb文件无法正常打开,打开后是空白,但是有正常内存占用,但可以在打开Maya应用程序后打开场景ma和mb格式。
  • ¥20 ML307A在使用AT命令连接EMQX平台的MQTT时被拒绝
  • ¥20 腾讯企业邮箱邮件可以恢复么
  • ¥15 有人知道怎么将自己的迁移策略布到edgecloudsim上使用吗?