Hatena::ブログ(Diary)

Ko-Taのバ・ー・ルのようなもの

2009-05-08

AlphaOgg HDR (OggVorbis再生Delphiライブラリ HDR版)

f:id:Ko-Ta:20090508072301j:image

・AlphaOgg HDR(2009/09/23更新)

http://kota.dokkoisho.com/#AlphaOggHDR

・wuvorbis.dll

http://kikyou.info/tvp/

(一番下)


・概要

W.Dee氏のwuvorbis.dllを使ってOggVorbisを再生するDelphiライブラリのHDR版です。

HDR処理により、レンジオーバー時の波形の歪みを解消してくれます。

その他、音量フェード機能やリアルタイム波形取得などの機能も備えています。


前VersionのAlphaOggから、高速化、内部波形合成のHDR化が盛り込まれています。

前Versionから命令が若干異なる部分があるので、完全な後方互換はありませんが、ちょっと弄れば動くでしょう。

また、HDR処理が入りましたが、全体の高速化を行ったので全体の処理負荷は減っている筈です。(前回のコードが相当お粗末でしたので…)

ソースが古いため相変わらず汚い部分が残ってますが、ごめんなさい。


・HDR機能

OggVorbisから波形を取り出すプロセスは前回とほぼ変わりませんが、Playerで複数の波形を合成する際には32Bit整数値によるHDR処理が行われます。

HDR出力範囲を指定することで、本来レンジオーバーで歪む波形も、自動的・動的にボリューム調整を行い波形特性を維持したまま出力します。

この機能を応用すると、大爆発で一時的に周りの音が小さく聞こえたり、耳を澄まして小さい音を聞き分ける、と言った人間的な特性を疑似再現することも出来るかと思います。


詳しい原理説明はこちらで。

http://d.hatena.ne.jp/Ko-Ta/20061209/p1


・バージョン情報

2011/08/16...Rendering内で範囲外アクセスをしていた点を修正。

2009/09/23...範囲外アクセスをしていた点を修正。

2009/07/13...セマフォクラスの名前がVCLライブラリのものと被るので変更。

2009/06/11...パンボリュームの追加

2009/05/08...とりあえず公開

涼 2009/06/05 01:25 大変便利で、感動しております。
ただ、Delphi6と7は問題なく快適に動作しておりますが、
Delphi2009だと、OggPlayer.Renderingのところで…
'アドレス 00403583 でアドレス 00000000 に対する書き込み違反がおきました'
と言われるんですけれども…これは、私が何か気付かずに間違っているのでしょうか?
2009には対応していないのでしょうか?

Ko-TaKo-Ta 2009/06/11 12:48 はじめまして。
私は2007を使用しておりますので、2009等での動作報告は有り難い限りです。
さて、サンプルのコードそのままを実行して一般保護エラーと仮定して、アドレスから遡ってみましたところ、どうやらコンパイラの吐くバイナリが微妙に違うのかソース位置を逆算することが出来ませんでした。
より正確なソース上での位置(関数名と例外発生したコード位置)が分かるようでしたら、教えていただければと思います。
「00000000 に対する書き込み(ヌルポ)」とありますので、何となくではありますが原因そのものは前処理に有りそうな気がします。
例えば、DLLとの連携そのものが2009で変わっちゃってロードそのものが上手く行かなくなって・・・なんてことは無いとは思いますが・・・。

涼 2009/06/14 19:41 お返事ありがとうございます。エラーが出てブレーク?するのは、
TOggData.RenderingToPointerの...
a := RenderingToPointer4096(d,l,tt,Format32Bit);
の行です…
…えっと、すいません、あんまり詳しくなくて…
もし的外れだったら仰ってください。調べなおします。

Ko-TaKo-Ta 2009/06/22 23:53 時間を割いていただき有り難う御座います。
RenderingToPointer4096内部の位置を知りたかったのですが、追跡は難しいようですね。
こちらで分かる範囲でソースを見直してみます。

涼 2009/06/29 21:14 _VolumeApply32のforの中…みたい…なんですけど…。
どうして良いのかわからなくて、デバックログみたいのを出力させてみました。
RenderingToPointer4096は何回か成功して、何度目かに_VolumeApply32内で'書き込み違反'となりました。
それから、アドレスはOggデータによっても違うようです。
'アドレス FFFFFDF5 に対する読み込み違反がおきました。'
'アドレス FFFFFFFF に対する読み込み違反がおきました。'
'アドレス 00000000 に対する読み込み違反がおきました。'
'アドレス 00000004 に対する読み込み違反がおきました。'
0近辺ではあるのですが…。参考になれば幸いです。
役に立たない情報だったらごめんなさい。

涼 2009/06/30 09:14 バッファサイズを小さくすると、ReleaseSemaphore(FSema,1,@p)の行で
'アドレス 〜 に対する読み込み違反がおきました。'となります。
_VolumeApply32をコメントアウトしても、同じです。

Ko-TaKo-Ta 2009/07/02 22:28 どうも有り難う御座います!
セマフォがダメっていやーな感じですね。
たぶん、スレッドの競合が起こっているのでしょうね。競合用の排他処理(セマフォ)でエラーが出取るので、もしかするとセマフォ生成すら出来ていないのかも知れませんね。
Delphi2009で突如発生した理由は分かりませんが、これは2009入れないとちょっと追跡は難しいかなぁ・・・。
2009はまだ買ってないんですよね(タハハ・・・orz

涼 2009/07/03 01:30 Delphi2009から、SyncObjsユニットに、TSemaphore=class(THandleObject)ってのがありますが…
なんか関係あるんでしょうかねぇ…。

Ko-TaKo-Ta 2009/07/05 17:06 なるほど!
もしかするとそのオブジェクトに置き換わってしまっているのかも知れませんね。
TSemaphoreをctrl+左クリックで飛ばされた先がSyncObjsなら、その原因が濃厚です。
AlphaOgg側のクラス名を変更(またはネームスペースを与えるなど)して回避、無事動けばいいのですが・・・。

涼 2009/07/09 20:10 名前変更ではダメでした…。
もう少し、いろいろ試してみます。

Ko-TaKo-Ta 2009/07/13 19:28 治る治らないは別として、名前が被るのはマズイので一応対策しておきました。
もしかして、DLLそのものが読み込めていない(CurrentPathの問題などで)などでは無いですよね?(サンプルではIFチェックやってないのでー)

涼 2009/07/17 07:19 DLLは、読み込めているみたいです。
CurrentPathの問題などがあるときは、ちゃんとエラー吐きますし…。
_VorbisfileInitializeはTrueで帰ってきます。

Ko-TaKo-Ta 2009/09/23 01:17 確保メモリ範囲外のにアクセスしていたようです。
もしかすると改善されるかも知れません。

涼 2010/01/21 16:46 修正お疲れ様です。
試してみたところ、相変わらず、Delphi2009では、例外が…。
もちろん、Delphi6やDelphi7では問題ない様です。

Ko-TaKo-Ta 2010/03/24 08:21 ふと思い立ったのですが、DDSDのCoInitializeEx(Nil, 0);と関係があったりするのかな?
QD公式掲示板でも触れられておりますので、参考になれば幸いです。

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証