JUCEプログラミング、AudioPlayerを作成する4、音声処理の部分

要部である音声処理プログラムの部分を見ていきます。

関数の役目が重要なのかな~

JUCEチュートリアルの音声再生アプリ、音声処理プログラムの部分を進めていきます。

チュートリアルを進めるうえで、いろいろと調査をして、手探りな雰囲気の現段階での理解の状態を記載しています。本質とは異なる点があるかもしれませんが、ご了承ください。

進めているチュートリアルの「Processing the Audio」になります。

あわせて読みたい

こんな人の役に立つかも

・JUCEフレームワークに入門したい人

・JUCEプログラミングでオーディオアプリを作成したい人

・JUCEで音声再生を行いたい人

目次

音声処理プログラム

「MainComponent.cpp」に音声処理プログラムを追加していきます。音声の準備を行う「prepareToPlay関数」、音声バッファを読みこんで処理を行う「getNetAudioBlock関数」、音声リソースを解放する「releaseResoueces関数」を実装します。

この3つの関数はセットのように利用するようです。

いろいろとネットで調査した結果の、現段階の理解では、

①「prepareToPlay」で音声の準備を行い

②準備された音声のバッファ(512サンプルなどの区切られたオーディオバッファのブロック単位)を順次「getNextAudioBlock」で処理して音声を加工などします。

③音声を停止したり、一連の音声バッファが最後まで到達したら、「releaseResources」が実行

というイメージです。かなり抽象的なイメージしかもてていないので、具体的にどのように動作しているかを今後検証したいと思っています。

参考にさせていただいたサイト

JUCE
prepareToPlay and releaseResources are not getting called? Well, 😃 IMHO this is a documentation bug! If one person falls into a trap, it might be their fault, but if two do… The documentation should say something like: ...

prepareToPlay関数

prepareToPlay関数で、再生する音声の準備を行います。AudioTransportSourceクラスの変数transportSource変数で読み込んだ音声を操作するので、transportSourceからprepareToPlayを呼び出します。

void MainComponent::prepareToPlay (int samplesPerBlockExpected, double sampleRate)
{
    transportSource.prepareToPlay(samplesPerBlockExpected, sampleRate);
}

シンプルに処理をtransportSourceに投げるのみです。

以前作成した音声関連のクラスに、今回の変数名を赤字で当てはめてみました。今回登場するのは、「transportSource」と「readerSource」になります。

getNextAudioBlock関数

この関数でも、シンプルに、transportSourceのgetNextAudioSource関数に引数として渡されてきたbufferToFillを渡すだけの処理となっています。

void MainComponent::getNextAudioBlock (const juce::AudioSourceChannelInfo& bufferToFill)
{
    //[1]音声の読み込みでnullptrでないことを確認しています。
    if (readerSource.get() == nullptr)
    {
        bufferToFill.clearActiveBufferRegion();
        return;
    }

    transportSource.getNextAudioBlock(bufferToFill);
}

[1]に、唯一条件として追加されているプログラムがあります。readerSource(上の図でいくと、transportSourceが操作する対象の音声)がnullptrの場合は「clearActiveBufferRegion」関数でbufferToFillの値をゼロ(音声出力をゼロ)にします。一種のエラー処理のようなものでしょうか。出力が確実にゼロとなるようにしているようです。

releaseResources関数

releaseResourcesも、同様にtransportSourceのreleaseResourcesを呼び出すだけとなります。

void MainComponent::releaseResources()
{
    transportSource.releaseResources();
}

今回は、プログラム量が少ないのですが、中途半端になってしまうので、次の記事で、open、play、stopボタンの実装を行っていきたいと思います。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次