Skip to content

Commit

Permalink
Fix camera mute (#143)
Browse files Browse the repository at this point in the history
* mute camera in case if it's supported and required

* applyPlaySound properly

* fix compilation error

* fix comments

* fix comments 2

* add integration test for setPlaySounds

* pass mPlaySoundsTask
  • Loading branch information
xp-vit authored and natario1 committed Feb 7, 2018
1 parent 0a54bf4 commit e3abae9
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 7 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@

import android.graphics.Bitmap;
import android.graphics.PointF;
import android.hardware.Camera;
import android.os.Build;
import android.support.test.filters.MediumTest;
import android.support.test.rule.ActivityTestRule;
import android.support.test.runner.AndroidJUnit4;
Expand Down Expand Up @@ -364,6 +366,25 @@ public void testSetLocation() {
// This also ensures there are no crashes when attaching it to camera parameters.
}

@Test
public void testSetPlaySounds() {
controller.mPlaySoundsTask.listen();
boolean oldValue = camera.getPlaySounds();
boolean newValue = !oldValue;
camera.setPlaySounds(newValue);
controller.mPlaySoundsTask.await(300);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(camera.getCameraId(), info);
if (info.canDisableShutterSound) {
assertEquals(newValue, camera.getPlaySounds());
}
} else {
assertEquals(oldValue, camera.getPlaySounds());
}
}

//endregion

//region testSetVideoQuality
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -129,4 +129,9 @@ public void onBufferAvailable(byte[] buffer) {
void setVideoMaxSize(long videoMaxSizeInBytes) {

}

@Override
void setPlaySounds(boolean playSounds) {

}
}
50 changes: 43 additions & 7 deletions cameraview/src/main/java/com/otaliastudios/cameraview/Camera1.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.otaliastudios.cameraview;

import android.annotation.TargetApi;
import android.graphics.ImageFormat;
import android.graphics.PointF;
import android.graphics.Rect;
Expand All @@ -9,6 +10,7 @@
import android.location.Location;
import android.media.CamcorderProfile;
import android.media.MediaRecorder;
import android.os.Build;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.annotation.WorkerThread;
Expand Down Expand Up @@ -178,6 +180,7 @@ void onStart() {
mergeLocation(params, null);
mergeWhiteBalance(params, WhiteBalance.DEFAULT);
mergeHdr(params, Hdr.DEFAULT);
mergePlaySound(mPlaySounds);
params.setRecordingHint(mSessionType == SessionType.VIDEO);
mCamera.setParameters(params);

Expand Down Expand Up @@ -366,6 +369,23 @@ private boolean mergeHdr(Camera.Parameters params, Hdr oldHdr) {
return false;
}

@TargetApi(17)
private boolean mergePlaySound(boolean oldPlaySound) {
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
Camera.CameraInfo info = new Camera.CameraInfo();
Camera.getCameraInfo(mCameraId, info);
if (info.canDisableShutterSound) {
mCamera.enableShutterSound(mPlaySounds);
return true;
}
}
if (mPlaySounds) {
return true;
}
mPlaySounds = oldPlaySound;
return false;
}


@Override
void setAudio(Audio audio) {
Expand Down Expand Up @@ -572,15 +592,19 @@ public void onPreviewFrame(byte[] data, Camera camera) {
private boolean isCameraAvailable() {
switch (mState) {
// If we are stopped, don't.
case STATE_STOPPED: return false;
case STATE_STOPPED:
return false;
// If we are going to be closed, don't act on camera.
// Even if mCamera != null, it might have been released.
case STATE_STOPPING: return false;
case STATE_STOPPING:
return false;
// If we are started, mCamera should never be null.
case STATE_STARTED: return true;
case STATE_STARTED:
return true;
// If we are starting, theoretically we could act.
// Just check that camera is available.
case STATE_STARTING: return mCamera != null;
case STATE_STARTING:
return mCamera != null;
}
return false;
}
Expand Down Expand Up @@ -678,15 +702,15 @@ private void initMediaRecorder() {
mMediaRecorder.setOrientationHint(computeSensorToOutputOffset());

//If the user sets a max file size, set it to the max file size
if(mVideoMaxSizeInBytes > 0) {
if (mVideoMaxSizeInBytes > 0) {
mMediaRecorder.setMaxFileSize(mVideoMaxSizeInBytes);

//Attach a listener to the media recorder to listen for file size notifications
mMediaRecorder.setOnInfoListener(new MediaRecorder.OnInfoListener() {
@Override
public void onInfo(MediaRecorder mediaRecorder, int i, int i1) {
switch (i){
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED:{
switch (i) {
case MediaRecorder.MEDIA_RECORDER_INFO_MAX_FILESIZE_REACHED: {
endVideoImmediately();
break;
}
Expand Down Expand Up @@ -858,6 +882,18 @@ void setVideoMaxSize(long videoMaxSizeInBytes) {
mVideoMaxSizeInBytes = videoMaxSizeInBytes;
}

@Override
void setPlaySounds(boolean playSounds) {
final boolean old = mPlaySounds;
mPlaySounds = playSounds;
schedule(mPlaySoundsTask, true, new Runnable() {
@Override
public void run() {
mergePlaySound(old);
}
});
}

// -----------------
// Additional helper info
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -119,4 +119,9 @@ public void onBufferAvailable(byte[] buffer) {
void setVideoMaxSize(long videoMaxSizeInBytes) {

}

@Override
void setPlaySounds(boolean playSounds) {

}
}
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ abstract class CameraController implements
protected Audio mAudio;
protected float mZoomValue;
protected float mExposureCorrectionValue;
protected boolean mPlaySounds;

protected int mCameraId;
protected ExtraProperties mExtraProperties;
Expand Down Expand Up @@ -77,6 +78,7 @@ abstract class CameraController implements
Task<Void> mLocationTask = new Task<>();
Task<Void> mVideoQualityTask = new Task<>();
Task<Void> mStartVideoTask = new Task<>();
Task<Void> mPlaySoundsTask = new Task<>();

CameraController(CameraView.CameraCallbacks callback) {
mCameraCallbacks = callback;
Expand Down Expand Up @@ -320,6 +322,8 @@ final void setPictureSizeSelector(SizeSelector selector) {

abstract void setVideoMaxSize(long videoMaxSizeInBytes);

abstract void setPlaySounds(boolean playSounds);

//endregion

//region final getters
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1361,6 +1361,7 @@ private void playSound(int soundType) {
*/
public void setPlaySounds(boolean playSounds) {
mPlaySounds = playSounds && Build.VERSION.SDK_INT >= 16;
mCameraController.setPlaySounds(playSounds);
}

/**
Expand Down Expand Up @@ -1705,5 +1706,10 @@ public Flash toggleFlash() {
return mCameraController.getFlash();
}


/* for tests */int getCameraId(){
return mCameraController.mCameraId;
}

//endregion
}

0 comments on commit e3abae9

Please sign in to comment.