トップページ > 記事閲覧
サウンドの遅延について
名前:motoYo 日時: 2019/11/25 17:42

約半年前からDXLibを愛用させていただいております。 趣味で様々なゲームを作っており、現在はリズムゲームを作っています。 大まかなシステムが完成し、プレイテストをしてみたのですが、0.1秒程度サウンドが遅延しているように感じました。 また、別の方が作られているUnityのリズムゲームサンプルでは、その現象は確認できませんでした。 再生するサウンドはすべてメモリに読み込んであるので、読み込み速度の問題では無いと思われます。 また、非垂直同期下において2000fps以上安定して出ているので、処理速度においても問題はないと思われます。 DirectSound/XAudio2どちらでも同様の現象が発生しました。 原因究明と解決のため、お答えいただけると幸いです。 【動作環境】 OS:Windows10 Home 1903 CPU:Intel Core i7-7700 3.60GHz ROM:HDD 1TB RAM:DDR4 16GB GPU:NVIDIA GeForce GTX 1050Ti DXLib:Ver 3.20f(C++版) C++:C++17 Editor:VisualStudio2019
メンテ

Page: 1 |

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

思ったより早く実装できました よろしければWASAPIによるサウンド再生に対応したこちらのバージョンをダウンロードしてください m(_ _)m 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) 以下の関数を追加しました // サウンドの再生にWASAPIを使用するかどうかを設定する // Flag TRUE : WASAPIを使用する FALSE : WASAPIを使用しない( デフォルト ) // IsExclusive TRUE : 排他モードを使用する FALSE : 排他モードを使用しない // DevicePeriod 再生遅延時間、100ナノ秒単位( 100000 で 10ミリ秒 )、-1でデフォルト値 // SamplePerSec サンプリングレート int SetEnableWASAPIFlag( int Flag, int IsExclusive = TRUE , int DevicePeriod = -1 , int SamplePerSec = 44100 ) ; DxLib_Init の呼び出しの前に SetEnableWASAPIFlag( TRUE ) ; と記述すればサウンドの再生が WASAPI を使用したものになります 遅延を最小に抑える場合は SetEnableWASAPIFlag( TRUE, TRUE, 0 ) ; としてください( DevicePeriod にサウンドデバイスが対応している最小遅延時間以下の値を指定すると 自動的にデバイスが対応している最小遅延時間が使用されるようになりますので ) 実際に採用された遅延時間は Log.txt に以下のような感じに出力されます WASAPI の初期化を行います 遅延時間 : 3.00 ms デフォルト遅延時間 : 10.00 ms 最小遅延時間 : 3.00 ms WASAPI の初期化は正常に終了しました 『遅延時間』とだけ書かれている行が、実際に使用する遅延時間です よろしければお試しください m(_ _)m
メンテ
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

> motoYoさん、あいおい?さん お待たせしました ご報告いただいたこちらのバグ ・IsExclusive = FALSE;(排他モードを利用しない(共有モード))の場合、WASAPIデバイスの初期化に失敗する。 ・DevicePeriod = 0 or -1 の場合はデフォルト値が使用される。 ・なにも指定していないときとSetEnableWASAPIFlag(FALSE)を追加したときの挙動が異なる を、修正したバージョンをアップしましたので、よろしければお試しください m(_ _;m 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > ・自分の環境で記載されているデフォルト遅延時間/最小遅延時間はそれぞれ >  10.00 ms/3.00 ms >  となっているが、デフォルト/最短を利用した場合にLogに書き出される遅延時間と異なる。 >  遅延時間 10.16ms/3.63ms >  また、実際にDevicePeriodに値を指定した場合にも、若干のズレが生じる。 こちらは仕様のようです ”排他モードで遅延時間を指定して失敗した場合は遅延バッファを調整して再度指定を試す”という処理を ネット上で見かけた排他モード再生のサンプルプログラムや、あいおい?さんが使用された MPC-BE のソースでも 行っていて、その通りにプログラムを実行するとぴったりの最小遅延時間にならないデバイスがあるようです ( 手元のPCでは 3.00 ぴったりでしたが、別の PC では 3.00ms より大きな値になりました ) > 2. WASAPIの初期化に失敗する > こちらの環境では排他モードも共有モードも初期化に失敗します。 > オーディオインターフェース: AG03(ヤマハ) (音が鳴らない) 今回こちらは直せたかどうかは分かりません… ( 共有モードでは初期化に成功する可能性は高いと思いますが… )
メンテ
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

お試しいただきありがとうございます 192KHzは凄まじいですね… ( あと、最小遅延時間が 3.00ms 以下のデバイスもあるのですね… ) > USBによるオーディオインターフェースがAG03のみしか所持しておらず、何故排他モードが使えないのか、他に使えない機器があるのかまだ不確かですが報告させていただきます。 ご情報ありがとうございます WASAPI の排他モードは、最初に対応しているサウンドフォーマットを調べ、その後 オーディオクライアントの初期化を行おうとしますので、 『オーディオクライアントの初期化に失敗しました』 というログが出ているということは、排他モードに対応しているサウンドフォーマットは 見つけることができたということになります( 見つけることができなかった場合は別のエラーログになるので ) AG03は排他モードに対応していない、という可能性も考えましたが 排他モードに対応しているサウンドフォーマットがあった、という結果が出ているので、恐らく対応していると思います 大きな処理の変更は行っていませんが、WASAPI の初期化に失敗した場合もログに情報をできるだけ出力するように 処理を変更したバージョンをアップしましたので、よろしければお試しになってみてください m(_ _;m 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい)
メンテ
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
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存