码迷,mamicode.com
首页 > 其他好文 > 详细

XAPO中LockForProcess 音频格式设置以及数据处理后的音频格式

时间:2016-04-29 17:32:52      阅读:132      评论:0      收藏:0      [点我收藏+]

标签:

XAPO中LockForProcess 格式 是由与之绑定的IXAudioSubmixVoice来影响的。
但是貌似只能影响通道数和采样率,其中的WAVEFORMATEX.wBitsPerSample是Float型,32bit,暂时没有发现怎么去修改这个数值。
创建IXAudioSubmixVoice时会加入通道数和采样率,这两个数据要流向XAPO的话,
通过IXAudioSubmixVoice::SetEffectChain来关联,以下是过程(例子来自Microsoft DirectX SDK (June 2010)\Samples\C++\XAudio2\XAudio2BasicSound):

1.创建XAPO:
MyXAPO   * SubmixMyXAPO=NULL;

XAPO_REGISTRATION_PROPERTIES *ppRegistrationProperties;
 hr=XAudio2CreateReverb(&pXAPO);
 pXAPO->QueryInterface(__uuidof(IXAPO),(void**)&SubmixMyXAPO);
 SubmixMyXAPO->GetRegistrationProperties(&ppRegistrationProperties);
 SubmixMyXAPO->Release();
 SubmixMyXAPO=new MyXAPO(ppRegistrationProperties);

2.创建SubmixVoice需要的参数:
 XAUDIO2_EFFECT_DESCRIPTOR descriptor;
 descriptor.InitialState = true;
 descriptor.OutputChannels = 2;
 descriptor.pEffect = SubmixMyXAPO;
 XAUDIO2_EFFECT_CHAIN chain;
 chain.EffectCount = 1 ;
 chain.pEffectDescriptors = &descriptor;

3.创建子混音器,并设置通道数和采样率。
 
if(FAILED(hr=pXAudio2->CreateSubmixVoice(&pSubMixVoice2,1,44100,0,7))) //设置通道数(第二个参数)和采样率(第三个参数)
 {
  wprintf( L"Failed creating submix voice: %#X\n", hr );
  SAFE_RELEASE( pXAudio2 );
  CoUninitialize();
  return 0;
 }

4.关联起来:
hr=pSubMixVoice2->SetEffectChain(&chain);//关联XAPO和SubmixVoice

如果不去抓取XAPO中的数据,而且与之关联的IXAudioVoice已经是效果链的最后与MasterVoice相关联的的SubmixVoice(SourceVoice),或者是MasterVoice,那么声音可以直接流向MasterVoice,且音质很好。
在XAPO中Process中抓到数据后,流向.wav文件或者另外自己封装的Player(只有一个IXAudioSourceVoice),那么文件的头格式或者IXAudioSourceVoice的格式,需要如下:

 const  WAVEFORMATEX* pWFInfo pWFInfo;//是由外部来设置的

 m_pwfxEx.Format.wFormatTag	= WAVE_FORMAT_EXTENSIBLE; //需要注意
 m_pwfxEx.Format.nChannels	= pWFInfo->nChannels;
 m_pwfxEx.Format.cbSize	= 22;
 m_pwfxEx.Format.wBitsPerSample	= 32; //需要注意
 m_pwfxEx.Format.nBlockAlign	= m_pwfxEx.Format.nChannels * (m_pwfxEx.Format.wBitsPerSample/8);
 m_pwfxEx.Format.nSamplesPerSec	= pWFInfo->nSamplesPerSec;
 m_pwfxEx.Format.nAvgBytesPerSec = m_pwfxEx.Format.nSamplesPerSec * m_pwfxEx.Format.nBlockAlign;
 m_pwfxEx.dwChannelMask	= 0; //需要注意
 m_pwfxEx.SubFormat	= KSDATAFORMAT_SUBTYPE_IEEE_FLOAT;
 m_pwfxEx.Samples.wValidBitsPerSample = m_pwfxEx.Format.wBitsPerSample;

这样的话,才可以保证文件中的数据或者Player播放音频数据时没有杂音。但是保存文件的话,1秒钟的数据差不多有348K,暂时还不知道怎么将数据压缩一下。

交流QQ:1245178753

XAPO中LockForProcess 音频格式设置以及数据处理后的音频格式

标签:

原文地址:http://blog.csdn.net/u011417605/article/details/51250130

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!