Ticket #39474

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

Eröffnet am: 2019-08-14 20:21 Letztes Update: 2019-08-15 20:35

Auswertung:
Verantwortlicher:
Typ:
Status:
Offen [Owner assigned]
Komponente:
Priorität:
5 - Mittel
Schweregrad:
7
Lösung:
Keine
Datei:
Keine
Vote
Score: 0
No votes
0.0% (0/0)
0.0% (0/0)

Details

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

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

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

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

Ticket-Verlauf (3/3 Historien)

2019-08-14 20:21 Aktualisiert von: yyagi
  • New Ticket "Riff chunked oggを使った曲を再生しようとすると、DTXManiaが強制終了する" created
2019-08-14 20:47 Aktualisiert von: yyagi
  • Details Updated
Kommentar

フォーラムのほうにも書きましたが、おそらく発生条件は以下の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 Aktualisiert von: yyagi
Kommentar

もう少し調べてみた。

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ファイルになるはず。

Dateianhangliste

Keine Anhänge

Bearbeiten

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Anmelden