これまでのシリーズで、とりあえず動くところまでは作りましたがcordova-meia-pluginにはもっと色々な機能があり、1機能だけではあまりに寂しいので、増やしてみます。
(これまで、Version 10 のPersonal Environmentで確認していましたが、今回から11にアップグレードしています。カテゴリはこのシリーズの間はOutSystems 10としておきます)
このプラグインは大きく分けて演奏と録音の機能があるようなので、作成済みのPlaySoundの周辺機能ということで演奏周りの機能を充実させることにします。
まずは停止と再開を自由にできるように
- 演奏停止アクション
- 現在の演奏位置を返すアクション
- 音声の合計時間を返すアクション
を実装します。
OutSystemsのアクション部分はほとんど変わらないので、JavaScriptコードだけ掲載しています。
Table of Contents
実装済みの演奏アクションへの修正
演奏開始後にmediaのオブジェクトを触るため、PlaySoundのrelease関数(OSの音声ファイルへの参照を開放する)呼び出しを消し、任意に呼べるようにClient Actionに置き換え。
var で変数定義しておくと、アクションをまたがって参照できません(実行時にJavaScriptの関数として生成されているようなので)。
そこで、ベースとなるcordovaプラグイン読み込みで作られるMediaオブジェクトのプロパティとして、作成したインスタンスを保管するように修正。
リソース解放用のrelease関数呼び出しを、演奏のコールバックから独立したアクションに移動して任意のタイミングで呼べるようにしました。
PlaySoundのJavaScript変更後。作成したインスタンスをMedia.MediaPluginObjectというプロパティにセットしています。
if (!Media.MediaPluginObject) {
Media.MediaPluginObject = new Media($parameters.FilePath,
function () {
$parameters.Success = true;
$resolve();
}, function (mediaError) {
$parameters.Success = false;
$parameters.ErrorMessage = mediaError.code + ":" + mediaError.message;
$resolve();
}
);
}
Media.MediaPluginObject.play();
取り除いたrelease()呼び出しは、Releaseアクションへ待避。
if (Media.MediaPluginObject) {
Media.MediaPluginObject.release();
Media.MediaPluginObject = null;
}
追加アクション
追加するアクションは、OutSystemsの定義としては、演奏(PlaySound)と同じなので、気になる場合は、シリーズの最初の記事を確認してください。
リリース済みの時と、演奏を開始していないときは何もしないようにしています。
演奏停止アクション
if (Media.MediaPluginObject)
Media.MediaPluginObject.stop();
現在の演奏位置を返すアクション
値を返すアクションなので、出力パラメータCurrentPositionが必要です(JavaScriptエレメントと、アクション自体に)。
if (Media.MediaPluginObject) {
Media.MediaPluginObject.getCurrentPosition(
function (position) {
$parameters.Success = true;
$parameters.CurrentPosition = position;
$resolve();
}, function (e) {
$parameters.Success = false;
$parameters.ErrorMessage = e;
$resolve();
}
);
}
音声の合計時間を返すアクション
ベースのcordovaプラグインが合計時間不明の時、-1を返すようになっています。そこでアクション自体でも、演奏対象を呼んでいないなどで時間がわからないとき-1を返しています。
if (Media.MediaPluginObject) {
$parameters.Duration = Media.MediaPluginObject.getDuration();
} else {
$parameters.Duration = -1
}