0

私はこの素晴らしいチュートリアルをここで使用して、誰かがマイクに息を吹きかけたことを検出しています。

私の最終目標は、誰かが電話に息を吹きかけているときに 1 つの音を鳴らし、吹き込んでいないときに音を止めることです。ただし、この例はタイマーベースであるため、この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サウンドを1回再生し、吹き込まれていないときに停止するアイデアはありますか?

4

2 に答える 2

0

ローパスの結果がしきい値を超えている間、1 秒あたり 30 回サウンドを再起動するため、うまくいきません。これを修正する方法は次のとおりです。

ある種の永続的なフラグがあることを確認し、それを初期BOOL is_playingに設定してください。NOしきい値を超えたら、 をテストしis_playingます。NOそれが で呼び出さplayEffectloop:YES、 に設定さis_playingれている場合のみYES

ローパスの結果がしきい値stopAllEffectsを下回り、 に設定さis_playingれている場合NO。また、下限しきい値が本当にゼロであるべきかどうかを再検討する必要があります。0.95 まではかなり高くなる可能性があります。

于 2013-02-06T05:24:59.460 に答える
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 に答える