トップページ > 記事閲覧
Windows版で出力サウンドデバイスが1chの場合アクセス違反が発生する
名前:lltcggie 日時: 2022/07/30 18:24

いつもお世話になっております。 Windows版で出力サウンドデバイスが1chの場合、DxSound.cppのWriteSelfMixingSample()で不正なメモリアドレスへの書き込みが行われてアクセス違反が発生しました。 GFlagsでページ ヒープ検証を有効にするとアクセス違反を検出しやすくなります。 ページ ヒープ検証を有効化 gflags.exe /p /enable game.exe /full ページ ヒープ検証を無効化 gflags.exe /p /disable game.exe 確認バージョン Ver 3.23b 発生箇所 DxSound.cpp 12535行目 BufferF = ( float * )SoundSysData.SelfMixingBuffer ; if( SoundSysData.SelfMixingFormatIsFloat ) { for( i = 0 ; i < SampleNum ; i ++, BufferF += 2 ) { *( ( float * )Buffer0 ) = BufferF[ 0 ] ; *( ( float * )Buffer1 ) = BufferF[ 1 ] ; ← ここ Buffer0 += Stride ; Buffer1 += Stride ; } } システム情報とWASAPI関係のログ 3:DXライブラリの初期化処理開始 4: システムの情報を出力します 5: DXライブラリ Ver3.23b 5: 論理プロセッサの数 : 24 5: OS Windows10 ( Build 19043 ) 106: 現時点のCPU動作速度:大体3.73GHz 106: MMX命令を使用します 106: SSE命令が使用可能です 107: SSE2命令が使用可能です 107: CPUベンダ:AuthenticAMD 109: CPU名:AMD Ryzen 9 5900X 12-Core Processor 469: WASAPI の初期化を行います 483: デバイス名 : ヘッドセット (WH-1000XM5 Hands-Free AG Audio) 492: デフォルト遅延時間 : 10.000 ms 493: 最小遅延時間 : 3.000 ms 493: 遅延時間 : 10.000 ms 497: チャンネル数   : 1 ch 498: 量子化ビット深度 : 32 bit 498: 有効ビット深度  : 32 bit 498: サンプリングレート : 16000 Hz 499: データ形式 : 浮動小数点型 原因ですが、WriteSelfMixingSample()は出力デバイスが2chであることを前提とした処理を行っているのが原因だと思われます。 (出力デバイスが1ch時のミキシング処理が実装されていないという解釈の方が正しい?) Bluetoothのオーディオデバイスは通話時だとモノラルなデバイスになるものが多数なため直していただけると助かります。 よろしくお願いします。
メンテ

Page: 1 |

Re: Windows版で出力サウンドデバイスが1chの場合アクセス違反が発生する ( No.1 )
名前:管理人 日時:2022/07/31 03:22

すみません、サウンドの出力チャンネル数が 1 となることを想定していませんでした 手元に 1ch出力に対応したサウンドデバイスが存在しないので動作確認は出来ていませんが、 lltcggieさんから頂いたご情報を元に WriteSelfMixingSample の処理を書き換え 恐らく修正できたと思いますので、よろしければこちらの修正バージョンを試してみてください 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: Windows版で出力サウンドデバイスが1chの場合アクセス違反が発生する ( No.2 )
名前:lltcggie 日時:2022/07/31 04:58

WriteSelfMixingSample()でのクラッシュが修正されていることを確認しました。 ありがとうございます! ただ、出力デバイスが1chの場合だとステレオ音源の1ch目の音しか出力されていないのですがこれは仕様でしょうか? (例えばステレオ音源の1ch目を無音に編集した音源を流すと無音しか流れない) また主題とは離れてしまいますが、ページ ヒープ検証を有効化したところアプリケーション終了時にDxSoundWin.cppで 解放済みインスタンスのメンバ変数にアクセスしていてアクセス違反が発生していることに気づいたので修正案を共有させていただきます。 修正前 ULONG __stdcall D_CMMNotificationClient::Release() { _cRef-- ; if( 0 == _cRef ) { delete this ; } return _cRef ; } 修正後 ULONG __stdcall D_CMMNotificationClient::Release() { LONG cRef = --_cRef ; if( 0 == cRef ) { delete this ; } return cRef ; }
メンテ
Re: Windows版で出力サウンドデバイスが1chの場合アクセス違反が発生する ( No.3 )
名前:管理人 日時:2022/07/31 22:30

> ただ、出力デバイスが1chの場合だとステレオ音源の1ch目の音しか出力されていないのですがこれは仕様でしょうか? > (例えばステレオ音源の1ch目を無音に編集した音源を流すと無音しか流れない) ご指摘の通り1ch目の音だけを出力していました 昔のモノラルTVに黄色と白色のケーブルを接続してステレオ音声を流すと左側の音だけ聞こえたので なんとなくモノラルの出力先にステレオ音源を流した場合はそうなるものだと思いこんでいましたが ステレオ2chをモノラル1chに合成するのが一般的なんですね (・・; 単純に 1chと 2chの振幅値を足して2で割っただけの合成ですが、これで 2ch目の音も聞こえるようになったと思いますので 何度も申し訳ありませんがよろしければお試しください 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 // ソース (中身を既存のライブラリのファイルに上書きして『リビルド』をして下さい) > また主題とは離れてしまいますが、ページ ヒープ検証を有効化したところアプリケーション終了時にDxSoundWin.cppで > 解放済みインスタンスのメンバ変数にアクセスしていてアクセス違反が発生していることに気づいたので修正案を共有させていただきます。 ご指摘&修正案ありがとうございます メモリ解放した後にメンバー変数を参照するのはNGというのは理解していたのですが、見落としていました m(_ _;m ( こちらも上記のバージョンで修正してあります )
メンテ
Re: Windows版で出力サウンドデバイスが1chの場合アクセス違反が発生する ( No.4 )
名前:lltcggie(解決済み) 日時:2022/07/31 23:54

WriteSelfMixingSample()でのクラッシュ、2ch目の音の対応、D_CMMNotificationClient::Release()の修正、すべて問題ありませんでした。 迅速にご対応いただきありがとうございました!
メンテ

Page: 1 |

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

   クッキー保存