package com.jasonette.seed.Action; import android.content.Context; import android.content.Intent; import android.media.AudioManager; import android.media.MediaPlayer; import android.os.Environment; import android.util.Log; import com.jasonette.seed.Core.JasonViewActivity; import com.jasonette.seed.Helper.JasonHelper; import org.json.JSONObject; import java.io.File; import cafe.adriel.androidaudioconverter.AndroidAudioConverter; import cafe.adriel.androidaudioconverter.callback.IConvertCallback; import cafe.adriel.androidaudioconverter.callback.ILoadCallback; import cafe.adriel.androidaudioconverter.model.AudioFormat; import cafe.adriel.androidaudiorecorder.AndroidAudioRecorder; import cafe.adriel.androidaudiorecorder.model.AudioChannel; import cafe.adriel.androidaudiorecorder.model.AudioSampleRate; import cafe.adriel.androidaudiorecorder.model.AudioSource; public class JasonAudioAction { private MediaPlayer player; public void play(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { try { if (action.has("options")) { JSONObject options = action.getJSONObject("options"); if(options.has("url")){ if(player == null) { player = new MediaPlayer(); player.setAudioStreamType(AudioManager.STREAM_MUSIC); } AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE); ((JasonViewActivity)context).setVolumeControlStream(AudioManager.STREAM_MUSIC); String url = options.getString("url"); player.reset(); player.setDataSource(url); player.prepare(); player.start(); } } JasonHelper.next("success", action, new JSONObject(), event, context); } catch (SecurityException e){ JasonHelper.permission_exception("$audio.play", context); } catch (Exception e) { Log.d("Error", e.toString()); } } public void pause(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { if(player!=null){ player.pause(); } JasonHelper.next("success", action, new JSONObject(), event, context); } public void stop(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { if(player!=null){ player.stop(); player.release(); player = null; } JasonHelper.next("success", action, new JSONObject(), event, context); } public void duration(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { if (player != null) { try { int duration = (int) (player.getDuration() / 1000); JSONObject ret = new JSONObject(); ret.put("value", String.valueOf(duration)); JasonHelper.next("success", action, ret, event, context); } catch (Exception e) { Log.d("Error", e.toString()); try { JSONObject err = new JSONObject(); err.put("message", "invalid position"); JasonHelper.next("error", action, err, event, context); } catch (Exception e2){ Log.d("Error", e2.toString()); } } } else { try { JSONObject err = new JSONObject(); err.put("message", "player doesn't exist"); JasonHelper.next("error", action, err, event, context); } catch (Exception e){ Log.d("Error", e.toString()); } } } public void position(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { if (player != null) { try { int duration = player.getDuration(); int position = player.getCurrentPosition(); float ratio = position/duration; JSONObject ret = new JSONObject(); ret.put("value", String.valueOf(ratio)); JasonHelper.next("success", action, ret, event, context); } catch (Exception e) { try { JSONObject err = new JSONObject(); err.put("message", "invalid position or duration"); JasonHelper.next("error", action, err, event, context); } catch (Exception e2){ Log.d("Error", e2.toString()); } } } else { try { JSONObject err = new JSONObject(); err.put("message", "player doesn't exist"); JasonHelper.next("error", action, err, event, context); } catch (Exception e){ Log.d("Error", e.toString()); } } } public void seek(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { if(player!=null) { try { if (action.has("options")) { JSONObject options = action.getJSONObject("options"); if(options.has("position")){ float position = Float.parseFloat(options.getString("position")); int duration = player.getDuration(); player.seekTo((int)position * duration); } } } catch (Exception e) { Log.d("Error", e.toString()); } } JasonHelper.next("success", action, new JSONObject(), event, context); } public void record(final JSONObject action, JSONObject data, final JSONObject event, final Context context) { try { int color = JasonHelper.parse_color("rgba(0,0,0,0.8)"); if (action.has("options")) { JSONObject options = action.getJSONObject("options"); if (options.has("color")) { color = JasonHelper.parse_color(options.getString("color")); } } AndroidAudioConverter.load(context, new ILoadCallback() { @Override public void onSuccess() { } @Override public void onFailure(Exception error) { Log.d("Error", error.toString()); } }); String filePath = Environment.getExternalStorageDirectory() + "/recorded_audio.wav"; int requestCode = (int)(System.currentTimeMillis() % 10000); AndroidAudioRecorder.with((JasonViewActivity)context) .setFilePath(filePath) .setColor(color) .setRequestCode(requestCode) .setSource(AudioSource.MIC) .setChannel(AudioChannel.STEREO) .setSampleRate(AudioSampleRate.HZ_48000) .setAutoStart(true) .setKeepDisplayOn(true) .record(); JSONObject callback = new JSONObject(); callback.put("class", "JasonAudioAction"); callback.put("method", "process"); JasonHelper.dispatchIntent(String.valueOf(requestCode), action, data, event, context, null, callback); } catch (SecurityException e){ JasonHelper.permission_exception("$audio.record", context); } catch (Exception e){ Log.d("Error", e.toString()); } } // util public void process(Intent intent, final JSONObject options) { convert(options); } private void convert(final JSONObject options){ File file = new File(Environment.getExternalStorageDirectory() + "/recorded_audio.wav"); try { final JSONObject action = options.getJSONObject("action"); final JSONObject data = options.getJSONObject("data"); final JSONObject event = options.getJSONObject("event"); final Context context = (Context) options.get("context"); IConvertCallback callback = new IConvertCallback() { @Override public void onSuccess(File convertedFile) { try { JSONObject ret = new JSONObject(); String filePath = "file://" + convertedFile.getAbsolutePath(); ret.put("file_url", filePath); ret.put("url", filePath); ret.put("content_type", "audio/m4a"); JasonHelper.next("success", action, ret, event, context); } catch (Exception e) { Log.d("Error", e.toString()); } } @Override public void onFailure(Exception error) { try { JSONObject err = new JSONObject(); err.put("message", error.toString()); JasonHelper.next("error", action, err, event, context); } catch (Exception e){ Log.d("Error", e.toString()); } } }; AndroidAudioConverter.with(context) .setFile(file) .setFormat(AudioFormat.M4A) .setCallback(callback) .convert(); } catch (Exception e) { Log.d("Error", e.toString()); } } }