in native-audio/app/src/main/java/com/example/nativeaudio/NativeAudio.java [64:312]
protected void onCreate(Bundle icicle) {
super.onCreate(icicle);
setContentView(R.layout.main);
assetManager = getAssets();
// initialize native audio system
createEngine();
int sampleRate = 0;
int bufSize = 0;
/*
* retrieve fast audio path sample rate and buf size; if we have it, we pass to native
* side to create a player with fast audio enabled [ fast audio == low latency audio ];
* IF we do not have a fast audio path, we pass 0 for sampleRate, which will force native
* side to pick up the 8Khz sample rate.
*/
if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR1) {
AudioManager myAudioMgr = (AudioManager) getSystemService(Context.AUDIO_SERVICE);
String nativeParam = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_SAMPLE_RATE);
sampleRate = Integer.parseInt(nativeParam);
nativeParam = myAudioMgr.getProperty(AudioManager.PROPERTY_OUTPUT_FRAMES_PER_BUFFER);
bufSize = Integer.parseInt(nativeParam);
}
createBufferQueueAudioPlayer(sampleRate, bufSize);
// initialize URI spinner
Spinner uriSpinner = (Spinner) findViewById(R.id.uri_spinner);
ArrayAdapter<CharSequence> uriAdapter = ArrayAdapter.createFromResource(
this, R.array.uri_spinner_array, android.R.layout.simple_spinner_item);
uriAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
uriSpinner.setAdapter(uriAdapter);
uriSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
public void onItemSelected(AdapterView<?> parent, View view, int pos, long id) {
URI = parent.getItemAtPosition(pos).toString();
}
public void onNothingSelected(AdapterView parent) {
URI = null;
}
});
// initialize button click handlers
((Button) findViewById(R.id.hello)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
// ignore the return value
selectClip(CLIP_HELLO, 5);
}
});
((Button) findViewById(R.id.android)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
// ignore the return value
selectClip(CLIP_ANDROID, 7);
}
});
((Button) findViewById(R.id.sawtooth)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
// ignore the return value
selectClip(CLIP_SAWTOOTH, 1);
}
});
((Button) findViewById(R.id.reverb)).setOnClickListener(new OnClickListener() {
boolean enabled = false;
public void onClick(View view) {
enabled = !enabled;
if (!enableReverb(enabled)) {
enabled = !enabled;
}
}
});
((Button) findViewById(R.id.embedded_soundtrack)).setOnClickListener(new OnClickListener() {
boolean created = false;
public void onClick(View view) {
if (!created) {
created = createAssetAudioPlayer(assetManager, "background.mp3");
}
if (created) {
isPlayingAsset = !isPlayingAsset;
setPlayingAssetAudioPlayer(isPlayingAsset);
}
}
});
// native uriPlayer is broken in android 21 and over, internal bug id: b/29321867
// will re-open after it is fixed in later OSes
((Button) findViewById(R.id.uri_soundtrack)).setOnClickListener(new OnClickListener() {
boolean created = false;
public void onClick(View view) {
if (!created && URI != null) {
created = createUriAudioPlayer(URI);
}
}
});
((Button) findViewById(R.id.pause_uri)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
setPlayingUriAudioPlayer(false);
}
});
((Button) findViewById(R.id.play_uri)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
setPlayingUriAudioPlayer(true);
}
});
((Button) findViewById(R.id.loop_uri)).setOnClickListener(new OnClickListener() {
boolean isLooping = false;
public void onClick(View view) {
isLooping = !isLooping;
setLoopingUriAudioPlayer(isLooping);
}
});
((Button) findViewById(R.id.mute_left_uri)).setOnClickListener(new OnClickListener() {
boolean muted = false;
public void onClick(View view) {
muted = !muted;
setChannelMuteUriAudioPlayer(0, muted);
}
});
((Button) findViewById(R.id.mute_right_uri)).setOnClickListener(new OnClickListener() {
boolean muted = false;
public void onClick(View view) {
muted = !muted;
setChannelMuteUriAudioPlayer(1, muted);
}
});
((Button) findViewById(R.id.solo_left_uri)).setOnClickListener(new OnClickListener() {
boolean soloed = false;
public void onClick(View view) {
soloed = !soloed;
setChannelSoloUriAudioPlayer(0, soloed);
}
});
((Button) findViewById(R.id.solo_right_uri)).setOnClickListener(new OnClickListener() {
boolean soloed = false;
public void onClick(View view) {
soloed = !soloed;
setChannelSoloUriAudioPlayer(1, soloed);
}
});
((Button) findViewById(R.id.mute_uri)).setOnClickListener(new OnClickListener() {
boolean muted = false;
public void onClick(View view) {
muted = !muted;
setMuteUriAudioPlayer(muted);
}
});
((Button) findViewById(R.id.enable_stereo_position_uri)).setOnClickListener(
new OnClickListener() {
boolean enabled = false;
public void onClick(View view) {
enabled = !enabled;
enableStereoPositionUriAudioPlayer(enabled);
}
});
((Button) findViewById(R.id.channels_uri)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
if (numChannelsUri == 0) {
numChannelsUri = getNumChannelsUriAudioPlayer();
}
Toast.makeText(NativeAudio.this, "Channels: " + numChannelsUri,
Toast.LENGTH_SHORT).show();
}
});
((SeekBar) findViewById(R.id.volume_uri)).setOnSeekBarChangeListener(
new OnSeekBarChangeListener() {
int lastProgress = 100;
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (BuildConfig.DEBUG && !(progress >= 0 && progress <= 100)) {
throw new AssertionError();
}
lastProgress = progress;
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
int attenuation = 100 - lastProgress;
int millibel = attenuation * -50;
setVolumeUriAudioPlayer(millibel);
}
});
((SeekBar) findViewById(R.id.pan_uri)).setOnSeekBarChangeListener(
new OnSeekBarChangeListener() {
int lastProgress = 100;
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
if (BuildConfig.DEBUG && !(progress >= 0 && progress <= 100)) {
throw new AssertionError();
}
lastProgress = progress;
}
public void onStartTrackingTouch(SeekBar seekBar) {
}
public void onStopTrackingTouch(SeekBar seekBar) {
int permille = (lastProgress - 50) * 20;
setStereoPositionUriAudioPlayer(permille);
}
});
if (Build.VERSION.SDK_INT > 19) {
int[] uriIds = { R.id.uri_soundtrack, R.id.pause_uri,
R.id.play_uri, R.id.loop_uri,
R.id.mute_left_uri, R.id.mute_right_uri,
R.id.solo_left_uri, R.id.solo_right_uri,
R.id.mute_uri, R.id.enable_stereo_position_uri,
R.id.channels_uri, R.id.volume_uri,
R.id.pan_uri, R.id.uri_spinner,};
for(int id : uriIds)
findViewById(id).setEnabled(false);
}
((Button) findViewById(R.id.record)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
int status = ActivityCompat.checkSelfPermission(NativeAudio.this,
Manifest.permission.RECORD_AUDIO);
if (status != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(
NativeAudio.this,
new String[]{Manifest.permission.RECORD_AUDIO},
AUDIO_ECHO_REQUEST);
return;
}
recordAudio();
}
});
((Button) findViewById(R.id.playback)).setOnClickListener(new OnClickListener() {
public void onClick(View view) {
// ignore the return value
selectClip(CLIP_PLAYBACK, 3);
}
});
}