Re: サウンドの遅延について ( No.1 ) |
- 名前:Citrine 日時:2019/11/25 22:37
読み込んでいるサウンドファイルの形式はMP3でしょうか?
MP3は仕様の関係上、エンコードした際に冒頭に無音部分が追加される場合があります。
これによって再生時に微小なズレが生じ、音楽ゲームでは遅延として現れることがあります。
参考:ttp://dj-daishizen.blog.jp/archives/1061296.html
|
Re: サウンドの遅延について ( No.2 ) |
- 名前:管理人 日時:2019/11/26 01:13
0.1秒の遅延はなかなか大きな遅延ですね… ( 60fps 換算で 6フレームなので )
手元で以下のような『左右に移動する四角形が画面の端に当たる度に音が鳴る』プログラムを組んで
試してみましたが、0.1秒の遅延は感じられませんでした
#include "DxLib.h"
#define BOX_SIZE (32)
int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow )
{
int x, add ;
int SoundHandle ;
// ウインドウモードで起動
ChangeWindowMode( TRUE ) ;
// DXライブラリの初期化
if( DxLib_Init() < 0 ) return -1 ;
// 描画先を裏画面にする
SetDrawScreen( DX_SCREEN_BACK ) ;
// 音を読み込み
SoundHandle = LoadSoundMem( "Test.wav" ) ;
// メインループ
x = 0 ;
add = 8 ;
while( ProcessMessage() == 0 )
{
// 移動
x += add ;
// 画面の端に到達したら音を鳴らす
if( x <= 0 || x >= 640 - BOX_SIZE )
{
add = -add ;
PlaySoundMem( SoundHandle, DX_PLAYTYPE_BACK ) ;
}
// 画面のクリア
ClearDrawScreen() ;
// 四角形の描画
DrawBox( x, 240 - BOX_SIZE / 2, x + BOX_SIZE, 240 + BOX_SIZE / 2, GetColor( 255,255,255 ), TRUE ) ;
// 裏画面の内容を表画面に反映
ScreenFlip() ;
}
// DXライブラリの後始末
DxLib_End() ;
// ソフトの終了
return 0 ;
}
( Test.wav はDXライブラリのパッケージの中の『サンプルプログラム実行用フォルダ』の中にあります )
よろしければ motoYoさんの環境では上記のプログラムでも0.1秒の遅延( 壁に四角形が当たってから 0.1秒後に鳴っている )が
発生するかお試しいただけないでしょうか? m(_ _;m
|
Re: サウンドの遅延について ( No.3 ) |
- 名前:motoYo 日時:2019/12/03 18:00
返信が遅くなり、申し訳ございません。
結論から言うと、遅延の原因は、サウンドドライバが一番でした。
そのまま実行したときは、そのまま0.1s程度の遅延が発生しましたが、
サウンドドライバを汎用のものに変更すると、1~2f程度の遅延に収まりました。
ただ、リズムゲームを作るに当たり、どうしてもその遅延が気になってしまいます。
DirectSoundはVistaからはエミュレートで音を出しているからどうしても遅延が発生してしまう、という記事を数個見つけました。
コレを解決するには、別のサウンド方式を使うほか無いようです。
DXLibで、この問題を解決していただくことは出来ますでしょうか?
「DirectXを使いやすくまとめた」という趣旨からずれる以上、厳しいとは思いますが、どうかよろしくお願いいたします。
|
Re: サウンドの遅延について ( No.4 ) |
- 名前:管理人 日時:2019/12/04 00:33
> DXLibで、この問題を解決していただくことは出来ますでしょうか?
DxLib_Init を呼ぶ前の行に SetEnableXAudioFlag( TRUE ); と記述することで DirectSound の代わりに
XAudio2 を使用するようにすることができます
// DxLib_Init の前に呼ぶ
SetEnableXAudioFlag( TRUE );
if( DxLib_Init() < 0 )
{
return 0;
}
XAudio2 でも同様の遅延があるか、よろしければお試しになってみてください m(_ _)m
( XAudio2 でも駄目でしたら、Vista 移行でのみ使用できるという低レイテンシオーディオAPIである WASAPI を
使ったオーディオ再生処理を実装しようと思います )
|
Re: サウンドの遅延について ( No.5 ) |
- 名前:motoYo 日時:2019/12/04 23:41
No.1記載の通り、また再度確認もしましたが、DirectSound/XAudio2どちらでも同様の現象が発生しました。
なお、計測はしていませんが、ほとんど遅延量に差は感じられませんでした。
ご存知かとは思いますが、WASAPIや遅延関係について、自分が調べた情報を記載しておきます。
WASAPIには共有モード/排他モードがある。
共有モードの場合は、他のアプリケーションと音が共存できるが、一度Windowsのサウンドミキサーを通るためその際に遅延が発生する。
(DirectSoundの場合、DirectSound->共有WASAPI->サウンドミキサー の経路を通るため、バッファサイズによるがDirectSoundよりWASAPIのほうが遅延は少ないといえる)
排他モードの場合は、サウンドデバイス1つをアプリ側で完全に独占することになるが、余計なものを通す必要がないため遅延は少ない。
バッファサイズが小さいほど遅延量は小さくなるが、性能が低ければ大きくバッファを取る必要があるため、ユーザーの環境に応じて設定できるようにする必要性がある。
また、event drivenというものがあり、遅延は小さくなるが高負荷になる。
:自環境の場合、ソフトウェア上での遅延表示は「排他モード/event driven有効」で5msでした。
WASAPI以外の場合、ASIOを使うという手もあるが、XPからでも使えるという利点と、対応サウンドカードがないと使えないという欠点がある。
(ASIO4ALLといった、非対応のものでも対応してくれる便利ソフトみたいなものもあるにはあるが)
基本的にサウンドカード等が特殊対応していない限り排他モードになる。
:自環境の場合、ソフトウェア上での遅延表示は、ギリギリまでバッファサイズを下げて3msでした。
Unityを利用したプログラムの場合、ほとんど遅延を感じないので、OpenALは遅延が少ない可能性が...?
|
Re: サウンドの遅延について ( No.6 ) |
- 名前:管理人 日時:2019/12/05 00:42
ご情報ありがとうございます
幾つかご質問させてください
> なお、計測はしていませんが、ほとんど遅延量に差は感じられませんでした。
計測には特殊な機材など必要だと思うのですが、計測をするための環境をお持ちなのでしょうか?
> :自環境の場合、ソフトウェア上での遅延表示は「排他モード/event driven有効」で5msでした。
> :自環境の場合、ソフトウェア上での遅延表示は、ギリギリまでバッファサイズを下げて3msでした。
よろしければ『遅延表示』をどのように確認されたのか教えていただけないでしょうか?
> Unityを利用したプログラムの場合、ほとんど遅延を感じないので、OpenALは遅延が少ない可能性が...?
Unity の Windows版が OpenAL を使用しているという情報を見つけることができませんでした
よろしければ Unity の Windows版が OpenAL を使用しているという情報をどちらでご覧になったのか教えていただけないでしょうか? m(_ _;m
|
Re: サウンドの遅延について ( No.7 ) |
- 名前:motoYo 日時:2019/12/05 17:30
> 計測には特殊な機材など必要だと思うのですが、計測をするための環境をお持ちなのでしょうか?
計測する場合は、HDMIキャプチャで画面と音声を録画/録音しています。(60fps単位なので、精度は低いですが)
> よろしければ『遅延表示』をどのように確認されたのか教えていただけないでしょうか?
とあるオープンソース.Netプログラムに同梱されている機能の、サウンド変更システムの遅延表示を使いました。
Bass.Netを利用して、ASIOとWASAPIの遅延量を測っているようです。
BassWasapi.BASS_WASAPI_GetInfo();
BassAsio.BASS_ASIO_GetLatency(false);
等の関数を利用して遅延秒数を出していることがわかりました。
> Unity の Windows版が OpenAL を使用しているという情報を見つけることができませんでした
OpenALのWikipediaにUnityが記載してあっただけでした。
UnityのWikipediaを見ても、その他ページを見てもこの情報は載ってなかったので、
不確定情報のまま発してしまいました。ご迷惑をおかけしました。
ja.wikipedia.org/wiki/OpenAL
|
Re: サウンドの遅延について ( No.8 ) |
- 名前:管理人 日時:2019/12/06 01:23
ご返答ありがとうございます
> 計測する場合は、HDMIキャプチャで画面と音声を録画/録音しています。(60fps単位なので、精度は低いですが)
なるほど、映像と音が一緒に伝送されている HDMI のキャプチャで確認できるのですね…
> とあるオープンソース.Netプログラムに同梱されている機能の、サウンド変更システムの遅延表示を使いました。
> Bass.Netを利用して、ASIOとWASAPIの遅延量を測っているようです。
> BassWasapi.BASS_WASAPI_GetInfo();
> BassAsio.BASS_ASIO_GetLatency(false);
> 等の関数を利用して遅延秒数を出していることがわかりました。
ご情報ありがとうございます
BASS audio library の存在を初めて知りました、BASS audio library が提供しているライブラリの一つが Bass.Net なのですね
あと、motoYoさんのご情報にもありますが、ASIO の方がより本格的に遅延対策ができるようですね
ただ、ASIO を使用するには ASIOドライバのインストールが必要であったり、ソフトを開発する場合も
ASIO SDK のインストールが必要になるので、DXライブラリで対応できるのは専用ドライバや SDK の必要のない
WASAPI のみになると思います
因みに WASAPI 対応する場合も、対応が完了するのは何週間も先になると思いますので、
もしそんなに待てない、とのことでしたら BASS audio library や、ゲームでもよく使用されている
CRI ADX2 LE などをお使いください m(_ _)m
( 間違いなくDXライブラリのサウンド機能より高機能ですし(汗) )
> OpenALのWikipediaにUnityが記載してあっただけでした。
> UnityのWikipediaを見ても、その他ページを見てもこの情報は載ってなかったので、
> 不確定情報のまま発してしまいました。ご迷惑をおかけしました。
了解です
恐らく iOS では OpenAL を使用している筈なのでリンクが張られているのだと思います
( Windows では OpenAL は DirectSound などと同じような高レベルAPIの筈なので… )
|
Re: サウンドの遅延について ( No.9 ) |
- 名前:motoYo 日時:2019/12/07 17:25
ありがとうございます。
時間に追われるものではないので、ゆっくりとまとうと思います。
ただ、自分の技術向上のためにも、その他のサウンドライブラリの導入も頑張ってみようと思います。
お忙しい中、ありがとうございます!
|
Re: サウンドの遅延について ( No.10 ) |
- 名前:管理人 日時:2019/12/08 22:46
|
Re: サウンドの遅延について ( No.11 ) |
- 名前:motoYo 日時:2019/12/09 18:12
迅速な対応をしていただき、本当にありがとうございます。
30分ほど利用したところ、一部動作に問題が見つかりました。
(サンプリングレートは、全てデフォルト値を使用しています。)
・IsExclusive = FALSE;(排他モードを利用しない(共有モード))の場合、
WASAPIデバイスの初期化に失敗する。
更に、続いてDirectSoundデバイスの初期化を行うが、Log上は成功しているが音声が流れない。
再生地点や再生中等の情報も取得できない。
### Log ###
...
1488: WASAPI の初期化を行います
1535: オーディオクライアントの初期化に失敗しました
1548: DirectSound の初期化を行います
1553: DirectSound インターフェースの取得を行います.... 成功
1566: 引き続きインターフェースの初期化処理... 成功
1837: DirectSound デバイスを列挙します
1844: Module Name : Description : プライマリ サウンド ドライバー
1849: Module Name : {0.0.0.00000000}.{1b232b98-ccf6-4fe0-9ce0-f2b9771748cf} Description : スピーカー / ヘッドホン (Realtek Audio)
1854: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz
1860: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB
1865: 利用可能サンプリング精度
1871: Primary 16bit = OK 8bit = OK
1877: Secondary 16bit = OK 8bit = OK
1901: 利用可能チャンネル
1907: Primary MONO = OK STEREO = OK
1913: Secondary MONO = OK STEREO = OK
1996: DirectSound の初期化は正常に終了しました
...
###########
・自分の環境で記載されているデフォルト遅延時間/最小遅延時間はそれぞれ
10.00 ms/3.00 ms
となっているが、デフォルト/最短を利用した場合にLogに書き出される遅延時間と異なる。
遅延時間 10.16ms/3.63ms
また、実際にDevicePeriodに値を指定した場合にも、若干のズレが生じる。
・DevicePeriod = 0 or -1 の場合はデフォルト値が使用される。
(0がデフォルト値になるのは No.10 記載リファレンス通りではない。)
(1以上の場合は、最小遅延時間が利用される)
ご確認お願いいたします。
なお、遅延は抑えられていることを確認いたしました。本当にありがとうございます!
|
Re: サウンドの遅延について ( No.12 ) |
- 名前:あいおい? 日時:2019/12/09 23:11
こんにちは、私もこのスレッドに興味があってウォッチさせて頂いてました。
実際にWASAPI関連の関数が実装されたため使用させてもらおうとしたところ、いくつか不具合を見つけたので報告させていただきます。
1. なにも指定していないときとSetEnableWASAPIFlag(FALSE)を追加したときの挙動が異なる
なにも指定していないときはもちろん音が再生されていましたが、SetEnableWASAPIFlag(FALSE)を指定した場合音が鳴らなくなりました。
2. WASAPIの初期化に失敗する
こちらの環境では排他モードも共有モードも初期化に失敗します。
675: WASAPI の初期化を行います
691: WASAPI の排他モードの設定に失敗しました
699: DirectSound の初期化を行います
705: DirectSound インターフェースの取得を行います.... 成功
720: 引き続きインターフェースの初期化処理... 成功
769: DirectSound デバイスを列挙します
777: Module Name : Description : プライマリ サウンド ドライバー
786: Module Name : {0.0.0.00000000}.{55bc3b5b-86cd-46b3-99dc-e1f82bb005b2} Description : ライン (2- AG06/AG03)
794: Module Name : {0.0.0.00000000}.{2f5e5a19-2146-4d7b-a23b-4dd1e9057e19} Description : PLG2488H (High Definition Audio Device)
環境:
Windows 10 1903
オーディオインターフェース: AG03(ヤマハ) (音が鳴らない)
ディスプレイ: PLG2488H (音が鳴らない)
DXライブラリ(.NET Unicode版)
デバイスが複数あるのが原因かと思いましたが1つのみの接続でも変わらず。サンプリングレートをデバイスの最大値に合わせたりデフォルト値で試したりしましたが変化がありませんでした。
デバイスの排他モードを優先するにチェックは入っています。
|
Re: サウンドの遅延について ( No.13 ) |
- 名前:あいおい? 日時:2019/12/09 23:23
連投失礼します。
WASAPIの動作確認は動画再生ソフトのMPC-BEで排他モードも共有モードも動作確認済です。
|
Re: サウンドの遅延について ( No.14 ) |
- 名前:管理人 日時:2019/12/11 02:01
> motoYoさん、あいおい?さん
お試しいただきありがとうございます
現在 SetEnableWASAPIFlag(FALSE) を実行すると音が鳴らなくなるバグの修正や、共有モードでは音が鳴らないバグなど諸々を修正中です
明日くらいには修正バージョンをアップできると思いますので、もう少々お待ちください m(_ _;m
|
Re: サウンドの遅延について ( No.15 ) |
- 名前:管理人 日時:2019/12/12 01:43
|
Re: サウンドの遅延について ( No.16 ) |
- 名前:あいおい? 日時:2019/12/12 17:48
更新ありがとうございます。
第1引数にFALSEを指定した場合のバグ修正は確認できました。
私の環境での動作挙動が変化したので書かせていただきます。
オーディオインターフェースのAG03でも共有モードであるならば、正常に動作することが確認できました。
******************
WASAPI の初期化を行います
1195: 動作モード : 共有モード
1203: 遅延時間 : 10.00 ms
1211: デフォルト遅延時間 : 10.00 ms
1218: 最小遅延時間 : 3.00 ms
1225: 量子化ビット深度 : 32 bit
1232: サンプリングレート : 192000 Hz
1241: データ形式 : 浮動小数点型
1248: WASAPI の初期化は正常に終了しました
******************
排他モードでは依然として初期化に失敗します。
******************
785: WASAPI の初期化を行います
925: オーディオクライアントの初期化に失敗しました
932: DirectSound の初期化を行います
939: DirectSound インターフェースの取得を行います.... 成功
******************
第4引数に「44100」や「192000」を指定してみましたが結果は変わりませんでした(オーディオインターフェース自体は192kHzに対応してます)。
モニターについているスピーカーによるWASAPI 排他モードは動作しました。
******************
858: WASAPI の初期化を行います
910: 動作モード : 排他モード
920: 遅延時間 : 10.00 ms
930: デフォルト遅延時間 : 10.00 ms
939: 最小遅延時間 : 2.67 ms
949: 量子化ビット深度 : 16 bit
960: サンプリングレート : 48000 Hz
971: データ形式 : 整数型
979: WASAPI の初期化は正常に終了しました
******************
USBによるオーディオインターフェースがAG03のみしか所持しておらず、何故排他モードが使えないのか、他に使えない機器があるのかまだ不確かですが報告させていただきます。
|
Re: サウンドの遅延について ( No.17 ) |
- 名前:管理人 日時:2019/12/13 02:48
|
Re: サウンドの遅延について ( No.18 ) |
- 名前:ナナシ 日時:2019/12/13 16:05
「ボタンを押した瞬間音が鳴る」
の動作を行いたいならASIO使うのが良い気がします。
元々そのための規格なので強いです。
単に音と画面を同期したいならズレる前提で音を先行させる書き方をするべきですね。
市販の音ゲーもそれでやってますし。
自分はNAUDIOというライブラリとDXライブラリを併用して音は全てNAUDIOからの再生にしました。
NAUDIOでASIOとWASAPI比べると体感でわかるレベルでWASAPIが遅延します。
ググっても同様の比較記事出てきますしこの辺が限界かと。
|
Re: サウンドの遅延について ( No.19 ) |
- 名前:あいおい? 日時:2019/12/13 23:43
> 「ボタンを押した瞬間音が鳴る」
> の動作を行いたいならASIO使うのが良い気がします。
> 元々そのための規格なので強いです。
ASIOならこちらの環境でなら1msも出せるので、確かにそうなんですが
対応している機器が少ないので、高価な機材を揃える必要がありますし、配布するゲームであるならば環境も選ばれてくると思うので個人的にはWASAPIかなぁと思います
(もちろん、複数の方式から選択できるようになれば良いですが)
機材を揃えずともASIO環境を作るドライバがありますが、あれは非公式なものであって完璧に動く保証がないので。
> 大きな処理の変更は行っていませんが、WASAPI の初期化に失敗した場合もログに情報をできるだけ出力するように
> 処理を変更したバージョンをアップしましたので、よろしければお試しになってみてください m(_ _;m
同じ環境で実行してみました。
828: WASAPI の初期化を行います
849: チャンネル数 : 2 ch
856: 量子化ビット深度 : 24 bit
863: 有効ビット深度 : 24 bit
869: サンプリングレート : 192000 Hz
877: データ形式 : 整数型
884: デフォルト遅延時間 : 10.00 ms
891: 最小遅延時間 : 3.00 ms
897: 遅延時間 : 10.000 ms
911: オーディオクライアントの初期化に失敗しました エラーコード:8889000f
919: DirectSound の初期化を行います
926: DirectSound インターフェースの取得を行います.... 成功
エラーコードでググってみたらソフト的な不具合(?)ではなくハード的な問題らしく……?
デバイスマネージャーで専用ドライバーを削除してから起動してみたところ、
769: WASAPI の初期化を行います
791: チャンネル数 : 2 ch
800: 量子化ビット深度 : 32 bit
808: 有効ビット深度 : 24 bit
815: サンプリングレート : 44100 Hz
822: データ形式 : 整数型
829: デフォルト遅延時間 : 10.00 ms
837: 最小遅延時間 : 3.00 ms
844: 遅延時間 : 10.000 ms
879: 動作モード : 排他モード
886: WASAPI の初期化は正常に終了しました
というログを吐いてWASAPIで音が鳴るようになりました。が、標準ドライバが当たっているせいで音がブツブツですね。
ということで、この「オーディオクライアントの初期化に失敗しました」のエラーはDXライブラリの実装よりもヤマハのドライバー自体に問題があるように思えます……。
(MPC-BEでは普通に再生できるのが謎ですが……)
あと気になるところと言えば、以前のDxLibTestではデータ型が浮動小数点だったのに対し最新のDxLibTestでは整数型になっているところですかね……
PC固有の問題かもしれないので、後日ノートPCの内部スピーカーとAG03を使用した場合も観てみようかと。
****
他のソフトでも使ってみたところ、マルチメディア再生ソフトのMPC-BEでWASAPIが使えても、音楽編集ソフトのAdobe Auditionでは排他モードが使えないことが分かりました。
再生しようとしたときに
「オペレーティングシステムの設定が原因で、アクセスできないデバイスまたはチャンネルがあります。すべてのデバイスがサポートされるように、以下のアクションを実行してみてください。]
とエラーが出て再生に失敗します。MPC-BEが特別(?)に無理矢理再生させている可能性があります。
|
Re: サウンドの遅延について ( No.20 ) |
- 名前:管理人 日時:2019/12/14 06:22
> 「ボタンを押した瞬間音が鳴る」
> の動作を行いたいならASIO使うのが良い気がします。
> 元々そのための規格なので強いです。
『ASIO SDK が無いとビルドできないのでDXライブラリでは対応は無理』だと思っていましたが、
少し調べてみたところ ASIO SDK は ASIOドライバをロードして使っているだけなので、
ASIO SDK 無しで ASIOドライバを使えば『ASIO SDK 要らずの ASIO対応』ができそうです
あいおい?さんの仰られる通りゲーム向きではないですし、需要があるかも分かりませんが、
少し対応できるか試してみようと思います
> エラーコードでググってみたらソフト的な不具合(?)ではなくハード的な問題らしく……?
> ということで、この「オーディオクライアントの初期化に失敗しました」のエラーはDXライブラリの実装よりもヤマハのドライバー自体に問題があるように思えます……。
エラーコード 8889000f は AUDCLNT_E_ENDPOINT_CREATE_FAILED というエラーで、Microsoft のページでは
『メソッドは、レンダーまたはキャプチャデバイスのオーディオエンドポイントの作成に失敗しました。
これは、オーディオエンドポイントデバイスが取り外された場合、またはオーディオハードウェアまたは
関連するハードウェアリソースが再構成、無効化、削除、または使用不可になった場合に発生する可能性があります。』
となっていて、確かにソフトウェア側のコードの変更で対応できる類のエラーではなさそうです…
> あと気になるところと言えば、以前のDxLibTestではデータ型が浮動小数点だったのに対し最新のDxLibTestでは整数型になっているところですかね……
どうやら 共有モード=必ず浮動小数点 排他モード=基本的に整数型 のようです
> MPC-BEが特別(?)に無理矢理再生させている可能性があります。
もしかしたら排他モードではなく共有モードで動作しているのかもしれません
( 排他モードで初期化に失敗したら共有モードで起動する、というようなコードで… )
とりあえず前回のバージョンから以下の変更を行ったバージョンをアップしました
・WASAPI へのサウンドデータを送信する処理の最適化
・排他モードでオーディオクライアントの初期化に失敗した場合は共有モードでのオーディオクライアントの初期化を試すように処理を追加
・デフォルトで使用するサウンドAPIをWASAPIに変更
https://dxlib.xsrv.jp/temp/DxLibVCTest.zip // Windows版 VisualC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCCTest.zip // Windows版 BorlandC++ 用
https://dxlib.xsrv.jp/temp/DxLibBCC2Test.zip // Windows版 C++ Builder 10.3 用
https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.zip // Windows版 MinGW 用
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
https://dxlib.xsrv.jp/temp/DxLibMakeTest.zip // ソース
(中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
AG03の専用ドライバーでも動作するかもしれないような変更は何も行っていませんが、
よろしければお使いください m(_ _;m
|