0

我在这里使用这个很棒的教程检测何时有人对着麦克风吹气。

我的最终目标是当有人对着手机吹气时播放一个单一的声音,当他们没有对着手机吹气时停止它;然而,由于这个例子是基于定时器的,它每秒触发这个if语句 30 次(参见教程中的例子代码来了解定时器)。

if (lowPassResults > 0.95) {
    NSLog(@"Mic blow detected");

    self.audioSource = [[OALSimpleAudio sharedInstance] playEffect:audioSound volume:1.0 pitch:1.0 pan:0 loop:NO];

}   

if (lowPassResults  < 0){
    NSLog(@"PLEASE STOP?");
    [self.keyCSource stop];

}

任何人都有任何想法来听“打击”,如果它被吹入,那么播放一次 ObjectAL 声音然后在没有被吹入时停止它?

4

2 回答 2

0

据我了解,您可以检测到打击,而您的问题是,您只想播放一次声音。否则忽略我的回答...

创建一个属性@property BOOL blowDetected,将其设置YES为检测到打击时和NO停止声音时(或准备检测另一次打击时)。然后只播放声音if (!self.blowDetected)

更详细一点:

if (meterResults > 0.95) {
    NSLog(@"isPlaying");
    _isPlaying = YES;
}

到目前为止一切都很好,但在这里你也想开始播放你的声音,只有当_isPlaying == NO

if (!_isPlaying && meterResults > 0.95) {
    self.keyCSource = [[ ... and so on
    _isPlaying = YES;
}

然后,当meterResult下降

if (lowPassResults  < 0){
    _isPlaying = NO;
    [self.keyCSource stop];
}
于 2013-02-06T05:11:21.443 回答
0

这对您不起作用,因为只要您的低通结果超过阈值,您就会每秒重新启动声音 30 次。这是您可以解决此问题的方法。

确保您有某种持久性标志BOOL is_playing并将其设置为NO最初。当超过阈值时,测试is_playing. 仅当使用, 并设置为NO调用时。playEffectloop:YESis_playingYES

如果低通结果低于您的阈值stopAllEffects并设置is_playingNO。您还应该重新考虑您的下限是否真的应该为零。它可能会更高一些,最高可达 0.95。

于 2013-02-06T05:24:59.460 回答