チケット #39474

Riff chunked oggを使った曲を再生しようとすると、DTXManiaが強制終了する

登録: 2019-08-14 20:21 最終更新: 2019-08-20 23:33

報告者:
担当者:
チケットの種類:
状況:
オープン [担当者決定済み]
コンポーネント:
マイルストーン:
優先度:
5 - 中
重要度:
7
解決法:
修正済み
ファイル:
なし
投票
点数: 0
No votes
0.0% (0/0)
0.0% (0/0)

詳細

SoundDecoder.dll を「使っていない」DTXManiaで、下記の曲データをWASAPI/ASIOで再生しようとすると、WAVデータのデコード処理中にエラーが発生して、try-catchしているにもかかわらずアプリが強制終了する。従い、公開中のRel114では問題発生しないが、開発中の115で問題発生。派生本体では問題発生するものと思われる。

tps://www.dropbox.com/s/o2t8qiv1xay0u3f/TOCCATA.rar?dl=0

なおDirectSound使用時は、強制終了はしないものの、BGMが無音になる。

フォーラム ユーザフォーラム [#83387] からの引用。

チケットの履歴 (5 件中 3 件表示)

2019-08-14 20:21 更新者: yyagi
  • 新しいチケット "Riff chunked oggを使った曲を再生しようとすると、DTXManiaが強制終了する" が作成されました
2019-08-14 20:47 更新者: yyagi
  • 詳細が更新されました
コメント

フォーラムのほうにも書きましたが、おそらく発生条件は以下の3つの条件のアンドです。

  • RIFF chunked OGG で (つまり、WAVファイルの体裁をしているが、中にoggのchunkを埋め込んでいるようなファイル)
  • Oggのmodeが2+で、(つまりWAVのFormatTagが0x6770で)
  • Oggのエンコーダが "Xiphophorus libVorbis I 20010910"

# たまたまRIFF chunked OGG, mode 1, "Xiphophorus libVorbis I 20011231"のデータを所持しており、それはOKでした

取り急ぎ応急処置として、以下の対応を両方実施して回避できることを確認済み。

  1. https://ux.getuploader.com/ProjectOVCM/ の ogg vorbis ACM codecをインストールする。v2.5が64bit OS用、2.0が32bit用。説明はここ: https://ameblo.jp/true-shootingstar/entry-11009237346.html これでとりあえずWindows Media Playerで件のWAVファイルをかろうじて再生できるようになるが、あくまでかろうじてレベル。エクスプローラー上でプロパティ情報を表示しようとするだけでエクスプローラーが強制終了したりするのは相変わらず。
  2. 件のwavファイルの先頭2Cバイト(46バイト)を削る。これでwavヘッダの最初のところが削られてoggのヘッダの最初がファイルの頭になる。wavファイルとしては正しくないデータ構造になるものの、これでBASS.dllが(1.のACMを使って)件のwavファイルもどきをデコードできるようになり、問題はなくなる。(実際には、実データの頭を削るのではなく、DTXManiaでの読み込み時に先頭を削って処理する感じかと)

本来は、oggに関してのみ、SoundDecoder.dll相当のモジュールを作るべきですが、取り急ぎは上記で問題回避できると思います。

2019-08-15 20:35 更新者: yyagi
コメント

もう少し調べてみた。

https://github.com/kunitsyn/ogg-acm-codec

ここのreadme.txtやdevelopper.txtを見る限り、 ogg vorbisをWAVのRIFF chunkとして取り込む方法には複数あり、それぞれ一長一短ある模様。

  • mode 1/1+: dataチャンクにoggのヘッダ情報を入れるやり方。入力ストリームバッファを非常に小さくしている再生アプリでうまく扱えない可能性あり。
  • mode 2/2+: WAVEFORMATEXの拡張領域(cbSizeを1以上にして確保する領域)にoggのヘッダ情報を格納するやり方。件のファイルはこの拡張領域が30KB以上あり、これを想定していないデコーダがメモリ確保に失敗してAccess Violationに至っている模様。
  • mode 3/3+は、デコーダのバージョン依存あり。

で、私の環境では、mode1/2+は再生できて、2/2+がダメっぽい感じです。

なので、正しい対策は、mode 2/2+(3/3+)にちゃんと対応したデコーダを使う、ことになるのですが、上記の通り、WAVのまま扱おうとすると結局はどこかで破綻するようですので、WAVからoggを抽出して、WAVファイルでなくoggファイルとして扱うようなロジックを追加して対応しようと思います。幸い実装は簡単で、fmtチャンクのWAVEFORMATEXのcbsize以降(の先頭8byte以外)と、dataチャンクの中身を丸々ぶっこ抜いてくっつければ、それでoggファイルになるはず。

2019-08-19 12:34 更新者: yyagi
  • 解決法なし から 修正済み に更新されました
  • 詳細が更新されました
コメント

Rev. 8cb598283e68b1b0fc3cc2e851b5637547842866 で修正済み。いろいろと大変だったので備忘録として以下補足を。

  • WAVEファイルのデコードロジックを見直し、WAVEFORMATEXのwFormatTagを見て、Ogg VorbisだったときはOgg VorbisのACMではなく、NVobis ( https://github.com/ioctlLR/NVorbis ) を使ってデコードするようにしました。
  • NVorbis の NuGet パッケージは使わず、ソースコードをソリューションに取り込んでいます。理由は、Headerの検索に失敗するレアバグを踏んでしまい、自前で修正したため。(PullRequestを出すつもりではいますが、その前にまずGitHubのアカウントを取得しろという話・・・。修正箇所は NVorbis/Ogg/OggContainerReader.cs の322行目あたりです)
  • NVorbisが、.NET Core 2以上を要求します(現時点では事実上2.2以上)。VS2017でビルドしようとすると、これのSDKを追加する必要がありました。VS2019だと追加不要っぽいですが未確認です。追加は https://dotnet.microsoft.com/download からインストーラをダウンロードして実行。まだ未確認ですが、たぶんビルドだけでなく実行にもこれのランタイムが必要なような気がしています。バグ修正版をNuGetに反映してもらえれば、この辺をユーザーに意識させずに済むかな。
  • Ogg-Vorbisのデコーダを変えた関係で、ここだけデコーダの出力が16bit(short)から32bit(float)に変わりました。Riff chunked Vorbis又は(DirectSound時限定で)oggファイルの再生時に、ちょっとだけ音質が良くなったかもしれません。(私には違いが全く分からずでしたが)
  • これらの変更に伴い、CSound()のデコード周りの内部実装を見直して、つぎはぎ状態だったデコード周りを少しだけすっきりさせました。(本当はきっちり設計見直しもしたかったのですが、それはまたの機会に。)
  • DirectSound使用時のOgg Vorbisのデコードが遅くなったような気がします・・・。いい加減にストリーム再生を実装しないとダメかな。

まだまだ未確認事項が多く、またテストも不足していますので、今後のんびり確認/テストしていきます。ビルドしたものは下記に置きました。 https://osdn.net/users/yyagi/pf/DTXMania_TestBuilds/dl/DTXMania/DTXManiaGR_fixRiffChunkedVorbisDecoder.zip

なお、

WAVからoggを抽出して、WAVファイルでなくoggファイルとして扱うようなロジックを追加して対応しようと思います。幸い実装は簡単で、fmtチャンクのWAVEFORMATEXのcbsize以降(の先頭8byte以外)と、dataチャンクの中身を丸々ぶっこ抜いてくっつければ、それでoggファイルになるはず。

これもトライしてみたのですが、曲の途中までしかデコードしてくれないデータを見つけてしまったので、没にしました。

2019-08-20 23:33 更新者: yyagi
コメント

まだまだ未確認事項が多く、またテストも不足していますので、今後のんびり確認/テストしていきます。ビルドしたものは下記に置きました。 > https://osdn.net/users/yyagi/pf/DTXMania_TestBuilds/dl/DTXMania/DTXManiaGR_fixRiffChunkedVorbisDecoder.zip

#39490の修正を含めて、同じファイル名で再度uploadしました。お一人だけ古いファイルをダウンロード済みの方がいらっしゃいましたので、お手数ですが再度ダウンロードください。

なお、.NET Core 2以上・・・はなくても本体は動作しました。

添付ファイルリスト

添付ファイルはありません

編集

ログインしていません。ログインしていない状態では、コメントに記載者の記録が残りません。 » ログインする