Пример #1
0
  /**
   * starts detecting features/gesture depending on the used extractors.<br>
   * Does not record the data for later analysis
   */
  public void startDetection() {

    final AudioTrack at =
        new AudioTrack(
            android.media.AudioManager.STREAM_MUSIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            minSize,
            AudioTrack.MODE_STREAM);
    final AudioRecord ar =
        new AudioRecord(
            MediaRecorder.AudioSource.MIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            10 * minSize);

    final byte[] audio = signalGen.generateAudio();

    Thread detectionThread =
        new Thread(
            new Runnable() {

              private int sampleCounter;

              @Override
              public void run() {

                final byte[] buffer = new byte[minSize];
                while (detectionRunning) {
                  int samplesRead = ar.read(buffer, 0, minSize);
                  if (samplesRead != minSize) {
                    Log.e(
                        "AUDIO_MANAGER",
                        "Samples read not equal minSize ("
                            + samplesRead
                            + "). Might be loosing data!");
                  }

                  // size of bufferDouble is buffer.length/2
                  final double[] bufferDouble = convertToDouble(buffer, samplesRead);

                  if (sampleCounter >= 44100) {
                    if (featureDetector != null) {
                      featureDetector.checkForFeatures(bufferDouble, true); // false
                    }
                  }
                  // omit first second
                  sampleCounter += samplesRead;
                }

                ar.stop();
                ar.release();
              }
            });

    Thread playThread =
        new Thread(
            new Runnable() {
              @Override
              public void run() {

                at.play();
                while (detectionRunning) {
                  at.write(audio, 0, audio.length);
                }
                at.stop();
                at.release();
              }
            });

    ar.startRecording();
    detectionRunning = true;
    detectionThread.start();
    playThread.start();
  }
Пример #2
0
  /**
   * starts recording the received audio. Also saves it to a file for later analysis
   *
   * @throws FileNotFoundException
   */
  public void startRecord() throws FileNotFoundException {

    final AudioTrack at =
        new AudioTrack(
            android.media.AudioManager.STREAM_MUSIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_OUT_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            minSize,
            AudioTrack.MODE_STREAM);
    final AudioRecord ar =
        new AudioRecord(
            MediaRecorder.AudioSource.MIC,
            SAMPLE_RATE,
            AudioFormat.CHANNEL_IN_MONO,
            AudioFormat.ENCODING_PCM_16BIT,
            10 * minSize);

    tempFileRec = new File(ctx.getExternalCacheDir().getAbsolutePath() + "/temp_rec.raw");
    tempFileSend = new File(ctx.getExternalCacheDir().getAbsolutePath() + "/temp_send.raw");

    if (tempFileRec.exists()) tempFileRec.delete();

    if (tempFileSend.exists()) tempFileSend.delete();

    dosRec = new DataOutputStream(new FileOutputStream(tempFileRec));
    dosSend = new DataOutputStream(new FileOutputStream(tempFileSend));

    final byte[] audio = signalGen.generateAudio();

    Thread recordThread =
        new Thread(
            new Runnable() {

              private int sampleCounter;

              @Override
              public void run() {

                final byte[] buffer = new byte[minSize];
                while (recordRunning) {
                  int samplesRead = ar.read(buffer, 0, minSize);
                  if (samplesRead != minSize) {
                    Log.e(
                        "AUDIO_MANAGER",
                        "Samples read not equal minSize ("
                            + samplesRead
                            + "). Might be loosing data!");
                  }

                  // TODO: consider seperate thread (in case of buffer overflow)
                  writeByteBufferToStream(buffer, dosRec);

                  // size of bufferDouble is buffer.length/2
                  final double[] bufferDouble = convertToDouble(buffer, samplesRead);

                  if (sampleCounter >= 44100) {
                    if (featureDetector != null) {
                      featureDetector.checkForFeatures(bufferDouble, true); // false
                    }
                  }

                  // omit first second
                  sampleCounter += samplesRead;
                }

                ar.stop();
                ar.release();
                try {
                  dosRec.close();
                } catch (IOException e) {
                  e.printStackTrace();
                }
              }
            });

    Thread playThread =
        new Thread(
            new Runnable() {
              @Override
              public void run() {

                at.play();
                while (recordRunning) {
                  at.write(audio, 0, audio.length);
                  writeByteBufferToStream(audio, dosSend);
                }
                at.stop();
                at.release();
              }
            });

    ar.startRecording();
    recordRunning = true;
    recordThread.start();
    playThread.start();
  }