EMIPLIB-1.0.0的使用(二)

来源:互联网 发布:故君子莫大乎与人为善 编辑:程序博客网 时间:2024/04/30 08:34

2011.03.31  By Pafone

这次来编译soundfileplayer,新建一个工程。像EMIPLIB-1.0.0的使用(一)那样在工程属性加入include的目录、库目录和库,还要额外加一个库winmm.lib,这个库不用指定路径。

编译:

1.编译时,说出找不到unistd.h,注释掉即可,原因在上篇文章已经说过。

2.  链接错

1>正在链接...
1>emiplib-1.0.0.lib(mipwinmmoutput.obj) : error LNK2001: 无法解析的外部符号 __imp__waveOutOpen@24
1>emiplib-1.0.0.lib(mipwinmmoutput.obj) : error LNK2001: 无法解析的外部符号 __imp__waveOutClose@4
1>emiplib-1.0.0.lib(mipwinmmoutput.obj) : error LNK2001: 无法解析的外部符号 __imp__waveOutUnprepareHeader@12
1>emiplib-1.0.0.lib(mipwinmmoutput.obj) : error LNK2001: 无法解析的外部符号 __imp__waveOutReset@4
1>emiplib-1.0.0.lib(mipwinmmoutput.obj) : error LNK2001: 无法解析的外部符号 __imp__waveOutWrite@12
1>emiplib-1.0.0.lib(mipwinmmoutput.obj) : error LNK2001: 无法解析的外部符号 __imp__waveOutPrepareHeader@12

通过网上查找 , 知要加入winmm.lib这个库。

运行测试:

在生成.exe目录内放一个wav文件并改名为soundfile.wav,必须用这个名,因为在代码中已经写死。运行soundfileplayer.exe便可以听到声音了。

程序讲解:

soundfileplayer.cpp
  1. int main(void)
  2. {
  3.     MIPTime interval(0.050); // We'll use 50 millisecond intervals
  4.     MIPAverageTimer timer(interval);
  5.     MIPWAVInput sndFileInput;
  6.     MIPSampleEncoder sampEnc;
  7. #ifndef WIN32
  8.     MIPOSSInputOutput sndCardOutput;
  9. #else
  10.     MIPWinMMOutput sndCardOutput;
  11. #endif
  12.     MyChain chain("Sound file player");
  13.     bool returnValue;
  14.  
  15.     // We'll open the file 'soundfile.wav'
  16.  
  17.     returnValue = sndFileInput.open("soundfile.wav", interval);
  18.     checkError(returnValue, sndFileInput);
  19.     
  20.     // Get the parameters of the soundfile. We'll use these to initialize
  21.     // the soundcard output component further on.
  22.  
  23.     int samplingRate = sndFileInput.getSamplingRate();
  24.     int numChannels = sndFileInput.getNumberOfChannels();
  25.  
  26.     // Initialize the soundcard output
  27.     returnValue = sndCardOutput.open(samplingRate, numChannels, interval);
  28.     checkError(returnValue, sndCardOutput);
  29.  
  30.     // Initialize the sample encoder
  31. #ifndef WIN32
  32.     // The OSS component can use several encoding types. We'll ask
  33.     // the component to which format samples should be converted.
  34.     returnValue = sampEnc.init(sndCardOutput.getRawAudioSubtype());
  35. #else
  36.     // The WinMM output component uses signed little endian 16 bit samples.
  37.     returnValue = sampEnc.init(MIPRAWAUDIOMESSAGE_TYPE_S16LE);
  38. #endif
  39.     checkError(returnValue, sampEnc);
  40.  
  41.     // Next, we'll create the chain
  42.     returnValue = chain.setChainStart(&timer);
  43.     checkError(returnValue, chain);
  44.  
  45.     returnValue = chain.addConnection(&timer, &sndFileInput);
  46.     checkError(returnValue, chain);
  47.  
  48.     returnValue = chain.addConnection(&sndFileInput, &sampEnc);
  49.     checkError(returnValue, chain);
  50.  
  51.     returnValue = chain.addConnection(&sampEnc, &sndCardOutput);
  52.     checkError(returnValue, chain);
  53.  
  54.     // Start the chain
  55.  
  56.     returnValue = chain.start();
  57.     checkError(returnValue, chain);
  58.  
  59.     // We'll wait until enter is pressed
  60.  
  61.     getc(stdin);
  62.  
  63.     returnValue = chain.stop();
  64.     checkError(returnValue, chain);
  65.  
  66.     // We'll let the destructors of the components take care
  67.     // of their de-initialization.
  68.  
  69.     return 0;
  70. }

链的建立:

由以下代码可知,   链是这样的   timer –> sndfileInput –> sampEnc –> sndCardOutput

simplechain.cpp part0
  1.     // Next, we'll create the chain
  2.     returnValue = chain.setChainStart(&timer);
  3.     checkError(returnValue, chain);
  4.  
  5.     returnValue = chain.addConnection(&timer, &sndFileInput);
  6.     checkError(returnValue, chain);
  7.  
  8.     returnValue = chain.addConnection(&sndFileInput, &sampEnc);
  9.     checkError(returnValue, chain);
  10.  
  11.     returnValue = chain.addConnection(&sampEnc, &sndCardOutput);
  12.     checkError(returnValue, chain);

需要讲下的是sampEnc,这个是MIPSampleEncoder类,在mipsampleencoder.h中

/** Changes the sample encoding of raw audio messages.
*  This component can be used to change the sample encoding of raw audio messages.
*  It accepts all raw audio messages and produces similar raw audio messages, using
*  a predefined encoding type.
*/

是用来改变原始声音数据编码的。因为声卡输入的格式为16位unsigned,而wavfile提供的数据不一定是这个,所以要加入这一sampEnc环节。

注:测试时必须用soundfile.wav这个文件名,因为代码已经写死

原创粉丝点击