いつもDXライブラリにお世話になっております。
ループ設定をしたBGM再生中、サウンドデバイスを1つもない状態にすると
まれにアクセス違反が発生する現象を確認しましたのでご報告いたします。
[再現ソースコード]
#include "DxLib.h"
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
ChangeWindowMode(TRUE); // ウィンドウモードに
if (DxLib_Init() == -1) { return -1; } // DXライブラリ初期化処理
DxLib::SetAlwaysRunFlag(TRUE); // 非アクティブで処理を実行
// Windows内のメディアファイルを指定、もしなければ適当なものを再生してください
const char* FileName = "C:\\Windows\\Media\\Ring01.wav";
int handle;
if((handle = LoadSoundMem(FileName)) != -1){
SetLoopTimePosSoundMem(200, handle);//★適当にループ位置を入力(この行を抜いた場合はアクセス違反が起きなくなります)
PlaySoundMem(handle, DX_PLAYTYPE_LOOP); // ループ再生
DrawString(30, 230,
"サウンドループ再生中。この状態で「再生」用のサウンドデバイスを\r\n「0個」にするとアクセス違反が発生します\r\n(キーを押すと終了)",
GetColor(255, 255, 255));//表示
WaitKey(); // キーの入力待ち
}
DxLib_End();
return 0; // ソフトの終了
}
[状況]
「サウンドデバイスが1つ以上ある状態」で上記ソースコードを実行中、
Windowsの「サウンド」プロパティで「サウンドデバイスを全て無効化」(Win11の場合)すると
以下の関数呼び出し先でアクセス違反が発生します。
(以下はVisual Studioの呼び出し履歴をコピーしたもの、上であるほど奥深くの関数です。行数は不明です)
> DxLib::_MEMCPY(void *,void const *,unsigned int)
DxLib::RunSoundConvert(struct DxLib::SOUNDCONV *,void *,unsigned int)
DxLib::SoundDataCopy(struct DxLib::SOUNDBUFFERLOCKDATA *,struct DxLib::SOUNDCONV *,unsigned long)
DxLib::ProcessStreamSoundMem_UseGParam(int,int)
DxLib::ProcessStreamSoundMemAll(void)
DxLib::StopMusicMem_PF(struct DxLib::MIDIHANDLEDATA *)
ただときどき再現しなくなることもあり、完全な再現条件が分かっていません。
コンパイル環境はVisual Studio Community 2022の「x86」でした。
環境依存の問題かもしれませんが、よければ一度ご確認いただけますと幸いです。