WASAPI排他モードにしてからWAVファイルを再生しているときに他のアプリのスクロールバーをいじったりCtrl+Alt+Delを押してタスクマネージャを起動すると音が歪んでしまう。一旦歪むとずっと歪んだままだ。再生を停止して、再生しなおすと直る。
なんとなく画面表示にタイムスライスが奪われて再生がうまくいかなくなるのかなと思い、プロセスの優先順位をHIGH_PRIORITY_CLASSにしたら直った。
// プロセスの優先順位
SetPriorityClass(GetCurrentProcess(), HIGH_PRIORITY_CLASS);
何か処理に足りない部分があるのかなと思うが、原因はよくわからない。
後良くわからないのが、プロセスの優先順位とMMCSSで設定するスレッドの優先順位との関係だ。プロセスの優先順位をいじる前に、WASAPI再生スレッドにはAvSetMmThreadCharacteristicsWで”Pro Audio”、AvSetMmThreadPriorityでAVRT_PRIORITY_CRITICALという最高の優先順位を設定している。
// スレッド優先順位のヘルパクラス
struct av_mm_thread_characteristics
{
av_mm_thread_characteristics(std::wstring& str) : task_name_(str)
{
handle_ = ::AvSetMmThreadCharacteristicsW(str.c_str(),(LPDWORD)&task_index_);
}
bool set_priority(AVRT_PRIORITY p)
{return (::AvSetMmThreadPriority(handle_,p) == TRUE);}
~av_mm_thread_characteristics()
{
::AvRevertMmThreadCharacteristics(handle_);
}
private:
std::wstring task_name_;
uint32_t task_index_;
HANDLE handle_;
};
--(中略)--
// 再生スレッドで実行する関数
void application::output_thread_main()
{
--(中略)--
// MMCSSの初期化
sf::av_mm_thread_characteristics avmm(wstring(L"Pro Audio"));
avmm.set_priority(AVRT_PRIORITY::AVRT_PRIORITY_CRITICAL);
--(中略)--
}
これが機能していない感じだ。どうもプロセス>MMCSSという優先なような気もがする。少し調べてみようと思う。