Re: サウンドの遅延について ( No.21 ) |
- 名前:あいおい? 日時:2019/12/15 15:16
早速試してみました。
699: WASAPI の初期化を行います
714: チャンネル数 : 2 ch
721: 量子化ビット深度 : 24 bit
728: 有効ビット深度 : 24 bit
735: サンプリングレート : 44100 Hz
743: データ形式 : 整数型
752: デフォルト遅延時間 : 10.00 ms
758: 最小遅延時間 : 3.00 ms
765: 遅延時間 : 10.000 ms
877: オーディオクライアントの初期化に失敗しました エラーコード:8889000f
884: 排他モードでの初期化に失敗したので共有モードでの初期化を試行します
889: WASAPI の初期化を行います
898: チャンネル数 : 2 ch
904: 量子化ビット深度 : 32 bit
910: 有効ビット深度 : 32 bit
916: サンプリングレート : 44100 Hz
923: データ形式 : 浮動小数点型
929: デフォルト遅延時間 : 10.00 ms
936: 最小遅延時間 : 3.00 ms
943: 遅延時間 : 10.000 ms
986: 動作モード : 共有モード
993: WASAPI の初期化は正常に終了しました
とりあえずこのようなログになってWASAPI共有モードに切り替わりました。正常に切り替わっています。感謝です。
> もしかしたら排他モードではなく共有モードで動作しているのかもしれません
> ( 排他モードで初期化に失敗したら共有モードで起動する、というようなコードで… )
MPC-BEで再生できてしまう件、もしかしたら切り替わっているかも? と思い確認しましたが排他モードでしっかりと動いているようです。
(タスクバーのスピーカーアイコンをクリックしたとき、レベルメーターが動いていないのでWindowsのミキサーを通していない→排他モードであるということがわかる)
ソニーの音楽再生アプリのMusic Center for PCでも排他で再生できるっぽいです。
ビット深度とサンプリングレートを手動で設定するか自動で設定するかの項目があるのですが、
自動だともちろん再生され、手動ではエラーが発生するときとしないときで分かれることが分かりました(MPC-BEではそのような設定がなかったです)。
AG03のデフォルトのサンプリングレート(コントロールパネルから変更できます)と一致した設定でないとエラーが出る? ようです。
ビット深度は24bit以下ならどれでもOKでした。
あとはDXライブラリのソースコードを参考に、オーディオライブラリであるBASSでフォーマットのチェックをしてみました
// DXライブラリから引用
var rates = new int[] { 44100, 48000, 88200, 96000, 176400, 192000 };
// Windows既定のデバイス
var device = BassWasapi.DefaultDevice;
for (int i = 0; i < rates.Length; i++)
{
// 排他モードで2ch、rates[i]Hzのサンプリングレートで使用可能か?
var format = BassWasapi.CheckFormat(device, rates[i], 2, WasapiInitFlags.Exclusive);
// 使用不可ならUnknown、使用可ならビット深度が出力される
Debug.WriteLine($"{rates[i]} : {format}");
}
return;
すると出力が
44100 : Unknown
48000 : Unknown
88200 : Unknown
96000 : Unknown
176400 : Unknown
192000 : Bit24
こうなったので、
BassWasapi.Init(device, 192000, 2, WasapiInitFlags.Exclusive);
で初期化をしてやると初期化成功フラグはTrueになりました。
BASS自体のソースコードが公開されていないので参考にならないと思いますが……
(とりあえず、WASAPI自体は動くようになったので、他の環境でも動かない事例が出ない限り、このままでも良いと思います
同じドライバーを使っているSteinberg社のオーディオインターフェースは全滅かもしれませんが)
|
Re: サウンドの遅延について ( No.22 ) |
- 名前:管理人 日時:2019/12/16 02:56
|
Re: サウンドの遅延について ( No.23 ) |
- 名前:あいおい? 日時:2019/12/16 18:49
> というわけで、もしかしたら排他モードでも初期化が成功するようにできたかもしれないバージョンを
> アップしましたので、何度も申し訳ありませんが、よろしければお試しください m(_ _;m
708: DirectInput 関連の初期化は正常に終了しました
718: WASAPI の初期化を行います
731: デフォルト遅延時間 : 10.00 ms
738: 最小遅延時間 : 3.00 ms
744: 遅延時間 : 10.000 ms
759: チャンネル数 : 2 ch
766: 量子化ビット深度 : 24 bit
773: 有効ビット深度 : 24 bit
779: サンプリングレート : 192000 Hz
786: データ形式 : 整数型
968: オーディオクライアントの初期化に失敗しました エラーコード:88890008
974: 排他モードでの初期化に失敗したので共有モードでの初期化を試行します
981: WASAPI の初期化を行います
991: デフォルト遅延時間 : 10.00 ms
998: 最小遅延時間 : 3.00 ms
1005: 遅延時間 : 10.000 ms
1014: チャンネル数 : 2 ch
1021: 量子化ビット深度 : 32 bit
1028: 有効ビット深度 : 32 bit
1036: サンプリングレート : 192000 Hz
1042: データ形式 : 浮動小数点型
1086: 動作モード : 共有モード
1094: WASAPI の初期化は正常に終了しました
依然としてオーディオクライアントの初期化に失敗してしまいますね……エラーコードは変化しましたが
> あと、今回のバージョンでは、まだ中途半端な実装ですが ASIO にも対応しましたので、
> よろしければ DxLib_Init の呼び出し前に
>
> SetEnableASIOFlag( TRUE ) ;
>
> という記述を追加して実行してみてください m(_ _)m
試してみましたが、DxLib_Init()が呼び出されたタイミングでメモリ違反を起こしてしまうようです
例外がスローされました: 'System.AccessViolationException' (***.exe の中)
型 'System.AccessViolationException' のハンドルされていない例外が ***.exe で発生しました
保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。
Log.txtは「730: ASIO の初期化を行います」で止まっています。デバイスのデフォルト設定を44.1kHzにしても変わらずです
ASIOは環境を選ぶ機能なので、デバッグが難しそうです……複数のデバイスを検証するなら何人か集まらないと厳しいかもしれないです……。
|
Re: サウンドの遅延について ( No.24 ) |
- 名前:Tir 日時:2019/12/17 01:08
一応こちらに書いた方がいいと思ったのでこちらに書きます
暫定最新版においてWASAPIが入った状態でChangeVolumeSoundMemで15以下に設定するといきなり無音になってしまいます
|
Re: サウンドの遅延について ( No.25 ) |
- 名前:管理人 日時:2019/12/18 02:28
|
Re: サウンドの遅延について ( No.26 ) |
- 名前:あいおい? 日時:2019/12/18 20:13
> ただ、その後、エラーの原因となりえる別の箇所を見つけて修正してみましたので、本当に何度も申し訳ありませんが
DX.SetEnableWASAPIFlag(DX.TRUE, DX.TRUE, -1, 192000);
で実行すると
880: WASAPI の初期化を行います
896: デフォルト遅延時間 : 10.00 ms
903: 最小遅延時間 : 3.00 ms
910: 遅延時間 : 10.000 ms
928: チャンネル数 : 2 ch
936: 量子化ビット深度 : 24 bit
944: 有効ビット深度 : 24 bit
954: サンプリングレート : 192000 Hz
961: データ形式 : 整数型
1024: 動作モード : 排他モード
1031: WASAPI の初期化は正常に終了しました
となり正常に排他モードで起動することが確認できました! ありがとうございます!
(第4引数にサンプリングレートを指定しても、デバイスのデフォルト値が反映されるようですが)
ついでにこの状態でのASIOのログも添付しておきます。
899: ASIO の初期化を行います
907: ASIOドライバの列挙を開始します
914: ASIOドライバのレジストリ階層を取得しました
922: ASIOドライバNo.0 のドライバキー名は Yamaha Steinberg USB ASIO です
929: ASIOドライバNo.0 のドライバキー階層の取得に成功しました
935: ASIOドライバNo.0 のCLSIDは {cb7f9ffd-a33b-48b2-8bc0-437d94f37142} です
963: ASIOドライバNo.0 のCLSIDの情報を発見しました
970: ASIOドライバNo.0 のCLSIDの情報階層の取得に成功しました
977: ASIOドライバNo.0 のドライバのパスキーの取得に成功しました
984: ASIOドライバNo.0 のドライバのパスは C:\Program Files (x86)\Yamaha\Yamaha Steinberg USB Driver\ysusb_asio64.dll です
992: ASIOドライバNo.0 のドライバDllの存在が確認できました
999: ASIOドライバNo.0 のドライバをリストに追加しました
1006: ASIOドライバの列挙が完了しました
1013: ASIOドライバをロードします
1759: ASIOドライバをロードに成功しました
1770: ASIOを初期化します
1775: ASIOを初期化に成功しました
1781: ASIOのバッファサイズを取得します
1787: ASIOのバッファサイズの取得に成功しました
1793: 最小バッファサイズ : 128
1799: 最大バッファサイズ : 128
1804: 優先バッファサイズ : 128
1811: バッファサイズの粒度 : 0
1817: ASIOのチャンネル情報を取得します
1824: ASIOのチャンネル情報の取得に成功しました
1831: フォーマットタイプ : ASIOSTInt32LSB
1838: ASIOのサンプルレートを 44100Hz に設定します
2359: ASIOのサンプルレートの設定に成功しました
2366: ASIOのサンプルレートを取得します
2372: ASIOのサンプルレートの取得に成功しました
2378: サンプルレート : 44100.000
2384: ASIOのバッファを作成します
2575: ASIOのバッファの作成に成功しました
2584: ASIOのサウンドの再生を開始します
2593: ASIO の初期化に成功しました
2604: WASAPI の初期化は正常に終了しました
このバージョンではASIOでも起動することができ、正常にASIOが動作することが確認できました
(AG03のASIOドライバーでは、ASIOで再生しながらWindowsの音を流すことができるので、それで判断してます)
こちらも特に問題はなさそうです。
|
Re: サウンドの遅延について ( No.27 ) |
- 名前:motoYo 日時:2019/12/19 07:15
自分のコードに問題があるのかもしれませんが、ASIO対応版以降
外部シンボル "__imp_CLSIDFromString" は未解決です。
とエラーが出て、ビルドできなくなってしまいました。
|
Re: サウンドの遅延について ( No.28 ) |
- 名前:管理人 日時:2019/12/20 01:49
|
Re: サウンドの遅延について ( No.29 ) |
- 名前:あいおい? 日時:2019/12/20 19:55
> あと、ASIO の方もバッファサイズ( 遅延時間 )とサンプリングレートを指定するための引数を追加してみましたので、
> よろしければお試しください m(_ _)m
.NETのUnicode版で
DX.DxLib_Init()を実行したときメモリアクセス違反を起こしてしまうようです。
ASIOやWASAPIのフラグをコメントアウトしても発生します。
551: DirectInput関係初期化処理
557: XInput DLL の読み込み中... 成功
579: DirectInput7 の取得中... DirectInput8 の取得を試みます...
Log.txtはここで止まっています。
自分のPC環境はあまり変化させていないですが、もしかしたら環境依存の不具合かもしれないです……
|
Re: サウンドの遅延について ( No.30 ) |
- 名前:管理人 日時:2019/12/21 03:31
> DX.DxLib_Init()を実行したときメモリアクセス違反を起こしてしまうようです。
すみません、私の環境でも同じ Log.txt の出力でメモリアクセス違反を起こすのを確認しました
ただ、原因が分からず、とりあえずリビルドしてみた dllファイルを使ってみたら
メモリアクセス違反が起こらなくなりました…
謎ですが、直ったようですのでよろしければお試しになってみてください m(_ _;m
https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // Windows版 .NET用
|
Re: サウンドの遅延について ( No.31 ) |
- 名前:あいおい? 日時:2019/12/21 14:06
> 謎ですが、直ったようですのでよろしければお試しになってみてください m(_ _;m
こちらでも直ったことが確認できました
いくつかの設定の組み合わせでWASAPIやASIOを走らせてみたので参考までに。
ASIO on DxLib (freq. 192kHz, buf. 1024, device Yamaha AG03) gist.github.com/AioiLight/0507a6a012b1c6aa3fe33283792499b9
ASIO on DxLib (freq. 44.1kHz, buf. 1024, device Yamaha AG03) gist.github.com/AioiLight/6e64732da86d50345fc2f94096331ca8
WASAPI on DxLib (freq. 192kHz, buf. 10ms, device Yamaha AG03) gist.github.com/AioiLight/44521be99a6583b78776bd5f9989af1e
WASAPI(shared) on DxLib (freq. 192kHz, buf. 10ms, device Yamaha AG03) gist.github.com/AioiLight/dc1e06bf02ccaf8d3f32024af8a5634d
> ログに出力されていませんが、指定されたサンプリングレートがデバイスで対応していなかった場合は
> 他のサンプリングレートを試すので、恐らく指定されたサンプリングレートにAG03は対応していなかったのだと思います
このVer.からログが出力されて、対応しているかどうか判別できるようになりました。ありがとうございます。
こちらの環境ではこのテスト版のDXライブラリで概ね良好に動作することを確認できました。
****
(これは改善しようのないことなのかもしれませんが、
WASAPIやASIOで設定されたサンプリングレートと異なるサンプリングレートの音源を効果音として再生すると再生するときに
プツプツ音が鳴ります。共有モードでも鳴っているのでサンプリングレートを変換する際に精度が足りてない? 感じがあります)
|
Re: サウンドの遅延について ( No.32 ) |
- 名前:管理人 日時:2019/12/22 03:32
正常に動作したようで何よりです
ログの掲載もありがとうございます m(_ _)m
> (これは改善しようのないことなのかもしれませんが、
> WASAPIやASIOで設定されたサンプリングレートと異なるサンプリングレートの音源を効果音として再生すると再生するときに
> プツプツ音が鳴ります。共有モードでも鳴っているのでサンプリングレートを変換する際に精度が足りてない? 感じがあります)
手元にも 192KHz で動作するヘッドホンアンプがあったので192KHzではない音の再生を試してみたのですが、
特にプツプツ音は聞こえませんでした
幾つかご質問させてください
1.プツプツ音は、再生している間ずっとプツプツ鳴り続けるのでしょうか、それとも鳴り始めと鳴り終わりのみプツと鳴るのでしょうか?
2.プツプツ音が確認できる WASAPIのサンプリングレートと、プツプツ音が鳴るサウンドファイルのサンプリングレートを教えていただけないでしょうか?
あと、もし可能でしたらプツプツ音が確認できるサウンドファイルをご提供いただけないでしょうか? m(_ _;m
|
Re: サウンドの遅延について ( No.33 ) |
- 名前:あいおい? 日時:2019/12/27 03:07
返信遅れました。
> 1.プツプツ音は、再生している間ずっとプツプツ鳴り続けるのでしょうか、それとも鳴り始めと鳴り終わりのみプツと鳴るのでしょうか?
鳴り終わりでプツッと鳴ります。
> 2.プツプツ音が確認できる WASAPIのサンプリングレートと、プツプツ音が鳴るサウンドファイルのサンプリングレートを教えていただけないでしょうか?
192kHz再生時に鳴ります。サウンドファイルのサンプリングレートは44.1kHzです。
デバイスのサンプリングレートをファイルに合わせると鳴らなくなります。
> あと、もし可能でしたらプツプツ音が確認できるサウンドファイルをご提供いただけないでしょうか? m(_ _;m
ttps://cdn.discordapp.com/attachments/542364337151672337/659816677776687111/test.wav
(音源の最後はフェードアウトさせてるので音源由来の問題ではないはずです)
う〜ん、いまいち再現性がないです。
例えば、int spaceにこのファイル、int downにも同じファイルを、サウンドを生成させて(サウンドのハンドルの値は別です)、
spaceはスペースキーを押した瞬間に再生、downは下キーを押した瞬間に再生というコードを組んだ場合、
spaceではプツッと音が鳴らず、downではプツッと音がする……のような感じです。
スペースキーを押したときにdownのサウンドハンドルを再生させるともちろんプツッと音がします。
サウンドの生成タイミングによって何かが違う……ように思えます。憶測ですが。
もちろんどちらのサウンドハンドルもDXライブラリの初期化後に生成しています。
|
Re: サウンドの遅延について ( No.34 ) |
- 名前:管理人 日時:2019/12/28 23:24
|
Re: サウンドの遅延について ( No.35 ) |
- 名前:あいおい? 日時:2019/12/29 02:30
> というわけで、波形データが入っていないメモリ領域にアクセスするバグを修正したバージョンを
> アップしましたので、よろしければお試しください m(_ _;m
こちらでも音が正常に再生されることを確認できました。ありがとうございます。
> 因みに今回からデフォルトの使用APIを WASAPI の共有モードにしています
良いと思います。("DirectX"ではなくなってしまいますが (汗 )
****
ひとつ要望なのですが、WASAPI使用時でサウンドハンドルの再生時間をパフォーマンスカウンタと同じ精度で取得・設定することはできませんか?
DirectSoundとは違いCoreAudio APIでは可能なようですが 無理であればスルーしていただいて構いません m(__)m
|
Re: サウンドの遅延について ( No.36 ) |
- 名前:管理人 日時:2019/12/30 10:39
|
Re: サウンドの遅延について ( No.37 ) |
- 名前:あいおい? 日時:2019/12/30 12:39
> 現状で一番高精度に再生位置を取得・設定できる関数は GetCurrentPositionSoundMem と
> SetCurrentPositionSoundMem というサンプル単位で再生位置を取得・設定するための関数なのですが、
> こちらでは駄目でしょうか?
今までGetSoundCurrentTime(int handle);を使っていたためそちらを使用していませんでした……。
度重なって申し訳ないのですが質問がございます。
GetCurrentPositionSoundMemをGetFrequencySoundMemで割れば、今再生中の位置を秒数で取得できるはずですが、
仮にサンプル数が192000Hzの場合3時間強ほどしか再生位置を取得できないように思えます。
3時間長い音源を使うことはないですが、より大きな値が取得できるのであれば大きな値が指定できる方の方がいいかなと思い……
年末年始の忙しい時期に申し訳ないです m(__)m
|
Re: サウンドの遅延について ( No.38 ) |
- 名前:管理人 日時:2019/12/31 15:25
|
Re: サウンドの遅延について ( No.39 ) |
- 名前:あいおい? 日時:2020/01/01 01:01
> というわけで、サウンドの再生位置の変更や取得を64bit化してみましたので、よろしければお試しください m(_ _)m
ありがとうございます! DLLを更新しても正常に動作することが確認できました。32bit越えの時間になる音源ファイルの検証は後日行おうと思います。
個人的には、WASAPIとASIO対応については、これで良いと思います。これと言って不具合もなくなりましたし。
要望を聞いてくださり、ありがとうございました。m(__)m
|
Re: サウンドの遅延について ( No.40 ) |
- 名前:管理人 日時:2020/01/01 06:26
お試しいただきありがとうございます
正常に動作しているようで何よりです
> 個人的には、WASAPIとASIO対応については、これで良いと思います。これと言って不具合もなくなりましたし。
>
> 要望を聞いてくださり、ありがとうございました。m(__)m
こちらこそ幾度にも渡る不具合の検証や予定になかったASIO関係の機能の検証にまでお付き合い頂き本当にありがとうございました m(・・;m
もう少しだけソフトウェアミキシングの処理を高速化できそうなので、その辺りを整備したら正式版としてアップしようと思います
|