プレビュー音がループしない
時間があれば調べてみようと思いますが、とりあえず1点。
SlimDX側の問題って可能性はないのですよね(ってことを既に確認済みだったりすると直近はDTXMania側のみのソースチェックに注力できて助かる)?
SlimDX側の問題って可能性はないのですよね
その可能性は否定できません。
私も、いつも疑問があれば、SlimDX のソースコードまで戻って調べてます。
# SlimDX ソースは TortoiseSVN でチェックアウトしてあります。
何しろ、彼らはリリースのたびに平気でデグレしますからねー。
しかも「もう外部プログラマの補助は不要だ」とまで言い切ってて、バグや提案を受ける窓口を減らしましたしねー。
過去に彼らに申請して修正してもらったバグもまた June2010 で再現してるので、仕方なく私自身で SlimDX をカスタマイズしてますしねー。
FROMさんがお作りになった旧SlimDXページを拝見したのですが、
http://mainori-se.sakura.ne.jp/slimdxwiki/@old/wiki.cgi?page=DirectSound+%A4%CE%BB%C8%A4%A4%CA%FD
「ストリームサウンドの場合には、ループモードで再生を開始します。」って書いてありました。 実際、セカンダリバッファの再生開始をするところのソース(CSound.cs)は
this.Buffer.Play( 0, ( this.bストリーム再生する || this.bループする ) ? PlayFlags.Looping : PlayFlags.None );
こうなってました。
・・・微妙に「ストリーム再生かつループ再生なんて機能は未実装」ってなオチの香りが漂ってきたのですが、そんなことないですよね。
# オンメモリ再生の場合はちゃんとループ再生することを確認しました。
以前私が作成した某 TO MAKE THE なんとかですが、あれの PREVIEW では、長い ogg(1曲全部)を鳴らしていました。
そして、正常にストリーム再生にてループもしていたことを記憶しています。
(BGM全部をオンメモリにしてたらフリーズ時間がかかりすぎるのですぐ分かるし、ループするたびに動画とずれていった(汗)ことも覚えてます。)
なので、DirectSound 側では正しくループしているんだと思います。
問題は、バッファではなく、ループしてるバッファに書き込むほうがループできてないのではないかと非常に繊細な注意を持って動向を注目し続けております。
それでは、バッファへの書き込み部分をチェックするのと平行して、「どのバージョンからループしなくなったのか」を、私が持っている過去バージョンで一通りチェックしてみます。
そのときのリリメモと突き合わせればあるいは。
ある程度以上の大きさのプレビュー音(某fさんのFlyHighで確認)について、 DTXMania068 (080601) ではループ再生しますが、 DTXMania069 (080810) ではループ再生しない、と出ました。
この間にまだ2つのバージョンが存在しますが、手持ちにはなく未確認です。
・・・あれれ、某MAKE THEの話と合わないな・・・。
なおPSPdisp環境下で起動できなくなる問題は、070以降で発生していました。!SlimDX導入以降、サブモニタ環境では起動不可になっていたようです。
CSound.cs のプロパティ bループする なんですが、誰もsetしてないような気が。 (参照はサウンドバッファ書き込み時など随時行われているのですが。)
なので常にfalseになってるっぽい。
なので、まずは CSound.cs の t再生を開始する(bool) の中でthis.bループの値をセットしてやってみたところ、 ちょうどループになるタイミングでGPFとなりました。Access Violationだそうな。
ふむ。ちょっと進んだ。
CScore.cs の最後の tデコーダの現在の読み出し位置から1バッファ分のPCMを指定されたバッファに書き込む() が怪しいよなぁ、最後はみ出た部分の処理でハマるよなぁ、ああこの辺のことをfromさんはおっしゃっていたのか-、というところまでは何とか追いつきました。
さてどうしたものか・・・。
結局、2010-11-24のコメントの通りに CSound.cs の 340行目あたりを
public void t再生を開始する( bool bループする ) { this.Buffer.Stop(); : try { this.bループする = bループする; // #23575 2010.12.18 yyagi: これを追加する this.Buffer.Play(0, (this.bストリーム再生する || bループする) ? PlayFlags.Looping : PlayFlags.None); } catch( OutOfMemoryException ) { :
と1行加えてみたところ、今はなぜか普通にループ再生できるようになっていました。前は何か勘違いしていたのだろうか・・・。
ただし、oggやxaではうまくいくのですが、mp3(正確にはriff chunked mp3)だとループ時にGPFでコケます。 問題の所在が SoundDecoder.dll クサくなってきました・・・。
今回(Ver.096)ループする仕様に治してくださったと思うのですが、ループしない仕様でもいいんじゃないですか?と言ったら怒られますか?(汗
選曲画面で放置すると延々ループしてるのって少々耳障りなんですよね、、、放置するほうが悪いんですがw
普通プレビューは1回聞けば十分だと思うので、一度再生したら選曲BGM(指定していればですが)に戻ったほうが私としてはストレスの少ないGUIに感じます。
「ループしない」というチケットとは逆行した意見で申し訳ありませんが、コメント残させていただきますm(
※問題なのはループしたいのに出来ていない、ってことなのかもしれませんが。
「ループさせない方がよい」可動化は他の方のご意見をお待ちいたします。
意見がなさそうですので、一旦チケットをクローズいたします。
ループさせない方がよいと思われる方は、その旨新規チケットを起票下さいませ。
選曲画面において、プレビュー音がループ再生されません。
プレビュー音をストリーム再生に対応させた際に何らかの影響が出たかと思いますが、もしかしたら SoundDecoder.dll 側の問題かも知れません。(もしそうなら対処できませんが。)