XAudio2学习之组合音频方法作为操作集

多个XAudio2方法可以作为一个操作集的一部分被调用。这些方法都使用OperationSet作为参数,这样可以允许他们作为延迟组的一部分被调用。在某个特定的时刻,需要改变的整个集合可以被同时应用,通过调用函数IXAudio2::CommitChanges时使用那组的OperationSet识别码。这样,就允许客户端代码的不同部分分别应用原子改变到音频图而不相互冲突。推荐的做法是,客户端使用一个全局的计数器,当需要生成一个唯一的新的OperationSet识别码时,将计数器增加1。对于音频图的一组修改,原子方式的应用到音频图,可以用来保证采样率的准确性。例如,voices同步启动。

如果OperationSet的值被设置为,修改会立马被应用,并且它会在方法调用后的第一个音频处理时生效。如果IXAudio2::CommitChanges调用时使用XAUDIO2_COMMIT_ALL参数,所有待操作集中的修改都会执行,忽略它们自己的OperationSet识别码

某些方法,当它们在XAudio2回调中使用XAUDIO2_COMMIT_NOW标志被调用时,会立即生效。其他的所有使用OperationSet参数的方法,只在下一阶段的处理中,方法被调用后(如果是使用XAUDIO2_COMMIT_NOW调用的话)才会生效,或者在IXAudio2::CommitChanges使用相同的OperationSet被调用后正因为如此,某些方法调用不一定按照它们被调用的顺序生效。

当IXAudio2::StopEngine被调用的时候,所有的等待操作都会被原子性的提交。任何被调用的函数方法在引擎停止的时候都会生效,忽略前面提供的OperationSet识别码。当重启引擎的时候,XAudio2会恢复异步状态。

在哪些简单场景中操作集才有用,包括以下几个方面:

·同时启动多个voices;

·同时提交内存buffer给一个voice,同时给一个voice设置参数,或者同时启动一个voice;

·对音频图做一个大规模的改变,比如连接所有的source voices到一个新的submix voice。

下面列举出可以被作为操作集一部分来调用的方法:

  • IXAudio2SourceVoice::ExitLoop

  • IXAudio2Voice::SetFilterParameters

  • IXAudio2SourceVoice::SetFrequencyRatio

  • IXAudio2Voice::DisableEffect

  • IXAudio2Voice::EnableEffect

  • IXAudio2Voice::SetChannelVolumes

  • IXAudio2Voice::SetEffectParameters

  • IXAudio2Voice::SetOutputMatrix

  • IXAudio2Voice::SetVolume

  • IXAudio2SourceVoice::Start

  • IXAudio2SourceVoice::Stop

除了上面描述的方法,客户端代码最终都必须调用IXAudio2::CommitChanges来执行deferred(延迟)修改。

那么怎么组合Audio方法作为一个操作集呢?

1.声明一个全局的操作集计数器:用来保证每个操作集都是唯一的。

UINT32 OperationSetCounter = 0;
2.增加计数器的值:每次一个新的操作集提交的时候,全局计数器都应增加来确保每次设置都是唯一的。
UINT32 OperationID = UINT32(InterlockedIncrement(LPLONG(&OperationSetCounter)));
3.通过设置它们的OperationSet参数来组合方法:设置操作集参数到全局计数器的当前值。这种情形中,四个IXAudio2SourceVoice::Start被组合成一个操作集。组合方法调用会导致这四个音频准确的在同一时刻启动。
hr = pSFXSourceVoice1->Start( 0, OperationID );
hr = pSFXSourceVoice2->Start( 0, OperationID );
hr = pSFXSourceVoice3->Start( 0, OperationID );
hr = pSFXSourceVoice4->Start( 0, OperationID );
4.启动操作集。

pXAudio2->CommitChanges(OperationID);

组合成操作集调用函数方法的过程大致如此。

交流QQ:1245178753

本文地址:http://blog.csdn.net/u011417605/article/details/51045457

你可能感兴趣的:(audio,XAudio2)