Guest User

Untitled

a guest
Mar 22nd, 2018
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.48 KB | None | 0 0
  1. package com.example.superpoweredsample;
  2.  
  3. import android.content.Context;
  4. import android.content.res.AssetFileDescriptor;
  5. import android.databinding.DataBindingUtil;
  6. import android.media.AudioManager;
  7. import android.os.Bundle;
  8. import android.support.v4.util.Pair;
  9. import android.support.v7.app.AppCompatActivity;
  10. import android.widget.SeekBar;
  11.  
  12. import com.example.superpoweredsample.databinding.MainActivityBinding;
  13.  
  14. import java.io.IOException;
  15.  
  16. public class MainActivity extends AppCompatActivity {
  17.  
  18. public static final int TEMPO_HALF = 0;
  19. public static final int TEMPO_NORMAL = 1;
  20. public static final int TEMPO_DOUBLE = 2;
  21.  
  22. private MainActivityBinding binding;
  23.  
  24. boolean playing = false;
  25.  
  26. @Override
  27. protected void onCreate(Bundle savedInstanceState) {
  28. super.onCreate(savedInstanceState);
  29. this.binding = DataBindingUtil.setContentView(this, R.layout.activity_main);
  30. this.binding.setPlaying(playing);
  31.  
  32. // Get the device's sample rate and buffer size to enable low-latency Android audio output, if available.
  33. Pair<Integer, Integer> deviceAudioInfo = getDeviceAudioInfo();
  34. Integer sampleRate = deviceAudioInfo.first;
  35. Integer bufferSize = deviceAudioInfo.second;
  36.  
  37. Pair<Integer, Integer> trackLocationInfo = getTrackLocationInfo();
  38. Integer fileOffset = trackLocationInfo.first;
  39. Integer fileLength = trackLocationInfo.second;
  40.  
  41. // Arguments: path to the APK file, offset and length of the two resource files, sample rate, audio buffer size.
  42. SuperpoweredExample(sampleRate, bufferSize, getPackageResourcePath(), fileOffset, fileLength);
  43.  
  44. setupViews();
  45.  
  46. }
  47.  
  48. private void setupViews() {
  49. binding.btnPlayPause.setOnClickListener((view) -> {
  50. setPlaying(!playing);
  51. });
  52.  
  53. binding.sbPitch.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  54. @Override
  55. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  56. onPitchChanged(progress - 12);
  57. }
  58.  
  59. @Override
  60. public void onStartTrackingTouch(SeekBar seekBar) {
  61.  
  62. }
  63.  
  64. @Override
  65. public void onStopTrackingTouch(SeekBar seekBar) {
  66.  
  67. }
  68. });
  69.  
  70. binding.sbTrackProgress.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
  71. @Override
  72. public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
  73. if (progress == seekBar.getMax()) {
  74. setPlaying(!playing);
  75. }
  76. }
  77.  
  78. @Override
  79. public void onStartTrackingTouch(SeekBar seekBar) {
  80.  
  81. }
  82.  
  83. @Override
  84. public void onStopTrackingTouch(SeekBar seekBar) {
  85. seekTo(seekBar.getProgress() / 100.0f);
  86. }
  87. });
  88.  
  89. binding.radioGroup.check(binding.rbNormalTime.getId());
  90. binding.radioGroup.setOnCheckedChangeListener((group, checkedId) -> {
  91. switch (checkedId) {
  92. case R.id.rb_slow_down:
  93. onTempoSelected(TEMPO_HALF);
  94. break;
  95. case R.id.rb_normal_time:
  96. onTempoSelected(TEMPO_NORMAL);
  97. break;
  98. case R.id.rb_speed_up:
  99. onTempoSelected(TEMPO_DOUBLE);
  100. break;
  101. default:
  102. onTempoSelected(TEMPO_NORMAL);
  103. break;
  104. }
  105. });
  106. }
  107.  
  108. private void setPlaying(boolean playing) {
  109. this.playing = playing;
  110. this.binding.setPlaying(this.playing);
  111. onPlayPause(this.playing);
  112. }
  113.  
  114. private Pair<Integer, Integer> getDeviceAudioInfo() {
  115. String samplerateString;
  116. String buffersizeString;
  117.  
  118. AudioManager audioManager = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
  119. samplerateString = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
  120. buffersizeString = audioManager.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
  121.  
  122. if (samplerateString == null) samplerateString = "44100";
  123. if (buffersizeString == null) buffersizeString = "512";
  124.  
  125. return new Pair<>(Integer.parseInt(samplerateString), Integer.parseInt(buffersizeString));
  126. }
  127.  
  128. private Pair<Integer, Integer> getTrackLocationInfo() {
  129. AssetFileDescriptor fd;
  130. Pair<Integer, Integer> trackLocationInfo = null;
  131.  
  132. try {
  133. fd = getTrackAsset();
  134. int fileOffset = (int) fd.getStartOffset();
  135. int fileLength = (int) fd.getLength();
  136. trackLocationInfo = new Pair<>(fileOffset, fileLength);
  137. } catch (IOException e) {
  138. e.printStackTrace();
  139. }
  140.  
  141. return trackLocationInfo;
  142. }
  143.  
  144. private AssetFileDescriptor getTrackAsset() throws IOException {
  145. return getAssets().openFd("Protest the Hero - Drumhead Trial (Instrumental).mp3");
  146. }
  147.  
  148. static {
  149. System.loadLibrary("native-lib");
  150. System.loadLibrary("SuperpoweredExample");
  151. }
  152.  
  153. private native void SuperpoweredExample(int samplerate, int buffersize, String apkPath,
  154. int fileOffset, int fileLength);
  155.  
  156. private native void onPlayPause(boolean play);
  157.  
  158. private native void seekTo(double positionPercent);
  159.  
  160. private native void onPitchChanged(int pitchValue);
  161.  
  162. private native void onTempoSelected(int tempoValue);
  163.  
  164. public native String stringFromJNI();
  165. }
Add Comment
Please, Sign In to add comment