複数のボタンプレスと重なるサウンド

ボタンを押した後、もう1つを押すと音が重なります。もう一度押すと最初の音が止まるように、どうすれば修正できますか?

 - (void)playOnce:(NSString *)aSound {

NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[theAudio setDelegate: self];
[theAudio setNumberOfLoops:0];
[theAudio setVolume:1.0];
[theAudio play];    
 }

- (void)playLooped:(NSString *)aSound {

NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
AVAudioPlayer* theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
[theAudio setDelegate: self];
// loop indefinitely
[theAudio setNumberOfLoops:-1];
[theAudio setVolume:1.0];
[theAudio play];
[theAudio release];


    }
0
以下のいずれかを行うことができます:1.ボタンがクリックされたら、AVaudioplayerがまだ再生中かどうかを確認します。もしあなたがそれを無視して何もしないなら、それを止めて新しい音を演奏することができます。
追加された 著者 atbebtg,
追加された 著者 Josh Caswell,
追加された 著者 Josh Caswell,
あなたは実際に質問をする必要があります。
追加された 著者 wbyoung,
aSoundとは何ですか?
追加された 著者 Dor Bashan,
あなたは何個のボタンを持っていますか?あなたは何を達成しようとしていますか?私はあなたがどのように1つのアクションですべてのvoidメソッドを呼び出すのか分かりません。私は音を扱う最善の方法がデリゲートにあることを知っています。あなたの目的は何ですか?
追加された 著者 Dor Bashan,
よく... if(!theAudio){}を削除してチェックしてみてください
追加された 著者 Dor Bashan,
複数のボタンを押したときにif(!theAudio)を削除すると、サウンドが重なります
追加された 著者 alfred,
私の質問は、1つのボタンをクリックすると音が鳴りますが、別のボタンをクリックすると重なります
追加された 著者 alfred,
- (void)playOnce:(NSString *)aSound;
追加された 著者 alfred,
- (IBAction)beatButton50 {[self playOnce:@ "racecars"]; }
追加された 著者 alfred,

6 答え

各メソッドの開始時にプレーヤーが既に再生しているかどうかを確認する:

if (theAudio.playing == YES) {
    [theAudio stop];
}

AVAudioPlayerクラスリファレンス

0
追加された

あなたのplayOnceメソッドでは、 'path'変数は使用されていません - あなたの警告メッセージを取り除くためにそれを削除してください。あなたのplayOnceは何かを再生するように設定していないので、私はそれがどのように動作するはずかわかりません - あなたがplayLoopedを最初に呼び出さない限り?また、initWithContentsOfUrlの後にprepareToPlayを呼び出す必要があります。

 - (void)playOnce:(NSString *)aSound {

  NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
  if (theAudio && [theAudio isPlaying]) {
    [theAudio stop]
  } else {
         theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
         [theAudio prepareToPlay];

         [theAudio setDelegate: self];
    [theAudio setNumberOfLoops: 1];
    [theAudio setVolume: 1.0];
    [theAudio play];
  }

}
0
追加された
まず、Stack Overflowへようこそ。これがうまくいく方法は、あなたが一貫した質問をすることです。あなたがあなたの質問に対する答えを受け取ったときに、それをチェックマークで「チェック」することによって答えを示します。これは進行中のチュートリアルのための形式ではなく、オリジナルの質問に追加することはできません。あなたの元の1つの質問にまだ答えがなかったら、私はあなたにそれを手伝うつもりです。 Androidプログラミングの本を読むことを検討して、初心者であれば基本を学ぶことができます。これが私のやり方です。
追加された 著者 Alan Moore,
aSoundパラメータをクラスメンバに保存し、パラメータと比較してパラメータが異なるかどうかを確認できます。
追加された 著者 Alan Moore,
ああ、そうです、あなたが言っていることが分かります。私はあなたが別のサウンドを持っているかどうかを確認し、その場合にプレーヤーをリロードする必要があると思います。
追加された 著者 Alan Moore,
prepareToPlayを追加してみましたか? playLoopにあるコードを呼び出して、AVAudioPlayerを設定する必要があります。
追加された 著者 Alan Moore,
そのコードはどのように見えますか?
追加された 著者 alfred,
私はすべてのボタンのコードを持っていますが、私は別のサウンドを再生し、プレーヤーをリロードする方法を私は私が多くのことを知らないので、プログラミングには新しいです
追加された 著者 alfred,
私は他のボタンを別の音で押そうとすると同じ音を出すだけで、音が重なり合うのをやめました
追加された 著者 alfred,
私は本当にそれを必要とせず、私はパスラインを削除したので、私はplayLoopラインを削除したが、まだ音が再生されていない
追加された 著者 alfred,

あなたはおそらく次のようなことをすることができます:

    (void) playLooped: (NSString * ) aSound {
        NSString * path = [[NSBundle mainBundle] pathForResource: aSound ofType: @"caf"];

    //stop audio player from playing so the sound don't overlap
    if([theAudio isPlaying])
    {
        [theAudio stop]; //try this instead of stopAudio

    }

    if (!theAudio) {
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath: path] error: NULL];
    } 
    [theAudio setDelegate: self];
   //loop indefinitely
    [theAudio setNumberOfLoops: -1];
    [theAudio setVolume: 1.0];
    [theAudio play];
}
0
追加された
私はトレースを言うことを意味しました。コードにブレークポイントを入れる
追加された 著者 atbebtg,
コードを交換して[theAudio stop]が呼ばれていることを確認しましたか?
追加された 著者 atbebtg,
私は自分のコードを編集しました。私は[theAudio stop]でstopAudioを変更します。
追加された 著者 atbebtg,
どのように私はコードを交換する必要があります私はそれがプログラミングに新しいです解放する必要がありますまだ勉強しようとしています
追加された 著者 alfred,
私は複数のボタンを押すと、その奇妙なオーディオはまだ重なっている
追加された 著者 alfred,
stopAudioが見つからないことを伝えています
追加された 著者 alfred,
私はそのコードを入れるとエラーになります
追加された 著者 alfred,

これを正しく動作させるには、BOOL値をutizilizeする必要があります。

あなたの.mファイルに@implementationの前にこれを書いてください:

static BOOL soundIsPlaying = NO;

次に、あなたのIBActionは次のようになります。

- (IBAction)play {
    if (soundIsPlaying == YES) {
        [theAudio release];
        soundIsPlaying = NO;

    }

    else if (soundIsPlaying == NO) {
        NSString *path = [[NSBundle mainBundle] pathForResource:@"SOUNDFILENAME" ofType:@"wav"];
        theAudio=[[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath:path] error:NULL];
        theAudio.delegate = self;
        theAudio.volume = 1.0;
        theAudio.numberOfLoops = 0;
        [theAudio play];
        soundIsPlaying = YES;

    }   
}

正直言ってね別のボタンを押すと音が止まります。

0
追加された

viewControllerヘッダのAVAudioPlayerを宣言します(サウンドを再生するたびに新しいAVAudioPlayerを割り当てないでください)。そうすれば、StopAudioメソッドで使用できるポインターが得られます。

@interface myViewController : UIViewController  { 
    AVAudioPlayer *theAudio;
}
@property (nonatomic, retain) AVAudioPlayer *theAudio;
@end


@implementation myViewController
@synthesize theAudio;
- (void)dealloc {
    [theAudio release];
}
@end



- (void)playOnce:(NSString *)aSound {
    NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
    if(!theAudio){
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    }
    [theAudio setDelegate: self];
    [theAudio setNumberOfLoops:0];
    [theAudio setVolume:1.0];
    [theAudio play];
}

- (void)playLooped:(NSString *)aSound {
    NSString *path = [[NSBundle mainBundle] pathForResource:aSound ofType:@"caf"];
    if(!theAudio){
        theAudio = [[AVAudioPlayer alloc] initWithContentsOfURL: [NSURL fileURLWithPath:path] error:NULL];
    }
    [theAudio setDelegate: self];
   //loop indefinitely
    [theAudio setNumberOfLoops:-1];
    [theAudio setVolume:1.0];
    [theAudio play];
}

- (void)stopAudio {
    [theAudio stop];
    [theAudio setCurrentTime:0];
}

also be sure to read the Apple Docs

0
追加された
はい、上記のstopAudioメソッドを使用します。
追加された 著者 ader,
次に、次のサウンドを再生する前にAVAudioPlayerを停止します。
追加された 著者 ader,
上記のコードを編集しただけです。より詳細に達成しようとしていることを説明できますか?
追加された 著者 ader,
私は私に与えたコードを使用し、ボタンをクリックするとプログラムがクラッシュする
追加された 著者 alfred,
ヘッダーファイルにAVAudioPlayerを作成するにはどうすればよいですか?
追加された 著者 alfred,
これを修正するコードは何でしょうか
追加された 著者 alfred,
AVAudioPlayerを停止するために私は単にstopメソッドを使用しますか?
追加された 著者 alfred,
私はそれらのコード行を追加し、音はまだ重なっています
追加された 著者 alfred,
私は20のボタンのようなアプリケーションを作っていて、それぞれが別のサウンドを再生しますが、他のボタンをクリックするとサウンドが重なります
追加された 著者 alfred,

投稿したコードは、メソッドに送信された最初のサウンドだけを再生します。

1つの変更可能なサウンドだけを再生したい場合は、プレイヤーを停止してから、Audioを放して新しいサウンドを設定します。

0
追加された
どのように私はオーディオをリリースし、新しいものを設定するのですか?
追加された 著者 alfred,