課題##
JUCE/ProjucerのAudio Pluginテンプレートで作成したiOSアプリは、CapabilitiesでAudioのバックグランド再生をOnにするとその通りバックグラウンドでも再生できるが、常に再生になっている。これはユーザーにOn/Offを委ねたいところだが、テンプレートにはその機能は備わっていない。
前提##
JUCE/ProjucerでAudioプラグイン/アプリを作っている。
解決方法##
https://forum.juce.com/t/ios-background-processing/38308 に答えがあるのですが、JUCEApplicationBase::suspended()がバックグラウンドに回った時に呼ばれ、JUCEApplicationBase::resumed()がフォラグラウンドになった時に呼ばれるので、これらをオーバーライドすればできます。
Projucerの設定でPreprocessor DefinitionsにJUCE_USE_CUSTOM_PLUGIN_STANDALONE_APP=1を書いておいて、juce_StandaloneFilterApp.cppをまんまコピーしたMyStandaloneFilterApp.cppをプロジェクトに追加しておきます。
その上で、単にAudioのOn/Offをするのであれば、下記のコードでOK。
void suspended() override
{
StandalonePluginHolder* holder = StandalonePluginHolder::getInstance();
jassert(holder != nullptr);
holder->stopPlaying();
}
void resumed() override
{
StandalonePluginHolder* holder = StandalonePluginHolder::getInstance();
jassert(holder != nullptr);
holder->startPlaying();
}
実際には、プラグインにフラグを持たせておいてそのフラグによってこの処理を行うか否かを決定することになると思うので、下記のような感じになるかと。
void suspended() override
{
StandalonePluginHolder* holder = StandalonePluginHolder::getInstance();
jassert(holder != nullptr);
MyAudioProcessor* processor = (MyAudioProcessor*)holder->processor.get();
jassert(processor != nullptr);
if (!processor->isBackgroundProcessingEnabled())
{
holder->stopPlaying();
}
}
void resumed() override
{
StandalonePluginHolder* holder = StandalonePluginHolder::getInstance();
jassert(holder != nullptr);
MyAudioProcessor* processor = (MyAudioProcessor*)holder->processor.get();
jassert(processor != nullptr);
if (!processor->isBackgroundProcessingEnabled())
{
holder->startPlaying();
}
}