MeidaPlayer音效測試用例

本示例測試包括重低音(BassBoost)、環繞音(Virtualizer)、均衡器(Equalizer)和混響(EnvironmentalReverb),不包括視圖(Visualizer),因爲我發現前面4個網上都沒有找到像樣的用法,所以在這寫篇博文。

音效起作用條件

  1. 得到audio session ID
  2. 進行初始化
  3. 使能

設置音效範圍

這些數據都可以在源碼裏看到,在這裏也列舉一下

  1. BassBoost在[0,1000]範圍之間
  2. Virtualizer在[0,1000]範圍之間
  3. Equalizer在[-1500,1500]範圍之間,存在多個Band
  4. 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;
    }
}

源碼下載

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章