Ios 更改音频单位上的速率NewTimePitch
我使用的是带有不同音频单元的Ios 更改音频单位上的速率NewTimePitch,ios,iphone,audio,core-audio,audiounit,Ios,Iphone,Audio,Core Audio,Audiounit,我使用的是带有不同音频单元的AUGraph,其中一个是类型kAudioUnitType\u FormatConverter,以及子类型kAudioUnitSubType\u NewTimePitch。 我正在尝试更改其上的kNewTimePitchParam\u Rate参数 它确实以某种方式工作,但当我将参数重置为值1.0(无变化率)时,音频中仍然会出现音调变化。我正在努力理解如何正确地做到这一点 我在应用程序中实时执行此操作,直接调用AudioUnitSetParameter()函数: -
AUGraph
,其中一个是类型kAudioUnitType\u FormatConverter
,以及子类型kAudioUnitSubType\u NewTimePitch
。
我正在尝试更改其上的kNewTimePitchParam\u Rate
参数
它确实以某种方式工作,但当我将参数重置为值1.0(无变化率)时,音频中仍然会出现音调变化。我正在努力理解如何正确地做到这一点
我在应用程序中实时执行此操作,直接调用AudioUnitSetParameter()
函数:
- (void)setTempo:(float)value {
OSStatus err = noErr;
err = AudioUnitSetParameter(tempoUnit, kNewTimePitchParam_Rate, kAudioUnitScope_Global, 0, (Float32)value, 0);
if (err != noErr) {
NSLog(@"Could not set tempo unit rate: %d", (int)err);
}
}
这是正确的方法吗?
这是一个iOS应用程序,有没有更好的方法来实现这一点
相关问题:
编辑
在四处挖掘和记录之后,我发现:
首先是完整的图形结构:
AudioUnitGraph 0xDF5046:
Member Nodes:
node 1: 'auou' 'rioc' 'appl', instance 0x170837a80 O I
node 2: 'aufc' 'nutp' 'appl', instance 0x170634f20 O I
node 3: 'aufc' 'nutp' 'appl', instance 0x170a23140 O I
node 4: 'aufc' 'nutp' 'appl', instance 0x17083b700 O I
node 5: 'aumx' 'mcmx' 'appl', instance 0x17063bc80 O I
node 6: 'aumx' 'mcmx' 'appl', instance 0x174626da0 O I
node 7: 'aumx' 'mcmx' 'appl', instance 0x17063bd60 O I
Connections:
node 6 bus 0 => node 4 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 5 bus 0 => node 3 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 4 bus 0 => node 7 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 3 bus 0 => node 7 bus 1 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 7 bus 0 => node 2 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
node 2 bus 0 => node 1 bus 0 [ 2 ch, 44100 Hz, 'lpcm' (0x00000029) 32-bit little-endian float, deinterleaved]
Input Callbacks:
{0x100a31764, 0x1706df330} => node 5 bus 0 [2 ch, 44100 Hz]
{0x100a31764, 0x1706df250} => node 5 bus 1 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dccb0} => node 5 bus 2 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dda40} => node 5 bus 3 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dcc40} => node 5 bus 4 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dca80} => node 5 bus 5 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dcaf0} => node 5 bus 6 [2 ch, 44100 Hz]
{0x100a31764, 0x1706df2c0} => node 5 bus 7 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dce00} => node 5 bus 8 [2 ch, 44100 Hz]
{0x100a31764, 0x1706ddb90} => node 5 bus 9 [2 ch, 44100 Hz]
{0x100a31764, 0x1706dddc0} => node 5 bus 10 [2 ch, 44100 Hz]
{0x100a31764, 0x1708c0c40} => node 6 bus 0 [2 ch, 44100 Hz]
{0x100a31764, 0x1706df410} => node 6 bus 1 [2 ch, 44100 Hz]
{0x100a31764, 0x1706ddab0} => node 6 bus 2 [2 ch, 44100 Hz]
CurrentState:
mLastUpdateError=0, eventsToProcess=F, isInitialized=T, isRunning=T (1)
在图的最左侧,有到多声道混音器,每个混音器后面都有一个音频单元新的时间音高(音高调制),然后是一个从这两个单元接收音频数据的混音器,最后是节奏音频单元
我使用render回调配置左侧的每个混合器
起初,我认为每个回调都会一个接一个地调用,为同一个音频时间戳请求X帧音频数据,但在改变速度单位的速率后,帧不再按顺序被请求。
默认利率为1.0时不会发生这种情况
以下是默认速率为1.0的输出日志记录:
0 -> 1024 / 7785692434.000000 (0)
1 -> 1024 / 7785692434.000000 (0)
11 -> 1024 / 7785692434.000000 (0)
2 -> 1024 / 7785692434.000000 (0)
3 -> 1024 / 7785692434.000000 (0)
4 -> 1024 / 7785692434.000000 (0)
5 -> 1024 / 7785692434.000000 (0)
6 -> 1024 / 7785692434.000000 (0)
7 -> 1024 / 7785692434.000000 (0)
8 -> 1024 / 7785692434.000000 (0)
9 -> 1024 / 7785692434.000000 (0)
10 -> 1024 / 7785692434.000000 (0)
12 -> 1024 / 7785692434.000000 (0)
13 -> 1024 / 7785692434.000000 (0)
------------ advance to 1024 --------------
0 -> 1024 / 7785693458.000000 (0)
1 -> 1024 / 7785693458.000000 (0)
11 -> 1024 / 7785693458.000000 (0)
2 -> 1024 / 7785693458.000000 (0)
3 -> 1024 / 7785693458.000000 (0)
4 -> 1024 / 7785693458.000000 (0)
5 -> 1024 / 7785693458.000000 (0)
6 -> 1024 / 7785693458.000000 (0)
7 -> 1024 / 7785693458.000000 (0)
8 -> 1024 / 7785693458.000000 (0)
9 -> 1024 / 7785693458.000000 (0)
10 -> 1024 / 7785693458.000000 (0)
12 -> 1024 / 7785693458.000000 (0)
13 -> 1024 / 7785693458.000000 (0)
所以这里一切都很好,回调编号0、1和11放在一个混音器上,其余放在另一个混音器上(右边的大浮点数是回调音频时间戳采样时间)。现在,当我换成更高的费率时:
0 -> 1156 / 7785775378.000000 (0)
1 -> 1156 / 7785775378.000000 (0)
11 -> 1156 / 7785775378.000000 (0)
------------ advance to 84100 --------------
0 -> 380 / 7785776534.000000 (0)
1 -> 380 / 7785776534.000000 (0)
11 -> 380 / 7785776534.000000 (0)
------------ advance to 84480 --------------
2 -> 1156 / 7785775378.000000 (0)
3 -> 1156 / 7785775378.000000 (0)
4 -> 1156 / 7785775378.000000 (0)
5 -> 1156 / 7785775378.000000 (0)
6 -> 1156 / 7785775378.000000 (0)
7 -> 1156 / 7785775378.000000 (0)
8 -> 1156 / 7785775378.000000 (0)
9 -> 1156 / 7785775378.000000 (0)
10 -> 1156 / 7785775378.000000 (0)
12 -> 1156 / 7785775378.000000 (0)
13 -> 1156 / 7785775378.000000 (0)
------------ advance to 85636 --------------
2 -> 380 / 7785776534.000000 (0)
3 -> 380 / 7785776534.000000 (0)
4 -> 380 / 7785776534.000000 (0)
5 -> 380 / 7785776534.000000 (0)
6 -> 380 / 7785776534.000000 (0)
7 -> 380 / 7785776534.000000 (0)
8 -> 380 / 7785776534.000000 (0)
9 -> 380 / 7785776534.000000 (0)
10 -> 380 / 7785776534.000000 (0)
12 -> 380 / 7785776534.000000 (0)
13 -> 380 / 7785776534.000000 (0)
音频数据的请求顺序不同,前3次回调两次,其余两次
有人能证实我所观察到的是预期的吗