Loading packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml +4 −5 Original line number Diff line number Diff line Loading @@ -16,21 +16,20 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_width="250dp" android:layout_height="48dp" android:orientation="vertical" android:padding="10dp" android:layout_weight="1"> android:padding="13dp"> <TextView android:id="@+id/screen_recording_dialog_source_text" android:layout_width="match_parent" android:layout_width="250dp" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorPrimary"/> <TextView android:id="@+id/screen_recording_dialog_source_description" android:layout_width="wrap_content" android:layout_width="250dp" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> Loading packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +2 −2 Original line number Diff line number Diff line Loading @@ -225,8 +225,8 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis res.getString(R.string.screenrecord_name)); String notificationTitle = mAudioSource == ScreenRecordingAudioSource.NONE ? res.getString(R.string.screenrecord_ongoing_screen_and_audio) : res.getString(R.string.screenrecord_ongoing_screen_only); ? res.getString(R.string.screenrecord_ongoing_screen_only) : res.getString(R.string.screenrecord_ongoing_screen_and_audio); mRecordingNotificationBuilder = new Notification.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_screenrecord) Loading packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java +18 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import java.nio.ByteBuffer; public class ScreenInternalAudioRecorder { private static String TAG = "ScreenAudioRecorder"; private static final int TIMEOUT = 500; private static final float MIC_VOLUME_SCALE = 1.4f; private final Context mContext; private AudioRecord mAudioRecord; private AudioRecord mAudioRecordMic; Loading Loading @@ -148,6 +149,10 @@ public class ScreenInternalAudioRecorder { readShortsInternal = mAudioRecord.read(bufferInternal, 0, bufferInternal.length); readShortsMic = mAudioRecordMic.read(bufferMic, 0, bufferMic.length); // modify the volume bufferMic = scaleValues(bufferMic, readShortsMic, MIC_VOLUME_SCALE); readBytes = Math.min(readShortsInternal, readShortsMic) * 2; buffer = addAndConvertBuffers(bufferInternal, readShortsInternal, bufferMic, readShortsMic); Loading @@ -168,6 +173,19 @@ public class ScreenInternalAudioRecorder { }); } private short[] scaleValues(short[] buff, int len, float scale) { for (int i = 0; i < len; i++) { int oldValue = buff[i]; int newValue = (int) (buff[i] * scale); if (newValue > Short.MAX_VALUE) { newValue = Short.MAX_VALUE; } else if (newValue < Short.MIN_VALUE) { newValue = Short.MIN_VALUE; } buff[i] = (short) (newValue); } return buff; } private byte[] addAndConvertBuffers(short[] a1, int a1Limit, short[] a2, int a2Limit) { int size = Math.max(a1Limit, a2Limit); if (size < 0) return new byte[0]; Loading packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java +8 −5 Original line number Diff line number Diff line Loading @@ -55,9 +55,9 @@ import java.util.Date; */ public class ScreenMediaRecorder { private static final int TOTAL_NUM_TRACKS = 1; private static final int VIDEO_BIT_RATE = 10000000; private static final int VIDEO_FRAME_RATE = 30; private static final int AUDIO_BIT_RATE = 16; private static final int VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO = 6; private static final int AUDIO_BIT_RATE = 196000; private static final int AUDIO_SAMPLE_RATE = 44100; private static final int MAX_DURATION_MS = 60 * 60 * 1000; private static final long MAX_FILESIZE_BYTES = 5000000000L; Loading Loading @@ -108,7 +108,7 @@ public class ScreenMediaRecorder { // Set up audio source if (mAudioSource == MIC) { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); } mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); Loading @@ -121,10 +121,13 @@ public class ScreenMediaRecorder { wm.getDefaultDisplay().getRealMetrics(metrics); int screenWidth = metrics.widthPixels; int screenHeight = metrics.heightPixels; int refereshRate = (int) wm.getDefaultDisplay().getRefreshRate(); int vidBitRate = screenHeight * screenWidth * refereshRate / VIDEO_FRAME_RATE * VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO; mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoSize(screenWidth, screenHeight); mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE); mMediaRecorder.setVideoFrameRate(refereshRate); mMediaRecorder.setVideoEncodingBitRate(vidBitRate); mMediaRecorder.setMaxDuration(MAX_DURATION_MS); mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES); Loading packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java +1 −4 Original line number Diff line number Diff line Loading @@ -24,12 +24,9 @@ import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.NONE; import android.app.Activity; import android.app.PendingIntent; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; Loading Loading @@ -88,8 +85,8 @@ public class ScreenRecordDialog extends Activity { }); mModes = new ArrayList<>(); mModes.add(INTERNAL); mModes.add(MIC); mModes.add(INTERNAL); mModes.add(MIC_AND_INTERNAL); mAudioSwitch = findViewById(R.id.screenrecord_audio_switch); Loading Loading
packages/SystemUI/res/layout/screen_record_dialog_audio_source.xml +4 −5 Original line number Diff line number Diff line Loading @@ -16,21 +16,20 @@ --> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_width="250dp" android:layout_height="48dp" android:orientation="vertical" android:padding="10dp" android:layout_weight="1"> android:padding="13dp"> <TextView android:id="@+id/screen_recording_dialog_source_text" android:layout_width="match_parent" android:layout_width="250dp" android:layout_height="match_parent" android:layout_gravity="center_vertical" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorPrimary"/> <TextView android:id="@+id/screen_recording_dialog_source_description" android:layout_width="wrap_content" android:layout_width="250dp" android:layout_height="wrap_content" android:textAppearance="?android:attr/textAppearanceSmall" android:textColor="?android:attr/textColorSecondary"/> Loading
packages/SystemUI/src/com/android/systemui/screenrecord/RecordingService.java +2 −2 Original line number Diff line number Diff line Loading @@ -225,8 +225,8 @@ public class RecordingService extends Service implements MediaRecorder.OnInfoLis res.getString(R.string.screenrecord_name)); String notificationTitle = mAudioSource == ScreenRecordingAudioSource.NONE ? res.getString(R.string.screenrecord_ongoing_screen_and_audio) : res.getString(R.string.screenrecord_ongoing_screen_only); ? res.getString(R.string.screenrecord_ongoing_screen_only) : res.getString(R.string.screenrecord_ongoing_screen_and_audio); mRecordingNotificationBuilder = new Notification.Builder(this, CHANNEL_ID) .setSmallIcon(R.drawable.ic_screenrecord) Loading
packages/SystemUI/src/com/android/systemui/screenrecord/ScreenInternalAudioRecorder.java +18 −0 Original line number Diff line number Diff line Loading @@ -38,6 +38,7 @@ import java.nio.ByteBuffer; public class ScreenInternalAudioRecorder { private static String TAG = "ScreenAudioRecorder"; private static final int TIMEOUT = 500; private static final float MIC_VOLUME_SCALE = 1.4f; private final Context mContext; private AudioRecord mAudioRecord; private AudioRecord mAudioRecordMic; Loading Loading @@ -148,6 +149,10 @@ public class ScreenInternalAudioRecorder { readShortsInternal = mAudioRecord.read(bufferInternal, 0, bufferInternal.length); readShortsMic = mAudioRecordMic.read(bufferMic, 0, bufferMic.length); // modify the volume bufferMic = scaleValues(bufferMic, readShortsMic, MIC_VOLUME_SCALE); readBytes = Math.min(readShortsInternal, readShortsMic) * 2; buffer = addAndConvertBuffers(bufferInternal, readShortsInternal, bufferMic, readShortsMic); Loading @@ -168,6 +173,19 @@ public class ScreenInternalAudioRecorder { }); } private short[] scaleValues(short[] buff, int len, float scale) { for (int i = 0; i < len; i++) { int oldValue = buff[i]; int newValue = (int) (buff[i] * scale); if (newValue > Short.MAX_VALUE) { newValue = Short.MAX_VALUE; } else if (newValue < Short.MIN_VALUE) { newValue = Short.MIN_VALUE; } buff[i] = (short) (newValue); } return buff; } private byte[] addAndConvertBuffers(short[] a1, int a1Limit, short[] a2, int a2Limit) { int size = Math.max(a1Limit, a2Limit); if (size < 0) return new byte[0]; Loading
packages/SystemUI/src/com/android/systemui/screenrecord/ScreenMediaRecorder.java +8 −5 Original line number Diff line number Diff line Loading @@ -55,9 +55,9 @@ import java.util.Date; */ public class ScreenMediaRecorder { private static final int TOTAL_NUM_TRACKS = 1; private static final int VIDEO_BIT_RATE = 10000000; private static final int VIDEO_FRAME_RATE = 30; private static final int AUDIO_BIT_RATE = 16; private static final int VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO = 6; private static final int AUDIO_BIT_RATE = 196000; private static final int AUDIO_SAMPLE_RATE = 44100; private static final int MAX_DURATION_MS = 60 * 60 * 1000; private static final long MAX_FILESIZE_BYTES = 5000000000L; Loading Loading @@ -108,7 +108,7 @@ public class ScreenMediaRecorder { // Set up audio source if (mAudioSource == MIC) { mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.MIC); mMediaRecorder.setAudioSource(MediaRecorder.AudioSource.DEFAULT); } mMediaRecorder.setVideoSource(MediaRecorder.VideoSource.SURFACE); Loading @@ -121,10 +121,13 @@ public class ScreenMediaRecorder { wm.getDefaultDisplay().getRealMetrics(metrics); int screenWidth = metrics.widthPixels; int screenHeight = metrics.heightPixels; int refereshRate = (int) wm.getDefaultDisplay().getRefreshRate(); int vidBitRate = screenHeight * screenWidth * refereshRate / VIDEO_FRAME_RATE * VIDEO_FRAME_RATE_TO_RESOLUTION_RATIO; mMediaRecorder.setVideoEncoder(MediaRecorder.VideoEncoder.H264); mMediaRecorder.setVideoSize(screenWidth, screenHeight); mMediaRecorder.setVideoFrameRate(VIDEO_FRAME_RATE); mMediaRecorder.setVideoEncodingBitRate(VIDEO_BIT_RATE); mMediaRecorder.setVideoFrameRate(refereshRate); mMediaRecorder.setVideoEncodingBitRate(vidBitRate); mMediaRecorder.setMaxDuration(MAX_DURATION_MS); mMediaRecorder.setMaxFileSize(MAX_FILESIZE_BYTES); Loading
packages/SystemUI/src/com/android/systemui/screenrecord/ScreenRecordDialog.java +1 −4 Original line number Diff line number Diff line Loading @@ -24,12 +24,9 @@ import static com.android.systemui.screenrecord.ScreenRecordingAudioSource.NONE; import android.app.Activity; import android.app.PendingIntent; import android.os.Bundle; import android.util.Log; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.view.Window; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.Button; import android.widget.Spinner; Loading Loading @@ -88,8 +85,8 @@ public class ScreenRecordDialog extends Activity { }); mModes = new ArrayList<>(); mModes.add(INTERNAL); mModes.add(MIC); mModes.add(INTERNAL); mModes.add(MIC_AND_INTERNAL); mAudioSwitch = findViewById(R.id.screenrecord_audio_switch); Loading