メインコンテンツまでスキップ

チュートリアルAudioDeviceManagerクラス

📚 Source Page

このチュートリアルではAudioDeviceManagerクラスは、すべてのプラットフォームのオーディオデバイスを管理するために使用されます。これにより、デバイスのサンプルレートや入出力の数などを設定することができます。

レベル:中級

プラットフォーム:Windows, macOS, Linux, iOS, Android

クラス: AudioDeviceManager,AudioDeviceSelectorComponent,ChangeListener,BigInteger

スタート

注記

このチュートリアルでは、基本的にAudioAppComponentオーディオ入出力用のクラス (Tutorial: Processing audio input).また、基本的なGUIレイアウトのテクニック(Tutorial: Parent and child components).

このチュートリアルのデモ・プロジェクトのダウンロードはこちらから:PIP|ZIP.プロジェクトを解凍し、最初のヘッダーファイルをProjucerで開く。

このステップにヘルプが必要な場合は、以下を参照してください。Tutorial: Projucer Part 1: Getting started with the Projucer.

デモ・プロジェクト

このデモプロジェクトは、Projucerのオーディオアプリケーションテンプレートに基づいています。これはAudioDeviceSelectorComponentオブジェクトで、オーディオデバイスの設定を行うことができます。デモプロジェクトでは、現在のオーディオデバイスの設定を報告するシンプルなテキストコンソールも表示します。このアプリケーションは、アプリケーションのオーディオ処理エレメントの現在のCPU使用率も表示します。

注記

ここで紹介するコードは、大まかに以下のものと似ている。オーディオ設定デモJUCE Demo から。主な違いは、生成されるオーディオがTutorial: Processing audio input(これはオーディオ入力をホワイトノイズでリング変調する)。

AudioDeviceManager オブジェクトの設定を示す AudioDeviceSelectorComponent オブジェクト
AudioDeviceManager オブジェクトの設定を示す AudioDeviceSelectorComponent オブジェクト

オーディオ機器

JUCEは、それがサポートする全てのプラットフォーム上でオーディオデバイスにアクセスする一貫した手段を提供します。ここで提供されるデモアプリケーションは、デスクトッププラットフォームにのみデプロイされるかもしれませんが、これはGUIレイアウトの制約によるものです。オーディオはモバイルプラットフォームでもシームレスに動作します。

オーディオ・アプリケーション・テンプレートではAudioAppComponentクラスはAudioDeviceManagerオブジェクトdeviceManager- はパブリック・メンバーなので、サブクラスからアクセスできる。そのためAudioAppComponentクラスの基本的な初期化も行います。AudioDeviceManagerオブジェクトを呼び出したときに起こります。AudioAppComponent::setAudioChannels().

についてAudioDeviceManagerクラスは、オーバーライドされない限り、デフォルトのオーディオ・デバイスを使用しようとします。これはコードで設定するか、あるいはAudioDeviceSelectorComponentこの図のようにデバイスの設定やプリファレンスは保存され、次回以降のアプリケーション起動時に呼び出すことができます。アプリケーションのAudioDeviceManagerクラスはまた、優先デバイスが利用できなくなった場合(例えば、前回の起動以降に外部オーディオデバイスのプラグが抜かれた場合)、そのような状況でデフォルトデバイスにフォールバックすることもできます。

についてAudioDeviceManagerクラスはまた、入力されるMIDIメッセージのハブでもあります。これは他のチュートリアルで説明されています(Tutorial: Handling MIDI events).

についてAudioDeviceManagerクラスを継承しているため、設定の変更をブロードキャストすることができます。ChangeBroadcasterクラスを作成します。このコンポーネントの右側は、オーディオ・デバイスの設定が変更されるたびに、重要なオーディオ・デバイスの設定を投稿します。AudioDeviceManagerオブジェクトがトリガーされる。

AudioDeviceSelectorComponent クラス

についてAudioDeviceSelectorComponentクラスは、すべてのプラットフォームでオーディオデバイスを設定する便利な方法を提供します。上述したように、これはデモ・プロジェクトのユーザー・インターフェースの右側に表示されています。クラスがAudioDeviceSelectorComponentオブジェクトが構築されたらAudioDeviceManagerオブジェクトをコントロールしたい。AudioDeviceSelectorComponentクラスconstructorを参照)。ここではAudioDeviceSelectorComponentオブジェクトに渡す。AudioDeviceManagerのメンバーであるAudioAppComponent最大256の入出力チャンネルを可能にし、MIDIコンフィギュレーションを隠し、チャンネルをステレオ・ペアではなくシングル・チャンネルとして表示する:

    MainContentComponent()
: audioSetupComp (deviceManager,
0, // minimum input channels
256, // maximum input channels
0, // minimum output channels
256, // maximum output channels
false, // ability to select midi inputs
false, // ability to select midi output device
false, // treat channels as stereo pairs
false) // hide advanced options
{

我々のインターフェイスは、コントロールできるように設定されている:

  • 出力デバイスの選択
  • 入力デバイスの選択
  • 入出力チャンネルのイネーブルとディセーブル
  • デバイスがサポートしている)サンプルレートを選択する
  • オーディオバッファーサイズ(ブロックサイズ)の選択

これらの設定を変更すると、インターフェースの右側にある小さなコンソール・ウィンドウに新しいデータ・リストが表示されることに気づくはずだ。これはAudioDeviceManagerクラスはChangeBroadcasterクラスである。

我々のchangeListenerCallback()関数を呼び出す。dumpDeviceInfo()関数にアクセスする。AudioDeviceManagerオブジェクトから現在のオーディオデバイスを取得します。次に、デバイスに関する様々な情報を取得します:

    void dumpDeviceInfo()
{
logMessage ("--------------------------------------");
logMessage ("Current audio device type: " + (deviceManager.getCurrentDeviceTypeObject() != nullptr
? deviceManager.getCurrentDeviceTypeObject()->getTypeName()
: ""));

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");
}
}
注記

を使用している。getListOfActiveBits()関数を使用してBigIntegerアクティブなチャンネルのリストをビットマスクにしている。Stringオブジェクトになる。そのBigIntegerオブジェクトはビットマスクとして使用される。std::bitsetまたはstd::vector<bool>.を構成するビットの0(非アクティブ)または1(アクティブ)で表される。BigIntegerの値です。参照Tutorial: The BigInteger classに対して実行可能なその他の操作についてはBigIntegerオブジェクトがある。

このような変化に対応することは、実際のアプリケーションでは実に有用である。多くの場合、サンプルレートやその他のオーディオパラメータの変更に適切に対応することが重要です。

エクササイズ

の設定を変えて試してみてください。AudioDeviceSelectorComponentこのコンストラクタは、マルチチャンネルサウンドカードを使用していて、アプリが対応できるチャンネル数を制限できる場合に特に便利です。また、チャンネルのペアをステレオ・ペアとして表示することもできます。

についてAudioDeviceSelectorComponentクラスにもテストボタンをクリックします。これはデバイスの出力から正弦音を再生するもので、ユーザーがターゲット・デバイスでオーディオ出力が機能しているかテストするのに便利です。

CPU使用率

を呼び出して、アプリケーションのオーディオ処理エレメントのCPU使用率を求めます。AudioDeviceManager::getCpuUsage()関数を使用しています。我々のMainContentComponentクラスを継承している。Timerクラスで、50ミリ秒ごとにタイマーを起動する。我々のtimerCallback()関数からCPU使用率を得る。AudioDeviceManagerオブジェクトに表示されます。この値はLabelオブジェクトをパーセンテージ(小数点以下6桁)で表示します:

    void timerCallback() override
{
auto cpu = deviceManager.getCpuUsage() * 100;
cpuUsageText.setText (juce::String (cpu, 6) + " %", juce::dontSendNotification);
}

この特定のアプリケーションでは、オーディオ処理をほとんど行っていないので、CPU 使用率は非常に低く、おそらく多くのターゲットデバイスでは1%未満でしょう。しかし、異なるサンプルレートとバッファサイズが CPU 負荷に与える影響は、設定を組み合 わせて試すことで確認できます。一般的に、サンプルレートが高く、バッファサイズが小さいほど、より多くの CPU を使用します。

概要

このチュートリアルではAudioDeviceManagerクラスと一般的なオーディオ・デバイスについて説明します。あなたは今、次の方法を知っているはずです:

  • アクセスAudioDeviceManagerオブジェクトの中からAudioAppComponentオブジェクトを使います。
  • を作成する。AudioDeviceSelectorComponentオブジェクトを制御する。AudioDeviceManagerオブジェクトがある。
  • オーディオ機器の変化に対応。
  • サンプルレートやチャンネル数など、オーディオデバイスの便利な設定にアクセスできます。

こちらも参照