吹入麦克风播放1个声音而不是多个定时器触发器

时间:2013-02-06 05:07:45

标签: objective-c if-statement avaudioplayer

我正在使用这个很棒的教程here来检测有人吹进麦克风的时间。

我的最终目标是在有人吹进手机时播放一个声音,并在没有吹进手机时停止播放;但是,由于此示例是基于计时器的,因此它每秒触发此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声音 ONCE 然后在它没有被吹进时停止它?

2 个答案:

答案 0 :(得分: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];
}

答案 1 :(得分:0)

它不适合您,因为只要您的低通结果超过阈值,您就会每秒重启30次声音。以下是解决此问题的方法。

确保您拥有某种持久性标记BOOL is_playing并最初将其设置为NO。超过阈值时,请测试is_playing。仅当NO playEffect loop:YES调用is_playing时,YES设为stopAllEffects

如果低通结果低于您的阈值is_playing并将NO设置为{{1}}。您还应该重新考虑您的下限是否应该为零。它可能会高一点,高达0.95。