本示例測試包括重低音(BassBoost)、環繞音(Virtualizer)、均衡器(Equalizer)和混響(EnvironmentalReverb),不包括視圖(Visualizer),因爲我發現前面4個網上都沒有找到像樣的用法,所以在這寫篇博文。
音效起作用條件
- 得到
audio session ID
- 進行初始化
- 使能
設置音效範圍
這些數據都可以在源碼裏看到,在這裏也列舉一下
- BassBoost在
[0,1000]
範圍之間 - Virtualizer在
[0,1000]
範圍之間 - Equalizer在
[-1500,1500]
範圍之間,存在多個Band - EnvironmentalReverb在[-9000, 2000]之間
注意事項
測試時,需要只能有一個應用示例在使用MediaPlayer播放器,否則,誰先開啓誰就先起作用,參數(int priority, int audioSession)
裏的priority沒毛用
部分完整代碼
部分 == 完整 ~
public class MainActivity extends AppCompatActivity implements MusicService.Callback {
final static String TAG = MainActivity.class.getSimpleName();
List<MediaInfo> mediaInfos;
List<String> strings;
MusicService musicService;
int priority = 1;
// 重低音
BassBoost bassBoost;
// 環繞音
Virtualizer virtualizer;
// 均衡器
Equalizer equalizer;
// 混響
EnvironmentalReverb environmentalReverb;
SeekBarListener listener;
ServiceConnection serviceConnection = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName name, IBinder service) {
musicService = ((MusicService.MyBinder) service).getService();
musicService.setCallback(MainActivity.this);
Log.d(TAG, "priority:" + priority);
bassBoost = new BassBoost(priority, musicService.getAudioSessionId());
bassBoost.setEnabled(true);
Log.d(TAG, "default bassBoostStrength:" + bassBoost.getRoundedStrength());
sb_bassBoost.setMax(1000); //[0,1000]
sb_bassBoost.setProgress(getPreference("bassBoost"));
bassBoost.setStrength((short) getPreference("bassBoost"));
virtualizer = new Virtualizer(priority, musicService.getAudioSessionId());
virtualizer.setEnabled(true);
Log.d(TAG, "default virtualizerStrength:" + virtualizer.getRoundedStrength());
sb_virtualizer.setMax(1000); //[0,1000]
sb_virtualizer.setProgress(getPreference("virtualizer"));
virtualizer.setStrength((short) getPreference("virtualizer"));
equalizer = new Equalizer(priority, musicService.getAudioSessionId());
equalizer.setEnabled(true);
short[] ranges = equalizer.getBandLevelRange();
Log.d(TAG, "ranges[0]:" + ranges[0] + ", ranges[1]:" + ranges[1]);
for (short i = 0; i < equalizer.getNumberOfBands(); i++) {
System.out.println("default range" + i + ":" + equalizer.getBandLevel(i));
}
equalizerBand0.setMax(3000); // [-1500, 1500]
equalizerBand0.setProgress(getPreference("equalizerBand0") + 1500);
equalizer.setBandLevel((short) 0, (short) getPreference("equalizerBand0"));
equalizerBand1.setMax(3000); // [-1500, 1500]
equalizerBand1.setProgress(getPreference("equalizerBand1") + 1500);
equalizer.setBandLevel((short) 1, (short) getPreference("equalizerBand1"));
equalizerBand2.setMax(3000); // [-1500, 1500]
equalizerBand2.setProgress(getPreference("equalizerBand2") + 1500);
equalizer.setBandLevel((short) 2, (short) getPreference("equalizerBand2"));
equalizerBand3.setMax(3000); // [-1500, 1500]
equalizerBand3.setProgress(getPreference("equalizerBand3") + 1500);
equalizer.setBandLevel((short) 3, (short) getPreference("equalizerBand3"));
equalizerBand4.setMax(3000); // [-1500, 1500]
equalizerBand4.setProgress(getPreference("equalizerBand4") + 1500);
equalizer.setBandLevel((short) 4, (short) getPreference("equalizerBand4"));
environmentalReverb = new EnvironmentalReverb(priority, musicService.getAudioSessionId());
environmentalReverb.setEnabled(true);
Log.d(TAG, "default environmentalReverbReverbLevel:" + environmentalReverb.getReverbLevel());
sb_environmentalReverb.setMax(11000); //[-9000, 2000] // setReverbLevel
sb_environmentalReverb.setProgress(getPreference("environmentalReverb") + 9000);
environmentalReverb.setReverbLevel((short) getPreference("environmentalReverb"));
showDefaultEq();
}
@Override
public void onServiceDisconnected(ComponentName name) {
musicService = null;
}
};
@Bind(R.id.spinner)
Spinner spinner;
private void showDefaultEq() {
int presetNums = equalizer.getNumberOfPresets();
String[] presetNames = new String[presetNums];
for (short preset = 0; preset < presetNums; preset++) {
presetNames[preset] = equalizer.getPresetName(preset);
}
ArrayAdapter<String> adapter = new ArrayAdapter<>(this,
android.R.layout.simple_spinner_dropdown_item, presetNames);
spinner.setAdapter(adapter);
spinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d(TAG, "position:" + position);
equalizer.usePreset((short) position);
equalizerBand0.setProgress(equalizer.getBandLevel((short) 0) + 1500);
equalizerBand1.setProgress(equalizer.getBandLevel((short) 1) + 1500);
equalizerBand2.setProgress(equalizer.getBandLevel((short) 2) + 1500);
equalizerBand3.setProgress(equalizer.getBandLevel((short) 3) + 1500);
equalizerBand4.setProgress(equalizer.getBandLevel((short) 4) + 1500);
}
@Override
public void onNothingSelected(AdapterView<?> parent) {
}
});
for (String s : presetNames) {
System.out.println(s);
}
}
@Bind(R.id.bassBoost)
SeekBar sb_bassBoost;
@Bind(R.id.virtualizer)
SeekBar sb_virtualizer;
@Bind(R.id.equalizer_band0)
SeekBar equalizerBand0;
@Bind(R.id.equalizer_band1)
SeekBar equalizerBand1;
@Bind(R.id.equalizer_band2)
SeekBar equalizerBand2;
@Bind(R.id.equalizer_band3)
SeekBar equalizerBand3;
@Bind(R.id.equalizer_band4)
SeekBar equalizerBand4;
@Bind(R.id.environmentalReverb)
SeekBar sb_environmentalReverb;
@Bind(R.id.list)
ListView list;
@Bind(R.id.headLayout)
LinearLayout headLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ButterKnife.bind(this);
loadingMedias();
startService(new Intent(this, MusicService.class));
list.setAdapter(new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, strings));
list.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
if (musicService != null) {
musicService.load(mediaInfos.get(position));
}
}
});
listener = new SeekBarListener();
sb_bassBoost.setOnSeekBarChangeListener(listener);
sb_virtualizer.setOnSeekBarChangeListener(listener);
equalizerBand0.setOnSeekBarChangeListener(listener);
equalizerBand1.setOnSeekBarChangeListener(listener);
equalizerBand2.setOnSeekBarChangeListener(listener);
equalizerBand3.setOnSeekBarChangeListener(listener);
equalizerBand4.setOnSeekBarChangeListener(listener);
sb_environmentalReverb.setOnSeekBarChangeListener(listener);
}
@Override
public void update() {
}
@Override
public void updateProgress() {
}
class SeekBarListener implements SeekBar.OnSeekBarChangeListener {
@Override
public void onStopTrackingTouch(SeekBar seekBar) {
switch (seekBar.getId()) {
case R.id.bassBoost:
if (bassBoost.getStrengthSupported()) {
Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
short value = (short) seekBar.getProgress();
bassBoost.setStrength(value);
setPreference("bassBoost", value);
}
break;
case R.id.virtualizer:
if (virtualizer.getStrengthSupported()) {
Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
short value = (short) seekBar.getProgress();
virtualizer.setStrength(value);
setPreference("virtualizer", value);
}
break;
case R.id.equalizer_band0:
Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
Log.d(TAG, "equalizer.getNumberOfBands():" + equalizer.getNumberOfBands());
if (equalizer != null) {
short value = (short) (seekBar.getProgress() - 1500);
equalizer.setBandLevel((short) 0, value);
setPreference("equalizerBand0", value);
}
break;
case R.id.equalizer_band1:
if (equalizer != null) {
short value = (short) (seekBar.getProgress() - 1500);
equalizer.setBandLevel((short) 1, value);
setPreference("equalizerBand1", value);
}
break;
case R.id.equalizer_band2:
if (equalizer != null) {
short value = (short) (seekBar.getProgress() - 1500);
equalizer.setBandLevel((short) 2, value);
setPreference("equalizerBand2", value);
}
break;
case R.id.equalizer_band3:
if (equalizer != null) {
short value = (short) (seekBar.getProgress() - 1500);
equalizer.setBandLevel((short) 3, value);
setPreference("equalizerBand3", value);
}
break;
case R.id.equalizer_band4:
if (equalizer != null) {
short value = (short) (seekBar.getProgress() - 1500);
equalizer.setBandLevel((short) 4, value);
setPreference("equalizerBand4", value);
}
break;
case R.id.environmentalReverb:
Log.d(TAG, "seekBar.getProgress():" + seekBar.getProgress());
short value = (short) (seekBar.getProgress() - 9000);
environmentalReverb.setReverbLevel(value);
setPreference("environmentalReverb", value);
break;
}
}
@Override
public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
}
@Override
public void onStartTrackingTouch(SeekBar seekBar) {
}
}
private int getPreference(String key) {
return PreferenceManager.getDefaultSharedPreferences(this).getInt(key, 0);
}
private void setPreference(String key, int value) {
SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit();
editor.putInt(key, value).apply();
}
// MediaPlayer
private void loadingMedias() {
mediaInfos = exeAudioCursor(MediaStore.Audio.Media.EXTERNAL_CONTENT_URI,
null, MediaStore.Audio.Media.IS_MUSIC + " = 1", null, null);
strings = new ArrayList<>();
for (MediaInfo info : mediaInfos) {
strings.add(info.getTitle());
}
}
@Override
protected void onStart() {
super.onStart();
Intent intent = new Intent(this, MusicService.class);
bindService(intent, serviceConnection, BIND_AUTO_CREATE);
}
@Override
protected void onStop() {
super.onStop();
unbindService(serviceConnection);
}
@Override
protected void onDestroy() {
super.onDestroy();
musicService.clearCallback();
stopService(new Intent(this, MusicService.class));
bassBoost.release();
virtualizer.release();
equalizer.release();
environmentalReverb.release();
}
private List<MediaInfo> exeAudioCursor(Uri uri,
String projection[],
String selection,
String selectionArgs[],
String sortOrder) {
List<MediaInfo> infos = new ArrayList<>();
Cursor cursor = getContentResolver().query(uri, projection, selection, selectionArgs, sortOrder);
if (cursor != null && cursor.getCount() > 0) {
try {
while (cursor.moveToNext()) {
String title = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.TITLE));
String artist = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ARTIST));
String album = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.ALBUM));
String res = cursor.getString(cursor.getColumnIndexOrThrow(MediaStore.Audio.Media.DATA));
MediaInfo item = new MediaInfo();
item.setArtist(artist);
item.setAlbum(album);
item.setTitle(title);
item.setPath(res);
infos.add(item);
}
} finally {
cursor.close();
}
}
return infos;
}
}