久々、あいぽんのプログラムに付いて書きたいと思います。
ゲーム作っている時に実際に出たバグなんです。。。が。。。
皆様は音を再生するとき何を使用しておりますか?
僕は一番良く使われてる(?)
AVFoundation の AVAudioPlayer なるものを使用しています。
こいつが中々のクッサイものでした。
初期化は 下のようにして
/**
* ファイル名からメディアを取得する
*/
+ ( IOSMediaSound* ) GetSound:( NSString* )pSoundname
{
/** リソースから読み込み **/
NSString* path = [ [ NSBundle mainBundle ] pathForResource:pSoundname ofType:@"mp3"];
if ( !path )
{
NSLog(@"音楽ファイル : %@がありません", pSoundname);
return NULL;
}
NSError* playererror;
NSURL* url = [ NSURL fileURLWithPath:path ];
AVAudioPlayer* pSound = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&playererror];
/** メモリに読み込ませておく **/
if ( ![ pSound prepareToPlay ] )
NSLog( @"音 : バッファ読み込み失敗" );
if ( playererror != NULL )
NSLog(@"Error %@", playererror);
IOSMediaSound* pMediaSound = [ [ IOSMediaSound alloc ] initWithSound:pSound ];
return pMediaSound;
}
prepareToPlay にて、『再生時の遅延を無くすために予めバッファに読み込んでおく』
ということをしました。
これで、いきなり ”再生!” ってしてもすぐ再生されます。( 成功してたら )
ここはファクトリクラスの一部なので、サウンドの生成しかしていません。
実際は IOSMediaSound ってクラスがサウンドを保持しているクラスです。
@interface IOSMediaSound : NSObject
< AVAudioPlayerDelegate >
{
@public
/** サウンド **/
AVAudioPlayer* mpSound;
/** 管理クラス : ここに様々なイベントの処理を書く **/
IOSAudioPresenter* mpPresenter;
}
管理クラスを持っているのはいけないことだと思ってますが、なにか使うかもわからないので一応w
で。
再生は play、停止は stop、一時停止は pause。
基本。
これはわかりました。
何が頭を悩ませたって..
stop したらせっかく
prepareToPlay で読み込んでおいた音をバッファから取り除くんですね。
これは中々・・・ ブフッ∵(´ε(○=(゚∀゚ )
実際、 SE もこのクラスで使用していて、
SE の再生中に別の SE が流れると、
前のSEは stop して 新しい SE を play していました。
そして stop するとバッファから消えるので、
新たに prepareToPlay を書いていました。
これで、シュミレーターでは全然普通に動きました。
そう、問題は実機。
恐らく、デバイスの処理能力の問題だと思いますが、
stop の後に、 prepareToPlay を書くとエラー゚(゚´ω`゚)゚。
止まりはしません。遅延が起こります。
================================================================
『ふぅー・・・ ようやく出来た-! 後は申請かなー♪』
↓ 実機テスト
連続したSE再生の所で音がならない( ^ω^)・・・
↓
『おっぱい揉みたいなぁ~( 現実逃避 )』
↓
以下ループ
================================================================
随分悩まされました( ´Д`)=3
で、
『どうしたらいいんだ・・・』 と考えた結果
↓
そう。
stop がダメなら pause にして、
後は音の位置を先頭に戻したらいーじゃーん! FOOOO!!
ってしましたw
『pause だからバッファも開放されないし(b´∀`)ネッ! 』
果たしてこれで大丈夫なのか。
心配で夜もグッスリです。
**************************************
後、実機でテスト中に IOS4.3 だと起動しないバグが出た。
これはよくよく見たら
IOS 5.0 以降の
『GLKit』 と 『CoreImage』をフレームワークに追加していたからだった・・・
いや、もうなんかね・・・
しかもこの2つ、アプリ内では使ってなかったというwwww
なんで追加してたんだろ 俺・・・
以上!
音の管理や画像の管理は 色々と工夫しようと思った。
それこそ前の記事のファクトリクラスで読み込み部分は別に書くとか?
わからん。。。勉強あるのみだわ