AudioDeviceManagerのアプリも最後の実装になります。
やっとひと段落つくね
JUCEプログラミング、AudioDeviceManager classのチュートリアルのデモアプリの実装の最後になります。
changeListenerCallback関数
changeListenerは、いろいろな変化を取得できる便利なコールバックですが、今回は、deviceManagerの変化を取得しています。(以前はThumbnailの変化なども取得しています。)
void MainComponent::changeListenerCallback(juce::ChangeBroadcaster*)
{
dumpDeviceInfo();
}
処理の内容としては、GUI右に配置しているテキストエディタに表示する文字列(設定情報)を出力するための関数を呼び出します。この関数はすぐあとで実装します。
timerCallback関数
コンストラクタで50msec毎にタイマーを起動させていますので、その50msec毎に実行する処理を実装します。
void MainComponent::timerCallback()
{
auto cpu = deviceManager.getCpuUsage() * 100;
cpuUsageText.setText(juce::String(cpu, 6) + " %", juce::dontSendNotification);
}
タイマー処理では、CPUの利用率を表示します。(GUI右上部分のラベルオブジェクトに表示)
deviceManagerクラスの「getCpuUsage」関数では、Cpuの利用率が取得できるので、これを100倍することで、%表示とします。そして、「cpuUsageText」というラベルに文字列を「setText」関数で表示します。与える時には、文字列として与えなければいけませんので、第一引数でStringクラスにしています。
単純なキャストに慣れているので、文字列への変換は参考になりました。
dumpDeviceInfo関数
changeListenerCallback関数で呼び出されている処理です。GUI右側の音声デバイスの設定状態を表示する処理です。
ここでたくさん利用されているlogMessage関数は、後ほど実装する文字列を画面右のテキストエディタクラスのインスタンス、「diagnosticsBox」に表示するための関数です。
void MainComponent::dumpDeviceInfo()
{
//[1]音声デバイスのタイプを取得します。
logMessage("--------------------------------------");
logMessage("Current audio device type: " + (deviceManager.getCurrentDeviceTypeObject() != nullptr
? deviceManager.getCurrentDeviceTypeObject()->getTypeName()
: "<none>"));
//[2]音声デバイスを取得します。
if (auto* device = deviceManager.getCurrentAudioDevice())
{
logMessage("Current audio device: " + device->getName().quoted());
logMessage("Sample rate: " + juce::String(device->getCurrentSampleRate()) + " Hz");
logMessage("Block size: " + juce::String(device->getCurrentBufferSizeSamples()) + " samples");
logMessage("Bit depth: " + juce::String(device->getCurrentBitDepth()));
logMessage("Input channel names: " + device->getInputChannelNames().joinIntoString(", "));
logMessage("Active input channels: " + getListOfActiveBits(device->getActiveInputChannels()));
logMessage("Output channel names: " + device->getOutputChannelNames().joinIntoString(", "));
logMessage("Active output channels: " + getListOfActiveBits(device->getActiveOutputChannels()));
}
else
{
logMessage("No audio device open");
}
}
[1]では、音声デバイスタイプを取得します。ASIOとかCoreAudioなど、利用しているタイプを取得できます。
[2]では、音声デバイスを「device」インスタンスとして取得して、nullptr出ない場合は、deviceからサンプルレート設定などの音声デバイスの設定情報を取得してlogMessage関数で表示しています。表示で使用されているgetListOfActiveBits関数とlogMessage関数はこの後に実装します。
表示補助関数
getListOfActiveBits関数
有効な入出力チャンネルのリストを表示するような関数です。引数として「getActiveInputChannels」関数から取得されるBigintegerのポインタが渡されてきます。Bigintegerは、入出力チャンネルを2進数でビットのように表現していますので、b[i]のようにすると、有効なチャンネルの時に1、無効なチャンネルの時に0として条件判定部に利用できます。
Bigintegerについては、以前のこちらの記事「Bigintegerについて」をご参照ください。
juce::String MainComponent::getListOfActiveBits(const juce::BigInteger& b)
{
juce::StringArray bits;
for (auto i = 0; i <= b.getHighestBit(); ++i)
if (b[i])
bits.add(juce::String(i));
return bits.joinIntoString(", ");
}
最後に、「0,1」のように、有効なチャンネル数と、その後にカンマが付加されたStringsArrayを返します。
logMessage関数
これは、単純にテキストエディタクラスのインスタンス、「diagnosticsBox」に文字列を追加するような処理を行います。
最初にキャレット(入力位置)をテキストボックスの最後に持ってきて、その後にキャレット部分に引数で渡されてきたmの文字列を追加しています。そして、JUCE::newLineを追加することで、改行しています。
void MainComponent::logMessage(const juce::String& m)
{
diagnosticsBox.moveCaretToEnd();
diagnosticsBox.insertTextAtCaret(m + juce::newLine);
}
最終的に、こんな表示になります。