Date

Windows Core Audio を使って、低レイテンシの再生、キャプチャを実現しようとすると、スレッドスケジューリングについて考慮が必要となる。

DTM をやったことのある方なら分かるかと思うが、複数のVSTを起動した状態で曲を再生してるときに、バックグラウンドでウイルススキャンなど始まると、音が飛んだり止まったりする。

バックグラウンドのタスクは低優先度で、サウンド処理のタスクは高優先度で実行すれば、これらを防止することができる。

Windows Vista では Multimedia Class Scheduler Service (略して MMCSS)というスレッドの優先度を簡単に設定できる API がある。

MMCSS や Windows のスレッドスケジューリングについては、こちらに、分かりやすく解説されている。

MMCSSで優先度を設定するにはAvSetMmThreadCharacteristics を呼ぶ。設定する優先度は予めレジストリに登録されている「名前」で指定する。レジストリの場所はHKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\Tasksである。

元に戻すにはAvRevertMmThreadCharacteristics を呼ぶ。

1
2
3
4
5
6
7
8
//優先度を Audio に設定
DWORD taskIndex = 0;
m_hTask = AvSetMmThreadCharacteristics(TEXT("Audio"), &taskIndex);
//元に戻す
if (m_hTask != NULL) {
    AvRevertMmThreadCharacteristics(m_hTask);
    m_hTask = NULL;
}

WASAPI (Windows Core Audio を構成しているAPIの一部)は、MMCSS を使ってスレッド優先度を上げる。デバイスピリオドが 10ms 未満、かつ、PCM フォーマットのストリームを排他モードで再生しているときに、Pro Audio を割り当てる。 10ms 以上の場合は Audio を割り当てる。

In Windows Vista, if a system thread manages data transport for an exclusive-mode audio playback stream with a PCM format and a device period of less than 10 milliseconds, WASAPI assigns the MMCSS task name "Pro Audio" to the thread. If the device period of the stream is greater than or equal to 10 milliseconds, WASAPI assigns the MMCSS task name "Audio" to the thread.


Comments

comments powered by Disqus