• 締切済み

NSTimerカウントダウンで音楽を停止するには?

Xcodeで iPhoneアプリ作りに奮闘している初心者です。 NSTimerでカウントダウンタイマーを設定しましたが、タイマー終了とともに BGM音楽を停止したいのですが、.p ファイルに #import <AVFoundation/AVFoundation.h> と追加して、.m ファイルに タイマー終了時にイベントとして、 if (RestTime == 0) { timeflag = false; NSString *bgmPath = [[NSBundle mainBundle] pathForResource:@"xxxx"ofType:@"mp3" ]; NSURL *bgmUrl = [NSURL fileURLWithPath:bgmPath]; sound = [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil]; [sound setNumberOfLoops:-1]; [sound stop]; とコードをいれてみましたが、タイマーは終了しても音楽は止まらず鳴りっぱなしです。 NSTimer周辺に詳しい方で、カウントダウンタイマー終了と同時に他の作動をとめる設定(プログラムコード)をお知りのかたお助けねがいます。 また、すでに鳴っている(他のページ又は同じページ,controller内の)音楽をタイマーに合わせて止めることが不可能なら、タイマースタートボタンを押すと同時に音楽をスタートし、タイマー終了とともに音楽を停止するプログラムコードを教えていただけたら助かります。 よろしくお願いします。

みんなの回答

noname#177743
noname#177743
回答No.2

補足を拝見しましたが、どうも根本的なところでオブジェクト指向の概念を理解できていないように思えます。 [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil] これは、どういう働きをするものか理解されているでしょうか。AVAudioPlayerというAV再生のためのオブジェクトを作成し初期化する、ということです。そしてこのオブジェクトによりオーディオ再生は管理されます。ということは、現在再生している音を止めたりするのも、すべてその音のAVAudioPlayerインスタンスによって操作されるということです。 ですから、音を止めるためにまた [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil]とやっても無意味です。それは、単に(鳴っている音とは別の)新しい音の再生用オブジェクトを作ってそれを操作するにすぎないからで、現在なっている音にはなんの影響も与えません。 また、インスタンス変数を使った書き方ということですが……。「インスタンス変数」あるいは「メンバ変数」というものをご存知ないのでしょうか。使い方自体の説明は難しくはありませんが。そのクラス(ここではコントローラー)のインターフェイス宣言に、 @interface hogeclass : superhogeclass { id hoge_val; } このように変数の宣言を追加すると、、その変数はインスタンス作成後、常に保持されるようになります。そのままこの変数に値を代入して利用すればいいわけで、普通の変数と使い方は変わりありません。メソッドを終了して以後も値を保持し続けるという違いがあるぐらいです。 ただ、使い方を説明してもおそらくそれをそちらで応用できないのではないでしょうか。言語の基本がわからないと、この種の説明は、「読んで意味はわかっても自分で応用できない」ということになりがちです。 今からでも遅くはありませんので、Objective-Cの基本的な文法の入門書などを一冊用意し、基本的な部分をまず勉強されてから先へ進まれたほうがよいと思います。

noname#177743
noname#177743
回答No.1

sound = [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil]; [sound setNumberOfLoops:-1]; [sound stop]; ↑ これだと、新しくAVAudioPlayerを作ってループを停止させることになりますが……。既に鳴っているものを操作したいのですよね? ならば、現在動いているAVAudioPlayerに対してstopなど呼び出さないといけませんよ。 最初に再生をするときに作ったAVAudioPlayerをインスタンス変数などに入れて保管しておき、それをstopしてみてください。

vibmusic2
質問者

補足

ご回答ありがとうございます。 > これだと、新しくAVAudioPlayerを作ってループを停止させることになりますが……。既に鳴っているものを操作したいのですよね?  同一controller内で、タイマースタートボタンを押すと同時に音楽をスタートし、タイマー終了とともに音楽を停止するプログラムコードも教えていただけたら助かります。 よろしくお願いします。 ちなみに、-(IBAction)bgmplayEvent; でタイマースタートボタンにリンクさせて、タイマースタートとともに、音楽は確かにスタートしましたが、カウントダウンタイマー終了とともに(タイマー終了時のイベントとして)、音楽をstopさせるプログラムコードを下記のようにいれてみましたが、コードが間違っているようで、音楽はstopしませんでした。 タイマー終了時のイベントとして、アラートメッセージの提示とともに音楽停止のコードを下記のようにをいれました。アラートメッセージは確実に出ましたが、音楽は、停止しませんでした。 if (RestTime == 0) { timeflag = false; NSString *bgmPath = [[NSBundle mainBundle] pathForResource:@"xxxx"ofType:@"mp3" ]; NSURL *bgmUrl = [NSURL fileURLWithPath:bgmPath]; sound = [[AVAudioPlayer alloc] initWithContentsOfURL:bgmUrl error:nil]; [sound setNumberOfLoops:-1]; [sound stop]; alert1 = [ [UIAlertView alloc] initWithTitle:@"xxxxxx" message:@"xxxxxxxxxxxxxx" delegate:self cancelButtonTitle:@"xx" otherButtonTitles:nil]; [alert1 show]; [alert1 release]; この場合の音楽を停止する正しいプログラムコードを具体的に教えていただければ、助かります。 > 最初に再生をするときに作ったAVAudioPlayerをインスタンス変数などに入れて保管しておき、それをstopしてみてください。 確かに、他のページ、controller内で既に鳴っている音楽もカウントダウンタイマーで止めたいのですが、< インスタンス変数などに入れて保管しておき > 具体的なプログラムコードを教えていただければ助かります。 < インスタンス変数など >というのが、具体的にわからないので、ご教授お願い致します。 よろしくお願いします。