ヘッダーファイルはプログラムの目次のようですね~
ヘッダーを作成しながら、プログラム全体を追ってみよう
こんな人の役に立つかも
・JUCEフレームワークに入門したい人
・JUCEプログラミングでオーディオアプリを作成したい人
・JUCEで音声再生を行いたい人
Privateなメンバのプログラミング
「MainComponent.h」へ次のようにプログラムを追加しました。
private:
//
[1]列挙型で音声の再生状態を表現します。
enum TransportState
{
Stopped,
Starting,
Playing,
Stopping
};
//[2]ボタンの定義をします。
juce::TextButton openButton;
juce::TextButton playButton;
juce::TextButton stopButton;
//[3]音声再生処理のための各種クラスのオブジェクトを定義します。
juce::AudioFormatManager formatManager;
std::unique_ptr<juce::AudioFormatReaderSource> readerSource;
juce::AudioTransportSource transportSource;
TransportState state;
//[4]リスナー関数の定義をします。
void changeState(TransportState newState);//★add
void openButtonClicked();
void playButtonClicked();
void stopButtonClicked();
enumで音声の状態表現
[1]では、privateなメンバ変数として列挙型のenumで「TransportState」を定義しています。音声の再生状態を表現するものとなります。
enumは、初期化する数値を入れないと、0から順番になりますので、数値で示すと、「Stopped」が0ということになります。
チュートリアルでは、それぞれの状態を次のように定義しています。
①Stopped:音声のプレイバックがすでに停止していて、音声の再生開始可能な状態。
②Starting:音声再生の指示を受けたが、まだ音声の再生を開始していない状態。
③Playing:音声の再生中。
④Stopping:音声の停止の指示を受けた状態。この後にStoopedの状態に遷移します。
ボタンの定義
[2]で、今回のアプリに必要となる、音声読み込みボタン「openButton」と音声再生ボタン「playButton」そして、音声停止ボタン「stopButton」のTextButtonクラスのオブジェクトを定義します。
音声クラスの定義と関数プロトタイプ宣言
[3]では、前回調査した音声のプレイバックに関するクラスを準備しています。
[4]では、「changeState」関数と、各ボタンのクリックに対する処理のプロトタイプ宣言を行っています。
「changeState関数」は、音声の再生状態が変化したときにボタンの状態を変化させたりする関数です。次に出てくる、音声の再生状態が変化した際に、よびだされて、ボタンを押すことができるかなどの状態を制御します。
そのほかのボタンが押されたときの処理関数もプロトタイプ宣言しておきます。クリックされたときにコールバック関数として呼び出されるように後ほど紐づけを行います。また、中身もcppへ記述していきます。
音声再生状態の検知
ヘッダーファイルのクラス名を記載しているとことで、新たにクラスの継承を行います。
class MainComponent : public juce::AudioAppComponent,
public juce::ChangeListener//←[1]changeState関数を利用するために、ChangeListenerクラスを継承します。
{
public:
//...略...
void prepareToPlay(int samplesPerBlockExpected, double sampleRate) override;
void getNextAudioBlock(const juce::AudioSourceChannelInfo& bufferToFill) override;
void releaseResources() override;
void changeListenerCallback(juce::ChangeBroadcaster* source) override;//←[2]changeListenerCallback関数のオーバーライドです。
//...略...
[1]のように、「ChangeListener」クラスを継承します。音声の再生状態の変化を検知できるクラスのようですね。
このリスナー関数は、transportSourceを後ほど、紐づけて利用します。ここではChangeListenerクラスを継承してプロトタイプ宣言をしています。